Skip to content

REST 接口 ​

除特别说明外,所有接口都需要在请求头带上租户 API Key:

Authorization: Bearer <租户API Key>

默认地址 http://localhost:8787,演示租户 demo(apiKey 首次启动随机生成并打印在日志中)。本页供集成开发参考, 普通使用者无需关心。

启动服务端 ​

bash
# 无模型 Key 也能启动(认证/会话/接口都能测,只是对话会报错)
pnpm run server

# 带真实模型(推荐)
OPENAI_API_KEY=sk-... OPENAI_MODEL=gpt-4o-mini pnpm run server

主要环境变量:PORT(默认 8787)、DATA_DIR(默认 ./.zqagent_data)、 APPROVAL_TIMEOUT_SECONDS(审批/提问挂起超时,默认 900)、 TENANT_ID / TENANT_API_KEY / MODEL(演示租户)。

认证 ​

bash
export BASE=http://localhost:8787
export TOKEN=zk_xxxx   # 取启动日志「已创建演示租户」那一行的 apiKey

# 健康检查(公开)
curl -s $BASE/healthz                 # => {"status":"ok"}

# 无 Key → 401
curl -s -o /dev/null -w "%{http_code}\n" $BASE/api/v1/sessions   # => 401

# 正确 Key → 200
curl -s -o /dev/null -w "%{http_code}\n" -H "Authorization: Bearer $TOKEN" $BASE/api/v1/sessions

核心端点速查 ​

会话 ​

方法路径说明
GET/healthz健康检查(公开)
POST/api/v1/sessions创建会话
GET/api/v1/sessions列出会话
GET/api/v1/sessions/{id}获取会话
PATCH/api/v1/sessions/{id}重命名会话
DELETE/api/v1/sessions/{id}删除会话
GET/api/v1/sessions/{id}/state会话状态(含挂起中的审批/提问)
PATCH/api/v1/sessions/{id}/model切换会话模型
PATCH/api/v1/sessions/{id}/mode切换权限模式(plan / interactive / auto / discuss)
PATCH/api/v1/sessions/{id}/draft保存输入框草稿(传空串即清空)
POST/api/v1/sessions/{id}/turns提交任务
POST/api/v1/sessions/{id}/steer运行中补充信息
POST/api/v1/sessions/{id}/interrupt中断当前任务
POST/api/v1/sessions/{id}/resume恢复会话
GET/api/v1/sessions/{id}/events事件流(轮询或 SSE,支持 ?since= 增量)
GET/api/v1/sessions/{id}/approvals待审批列表
POST/api/v1/sessions/{id}/approvals/{aid}回答审批
GET/api/v1/sessions/{id}/questions待回答列表
POST/api/v1/sessions/{id}/questions/{qid}回答问题

项目与节点 ​

方法路径说明
GET / POST/api/v1/projects列出 / 创建项目(创建时指定工作目录)
DELETE/api/v1/projects/{id}删除项目
GET/api/v1/models可用模型列表
GET / PUT/api/v1/config查看 / 更新节点配置
GET / PUT/api/v1/node/llm查看 / 设置节点级默认模型
GET/api/v1/node/host节点主机信息
GET/api/v1/tools工具列表
GET/api/v1/mcpMCP 服务器列表
PUT/api/v1/mcp整体替换 MCP 配置(写入项目 .agent/mcp.json;平台下发时 409)
POST/api/v1/mcp/test连接测试单个 MCP 服务器(不落盘)

用量与成本 ​

方法路径说明
GET/api/v1/usage/summary用量汇总(按时间范围 / 模型)
GET/api/v1/usage/records明细记录
GET/api/v1/usage/export导出 CSV
GET / PUT/api/v1/usage/pricing查看 / 修改价格表
POST/api/v1/usage/rebuild重建汇总
POST/api/v1/usage/verify校验账本

远程接入与配对 ​

方法路径说明
GET/api/v1/fleet/status节点接入状态
POST/api/v1/fleet/enroll凭接入码接入(zqagent link 调用)
POST/api/v1/fleet/unlink解除接入
GET/api/v1/fleet/pairing获取云端接入配对信息(网关地址 + 命名空间/密钥 + nodeId)
GET / POST/api/v1/notifications查看 / 新增通知渠道
DELETE/api/v1/notifications/{id}删除通知渠道

快速上手 ​

bash
# 创建会话
curl -s -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{"model":"gpt-4o-mini"}' $BASE/api/v1/sessions
# => {"data":{"sessionId":"e4df66d6...","status":"idle",...}}

export SID=e4df66d6...   # 替换为返回的 sessionId

# 提交任务(立即返回,后台异步执行)
curl -s -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{"input":"你好,请介绍一下自己"}' $BASE/api/v1/sessions/$SID/turns
# => {"data":{"accepted":true,"status":"running"}}

# 轮询事件(since 游标增量拉取)
curl -s "$BASE/api/v1/sessions/$SID/events?since=0"

# 实时订阅(SSE)
curl -N -H "Authorization: Bearer $TOKEN" -H "Accept: text/event-stream" \
  $BASE/api/v1/sessions/$SID/events

若会话正在执行任务,POST /turns 会自动转为补充信息注入当前任务 (返回 {"data":{"accepted":true,"status":"steering"}}),而不是报错。

审批与提问 ​

模型请求有副作用的操作(写文件、执行命令等)时会挂起等待审批;调用 ask_user 等工具时 会挂起等待回答。

bash
# 查看待审批列表(id 就是工具调用 ID)
curl -s -H "Authorization: Bearer $TOKEN" $BASE/api/v1/sessions/$SID/approvals

# 回答审批:once | always_tool | always_command | deny
#   always_command 仅对 run_shell 有效
export AID=call_xxx
curl -s -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{"decision":"once"}' $BASE/api/v1/sessions/$SID/approvals/$AID

# 回答问题
curl -s -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{"answer":"继续"}' $BASE/api/v1/sessions/$SID/questions/qid_xxx

多租户隔离 ​

每个租户用自己的 API Key 访问自己的会话;用租户 A 的 Key 访问租户 B 的会话会返回 404。

错误码速查 ​

HTTPcode场景
401unauthorized无 Key / Key 无效
404not_found会话不存在 / 未知路由 / 跨租户访问
409not_running显式 steer 时会话未在运行中
409has_pending_interaction存在未决审批/提问,不能提交新任务
400bad_requestbody 非法 JSON / input 为空
400invalid_decisiondecision 非法,或对非 run_shell 提交 always_command