返回博客

如何用 API 一键部署 AI Agent?怡途Claw 实例创建到首次对话全流程

2026年7月24日阅读约 17 分钟
如何用 API 一键部署 AI Agent?怡途Claw 实例创建到首次对话全流程

不想自己搭 Docker、管模型 key、配端口计费?本文用怡途Claw 的 /api/app/* 接口,从拿 token 到发出第一条消息,四个请求跑通 AI Agent 部署全链路,附真实字段与易踩的坑。

自己搭一套 AI Agent 运行环境,要处理的事不少:Docker 镜像、模型 API key、网络端口、用量计费。怡途Claw 把这些收进了一个 SaaS 平台,对外暴露 /api/app/* 一组接口。这篇文章把「创建一个 Agent 实例并和它说上话」拆成四个 HTTP 请求,每个都带真实字段和容易踩的坑。

一、先拿到访问令牌

所有 /api/app/* 接口都要 JWT,放在 Authorization: Bearer <token>。注册和登录走这两步:

POST /api/app/auth/send-verify-code
POST /api/app/auth/login

登录成功返回 token,之后每个请求都带上它。这里有个贯穿全程的约束要先记住:APP 端的大模型配置只能「选系统提供的供应商 + 选模型」,不能自己填 baseUrlapiKey——平台替你托管了 key 和计费。想用自己的 key,得走网页端配置,APP 接口这条线不开放。这点会在第三步卡住不少人。

二、挑一个大模型供应商

创建实例前先选模型。拉供应商列表:

GET /api/app/llm/providers
Authorization: Bearer <token>

返回里每家供应商带 id(一个 UUID)、providerId(业务标识,比如 deepseek)、supportedModelsmodelPricing。怡途Claw 接了 14 家以上主流模型商,DeepSeek、通义、文心、Kimi 这些都在里面。记下你要用的那家的 id 和具体 modelId,下一步要用。

如果你不想挑,直接调 GET /api/app/llm/providers/default 拿默认供应商,省一步。

三、创建并启动实例

核心请求:

POST /api/app/instances
Authorization: Bearer <token>
Content-Type: application/json

{
  "name": "我的第一个 Agent",
  "type": "standard",
  "llmProviderId": "8f3a6c4c-3f82-4e20-a0b6-4b1a2b5e91f2",
  "llmConfig": { "modelId": "deepseek-chat" }
}

成功后返回实例 idstatus: "pending"。注意 llmConfig只放 modelId。如果你手贱传了 baseUrlapiKey

{
  "statusCode": 400,
  "message": "APP端不支持自定义大模型地址或密钥,请选择系统提供的模型供应商",
  "error": "Bad Request"
}

这是设计上的约束,不是 bug:模型 key、计费、网关都在平台侧,所以 APP 接口不暴露这些字段。providerId / llmProviderId 支持两种值——供应商的数据库主键 id(UUID)或业务标识 providerId(如 deepseek),两个都认。

实例刚建出来是 pending,要手动启动:

POST /api/app/instances/<id>/start

启动后 statusrunning。返回里有个 runtimeType 字段,告诉你这个实例跑在哪种运行时上——openclaw(标准)、hermesclaude-codecodex。不同运行时,下一步聊天接口的行为会不一样,这点很关键。

四、发第一条消息并接住流式回复

这一步最容易踩坑。发消息是异步的:

POST /api/app/chat/instances/<id>/messages
Authorization: Bearer <token>

{ "content": "你好", "sessionId": "main" }

返回里 pending: trueassistantMessage: null——别以为失败了。回复走另一条 SSE 长连接拿:

GET /api/app/chat/instances/<id>/stream?sessionId=main&slim=1
Accept: text/event-stream
Authorization: Bearer <token>

这是 text/event-stream,不是普通 GET,要用 SSE 客户端接,别拿 HTTP 轮询去硬拉。从 2026-07 起默认走 clawpilot 格式,事件分两类:event: chat 是主对话流(started / delta / final / aborted / error),event: agent 是侧信道(思考过程和工具调用)。

两个最容易漏的点:

  1. chatstate: delta 事件——agent 实时打字全靠它。漏了这个分支,用户就看不到字一个个冒出来,以为界面卡死。
  2. delta 里的 text 默认是累计全文,直接替换显示就行,别 += 拼接,否则文字会重复。只有加了 slim=1 且帧里带 patch: true 时才是真增量,这时才用 +=

工具调用走 agent 流的 tool 卡片:phase: started 建卡片,phase: result 写结果。大输出(比如一次 grep 出几十 KB)在 slim 模式下会拆成 4KB 一片的 result_chunk,按 toolCallId 拼接,chunkFinal: true 时定型——这是为了不让一帧 200KB 的 JSON 把手机主线程卡死,长回答流量也从 O(N²) 降到 O(N)。

还有一个不那么显眼的坑:runtimeType='claude-code' 的实例默认走终端 PTY,不产生 chat 事件。要让它在 SSE 通道里也冒出 run.started / message.delta 这些事件,得开 Agent Mode——单实例设 instance.metadata.useAgentMode = true,或后端 .envCLAUDE_CODE_DEFAULT_AGENT_MODE=true。这是灰度特性,接入前确认一下你的实例开没开。

收尾:查计费、停实例

跑起来就开始按 token 计费,查余额和用量:

GET /api/app/billing/balance
GET /api/app/billing/token-usage

不用了就停掉,不删不扣费:

POST /api/app/instances/<id>/stop

套餐到期会自动暂停(suspendReason: subscription_expired),续费重新激活,不续费才会被删。

这条链路之后能干什么

四个请求跑通之后,你要做的产品化东西——多实例编排、统一计费、按渠道分发——都建立在这条链路上。怡途Claw 的价值就在于:模型 key、容器、网关、计费这些脏活它都接了,你只对着 /api/app/* 写业务。想进一步把多个 Agent 编到一起统一管,实例列表、批量启停、用量统计这几个接口已经够用了,不需要再自建一套编排层。