
1. INMS 论文里的 Memory Sharing 到底在解决什么问题如果你最近在折腾 LLM Agents大概率会遇到一个很别扭的场景你写了三个 Agent一个负责查资料一个负责写代码一个负责跑测试。它们各自维护自己的上下文互相之间完全不知道对方刚才干了什么。查资料的 Agent 好不容易从一堆文档里定位到关键接口写代码的 Agent 却要从零开始重新理解需求跑测试的 Agent 发现某个依赖版本不对这个信息也传不回给写代码的那个。结果就是每个 Agent 都在重复劳动token 烧得飞快任务还经常卡在信息断层上。INMS 这篇论文的核心切入点就在这里。它讨论的是 Memory Sharing也就是让多个 LLM Agents 之间能够共享和复用记忆而不是各自为战。论文里把记忆分成几个层次来管理有短期的工作记忆记录当前这一轮任务里发生了什么有长期的语义记忆沉淀跨任务的经验还有共享记忆池让不同 Agent 可以按需读取别人产生的中间结果。这个思路其实很符合工程直觉——你不需要让每个 Agent 都变成全知全能而是让它们能像团队一样交换笔记。我自己的理解是Memory Sharing 要落地绕不开三个工程问题。第一是记忆的写入格式要统一否则 A Agent 写的东西 B Agent 读不懂第二是读取权限和范围要可控不能让一个负责闲聊的 Agent 读到生产环境的敏感配置第三是调用通道要稳定多个 Agent 频繁读写共享记忆底层 API 的并发和鉴权必须扛得住。前两个问题偏架构设计第三个问题则直接落到 API 接入层。这也是为什么我把这篇论文笔记和 TaoToken 的接入实践放在一起写。论文给的是机制层面的思路但真要跑起来你得有一个统一的 Key 和 Base URL 来支撑多 Agent 的并发调用。否则每个 Agent 配一套密钥光是管理就够头疼的。下面我会先讲清楚 INMS 里 Memory Sharing 的机制拆解然后给出可复制的配置片段最后演示一次多 Agent 记忆共享请求的验证动作。目标很明确把论文里的思路变成你本地能跑通的工程配置。2. TaoToken 统一 Key 接入多 Agent 共享记忆的前置准备在动手配置之前先把 TaoToken 这边的准备工作说清楚。你可以把它理解成一个统一的 API 通道多个 Agent 共用同一个 Base URL 和 Key不需要每个 Agent 单独申请一套凭证。对于 Memory Sharing 这种需要频繁跨 Agent 读写的场景统一通道的好处很明显鉴权逻辑只维护一份调用配额集中管理出问题的时候排查路径也短。先访问官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 了解整体能力然后进入控制台创建你的 API Key。控制台地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 在这里你可以生成和管理 Key。生成之后API Keys 管理页在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 建议你在这里给不同的 Agent 打上标签方便后续区分调用来源。这里有个细节值得注意Memory Sharing 场景下多个 Agent 会并发读写共享记忆所以 Key 的权限范围要提前想好。如果你只是本地实验一个 Key 给所有 Agent 用完全没问题如果是要跑长期任务建议按 Agent 角色拆分 Key比如「检索 Agent 专用」「编码 Agent 专用」这样某个 Agent 出问题的时候不会影响其他 Agent 的调用配额。Base URL 统一用 https://taotoken.net/api 注意这个地址后面不加任何 UTM 参数直接作为 API 请求的根地址。模型 ID 方面你可以根据任务复杂度选择轻量的记忆摘要任务用较小的模型复杂的推理任务用大模型。具体支持哪些模型可以在模型对话页面 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 查看当前可用的列表。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里面有针对不同语言和框架的调用示例。如果你用的是 Claude Code 这类工具可以参考 https://taotoken.net/claude-code-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaude-code-anthropicutm_campaignrewrite 里的配置说明。长期跑编码类 Agent 的话Coding Plan 页面 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 有更详细的套餐说明。准备工作做完之后你手里应该有三样东西一个 Base URLhttps://taotoken.net/api、一个 API Key、一个选定的 Model ID。这三件套是后面所有配置的基础缺一不可。接下来我会给出具体的配置文件片段你可以直接复制到自己的项目里。3. 可复制的多 Agent 记忆共享配置片段这一节给出实际可用的配置片段。我会用 JSON 和 TOML 两种格式分别演示你可以根据自己的技术栈选择。核心思路是所有 Agent 共用同一个 Base URL 和 Key但通过不同的 system prompt 和记忆读写策略来区分角色。先看 JSON 格式的配置适合 Node.js 或 Python 项目直接读取{ taotoken: { base_url: https://taotoken.net/api, api_key: sk-your-taotoken-key-here, default_model: claude-sonnet-4-20250514, timeout: 60 }, agents: { retriever: { role: retrieval, model: claude-haiku-3-5-20241022, memory_scope: shared_read_write, system_prompt: 你负责从共享记忆池中检索相关信息并将新发现的资料写入记忆池。 }, coder: { role: coding, model: claude-sonnet-4-20250514, memory_scope: shared_read_write, system_prompt: 你负责根据共享记忆中的需求编写代码并将代码变更记录写入记忆池。 }, tester: { role: testing, model: claude-haiku-3-5-20241022, memory_scope: shared_read_only, system_prompt: 你负责运行测试并读取共享记忆中的代码变更将测试结果写入记忆池。 } }, memory: { storage: local_file, path: ./shared_memory.json, max_entries: 500, ttl_seconds: 86400 } }如果你用的是 TOML 格式比如 Rust 项目或者某些 Python 工具的配置可以这样写[taotoken] base_url https://taotoken.net/api api_key sk-your-taotoken-key-here default_model claude-sonnet-4-20250514 timeout 60 [agents.retriever] role retrieval model claude-haiku-3-5-20241022 memory_scope shared_read_write system_prompt 你负责从共享记忆池中检索相关信息并将新发现的资料写入记忆池。 [agents.coder] role coding model claude-sonnet-4-20250514 memory_scope shared_read_write system_prompt 你负责根据共享记忆中的需求编写代码并将代码变更记录写入记忆池。 [agents.tester] role testing model claude-haiku-3-5-20241022 memory_scope shared_read_only system_prompt 你负责运行测试并读取共享记忆中的代码变更将测试结果写入记忆池。 [memory] storage local_file path ./shared_memory.json max_entries 500 ttl_seconds 86400这里有几个参数需要解释一下。memory_scope控制每个 Agent 对共享记忆的读写权限shared_read_write表示可读可写shared_read_only表示只读。这个设计对应了 INMS 论文里提到的权限分层思路——不是所有 Agent 都需要写入权限测试 Agent 只需要读取代码变更并写入测试结果不需要修改需求描述。max_entries和ttl_seconds是记忆池的容量控制。Memory Sharing 最大的坑就是记忆无限膨胀最后每个 Agent 的 prompt 里塞了几万条历史记录token 直接爆炸。所以一定要设置上限和过期时间让旧记忆自动淘汰。如果你用的是 Claude Code 或者类似的工具配置方式会略有不同。以 Claude Code 为例你需要在 settings 文件里指定 Base URL 和 Key{ anthropic: { base_url: https://taotoken.net/api, api_key: sk-your-taotoken-key-here }, model: claude-sonnet-4-20250514 }注意这里的 Base URL 同样是 https://taotoken.net/api 不要加多余的路径。Model ID 要和你实际使用的模型对应写错了会直接报 404。配置写完之后建议先跑一个最简单的连通性测试确认 Key 和 Base URL 没问题再开始多 Agent 的记忆共享逻辑。下一节我会给出具体的验证请求代码。4. 验证请求跑通一次多 Agent 记忆共享配置写好了接下来要验证它真的能跑通。我会用一个最小化的 Python 示例演示两个 Agent 如何通过共享记忆池协作完成一个任务。这个示例不依赖任何复杂的框架只用标准的 requests 库你可以直接复制运行。先安装依赖pip install requests然后创建一个memory_sharing_demo.py文件import json import os import requests from datetime import datetime TAOTOKEN_BASE_URL https://taotoken.net/api TAOTOKEN_API_KEY os.environ.get(TAOTOKEN_API_KEY, sk-your-taotoken-key-here) MEMORY_FILE ./shared_memory.json def load_memory(): if os.path.exists(MEMORY_FILE): with open(MEMORY_FILE, r, encodingutf-8) as f: return json.load(f) return {entries: []} def save_memory(memory): with open(MEMORY_FILE, w, encodingutf-8) as f: json.dump(memory, f, ensure_asciiFalse, indent2) def write_memory(agent_name, content): memory load_memory() memory[entries].append({ agent: agent_name, content: content, timestamp: datetime.now().isoformat() }) if len(memory[entries]) 500: memory[entries] memory[entries][-500:] save_memory(memory) def read_memory(agent_name, limit10): memory load_memory() entries memory[entries][-limit:] return \n.join([f[{e[agent]}] {e[content]} for e in entries]) def call_agent(agent_name, system_prompt, user_input, modelclaude-haiku-3-5-20241022): headers { Authorization: fBearer {TAOTOKEN_API_KEY}, Content-Type: application/json } payload { model: model, max_tokens: 1024, system: system_prompt, messages: [ {role: user, content: user_input} ] } response requests.post( f{TAOTOKEN_BASE_URL}/v1/messages, headersheaders, jsonpayload, timeout60 ) response.raise_for_status() return response.json()[content][0][text] if __name__ __main__: # Agent A检索 Agent负责收集信息并写入共享记忆 retriever_prompt 你是一个检索 Agent。请根据用户需求列出需要查证的关键信息点每条不超过 50 字。 retriever_result call_agent( retriever, retriever_prompt, 我要给一个 Python 项目添加单元测试需要了解哪些信息 ) write_memory(retriever, retriever_result) print(检索 Agent 写入完成) print(retriever_result) # Agent B编码 Agent读取共享记忆后继续工作 coder_prompt 你是一个编码 Agent。请根据共享记忆中的信息给出下一步的具体操作建议。 shared_context read_memory(coder) coder_result call_agent( coder, coder_prompt, f当前共享记忆内容\n{shared_context}\n\n请给出下一步操作建议。 ) write_memory(coder, coder_result) print(\n编码 Agent 读取并写入完成) print(coder_result)运行之前先把你的 Key 设置到环境变量里export TAOTOKEN_API_KEYsk-your-taotoken-key-here python memory_sharing_demo.py如果一切正常你会看到类似这样的输出检索 Agent 写入完成 1. 项目使用的测试框架pytest/unittest 2. 现有代码的模块划分 3. 需要覆盖的核心函数列表 4. 是否已有 CI 配置 编码 Agent 读取并写入完成 根据共享记忆建议先确认测试框架然后为每个核心函数编写测试用例。这个示例虽然简单但它完整演示了 Memory Sharing 的核心流程Agent A 产生记忆并写入共享池Agent B 读取共享池后继续工作。你可以把call_agent函数替换成任何你需要的 Agent 逻辑共享记忆的读写机制保持不变。实测下来这个模式在多个 Agent 协作的场景里非常实用。比如你有一个负责爬取文档的 Agent一个负责总结的 Agent一个负责生成代码的 Agent它们通过共享记忆池传递中间结果比每个 Agent 单独维护上下文要高效得多。5. 常见报错排查401、local proxy failed、reading choices多 Agent 接入的过程中有几个报错出现的频率特别高。我把自己踩过的坑整理出来你可以对照着排查。401 Unauthorized这是最常见的鉴权错误。原因通常是 Key 写错了、Key 过期了、或者请求头格式不对。检查你的请求头确保是Authorization: Bearer sk-xxx的格式注意 Bearer 和 Key 之间有一个空格。如果你用的是环境变量确认环境变量真的被读取到了可以在代码里打印一下os.environ.get(TAOTOKEN_API_KEY)看看是不是 None。还有一种情况是 Base URL 写错了。正确的地址是 https://taotoken.net/api 如果你写成了https://taotoken.net/api/v1或者少了/api都会导致鉴权失败。记住这个地址后面不加任何多余路径。local proxy failed这个报错通常出现在你本地配置了某些网络工具的情况下。TaoToken 的 API 通道是直连的不需要额外的网络配置。如果你看到这个报错先检查你的环境变量里有没有HTTP_PROXY或HTTPS_PROXY的设置有的话先取消掉。另外检查一下你的 hosts 文件确认没有把taotoken.net指向错误的地址。reading choices 相关报错如果你用的是 OpenAI 兼容的调用方式可能会遇到reading choices这样的报错。这通常是因为响应格式和你的解析代码不匹配。TaoToken 的 API 返回格式是标准的但如果你用的是 Anthropic 风格的接口返回的是content字段而不是choices。检查你的解析代码确认它和实际返回的 JSON 结构对应。可以在请求之后先打印完整的 response.json() 看看结构。OAuth 相关报错如果你用的是 Claude Code 或者其他需要 OAuth 的工具可能会遇到 OAuth 相关的报错。这种情况下检查你的 settings 文件里是否正确配置了 Base URL 和 Key。以 Claude Code 为例配置里需要同时指定base_url和api_key缺一不可。如果你用的是 CC Switch 或者 Cline MCP 这类工具配置里要写全三件套Base URL、Key、Model ID。少写任何一个都会导致连接失败。模型 ID 写错导致的 404这个报错信息通常比较模糊可能只显示model not found。解决办法是去模型对话页面确认当前可用的模型 ID不要凭记忆写。模型 ID 是区分大小写的claude-sonnet-4-20250514和Claude-Sonnet-4-20250514是两个不同的字符串。并发请求导致的限流多 Agent 场景下多个 Agent 同时调用 API 是很常见的。如果你看到 429 或者 rate limit 相关的报错说明触发了限流。解决办法有两个一是降低并发数给每个 Agent 加一个简单的请求间隔二是检查你的套餐配额确认当前配额是否足够支撑多 Agent 并发。Coding Plan 页面有更详细的配额说明。排查问题的通用思路是先确认 Base URL 和 Key 没问题再确认 Model ID 正确最后检查请求格式和解析逻辑。大部分报错都出在前两步。6. 从论文到工程多 Agent 记忆共享的落地建议把 INMS 论文里的 Memory Sharing 机制落到工程上我最大的体会是不要一上来就追求完美的记忆管理架构。先跑通一个最小的共享记忆池让两个 Agent 能通过它交换信息然后再逐步增加权限控制、容量管理、过期淘汰这些机制。共享记忆的格式尽量用纯文本或者简单的 JSON不要搞太复杂的嵌套结构。因为最终这些记忆是要塞进 prompt 里的结构越简单模型理解起来越容易。我试过用嵌套很深的 JSON 存记忆结果模型经常解析错字段后来改成扁平的文本记录问题就少了很多。权限控制方面建议从最小权限开始。默认所有 Agent 都是只读只有明确需要写入的 Agent 才给写权限。这样即使某个 Agent 出问题也不会污染整个共享记忆池。容量管理一定要做。我见过太多项目因为记忆池无限增长最后每个请求的 prompt 都超过模型上下文限制。设置一个合理的max_entries和ttl_seconds让旧记忆自动淘汰比手动清理靠谱得多。最后多 Agent 的调用通道尽量统一。用 TaoToken 这样的统一 Key 和 Base URL比每个 Agent 单独配一套凭证要省心得多。出问题的时候你只需要检查一个地方而不是在多个配置之间来回切换。接入文档里有更详细的配置示例模型对话页面可以快速验证你的 Key 是否可用。长期跑编码类 Agent 的话Coding Plan 的配额方案值得看一下。