2026年6月6日 2 分钟阅读

Terse 实战:用 TypeScript 为编码 Agent 构建确定性 + Agentic 混合工作流

tinyash 0 条评论

用 Claude Code 写代码很爽,但它偶尔会”自由发挥”——删了不该删的文件、改错了配置、或者在一个简单任务上浪费大量 API Token。用纯 YAML 工作流又太死板,改动一个参数就要重新部署全套。

Terse 正好填补了这个空白:它允许你在同一个工作流中混合确定性工具调用Agent 判断——需要精确的地方交给代码,需要决策的地方交给 LLM。

Terse 是什么

Terse 是一个代码优先的 AI 工作流平台,用 TypeScript 定义工作流,运行在无服务器沙箱中。它提供:

  • 类型化 SDK:从你的 workspace 自动生成强类型调用句柄
  • 确定性 + Agentic 混合:同一工作流中混合精确工具调用和 LLM 判断
  • 作用域权限:Agent 只能访问你显式声明技能的工具
  • 无服务器部署:一行 terse deploy 推送到云端沙箱

目前 Terse 已发布 terse-cli v0.1.64 和 terse-sdk,社区有 9 个 GitHub Stars,提供 Claude Code Skill 集成。

快速上手

安装 CLI

npm install -g terse-cli

初始化项目

terse init my-workflow
cd my-workflow

terse init 会完成全套设置:脚手架 TypeScript 项目文件、安装依赖、启动浏览器认证、运行 terse generate 生成类型化 SDK。初始化后的目录结构如下:

my-workflow/
  src/
    index.ts          # 工作流定义
    terse.generated.ts # 自动生成的 SDK(勿手动编辑)
  package.json
  tsconfig.json
  .env.example
  .gitignore

编写第一个工作流

打开 src/index.ts,写一个处理 GitHub PR 的混合工作流:

import { createJob } from "terse-sdk";
import { Triggers, Skills } from "./terse.generated";

export default createJob({
  trigger: Triggers.github.onPROpened({
    repo: "my-team/my-service",
  }),
  async run({ event }) {
    // 确定性工具调用:直接获取 PR 信息
    const pr = await Skills.github.getPullRequest({
      repo: event.repository.full_name,
      prNumber: event.number,
    });

    // Agent 判断:让 LLM 判断 PR 是否需要人工审核
    const review = await Skills.llm.generateText({
      prompt: `Review this PR diff and determine if it needs human review.
Title: ${pr.title}
Description: ${pr.body}
Files changed: ${pr.files.length}
Changes: ${pr.files.map(f => `- ${f.filename} (${f.status})`).join('\n')}

Respond with: YES or NO, and a one-sentence reason.`,
    });

    // 确定性工具调用:根据 Agent 判断结果操作
    if (review.output.includes("YES")) {
      await Skills.github.addLabel({
        repo: event.repository.full_name,
        prNumber: event.number,
        label: "needs-human-review",
      });
    }
  },
});

测试和部署

terse test

terse deploy

核心概念:Context as Code

Terse 最有意思的设计是 terse generate——它扫描你的 workspace,生成一个只包含你实际使用的集成的类型化 SDK。这意味着:

  • LLM 只看到作用域内的工具——不会像 Cursor 那样给你推荐 GitLab 操作当你在用 GitHub
  • IDE 有完整的 TypeScript 补全——Skills.github. 后自动补全你配置过的仓库操作
  • 权限边界清晰——Agent 无法调用未声明的工具
// terse generate 之后,terse.generated.ts 中会包含:
// Triggers.github.onPROpened(...)
// Skills.github.getPullRequest(...)
// Skills.linear.createIssue(...)
// 等强类型方法

两个实战场景

场景一:自动代码审查路由

当 AI Agent 生成大量代码时,不能让每行代码都进生产环境。用 Terse 可以搭建一个自动分流系统:

createJob({
  trigger: Triggers.github.onPROpened(),
  async run({ event }) {
    const files = await Skills.github.listFiles({ prNumber: event.number });
    
    // 确定性判断:配置文件和源代码需要不同审查级别
    const configFiles = files.filter(f => f.filename.endsWith(".yaml") || f.filename.endsWith(".env"));
    const sourceFiles = files.filter(f => f.filename.endsWith(".ts") || f.filename.endsWith(".py"));

    if (configFiles.length > 0) {
      // 配置文件变更 → 必须人工审核
      await Skills.github.requestReviewers({
        reviewers: ["senior-dev-team"],
      });
    } else if (sourceFiles.length <= 3) {
      // 小改动 → Agent 自动审查
      await Skills.llm.generateText({
        prompt: `Review these files for bugs and security issues...`,
      });
    }
  },
});

场景二:CI 失败自动诊断

createJob({
  trigger: Triggers.github.onCIStatusUpdate({ status: "failure" }),
  async run({ event }) {
    // Agent 分析失败原因
    const diagnosis = await Skills.llm.generateText({
      prompt: `CI failed on ${event.branch}. 
Error log: ${event.logs.slice(-500)}

What's the most likely cause and fix?`,
    });

    // 确定性操作:创建 Issue 并指派
    await Skills.linear.createIssue({
      title: `CI Fix: ${event.branch}`,
      description: diagnosis.output,
      assignee: "oncall",
      priority: "high",
    });
  },
});

Claude Code 集成

Terse 提供了一个 Claude Code Skill,直接在 Claude Code 中使用 /terse:create 命令创建工作流:

npx skills add TerseAI/Terse

/terse:create a workflow that reviews PRs and creates Linear issues for config changes

这个 Skill 会自动调用 terse generate 并输出 TypeScript 代码,让你在 Claude Code 中快速创建工作流原型。

部署选项

Terse 分为控制平面(编排器、触发器、仪表盘、历史记录)和数据平面(你的工作流代码),两者可以独立放置:

部署模式控制平面数据平面适用场景
Terse CloudTerse 托管Modal 沙箱快速上手
自托管数据平面Terse 托管你的网络数据合规
完全自托管你的网络你的网络企业隔离

为什么不是纯 Agent / 纯 YAML?

对比维度纯 Agent (Claude Code)纯 YAML 工作流 (n8n)Terse 混合模式
灵活性极高 — 自由调用低 — 固定 DAG高 — 代码控制
可预测性低 — 可能乱跑高 — 确定性执行高 — 精确部分用代码
审查友好差 — 对话历史好 — YAML diff好 — TypeScript PR
安全边界弱 — 全权限强 — 固定步骤强 — 技能作用域

注意事项

  1. 仍然需要 Terse 后端——即使 CLI 是开源的,运行时依赖 Terse Cloud 或你自托管的控制平面
  2. TypeScript 经验——如果你不熟悉 TypeScript,学习曲线会比 YAML 工作流高一点
  3. API 认证——需要配置 GitHub、Linear 等集成的 OAuth/API Key
  4. 适合团队使用——单人场景下,直接调 Claude Code 可能更直接

总结

Terse 的价值不在于它是一个更好的 Agent 或更好的工作流引擎——而在于它让你在同一文件中混用两者。对于 AI 编码工具产生的海量 PR、CI 日志、配置变更,Terse 提供了一种可审查、可测试、可预测的自动化方式。

如果你已经在使用 Claude Code 或 Codex 生成大量代码,又不想完全信任 Agent 的自由调用,Terse 是一个值得尝试的中间层。

发表评论

你的邮箱地址不会被公开,带 * 的为必填项。