2026-10-09 整理,服务周目标一「AI 助手与外部 Agent 协作技术方案」(周目标原文未入库,三项周目标见 10/16 结项待办「周目标」一条),对应 multica AIC-2693 的子任务「Agent 平台接入对比分析」。2026-10-10 按 1010 会补「接入卡点」,并与 ndclaw 对接报告、技术方案对齐。
要回答的问题:团团拆完任务后,要把任务派给公司内的 Agent 平台执行,再把结果取回来。三个候选平台各自支持什么调用协议?怎么鉴权、怎么代用户调用、怎么多轮、怎么传文件?接入前提和代价是什么?
方法:只读各平台仓库的代码与仓库内文档,没有调用任何线上接口。结论都附代码位置,并固定到以下提交(均在 GitHub
ndhy-app-web组织下):
平台 仓库 提交 ndclaw(Agent Hub) agent-hub / agent-hub-daemon / ai-hub-webui e243c5cb(09-30)/b6b1fb64(09-28)/ae508af8(09-28)AI 员工 agentia-engine 9070fa9(10-09)OpenQ 多智能体平台 openq-ai-manager(master) 6d92193(09-11)标「推断」的是读代码得出、未经实测的判断;标「待确认」的要问平台方。
只有 ndclaw 支持 A2A
协议,并且已经做到生产可用。AI
员工代码里的「a2a」是内部任务模式的名字;OpenQ 里的
agent_card 指对话里的工具卡。两者都不是
A2A 协议。
三家用的是三种协议:
三家都具备「派单 → 看进度 → 多轮续接 → 取结果」这几个动作,所以团团可以用一个统一的适配接口,加三个适配器来对接,抽象层不用改。
能不能「代用户调用」决定了能不能直接接。团团是平台服务,要代平台上的很多用户调用:
Userid)和 AI 员工(HMAC +
X-On-Behalf-Of)都支持;文件和图片:ndclaw 和 OpenQ 执行 Agent 时只取文本,图片和文件会被丢掉。只有 AI 员工有正式的附件字段和产物下载链接。ndclaw 有现成的变通办法:把文件链接写进正文。
建议:10/16 只接 ndclaw,承接直播电商场景的 9 个专家。AI 员工和 OpenQ 在技术方案里写清适配路线和接入前提,下周不实现。
| 维度 | ndclaw(Agent Hub) | AI 员工(agentia-engine) | OpenQ(openq-ai-manager) |
|---|---|---|---|
| 技术栈 | Python/FastAPI(agent-hub)+ AWS Fargate 每会话一个容器(daemon) | Go/gin | Next.js(基于开源 LobeHub 二次开发) |
| 调用协议 | A2A:JSON-RPC 与 REST 两种绑定 | 私有 REST:/api/s2s/* |
OpenResponses:POST /api/v1/responses;另有
LobeHub OpenAPI |
| 发现执行方 | GET /a2a/experts(自定义扩展),之后拿到标准的
agent-card.json |
GET /api/s2s/positions(AI 员工目录) |
GET /api/v1/agents(OpenAPI) |
| 服务鉴权 | BTS 签名 | S2S HMAC 签名。管理员线下发一次性票据,调用方用它换服务密钥 | 执行接口没有服务级鉴权;BTS/UC MAC 只用在周边接口上 |
| 代用户调用 | ✅ Userid 头 |
✅ X-On-Behalf-Of 头(本地用户 ID 或 UC 身份) |
❌ 只认用户自己的 API Key 或 OIDC |
| 用户开户 | 用户第一次调用时自动召唤专家副本、申请实例;平台字典配置每天自动开通 4000 个,等于不限,无需审核(林炜 10/10 确认) | ❌ 不会自动开户,用户必须已经在 AI 员工平台上 | UC 登录时自动开户 |
| 执行 | SendMessage(同步)/SendStreamingMessage(流式) |
POST /api/s2s/tasks(positionId
指定员工) |
POST /api/v1/responses(model 填 Agent
ID) |
| 流式 | ✅ SSE | ❌ 只能轮询 GET /:id、/:id/messages |
✅ SSE(stream: true) |
| 多轮 | 沿用同一个 contextId |
回答提问 /answer、追加要求
/follow-ups、确认计划 /confirm、继续
/continue |
previous_response_id(内部对应同一个话题) |
| 中止 | CancelTask |
/abort |
未见对应接口(待确认) |
| 文件和图片 | ❌ 只收发纯文本;变通办法是把 📎 [名](url)
写进正文 |
✅ 有附件字段 attachments,产物可以取临时下载链接 |
❌ 请求格式里定义了图片和文件,但服务端只取文本 |
| 冷启动 | 一般 40~60 秒,A2A 预热上限 300 秒(ndclaw 对接手册) | 走任务队列(推断:没有容器冷启动) | 走进程内的 Agent 运行时(推断:没有容器冷启动) |
| 用量查询 | 未见对外接口 | GET /:id/token-stats |
有余额和模型令牌接口(/api/v1/balance、llm_token) |
| 费用记在谁头上 | 模型用量记在 ndclaw 的 token 组下,按 UC 用户号区分;算力在 AI Hub 的 AWS 账号上。AgentHub 负责人已同意「可以先用」,以后会加一个 service code 之类的租户字段来拆分账单(10-09);多租户开发报价 3 人日、由我方下单(1009 晚会) | 有计费和权益模块,记在谁头上待确认 | 有余额和计费流程,推断扣的是被代用户的余额,待确认 |
| 接入卡点(都要对方配合) | 打开 A2A、给我方 BTS 应用授权,配置为主(ndclaw 报告 1.4 待办 1) | 发 S2S 票据;我方用户在 AI 员工平台没有账号、又不会自动开户;代用户调用时扣谁的额度 | /responses 只认用户自己的 API Key 或 OIDC,要对方加 BTS
鉴权并能指定用户;图片和文件输入不支持 |
| 10/16 前 | 接入 | 只写方案 | 只写方案 |
协议:agent-hub 里有一个 A2A
服务端(app/domain/a2a_server/),每个专家都是一个独立的
A2A Agent,地址挂在 /a2a/experts/{agent_ref}/...
下。消息交互层完全按 A2A
标准实现:SendMessage、GetTask、CancelTask、JSON-RPC
2.0、用 contextId 做多轮、产物放在 artifacts
里。谷歌 ADK 和 a2a-js
两套客户端都实际对接过。自定义只有两处:专家目录,以及按请求选模型(metadata.model)。(docs/a2a/integration-guide.md、docs/a2a/2026-08-12-a2a-protocol-conformance.md)
鉴权:只认
Authorization: BTS id=...,nonce=...,mac=... 加
Userid: <纯数字>。Userid
表示代哪个用户调用,后面所有的归属判断都按它来。名片
agent-card.json
不需要鉴权。(app/domain/a2a_server/middleware.py)
专家:分两种,mkt-
是市场上的公共专家,exp- 是用户自己的副本。用户第一次给
mkt- 专家发消息时,会自动召唤成自己的 exp-
副本,不同用户的副本互相隔离。专家由人设提示词
persona_md、技能列表和引擎组成;引擎默认 openclaw,也支持
hermes 和
claude-code;有批量导入功能。(app/domain/expert_hub/models.py:70,76、import_batch.py)
执行链:
chat.send;WORKING,结束时写入 artifacts 并置为
COMPLETED,出错置为 FAILED。(app/domain/a2a_server/executor.py:57-99)
文件和图片:收到的消息只取文本(executor.py:183);转发给引擎时只带会话标识、文本和去重键(gateway_ws.py:116-119);返回结果固定是一段
text/plain(executor.py:70-71);Agent Card
也只声明了文本(card.py:16,62-63)。ndclaw
自己的前端传文件的办法是:先上传到 ndclaw 网盘换签名链接,再把
📎 [文件名 | 大小](url) 写进正文。(ai-hub-webui
src/hooks/useAttachments.ts)
冷启动与资源:
cdk.json)。README.md「冷启动延迟优化」)费用:daemon 用 BTS 向公司 AI 网关的
/v1/key 申请密钥,申请时 username 填 UC
用户号、token_group 填 ndclaw 的组。所以模型用量记在 ndclaw
的 token 组下。(daemon
lambda/shared/ai_gateway_runtime_prep.py:86-123)
接入前提:
A2A_ENABLED,各租户还有单独开关);协议:不支持 A2A 协议。仓库里没有
agent-card,也没有 message/send。代码里的
a2a、a2a_agent、a2a_employee、ensemble
是内部任务模式的名字(AGENTS.md 第 6
节)。运维文档里的「AIHub A2A MCP」是 AI
员工作为调用方去调 AI Hub
的工作流和对话工具,方向和我们需要的相反。(docs/operations/aihub-a2a-mcp.md)
对外接口:给外部服务调用的私有 REST 接口,前缀
/api/s2s/。注释里写明的现有接入方有 agentia-commerce 和
ai-crab。(src/router/s2s_routes.go:38-77)
GET /api/s2s/positionsPOST /api/s2s/tasksGET /:id(状态)、GET /:id/messages(对话)POST /:id/answer(回答提问)、/confirm(确认计划)、/follow-ups(追加要求)、/continue(继续)、/abort(中止)GET /:id/artifacts/:aid/templink(产物临时下载链接)、GET /:id/token-stats(token
用量)rawInput(任务内容)、positionId(指定员工)、attachments(附件)、needsConfirmation(先停在计划等确认)、skillIds、knowledgeBaseIds、mode、preferredModel(src/model/task.go:912)。鉴权:每个请求用 S2S HMAC
签名,新版签名同时覆盖服务名和
X-On-Behalf-Of。服务密钥的拿法是:管理员线下发一张一次性票据,调用方调
POST /api/s2s/register 换取。每个服务还有状态、有效期和专属
IP
三层准入策略。(src/router/s2s_registration_routes.go、src/middleware/s2s_auth.go)
代用户调用:X-On-Behalf-Of 填本地用户
ID 或 UC
身份,但不会自动开户,用户不存在时鉴权直接失败。(src/middleware/s2s_auth.go:85-116)
适合程度:
接入前提:
src/service/billing、src/service/entitlement)。协议:不支持 A2A
协议。agent_card 是 Agent
对话里工具卡推进内部异步任务的一种触发来源(src/server/services/asyncTask/workflowTypes.ts:16)。
对外接口:
POST /api/v1/responses,实现 OpenResponses
协议,与 OpenAI Responses API
兼容(packages/openapi/src/routes/responses.route.ts):
model 字段填 Agent ID,后端调完整的
Agent
运行时执行(AiAgentService.execAgent),可以用工具(packages/openapi/src/services/responses.service.ts:25-28);stream: true 时用 SSE
流式返回(controllers/responses.controller.ts);previous_response_id
用来续接多轮,内部对应到同一个话题(responses.service.ts:269-271);function_call_output)。packages/openapi,挂在
/api/v1/):agents、agent-groups、messages(其中
POST /messages/replies 是「发一条用户消息并让 AI
回复」)、topics、files、knowledge-bases、models
等。/api/v1/llm_token、balance、files/agent、community,用
BTS 或 UC MAC
鉴权(src/server/services/externalApiAuth/、bts-auth/),但不能用来执行
Agent。/api/agent/run、/api/agent/stream
是内部执行用的,只接受消息队列服务 QStash 签过名的请求。鉴权:OpenAPI(含 /responses)只认
Authorization: Bearer <用户 API Key 或 OIDC 令牌>,没有服务凭证,也不能指定代哪个用户(packages/openapi/src/middleware/auth.ts)。用户用
UC
登录时会自动开户(src/server/services/uc-auth/index.ts:134、uc-user-provision/)。
文件和图片:请求格式里定义了
input_image 和
input_file(types/responses.type.ts:22,30),但服务端解析时只取文字部分,图片和文件会被丢掉(responses.service.ts:86-104)。
适合程度:协议是标准的,用现成的 OpenAI SDK 就能调,流式和多轮都有,从协议角度看最省事。卡在鉴权上:要代很多用户调用,有两条路,都需要 OpenQ 方配合:
/responses 也接受它已有的 BTS
鉴权,并能指定用户。统一适配接口。执行方域只用四个方法,每个平台写一个适配器;团团不直接调适配器(见 技术方案 3.4 节):
| 方法 | ndclaw(A2A) | AI 员工(S2S) | OpenQ(OpenResponses) |
|---|---|---|---|
list_agents 列出执行方 |
GET /a2a/experts |
GET /s2s/positions |
GET /v1/agents |
send 发一轮(首轮派单,之后续话)并收进度 |
SendStreamingMessage,续话带同一
contextId;SSE |
首轮 POST /s2s/tasks,续话
/answer、/follow-ups;没有流式,适配器内部轮询
GET /:id、/messages |
POST /v1/responses(stream: true),续话带
previous_response_id;SSE |
get_turn 取结果 |
GetTask 的 artifacts |
GET /:id + 产物下载链接 |
返回结果里的输出项 |
cancel 中止 |
CancelTask |
/abort |
未见对应接口(待确认) |
执行方登记。Agent 类执行方直接取各平台的目录,团团自己只登记「真人专家」和「用户自己」这两类。匹配时要用的价位,第一期先写估算值。
文件统一走链接。团团这边把图片和文件存进公司 CS,换成链接写进正文。这样三家都能接收;AI 员工可以额外用附件字段。
任务执行是一段对话。三家都是多轮的,任务详情页要能展示和执行方的对话,任务状态里要有「等你回复」。
| 平台 | 状态 |
|---|---|
| ndclaw | 10/16 要接。已确认事项、待办(开通 A2A 与授权、创建并上架 9 个直播专家、选品和售后做成技能包)和一项待定(预热池,先弄清机制再决定要不要向对方提)都在 ndclaw 对接背景与待确认项 第一节第 1.3、1.4 条。实例每天自动开通 4000 个、无需审核(林炜 10/10 确认)。费用一项已有答复:「先用」已同意,以后按租户字段拆分账单 |
| AI 员工 | 暂不考虑,不跟进,只保存本报告第三节的结论。以后接入时再问的四个问题:S2S 票据由谁发;用户能不能按 UC 身份自动开户;代用户调用时花的是谁的权益和额度;有没有流式或回调的计划 |
| OpenQ | 暂不考虑,不跟进,只保存本报告第三节的结论。以后接入时再问的四个问题:/responses
能不能加 BTS
鉴权并指定用户;图片和文件输入什么时候支持;执行时扣的是谁的余额;master
最后一次提交在 9/11,确认它就是线上在跑的版本 |
白晨在 1009 晚会说 ndclaw 只是执行方案之一,AI 员工也可以接;吴梦赢要白晨这边先评估有没有更好的方案(解读页 第一节第 2、6 条)。1010 会白晨问这两家接入快不快(解读页 第五节第 5 条),答案在第二节「接入卡点」一行:两家都要对方配合开通或改造,快慢取决于对方排期。要不要重新启动跟进,由白晨定。
knowledge/sources/会议对谈/2026-10-08-会议转写-10月16日前分工与本周设计任务-白晨林炜陈高武晚间快速会议.md:25-45。