# API Interface Reference 本文档是 `xworkmate-bridge` 当前运行入口与对外协议契约的唯一真相来源,按实际代码整理。 覆盖范围: - `xworkmate-go-core serve` 暴露的 bridge HTTP / WebSocket API - `xworkmate-go-core acp-stdio` 暴露的 stdio ACP bridge - `xworkmate-go-core gemini-acp-adapter` 暴露的 Gemini adapter HTTP / WebSocket API - `main.go` 默认模式下 `toolbridge.Run` 暴露的本地工具桥协议 不覆盖: - 仅存在于内部包、但未作为外部入口挂载的 helper - 作为 bridge 内部实现细节的 provider-specific upstream URL 契约 ## 1. Runtime Entry Points 二进制入口在 [main.go](../main.go) 中定义。 | 模式 | 命令 | 作用 | | --- | --- | --- | | Bridge HTTP / WS | `./build/bin/xworkmate-go-core serve` | 启动 canonical bridge,对外暴露 `/acp/rpc` 与 `/acp`,并附带健康检查。 | | ACP stdio | `./build/bin/xworkmate-go-core acp-stdio` | 通过 stdin/stdout 提供 ACP bridge。 | | Gemini adapter | `./build/bin/xworkmate-go-core gemini-acp-adapter` | 把 Gemini CLI / Gemini ACP stdio 封装成 HTTP / WebSocket ACP 服务。 | | Tool bridge | `./build/bin/xworkmate-go-core` | 默认模式;暴露本地工具桥协议,不挂 bridge HTTP 路由。 | ## 2. Bridge `serve` Mode ### 2.1 Canonical origin 与 listen 地址 - APP-facing canonical public origin: `https://xworkmate-bridge.svc.plus` - 默认 listen 地址:`127.0.0.1:8787` - 读取环境变量:`ACP_LISTEN_ADDR` ### 2.2 实际挂载路由 `serve` 模式当前由 `internal/acp.Server.Handler()` 实际挂载以下路径: | Path | Method / Protocol | Auth | 用途 | | --- | --- | --- | --- | | `/` | `GET` | 否 | 纯文本运行状态探针,返回 `xworkmate-bridge is running`。 | | `/api/ping` | `GET` | 否 | 返回镜像、tag、commit、version 等版本信息。 | | `/bridge/bootstrap/health` | `GET` | 否 | bootstrap 健康检查,返回 `bridgeOrigin`。 | | `/acp/rpc` | `POST` | 是 | JSON-RPC over HTTP 主入口。 | | `/acp/rpc` | `OPTIONS` | 否 | CORS 预检。 | | `/acp` | `GET` + WebSocket upgrade | 是 | JSON-RPC over WebSocket 主入口。 | 其他路径返回 `404 Not Found`。 ### 2.3 Auth、Origin 与 CORS bridge 的认证与跨域规则来自: - `ACP_AUTH_TOKEN` - `ACP_ALLOWED_ORIGINS` 默认 allowed origins: - `https://xworkmate.svc.plus` - `http://localhost:*` - `http://127.0.0.1:*` 规则: - `/acp/rpc` 与 `/acp` 都要求 origin 通过 allowlist 校验。 - 空 `Origin` 默认允许。 - `:*` 表示前缀匹配,例如 `http://localhost:*`。 - auth 使用 bearer header。 - 如果 `ACP_AUTH_TOKEN` 为空,则接受任意非空 bearer header。 - 如果 `ACP_AUTH_TOKEN` 非空,则必须匹配裸 token 或 `Bearer `。 错误行为: - origin 不允许:HTTP `403`,JSON-RPC error code `-32003` - bearer 缺失或不合法:HTTP `401`,JSON-RPC error code `-32001` - 非 `POST` 请求打到 `/acp/rpc`:HTTP `405`,JSON-RPC error code `-32600` ### 2.4 JSON-RPC envelope HTTP 与 WebSocket 统一使用 JSON-RPC 2.0 结构: ```json { "jsonrpc": "2.0", "id": "req-1", "method": "acp.capabilities", "params": {} } ``` 成功响应: ```json { "jsonrpc": "2.0", "id": "req-1", "result": {} } ``` 错误响应: ```json { "jsonrpc": "2.0", "id": "req-1", "error": { "code": -32601, "message": "unknown method: ..." } } ``` ### 2.5 HTTP streaming 当 `/acp/rpc` 的 `Accept` 包含 `text/event-stream` 时: - 中间通知通过 SSE `data: ...` 推送 - 最终结果也通过 SSE 发出 - 非流式场景则返回普通 `application/json` ## 3. Bridge HTTP Route Details ### 3.1 `GET /` - Auth:不需要 - 返回:`text/plain; charset=utf-8` - 内容:`xworkmate-bridge is running` ### 3.2 `GET /api/ping` - Auth:不需要 - 返回:`application/json` - 返回结构: ```json { "status": "ok", "image": "full-image-ref-or-empty", "tag": "tag-or-empty", "commit": "commit-or-empty", "version": "version-or-empty" } ``` 说明: - 版本信息来自环境变量 `IMAGE` - `IMAGE` 会被解析成 `image` / `tag` / `commit` / `version` ### 3.3 `GET /bridge/bootstrap/health` - Auth:不需要 - 返回:`application/json` - 返回结构: ```json { "ok": true, "bridgeOrigin": "https://xworkmate-bridge.svc.plus", "issuedBy": "xworkmate-bridge" } ``` 说明: - `bridgeOrigin` 读取 `BRIDGE_PUBLIC_BASE_URL` - 默认值:`https://xworkmate-bridge.svc.plus` ## 4. Bridge JSON-RPC Methods 未知方法统一返回: - JSON-RPC error code `-32601` - message 形如 `unknown method: ` ### 4.1 `acp.capabilities` 用途:返回 bridge 当前可用能力、provider catalog、gateway provider catalog 和 APP-facing execution target 列表。 必填参数:无 可选参数:无 返回结构: ```json { "singleAgent": true, "multiAgent": true, "availableExecutionTargets": ["agent", "gateway"], "providerCatalog": [ { "providerId": "codex", "label": "Codex", "targets": ["agent"] }, { "providerId": "opencode", "label": "OpenCode", "targets": ["agent"] }, { "providerId": "gemini", "label": "Gemini", "targets": ["agent"] } ], "gatewayProviders": [ { "providerId": "openclaw", "label": "OpenClaw", "targets": ["gateway"], "providerDisplay": { "logoEmoji": "🦞" } } ], "capabilities": { "single_agent": true, "multi_agent": true, "availableExecutionTargets": ["agent", "gateway"], "providerCatalog": [...], "gatewayProviders": [...] } } ``` 失败条件: - 一般不返回 RPC error;只要请求合法即给出当前 bridge 视角能力。 ### 4.2 `session.start` 用途:开始一个新任务 session;如果相同 `sessionId` 已存在,会 reset 该 session。 必填参数: - `sessionId: string` - `routing: object` 常用可选参数: - `threadId: string` - `taskPrompt: string` - `workingDirectory: string` - `attachments: []` - `aiGatewayBaseUrl: string` - `aiGatewayApiKey: string` `routing` 常见字段: - `routingMode` - `preferredGatewayProviderId` - `explicitExecutionTarget` - `explicitProviderId` - `explicitModel` - `explicitSkills` - `allowSkillInstall` - `installApproval` - `availableSkills` 返回结构: - 所有成功结果都会被 bridge 补齐 routing 元数据: - `resolvedExecutionTarget` - `resolvedProviderId` - `resolvedGatewayProviderId` - `resolvedModel` - `resolvedSkills` - single-agent 成功时通常包含: - `success: true` - `turnId: string` - `mode: "single-agent"` - `provider: string` - 可能包含 `effectiveWorkingDirectory`、`output`、`workspace`、artifact metadata - multi-agent 成功时通常包含: - `success: true` - `summary: string` - `finalScore: number` - `iterations: number` - `turnId: string` - `mode: "multi-agent"` - gateway 成功时至少保证: - `turnId` - `mode: "gateway-chat"` - 其余字段取决于 gateway payload 失败条件: - 缺少 `sessionId`:`-32602` - 缺少 `routing`:`-32602`,message 为 `ROUTING_REQUIRED` - routing 标记 unavailable:返回 `success: false` 与 `unavailable*` 字段 - single-agent provider 未被 bridge 广告:返回 `success: false` - multi-agent 缺少 `aiGatewayApiKey`:返回 `success: false` 通知: - 执行期间会通过 `session.update` 推送状态与步骤更新 ### 4.3 `session.message` 用途:继续已有 session 的下一轮消息。 必填参数: - `sessionId: string` - `routing: object` 可选参数: - 与 `session.start` 基本一致 返回结构: - 与 `session.start` 相同;bridge 会复用 session 历史,尤其在 multi-agent 与 Gemini adapter 路径中。 失败条件: - 缺少 `sessionId`:`-32602` - 缺少 `routing`:`-32602` ### 4.4 `session.cancel` 用途:取消活跃 session。 必填参数: - `sessionId: string` 返回结构: ```json { "accepted": true, "cancelled": true } ``` 失败条件: - 缺少 `sessionId`:`-32602` ### 4.5 `session.close` 用途:关闭 session 状态。 必填参数: - `sessionId: string` 返回结构: ```json { "accepted": true, "closed": true } ``` 失败条件: - 缺少 `sessionId`:`-32602` ### 4.6 `xworkmate.dispatch.resolve` 用途:根据候选 providers、required capabilities 和 node state 选择 provider,并返回 dispatch metadata。 必填参数: - 无强制必填;空输入也会返回结构化结果 常用参数: - `providers: []` - `preferredProviderId: string` - `requiredCapabilities: []string` - `nodeState: object` - `nodeInfo: object` 返回结构: ```json { "providerId": "codex", "provider": { "id": "codex", "name": "Codex", "defaultArgs": [], "capabilities": [] }, "agentId": "optional-agent-id", "metadata": { "node": {...}, "dispatch": {...}, "bridge": {...}, "provider": {...} } } ``` 失败条件: - 不走 RPC error;provider 选不到时 `providerId` / `provider` 可能为空。 ### 4.7 `xworkmate.routing.resolve` 用途:只做 routing resolve,不执行任务。 必填参数: - `routing: object` 常用参数: - `taskPrompt` - `workingDirectory` - `aiGatewayBaseUrl` - `aiGatewayApiKey` 返回结构: ```json { "ok": true, "resolvedExecutionTarget": "single-agent", "resolvedProviderId": "codex", "resolvedGatewayProviderId": "", "resolvedModel": "", "resolvedSkills": [], "skillResolutionSource": "local_match", "needsSkillInstall": false, "unavailable": false } ``` 失败条件: - 若未提供 `routing`,bridge 层不会对该方法报错,但返回的 resolved 结果可能为空。 - unavailable 场景通过 `unavailable` / `unavailableCode` / `unavailableMessage` 表达。 ### 4.8 `xworkmate.provider.probe` 用途:通过 bridge 对外探测某个 advertised provider 的 `acp.capabilities`。 必填参数: - `providerId: string` 返回结构: 成功: ```json { "success": true, "providerId": "codex", "probeMethod": "acp.capabilities", "capabilities": {} } ``` provider 未广告: ```json { "success": false, "providerId": "codex", "error": "provider is not advertised by the bridge" } ``` 失败条件: - 缺少 `providerId`:`-32602` - upstream probe 失败:返回 `success: false` 与 error 文本 ### 4.9 `xworkmate.mounts.reconcile` 用途:对 Codex / Claude / Gemini / OpenCode / OpenClaw / ARIS 的 mount 与 MCP 状态做统一 reconcile。 必填参数:无 常用参数: - `config` - `aiGatewayUrl` - `configuredCodexCliPath` - `codexHome` - `opencodeHome` - `openClawHome` - `aris` 返回结构: ```json { "mountTargets": [ { "targetId": "codex", "label": "Codex", "available": true, "supportsSkills": true, "supportsMcp": true, "supportsAiGatewayInjection": true, "discoveryState": "ready", "syncState": "ready", "discoveredSkillCount": 0, "discoveredMcpCount": 2, "managedMcpCount": 1, "detail": "..." } ], "arisBundleVersion": "optional", "arisCompatStatus": "idle" } ``` 失败条件: - 不通过 RPC error 暴露;目标缺失或配置异常通过每个 mount target 的 `available` / `discoveryState` / `syncState` / `detail` 体现。 ### 4.10 `xworkmate.gateway.connect` 用途:把 bridge runtime 连接到 gateway provider。 必填参数: - `runtimeId: string` 常用参数: - `gatewayProviderId: string` - `clientId` - `locale` - `userAgent` - `connectAuthMode` - `connectAuthFields` - `connectAuthSources` - `hasSharedAuth` - `hasDeviceToken` - `endpoint` - `packageInfo` - `deviceInfo` - `identity` - `auth` 返回结构: ```json { "ok": true, "snapshot": {}, "auth": {}, "returnedDeviceToken": "optional", "error": {} } ``` 说明: - 当 `gatewayProviderId` 为空时默认使用 `openclaw` - 对 `openclaw` 会应用 bridge-owned production routing 失败条件: - 缺少 `runtimeId`:通过 result 中 `ok: false` 与 `error.code = "INVALID_RUNTIME_ID"` 表达 - 建连失败:`ok: false`,错误信息写入 `error` ### 4.11 `xworkmate.gateway.request` 用途:向已连接的 gateway runtime 发送请求。 必填参数: - `runtimeId: string` - `method: string` 可选参数: - `params: object` - `timeoutMs: number` 返回结构: ```json { "ok": true, "payload": {}, "error": {} } ``` 失败条件: - runtime 不在线:`ok: false`,`error.code = "OFFLINE"` - request timeout:`ok: false`,错误消息包含 timeout ### 4.12 `xworkmate.gateway.disconnect` 用途:断开 gateway runtime。 必填参数: - `runtimeId: string` 返回结构: ```json { "accepted": true } ``` 失败条件: - 无 RPC error;如果 runtime 不存在,视为幂等接受。 ## 5. Bridge Notifications ### 5.1 `session.update` bridge 在 session 执行期间会通过 `session.update` 推送通知,统一 envelope: ```json { "jsonrpc": "2.0", "method": "session.update", "params": { "sessionId": "s1", "threadId": "t1", "turnId": "turn-...", "seq": 1 } } ``` 常见 payload 字段: - `type` - `event` - `message` - `pending` - `error` - `mode` - `title` - `role` - `iteration` - `score` ## 6. ACP stdio Mode `acp-stdio` 模式使用 `internal/acp.RunStdio`,通过 stdin/stdout 提供 ACP bridge。 特点: - 不挂 HTTP 路由 - 不处理 CORS / origin - 协议方法族与 bridge 主控面一致,仍由 `internal/acp` 管理 session / routing / execution ## 7. Gemini Adapter ### 7.1 Listen 与路由 - 默认 listen:`127.0.0.1:8791` - 环境变量:`GEMINI_ADAPTER_LISTEN_ADDR` 实际挂载路由: | Path | Method / Protocol | Auth | 用途 | | --- | --- | --- | --- | | `/acp/rpc` | `POST` | 取决于 `GEMINI_ADAPTER_AUTH_TOKEN` | Gemini adapter JSON-RPC HTTP 入口 | | `/acp/rpc` | `OPTIONS` | 否 | CORS 预检 | | `/acp` | `GET` + WebSocket upgrade | 取决于 `GEMINI_ADAPTER_AUTH_TOKEN` | Gemini adapter WebSocket 入口 | ### 7.2 Auth 与 origin 相关环境变量: - `GEMINI_ADAPTER_AUTH_TOKEN` - `GEMINI_ADAPTER_ALLOWED_ORIGINS` 规则: - 如果 `GEMINI_ADAPTER_AUTH_TOKEN` 为空,则 adapter 默认不强制 auth - 如果配置了 token,则要求 bearer 校验通过 - allowed origins 默认与 bridge 类似:`https://xworkmate.svc.plus,http://localhost:*,http://127.0.0.1:*` ### 7.3 Gemini adapter methods 支持的方法: - `acp.capabilities` - `session.start` - `session.message` - `session.cancel` - `session.close` - `gemini.initialize` - `gemini.raw` 未知方法不会返回 RPC error,而是返回: ```json { "success": false, "error": "unsupported method: ..." } ``` #### `acp.capabilities` 用途:返回 adapter 自身 provider 信息以及 Gemini 上游 initialize 结果的摘要。 返回结构: - `singleAgent: true` - `multiAgent: false` - `providers: [providerId]` - `capabilities.single_agent = true` - `provider.id` / `provider.label` - `upstream` 字段包含 Gemini initialize 信息摘要 #### `session.start` / `session.message` 用途:向 Gemini ACP upstream 转发,或在兼容模式下回退到本地 prompt runner。 常用参数: - `sessionId` - `taskPrompt` - `model` - `workingDirectory` 返回结构: - 成功时为 Gemini upstream result 或兼容模式汇总结果 - adapter 会维护 `adapterSession.history` #### `session.cancel` 返回固定结构: ```json { "accepted": true, "cancelled": false } ``` #### `session.close` 必填参数: - `sessionId` 返回: ```json { "accepted": true, "closed": true } ``` #### `gemini.initialize` 用途:显式暴露 Gemini upstream initialize 结果。 #### `gemini.raw` 用途:直接向 Gemini upstream 调方法。 常用参数: - `method` - `params` 如果缺少 `method`,返回: ```json { "success": false, "error": "method is required" } ``` ## 8. Tool Bridge Default Mode 默认模式下 `toolbridge.Run` 通过 stdin/stdout 暴露本地工具桥协议。 ### 8.1 协议特点 - 支持换行分隔 JSON - 也支持 `Content-Length` frame - 无 HTTP / WebSocket 外壳 ### 8.2 支持的方法 - `initialize` - `ping` - `tools/list` - `tools/call` ### 8.3 `tools/list` 当前固定暴露三个工具: - `chat` - `claude_review` - `vault_kv` ### 8.4 `tools/call` 参数结构: ```json { "name": "chat", "arguments": {} } ``` 成功时返回 text tool result;失败时返回 `isError: true` 的 tool result 或 `-32601` / `-32602` error response。 ## 9. Environment Variables ### 9.1 Bridge `serve` | 变量 | 默认值 | 作用 | | --- | --- | --- | | `ACP_LISTEN_ADDR` | `127.0.0.1:8787` | bridge listen 地址 | | `ACP_AUTH_TOKEN` | 空 | bridge bearer 校验 token | | `ACP_ALLOWED_ORIGINS` | `https://xworkmate.svc.plus,http://localhost:*,http://127.0.0.1:*` | bridge allowed origins | | `ACP_MULTI_AGENT_ENABLED` | `true` | `acp.capabilities` 中的 `multiAgent` 开关 | | `ACP_MULTI_AGENT_MODEL` | `gpt-4o` | multi-agent 默认模型 | | `BRIDGE_PUBLIC_BASE_URL` | `https://xworkmate-bridge.svc.plus` | bootstrap health 中的 public base URL | | `INTERNAL_SERVICE_TOKEN` | 空 | upstream provider / gateway 优先使用的内部服务 token | | `BRIDGE_AUTH_TOKEN` | 空 | `INTERNAL_SERVICE_TOKEN` 的 fallback,用于 upstream forwarding | | `IMAGE` | 空 | `/api/ping` 版本信息来源 | ### 9.2 Gemini adapter | 变量 | 默认值 | 作用 | | --- | --- | --- | | `GEMINI_ADAPTER_LISTEN_ADDR` | `127.0.0.1:8791` | Gemini adapter listen 地址 | | `GEMINI_ADAPTER_BIN` | 继承 `ACP_GEMINI_BIN`,再回退到 `gemini` | Gemini CLI 二进制 | | `ACP_GEMINI_BIN` | `gemini` | Gemini CLI fallback binary | | `GEMINI_ADAPTER_ARGS` | `--experimental-acp` | Gemini CLI 启动参数 | | `GEMINI_ADAPTER_PROTOCOL_VERSION` | `1` | Gemini initialize 协议版本 | | `GEMINI_ADAPTER_AUTH_TOKEN` | 空 | Gemini adapter bearer token | | `GEMINI_ADAPTER_PROVIDER_ID` | `gemini` | adapter provider ID | | `GEMINI_ADAPTER_PROVIDER_LABEL` | `Gemini` | adapter provider label | | `GEMINI_ADAPTER_ALLOWED_ORIGINS` | `https://xworkmate.svc.plus,http://localhost:*,http://127.0.0.1:*` | adapter allowed origins | | `GEMINI_ADAPTER_UPSTREAM_METHOD` | 空 | adapter 上游方法覆盖 | ### 9.3 Shared / provider command / tools | 变量 | 默认值 | 作用 | | --- | --- | --- | | `ACP_CODEX_BIN` | `codex` | Codex CLI binary | | `ACP_OPENCODE_BIN` | `opencode` | OpenCode CLI binary | | `ACP_CLAUDE_BIN` | `claude` | Claude CLI binary | | `ACP_GEMINI_BIN` | `gemini` | Gemini CLI binary | | `ACP_FIND_SKILLS_BIN` | 空 | 外部 skills finder 二进制 | | `ACP_INSTALL_SKILL_BIN` | 空 | 外部 skills installer 二进制 | | `LLM_API_KEY` | 空 | `chat` 工具使用的 OpenAI-compatible API key | ## 10. 代码定位 - [main.go](../main.go) - [internal/acp/server.go](../internal/acp/server.go) - [internal/acp/web_contract.go](../internal/acp/web_contract.go) - [internal/acp/bootstrap.go](../internal/acp/bootstrap.go) - [internal/acp/gateway_runtime.go](../internal/acp/gateway_runtime.go) - [internal/acp/provider_catalog.go](../internal/acp/provider_catalog.go) - [internal/acp/execution.go](../internal/acp/execution.go) - [internal/geminiadapter/server.go](../internal/geminiadapter/server.go) - [internal/toolbridge/runner.go](../internal/toolbridge/runner.go)