Terse 实战:用 TypeScript 为编码 Agent 构建确定性 + Agentic 混合工作流
用 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 Cloud | Terse 托管 | Modal 沙箱 | 快速上手 |
| 自托管数据平面 | Terse 托管 | 你的网络 | 数据合规 |
| 完全自托管 | 你的网络 | 你的网络 | 企业隔离 |
为什么不是纯 Agent / 纯 YAML?
| 对比维度 | 纯 Agent (Claude Code) | 纯 YAML 工作流 (n8n) | Terse 混合模式 |
|---|---|---|---|
| 灵活性 | 极高 — 自由调用 | 低 — 固定 DAG | 高 — 代码控制 |
| 可预测性 | 低 — 可能乱跑 | 高 — 确定性执行 | 高 — 精确部分用代码 |
| 审查友好 | 差 — 对话历史 | 好 — YAML diff | 好 — TypeScript PR |
| 安全边界 | 弱 — 全权限 | 强 — 固定步骤 | 强 — 技能作用域 |
注意事项
- 仍然需要 Terse 后端——即使 CLI 是开源的,运行时依赖 Terse Cloud 或你自托管的控制平面
- TypeScript 经验——如果你不熟悉 TypeScript,学习曲线会比 YAML 工作流高一点
- API 认证——需要配置 GitHub、Linear 等集成的 OAuth/API Key
- 适合团队使用——单人场景下,直接调 Claude Code 可能更直接
总结
Terse 的价值不在于它是一个更好的 Agent 或更好的工作流引擎——而在于它让你在同一文件中混用两者。对于 AI 编码工具产生的海量 PR、CI 日志、配置变更,Terse 提供了一种可审查、可测试、可预测的自动化方式。
如果你已经在使用 Claude Code 或 Codex 生成大量代码,又不想完全信任 Agent 的自由调用,Terse 是一个值得尝试的中间层。