适用版本:ChengOS v0.1.0+ | 最后核对:2026-08-12 | 来源:
crates/cheng-api/src/rest/routes.rs、crates/cheng-api/src/rest/dto/common.rs、crates/cheng-api/src/middleware/workspace_context.rs
ChengOS 中的一切都与同一个后端服务 cheng-api 通信。编辑器、对话网关和 cheng CLI 都只是本文所述 API 的普通客户端——不存在什么它们专用、而你无法使用的私有接口。
基础地址与约定
带版本的接口位于 /api/v1 之下。对默认安装而言就是 http://127.0.0.1:3000/api/v1。
有几个路由被刻意放在版本前缀之外,因为它们属于基础设施而非产品 API:
| 路径 | 用途 |
|---|---|
GET /health |
存活检查。用于负载均衡器和 chengos.sh status。 |
GET /ready |
就绪检查,包含数据存储连通性。 |
GET /metrics |
Prometheus 指标。按 Prometheus 惯例不做认证。 |
/ws/executions |
执行事件的 WebSocket 流。 |
/mcp |
应用级 MCP 服务,仅在 MCP_ENABLED=true 时挂载。 |
请求与响应体都是 JSON,字段名使用 camelCase,尽管后端是 Rust。登录响应形如 {"token": …, "refreshToken": …, "expiresIn": 3600}。
认证
多数接口需要 JWT。通过 POST /api/v1/auth/login 获取:
curl -X POST http://127.0.0.1:3000/api/v1/auth/login \
-H 'Content-Type: application/json' \
-d '{"email": "you@example.com", "password": "…"}'
{
"token": "eyJhbGciOi…",
"refreshToken": "eyJhbGciOi…",
"expiresIn": 3600,
"user": { "id": "…", "email": "…", "username": "…" }
}
之后每个请求都要带上该令牌:
Authorization: Bearer <token>
访问令牌一小时后过期。请用 POST /api/v1/auth/refresh 换取新令牌,而不是重新登录。POST /api/v1/auth/logout 返回 204,且只作用于客户端——它是在告诉你丢弃令牌,并不会在服务端吊销它。
认证接口的其余部分:
| 接口 | 用途 |
|---|---|
GET /auth/bootstrap-status |
该安装是否已有用户(needsSetup)。用于驱动首次初始化流程。 |
POST /auth/register |
创建账号,受该部署的注册策略约束。 |
GET /auth/validate |
仅校验令牌,不做其他事。 |
GET /auth/me |
当前用户。 |
POST /auth/password/forgot · /reset · /change |
密码生命周期。重置邮件需要 EMAIL_ENABLED。 |
另外三种凭证类型
JWT 并不是唯一的入口,混淆它们是 401 的常见来源:
- 渠道密钥(
chk_前缀)用于外部渠道适配器——WhatsApp、Telegram、Slack 等——的认证,且仅对/api/v1/channel/*有效。它们以凭证形式存储,不携带任何用户会话。 - WebSocket 票据(
chtk_前缀)由已认证的渠道 REST 接口签发,在 WebSocket 升级时一次性消费。它们存在的意义就是让渠道密钥永远不出现在 URL 中。 - MCP 令牌用于 MCP 服务的认证,可以是数据库托管的(推荐),也可以是静态的
MCP_SERVER_TOKEN。
选择工作区
几乎所有资源都归属于某个工作区。为了不必在每个路径里重复工作区,已认证的请求通过请求头携带它:
X-Workspace-Id: <workspace-uuid>
这个头会被授权校验,而不只是读取:中间件在认证之后运行,如果调用方对请求头中指定的工作区没有访问权限,请求会被拒绝。传入一个你看不到的工作区 id 会得到 403,而不是悄悄回落到某个默认工作区。
主要接口分组
| 前缀 | 覆盖内容 |
|---|---|
/workflows |
创建、读取、更新、删除、复制、导出;收藏;模板标记;按工作流的 LLM 节点配置。GET /workflows/templates 是公开且无需认证的。 |
/executions |
发起运行并检视:POST /executions 运行,然后是 /:id、/:id/logs、/:id/trace-snapshot、/active、/history。通过 /:id/cancel、/:id/pause、/:id/resume、/:id/approve 控制。 |
/nodes |
节点目录及其 JSON Schema。读取公开,写入需要认证。 |
/workspaces |
工作区,以及嵌套的 /members、/settings、/knowledge-bases、/channels、/channel-keys。 |
/credentials |
加密的凭证库。 |
/documents · /tables |
文档与电子表格工作区。 |
/skills · /skill-registry |
已安装的技能,以及通往公共注册中心的桥接。 |
/schedules |
定时与触发式运行。仅在配置了调度器时挂载。 |
/mcp/servers |
MCP 服务注册表。仅在 MCP 状态可用时挂载。 |
/llm · /tools · /settings · /analytics · /i18n |
模型供应商、工具元数据、实例设置、用量分析,以及节点界面的翻译包。 |
/channel |
渠道适配器入口。由 chk_ 密钥认证,而非 JWT。 |
有两组是条件挂载的——/schedules 和 /mcp/servers。如果它们在一个其他方面都健康的系统上返回 404,那是功能未配置,而不是出了故障。
分页
列表接口接受 offset 与 limit 查询参数。limit 默认为 20,并且被限制到最大 100——请求更多不会报错,你只会拿到 100 条。limit 为 0 会被当作默认值处理,而不是返回空页。在支持的地方,sortBy 与 order(asc / desc)控制排序。
响应会包裹整页:
{
"total": 137,
"items": [ … ],
"hasMore": true,
"offset": 0,
"limit": 20
}
请使用 hasMore,而不要拿 offset + limit 与 total 比较;前者已经把实际返回的条数计算在内了。
错误
所有错误共用一个信封:
{
"code": "VALIDATION_ERROR",
"message": "供人阅读的描述",
"details": { },
"timestamp": "2026-08-12T10:30:00Z",
"requestId": "…"
}
请匹配 code 而不是 message——message 是给人看的,措辞可能变化。requestId 是把客户端故障与服务端日志对应起来时应当引用的值。
有一个 code 值得特别说明:403 DEMO_MODE_RESTRICTED 表示该安装正以 CHENG_DEMO_MODE=true 运行,按白名单拒绝写入与执行。它反映的是配置,而不是你账号的权限问题。
实时执行事件
工作流运行通过 /ws/executions 以 WebSocket 流式推送,也可以从 /api/v1/ws/executions 访问。使用 JWT 认证,可放在 Authorization 请求头中,也可以作为 ?token= 查询参数传入;渠道客户端则改用 ?ticket=chtk_… 连接。该流承载节点级进度、流式节点的增量输出以及终态,这正是编辑器实时执行视图得以工作的原因。

暂无评论内容