协议与后端集成¶
实现适配器、后端或协议客户端时从本页开始。操作者配置见Agent 集成 和渠道与消息;协议方法与部署限制见Agent 协议。
选择扩展点¶
| 需求 | 扩展位置 | 不要混淆为 |
|---|---|---|
| 本地 Agent 已支持 ACP | ACP 名册条目/预设 | 新传输实现 |
| CLI 有特殊 transcript | CLI 配置,必要时增加 parser | ACP server |
| 远程服务接受 chat completions | OpenAI-compatible Agent 配置 | 能使用本地工具的后端 |
| 远程 Agent 发布 Agent Card | A2A client/server 集成 | kind: a2a 名册条目 |
| 消息平台需要 bot | Channel adapter | 子 Agent 后端 |
| 服务提供工具/资源 | MCP | Agent 间任务协议 |
| 产品需要定制轮次行为 | Plugin/participant | 共享 Agent Loop 的 fork |
现有后端能表达需求时优先复用。Backend kind 是经过校验的封闭集合,在 plugin manifest 里加一个自定义字符串不会注册新后端。
遵守运行时契约¶
装配根为 raven/core/runtime.py:build_runtime。运行时使用者依赖契约,入口和产品
适配器负责装配或翻译工作。保持 Kernel 不依赖 CLI、RPC、ACP 和产品代码。
| 契约或接口 | 源码 |
|---|---|
| 子 Agent 执行 | raven/contracts/subagent_backend.py |
| 工具执行 | raven/contracts/tool.py |
| 渠道与登录 | raven/contracts/channel.py,由 raven/channels/contract.py 重导出 |
| Turn 输入、事件、调度 | raven/spine/ |
| 产品 UI 线格式 schema | rpc-schema/openrpc.json |
| 后端条目校验 | raven/config/schema.py |
| 后端构造 | raven/agent/subagent/backends/__init__.py |
Canonical names 见 CONTEXT-MAP.md 和 CONTEXT.md。后端 session、宿主 conversation、
A2A task 与 DAG node id 生命周期不同,应显式映射,避免结果或凭据跨对话。
实现子 Agent 后端¶
SubagentBackend.run 接收 task 文本及 keyword-only 上下文,包括 task_id、
workspace、executor、session_key、instance、provider、model、mcps、
mcp_grant、mode、authored_task、on_delta。使用真实 Protocol 签名,不要复制子集。
契约要求返回最终文本,失败时抛异常。Manager 拥有通知、共享信号量和速率限制;后端 不要另建 dispatch 配额,也不要在没有最终答案时返回看似成功的句子。
实现并测试:
- 区分启动/readiness 和逐任务超时。
- 支持时绑定和续接原生 session id。
- 本地文件能力应符合事实,不能从 Agent 名推断。
- 显式 MCP 选择和 credential scope,不隐式共享秘密。
- 只有传输实际提供 delta 时才设置
streams/on_delta。 - 取消、进程清理、输出截断和非零退出。
新增 backend kind 需要同步修改 schema、构造、能力、配置写入和回归测试;目前不是
通用第三方 plugin 注册入口。仅 parser 的修改通常可留在
raven/agent/subagent/backends/transcript.py 并补 fixtures。
安全集成 ACP¶
ACP client 使用可选功能前先协商。Prompt 等待期间并发处理请求和通知;停止读取的 客户端无法回答权限或 elicitation 请求。Stdout 只承载协议,持续读取子进程 stderr。
测试 initialize、会话创建、prompt update、最终 stop reason、load/resume、取消、 未知能力和异常帧。不要声明只会返回“未实现”的方法。模型/mode 切换应作用于对应会话 的下一轮,而不是共享连接上的全部会话。
连接池下每会话 MCP 尤其敏感。能力声明本身不证明会话间隔离,因此 Raven 另有
sessionMcp 策略。应验证并发会话使用不同 server selection,也要测试权限请求
无人回答和客户端断开。
打包 schema fixtures 和 tests/test_acp_schema.py 检查帧形状。当前出站客户端
自动批准对方提供的权限选项;但请求中的 toolCall.rawInput.command 被宿主拒绝规则
命中时,改选拒绝选项。集成应说明这一信任模型,不能承诺人工逐操作审批。
安全集成 A2A¶
使用协议 SDK 的请求/响应形状。当前绑定是 A2A 1.0 JSON-RPC,不是早期斜线式方法名。
流式事件使用 StreamResponse,非流式 send 使用 SendMessageResponse;
除了 message/artifact 文本,还要读取 task status 文本。
分别测试公开 card、已认证 RPC 和可选 extended card。凭据匹配预期 origin;验证 跨 origin 接口和重定向时,不应向其他目标发送凭据。不要向 peer 暴露内部 traceback。
测试真实本地 client/server 往返并 stub turn,不要两边只各用手写 JSON fixture, 否则可能漏掉 envelope 分歧。任务状态当前在内存中,不要宣称持久化恢复或 push notifications。独立和网关托管的问题路由不同,详见协议指南。
增加消息适配器¶
适配器位于 raven/channels/adapters/<name>/,spec.py 导出包含 display name、
lazy factory、capabilities 和 config schema 的 ChannelSpec。Discovery 扫描这些
package,不要仅为列出渠道就导入可选平台 SDK。
宿主拥有 channel socket 字段:enabled、allow_from、workspace。Spec 声明
适配器专用字段以及 secret/required 标记。dispense_channel_config 向 factory
提供经过 admission 的视图;CLI/UI 配置复用同一声明,不要再维护一套字段列表。
实现 start、stop、send,入站消息经过 Intake。下载不可信附件或发送 reaction
前检查 sender/group 策略。保留路由元数据和会话身份,由 gateway 接通 submit 与投递。
只声明实际实现的能力。交互登录要求 SupportsLogin,streaming 要求对应 protocol,
capability proof 会检查这些声明。附件能力需要真实 send 和错误处理,不只是一个 flag。
当前网关 channel outlet 仍不提供流式输出。
不连接真实账户,先测试发送者允许/拒绝、群策略、媒体、缺少凭据、重连/关闭及投递失败; 之后单独进行得到明确授权的真实账户验收。
验证与交付¶
代表性仓库检查:
uv run pytest tests/test_subagent_third_party.py tests/test_acp_schema.py tests/test_a2a_interop.py -q
uv run pytest tests/test_channels_contract.py tests/test_channels_registry.py tests/test_channels_intake.py tests/test_channels_outlet.py -q
还应运行对应 adapter/backend 测试;代码修改需运行仓库 lint 和 import contracts。 准确说明验证过的供应商版本、操作和托管入口。Mock 测试不等于真实认证测试。Fixture 不能包含凭据、二维码数据或原始私有 transcript。