我平时同时开着两个 Agent。白天在 Qoder 里改一个前后端都有的业务项目,晚上或者需要批量跑脚本、做代码审查时,切到终端里的 Codex。两边干的是同一个仓库的活,彼此却互不知道对方听过什么。我在 Qoder 里花十分钟讲清楚的测试约定、哪个目录不要碰、接口命名的老规矩,换到 Codex 还得重新讲一遍。时间长了,我在仓库根目录维护了一个 NOTES.md,每次开新会话先让它读一遍。
这个办法撑了一阵,问题也越来越明显。NOTES.md 是我一个人手写的,Agent 在对话里学到的东西不会自己回写进去;我在 Codex 里纠正过的一个错误理解,Qoder 那边完全不知道。后来我又分别给两边写了项目级的规则文件,结果变成了三份内容相近、更新时间各不相同的说明。我也试过自己写一个很小的本地 MCP 服务,只做一件事:把一个 markdown 文件的内容作为工具返回。它解决了"两边读同一份"的问题,但它只能读,不能写,也谈不上召回,文件一长,Agent 每次都把整篇拉进来。
今年云栖大会上我听了一场 Agent Context 的分享,讲者把接入方式归成三种:自然语言一键接入、MCP、原生 API。我手上刚好有两个不同的 Agent,回来以后就打算挨个走一遍,看看三种方式在我的日常里到底差在哪。下面是那个下午的记录,按我实际操作的顺序写。
第一个绊脚的地方跟技术无关。会上讲的名字是 Agent Context,我去找帮助文档,文档标题写的是 RDS ContextDB;装好的命令行工具叫
ctxdb;后面配 MCP 时,示例里的服务名又是
contextdb。这几个名字指的是同一个东西,曾用名一路沿用下来,但第一次接触时我确实花了点时间确认自己没找错文档。如果要把这篇转给同事,我会在开头先写一句"文档里的 RDS ContextDB 就是它"。
开通流程本身很短:在控制台开通,新建一个工作空间,填名称和初始管理员,系统随即生成 API Key。我用的是新用户的试用额度,整个下午没有额外付费。
API Key 这一步要多留个心。帮助文档写得很清楚,Key 只显示一次,关闭弹窗后无法再查看。我当时差点直接点了关闭,停下来先把它存进了密码管理器。后面三种接入方式都要用到这个 Key,如果在这里丢了,后面每一步都会卡住。下文所有命令里的 Key 我都用
<API_KEY> 代替。
一键接入的做法是把一句自然语言发给 Agent,让它自己去读安装说明、装 CLI、做配置。帮助文档给的原句是:
请阅读 https://context-database-client.oss-cn-hangzhou.aliyuncs.com/install.md,按照脚本说明安装 ctxdb CLI,并使用 API Key <API_KEY> 为你自己完成接入配置。
我把这句话贴进 Qoder 的对话框,把占位符换成自己的 Key。Qoder 先去读了 install.md,然后按里面的步骤执行脚本,中间几次停下来让我确认要不要执行命令。这个确认有必要:它在本机装软件、写配置,我想知道它每一步动了什么。
装完以后,我在终端里跑了两条命令:
ctxdb statusctxdb ping
status 用来看当前配置了哪些 Agent,
ping 用来确认和服务端是通的。两条都正常,我才算放心。目前支持一键接入的 Agent 有 Qoder、QoderWork、Claude Code、Codex、OpenClaw、OpenCode、Hermes 和千问办公,我手上的两个都在列表里。
一键接入和后面要说的 CLI 方式,都会在 Agent 里装上 Hooks 和 Skill。Hooks 的作用我是读文档以后再回头验证的:每次我提交 prompt,它会拿这条 prompt 作为查询去召回记忆,把结果用
<recalled-memories> 标签注入上下文,有时还会附上
<available-knowledge-bases>,告诉 Agent 当前有哪些知识库可查;每轮对话结束后,服务端会异步从这一轮里提炼事实写进记忆。
我做了一个很小的验证。在一个会话里告诉 Qoder,这个项目的单元测试只跑某个子包,集成测试要先起本地依赖,不要直接跑全量。第二天新开会话,让它补一个函数的测试,它没有再问我测试怎么跑,直接按前一天说的方式去执行了。我维护 NOTES.md 想要的就是这个效果,只是以前一直得靠手工。
Codex 我换了 CLI 的方式来装,想看看把"Agent 替我执行"换成"我自己执行"有什么不同。命令是:
curl -fsSL 'https://context-database-client.oss-cn-hangzhou.aliyuncs.com/install.sh' | bash -s -- --agent codex --api-key <API_KEY>
执行之前,我先在浏览器里打开 install.sh 从头到尾看了一遍。管道直接喂给 bash 的安装方式,我一向习惯先看脚本内容。另一个顾虑是 Key 会出现在 shell 历史里,跑完以后我把那一行从历史中清掉了。这件事一键接入同样存在,只是换成了留在 Agent 的对话记录里,两种方式都得自己处理一下。
装好以后效果和一键接入基本一致,Codex 那边同样装上了 Hooks 和 Skill。一键接入相当于让 Agent 替你读说明、跑这条脚本,区别只在谁来执行、你能不能看清每一步。如果 CLI 已经在机器上,也可以直接用
ctxdb setup --agent codex 给某个 Agent 补配置,它会配置凭证、Hooks 和 Skills;
ctxdb login 走的是 Device Flow 登录。后来我又发现
ctxdb setup --all 会检测本机所有支持的 Agent 一起配,这个留到以后再试。
这时
~/.ctxdb/ctxdb.json 里已经有了两段配置,按
agents.<name> 分开,一段 qoder,一段 codex。两个 Agent 现在连的是同一个工作空间。不过"连到同一个地方"和"彼此能用上对方的记忆"是两回事,文档对记忆的描述是默认私有,需要几个 Agent 共用的内容应该放进知识库。这一步我没有去做跨 Agent 的对照测试,先按文档的说法理解。
第三种方式我在另一台机器上试,那台机器上没有装 CLI,Codex 和 Qoder 都只配 MCP。服务地址是
https://context-database.aliyuncs.com/v1/mcp,认证用
Authorization: Bearer <API_KEY> 请求头。
Codex 的 MCP 配置是 TOML:
[mcp_servers.contextdb]url = "https://context-database.aliyuncs.com/v1/mcp"[mcp_servers.contextdb.http_headers]Authorization = "Bearer <API_KEY>"
Qoder 和 Claude Code 这类用 JSON 的写法:
{ "mcpServers": { "contextdb": { "type": "http", "url": "https://context-database.aliyuncs.com/v1/mcp", "headers": { "Authorization": "Bearer <API_KEY>" } } }}配好之后两边都能看到 contextdb 提供的工具。MCP 这一年出了好几个协议版本,有状态的和无状态的都有,Agent Context 的服务端两类都支持,我不用先去查宿主用的是哪一版,这一点省了事。
问题很快就出现了。MCP 只提供工具,没有 Hooks。工具什么时候调用,完全由 Agent 自己判断。在这台机器上,我问 Codex 一个和项目约定有关的问题,它没有去查,直接按通用做法回答了;我补了一句"先查一下 contextdb 里有没有相关记录",它才调用工具。每轮结束后的自动提炼也没有了,想让它记住什么,得明确让它调写入的工具。
这跟方式一、方式二的体验差别挺大。装了 Hooks 的 Agent,召回是每次提交 prompt 时都会发生的固定动作;只配 MCP 的 Agent,召回取决于模型这一轮有没有想到去用工具。对一个已经支持 Hooks 的 Agent,我没有理由只配 MCP。MCP 更适合那些装不了 Hooks、但支持标准工具接口的宿主,或者团队里宿主种类太多、想用一种配置统一接入的情况。
第三种入口是原生 API,这次没有动手写代码,只读了文档。HTTP API 有知识库、文档、文件和查询几类接口,比如
POST https://context-database.aliyuncs.com/v1/knowledge/knowledge_bases 用来建知识库,
/v1/knowledge/documents、
/v1/knowledge/files 管文档和文件,
/v1/knowledge/query 做查询,请求体里放
question、
dataset_ids 和
top_k。
有个细节要注意:HTTP API 的认证头写法是
Authorization: Token $API_KEY,MCP 那边是
Bearer。同一个 Key,两种前缀,复制配置的时候很容易写错。
另一类是 Agents API,面向业务系统,说的是基于上下文执行任务、加工资产。目前公开的信息以定位为主,接口细节我没有找到,所以这次没法试。原生 API 适合业务后端或内部平台掌握完整流程、Agent 只是其中一环的场景,调用时机、重试、超时、审计都由接入方自己控制,代价是这些代码也得自己写和维护。我现在的场景用不上,但如果以后要在 CI 里自动把设计文档推进知识库,大概会走 HTTP API。
走完一遍,选哪种方式我只看一件事:任务流程的控制权在谁手里。
我直接在 Qoder、Codex 里工作,流程由 Agent 掌握,一键接入或 CLI 最短,而且能拿到 Hooks。两者之间,愿意让 Agent 自己动手就用一键接入,想自己看清每一步就用 CLI。宿主只支持 MCP、或者要统一一批不同宿主时,用 MCP,同时接受召回时机由模型决定这件事。业务系统自己编排流程,用 HTTP API。
还有一件事我刻意避免了:在同一个 Agent 上同时装 Hooks 又配 MCP。两条通道会不会重复召回、重复写入,我没有验证过,文档里也没找到明确说明,我不想猜,干脆一个 Agent 只留一个主入口。放大到团队也是同样的道理:入口一多,身份怎么传、失败怎么重试、审计记录能不能按同一个任务串起来,每个入口都会各长出一套。比较稳的做法是先定一个主入口,只为明确的场景加补充入口,比如开发者的交互式 Agent 走一键接入或 CLI,后台批处理走 HTTP API。
反过来的错误我也差点犯。刚开始我想"MCP 是标准协议,统一用它最省心",可我手上的两个 Agent 都支持 Hooks,统一成 MCP 等于主动放弃自动召回和自动提炼。选入口还是得看手上实际在用的 Agent 和要验证的效果。
整体比我预想的顺。一个下午把 Agent Context 接进了两个 Agent、试了三种方式,大部分时间花在读文档和确认每一步做了什么,命令本身没出问题。最有用的是 Hooks:它把"开会话先让 Agent 读一遍 NOTES.md"这件我每天在做的事变成了不需要我参与的动作。
还有几处别扭的,也记一下:名字不统一,第一次找文档要绕一下;Key 只显示一次,必须当场存好;MCP 方式下没有 Hooks,召回靠模型自觉;Agents API 还没有可以动手的细节。
我准备先把 NOTES.md 里的内容整理一遍,稳定的项目约定建成一个知识库,让 Qoder 和 Codex 都从那里查,NOTES.md 只保留临时事项。两个 Agent 都用 CLI 方式维持 Hooks,另一台机器上的 MCP 配置保留,作为对照。
还没想清楚的有两件。Key 的轮换是一件:它只显示一次,我现在两台机器、四处配置都用同一个 Key,哪天需要换的时候,要改的地方我得先列一张清单。另一件是召回的范围。现在每次提交 prompt 都会召回,仓库里问题越来越杂以后,召回进来的东西会不会开始干扰当前任务,我还没有判断依据,打算过两周回头看看
<recalled-memories> 里实际注入了什么,再决定要不要调。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70049330/viewspace-3187421/ ,如需转载,请注明出处,否则将追究法律责任。