☰
DeepSeek Harness:Agent工程化的插件化与可回放日志设计
2026/10/27 20:01:24 网站建设 项目流程

干了这么多年 Agent 相关开发,我最大的感受是:Agent 框架从来不缺热闹的 demo,缺的是能把任务真正兜住的工程骨架。你随便找个模型 API 就能让 Agent 跑起来,但一旦要接真实业务、要多人协作、要定位一次三天前的诡异失败,事情就完全不一样了。DeepSeek Harness 这个项目,我关注它主要不是因为“又多了一个框架”,而是它在两个点上做得非常扎实:全插件化设计,以及可回放会话日志。这两件事单独看不稀奇,凑在一起才是 Agent 工程化的关键闭环。这篇文章我想把这套设计从头到尾拆一遍,包括插件接口怎么写、会话日志为什么非得做到“可回放”、排障时怎么用日志回放去复现一次现场,以及我在 Windows 和离线局域网环境里踩过的那些坑。

1. 为什么我盯上了 DeepSeek Harness:Agent 工程化的第一性思考

1.1 从“能跑的 Demo”到“能上线的工程”之间差了什么

很多团队对 Agent 的感觉是:调用大模型做几次工具选择,返回一段文本,这就算跑通了。确实,如果你只需要让模型回答几个固定问题,这足够。但真实的 Agent 任务是长流程、多步骤的——用户说一句“帮我查一下最近的文献并整理成综述”,背后是检索、读取、摘要、格式转换、多轮修正,中间任何一步错了,整个任务的体验都会崩。

工程化和 demo 的区别,我自己的体会是四个层面。第一是错误处理:demo 里模型返回格式不对,重试一次就好;工程里你得分清是模型抽风、插件崩溃还是外部服务超时,然后采取完全不同的策略。第二是可观测性:demo 阶段出了问题,把输入输出打印出来就够;工程里你得知道“哪一步、哪个插件、用了多少 token、耗时多少”,才能回答老板那句“为什么这么慢”。第三是可扩展性:新加一个工具不能靠改代码分支,得让团队里不同人并行开发各自的插件而不互相踩踏。第四是可回滚:一次配置变更、一次插件升级搞坏了会话,你要能恢复到之前的状态,而不是让用户重跑一遍。

DeepSeek Harness 的工程化解剖,恰恰是在后三层下功夫。它不是一个什么都能干的编排平台,而是一个务实的底座:规定好插件的挂载方式,规定好会话日志的落盘格式,把 Agent 运行变成“可控、可查、可复现”的过程。你在它之上写的业务代码,更像是往机架上插板卡,而不是焊死一堆飞线。

1.2 Harness 到底管了什么:一场 Agent 任务的完整生命周期

我先不说内部实现,先描述一下 Harness 视角下,一个 Agent 任务从进入到结束要经过哪些环节。这样你才能理解插件和日志这两件事为什么是它的命根子。

一个典型的任务生命周期大概是这样的:用户输入进来之后,Harness 先做会话的初始化,把历史消息、上下文、插件列表、模型配置加载好;然后进入“编排循环”,也就是 Agent 核心的思考-行动-观察三件套;在每次行动之前,Harness 根据当前意图和插件清单,决定调用哪个插件;插件执行完毕,Harness 捕获结果和消耗,写入日志;循环直到 Agent 认为可以产出最终答案,或者达到最大步数、用户终止。最后,Harness 做收尾,把会话状态持久化。

这个生命周期听起来平平无奇,但它暴露了三个工程化的暗坑。第一,编排循环是不可中断的吗?如果中途进程崩溃,会话能不能从上次断点恢复?第二,插件产生的副作用怎么追踪?插件内部调了外部 API、读了文件、写了数据库,这些信息如果不进入日志,回放时就完全是黑盒。第三,Agent 的每一步决策依赖什么上下文?没有完整的上下文记录,你很难回答“它当时为什么选了 A 工具而不是 B 工具”。

Harness 把这三个问题压进两个设计里:插件机制负责规范“插槽”,日志系统负责记录“过程”。接下来我分别展开。

2. 全插件化设计:不是“留了几个扩接口”,而是把框架本身做薄

2.1 为什么业务能力必须插件化

我先打个比方。早年装电脑,CPU、内存、显卡都是插在主板上的,你想升级显卡,拔下来换一块就行,主板不用动。后来有些轻薄本把内存焊死在主板上,省了空间,但也让你彻底失去了升级能力,坏了只能换整机。Agent 框架也是一样:如果你把工具调用、知识检索、代码执行这些能力以 if-else 或者硬编码方式塞进主流程,每次加一个小功能都要动主框架,测试一轮、发布一轮、回滚一轮,周而复始,团队迟早崩溃。

插件化的第一层好处是隔离。每个插件有自己独立的依赖、配置和生命周期,A 插件的第三方库版本和 B 插件冲突,不会直接把主进程带崩。第二层好处是可替换。同一个功能可以由多个插件实现,通过配置切换版本,灰度发布的时候可以只给一部分会话用新插件。第三层好处是场景裁剪。内网部署、离线部署、教学演示,哪怕同一套 Harness,加载的插件清单完全不同——你不用让离线环境也必须装一堆云上才用得上的插件。

所以 DeepSeek Harness 把插件化当成一等公民设计,而不是后补的一组接口。你在它的配置文件里看到的是一个插件注册表,在代码层面看到的是明确的插件基类和生命周期回调。框架本身只保留路由、调度、日志、上下文传递这些通用能力,业务能力全部交给插件。

2.2 插件接口的三层契约:注册、调用、销毁

一个插件要在 Harness 里活得体面,至少要遵守三层契约。

第一层是注册契约。插件启动时向 Harness 声明四样东西:插件名和版本号、它能处理的任务类型或工具名称、它依赖的其它插件或服务、它的配置项 schema。声明任务类型特别关键,否则编排器不知道“什么意图该把控制权交给你”。声明配置 schema 则是为了校验,避免插件内部读配置时才发现缺字段。

第二层是调用契约。每个插件对外暴露一个统一入口,输入是一个结构化的参数对象,输出是结构化的结果对象。不要用自由文本传参,否则模型生成的参数你没法校验,出错了也说不清是谁的锅。调用契约里还必须包含超时、重试、限流这几件事。我见过很多插件写得很爽,但忘了设置超时,结果一次外部 HTTP 请求挂了三分钟,整个 Agent 任务跟着卡死。在 Harness 里,插件执行是有时间预算的,超时之后要么降级返回,要么由编排器决定是否终止。

第三层是销毁契约。Agent 任务是短则几秒、长则几小时的,插件可能在一次会话里被反复创建。如果插件持有文件句柄、网络连接、缓存对象,必须在销毁回调里释放。否则你跑一晚上压力测试,内存和文件描述符肉眼可见地涨,第二天排查时根本想不到是插件泄漏。

下面给一个简化版的插件基类示例,用 Python 描述,方便你理解调用结构:

from typing import Any, Dict, Optional class HarnessPlugin: name: str = "" version: str = "1.0.0" tasks: list[str] = [] config_schema: Dict[str, Any] = {} def __init__(self, config: Optional[Dict[str, Any]] = None): self.config = config or {} self._resources = [] def on_load(self) -> None: pass def on_unload(self) -> None: for res in self._resources: res.close() async def execute(self, task: str, params: Dict[str, Any], context: Dict[str, Any]) -> Dict[str, Any]: raise NotImplementedError

你注意context这个参数,它里面会塞入会话 ID、trace_id、插件间共享数据、回放事件收集器等。插件不应该自己去搞一套日志系统,而是通过 context 把事件抛给 Harness,由 Harness 统一落盘。这就是后文可回放日志和插件协同的基础。

2.3 实操示例:写一个“LLM Wiki 检索”插件

我们直接写一个能在本地知识库(类似 LLM Wiki)里做检索的插件,把它挂到 Harness 上。场景很常见:内网知识库、离线文档、私有手册,Agent 需要用这些内容回答用户问题,而不是直接裸答。

插件需要完成的事:接收查询词,去本地向量库或倒排索引里检索相关片段,把片段拼成上下文返回给主流程。

class WikiRetrieverPlugin(HarnessPlugin): name = "wiki_retriever" version = "1.2.0" tasks = ["doc_retrieval", "knowledge_query"] config_schema = { "index_path": {"type": "string", "required": True}, "top_k": {"type": "integer", "default": 5}, } def on_load(self): self.index_path = self.config["index_path"] # 实际项目里在这里加载向量索引文件 self._bucket = [] print(f"[{self.name}] index loaded from {self.index_path}") async def execute(self, task, params, context): query = params.get("query", "") top_k = self.config.get("top_k", 5) # 真实实现:调用本地检索引擎,这里用假数据代替 candidates = [f"片段{i}" for i in range(top_k)] context["events"].add("retrieved_docs", count=len(candidates)) return {"docs": candidates, "count": len(candidates)}

这段代码虽然简化,但已经展示了插件的关键面貌:能力边界清晰(只做检索)、配置外部化(索引路径来自配置)、执行结果结构化(docs 和 count)、运行过程埋点(通过 context 加事件)。你在 Harness 里注册插件时,只要把插件目录指向这个文件,并在配置里声明启用,下次 Agent 会话里就能把它当作工具来调用。

这中间有个容易忽略的点:插件能拿到用户输入和上下文,就等于拿到了一定范围的权限。你在设计插件时一定要想着“最小权限”——这个插件只应该看到它所需的字段,而不是整个会话的所有信息。Harness 在传参时会做一次过滤,把无关字段剔除。这个习惯在多人协作开发插件时尤其重要。

2.4 插件的隔离、权限与内网部署

插件化听起来美好,落地时最先撞到的是权限和依赖问题。我在 Windows 环境部署 DeepSeek Harness 时,就碰到过插件目录读取失败的经典报错:setnamedsecurityinfow failed (win32 error)。说白了就是当前进程没有权限修改或访问某个目录的安全属性,插件加载器去扫描插件目录时被系统拦下来了。

排查顺序是这样的:先看插件目录是不是放在系统保护目录下,比如C:\Program Files子目录;再看当前服务账号是不是普通用户,有没有该目录的读写权限;最后看杀毒软件或系统安全策略有没有拦截动态加载。解决办法不外乎三种:把插件目录挪到用户目录或独立数据目录;给服务账号显式授予目录权限;在插件机制里不做“目录内动态编译”,而是加载预先构建好的插件包。

内网或者离线局域网部署是另一个高频场景。离线环境最大的痛点是第三方依赖装不上。Harness 本身如果是一个可执行文件,那还好说;但插件一旦依赖特定 Python 库,离线装依赖就能逼疯人。我的建议是提前在一台联网机器上把所有插件的依赖打包成本地 wheelhouse,然后在离线环境统一安装。这种做法比每台机器手动磕依赖稳定得多。插件包最好做成自带依赖声明和版本锁定,用一个清单文件描述“这个插件需要哪些库、什么版本”。Harness 加载插件时先校验依赖是否满足,不满足就给清晰报错,而不是等到运行到一半才崩。

3. 可回放会话日志:把 Agent 的“黑盒”变成“录像机”

3.1 普通日志和可回放日志的根本差异

绝大多数 Agent 框架的日志是散点式的:起一个步骤打一行“开始”,结束打一行“完成”,报错打一行堆栈。这些日志在你排查“某个插件报错了”时勉强够用,但要回答“这个 Agent 为什么回答得这么奇怪”,你几乎要拿着放大镜去找各条日志之间的因果。

可回放会话日志的思路完全不同:它记录的不是散落的“提示”,而是一个完整的事件流——从会话开始到结束,每一个输入、每一次模型调用、每一个插件调用、每一个中间结果、每一次错误,都按时间顺序、按层级关系记录完整。回放时,你可以像看录像一样,把会话从头到尾重演一遍,甚至可以在某一步暂停,查看当时的上下文和状态。

生活类比一下:普通日志是事故现场的照片,可回放日志是行车记录仪的视频。照片只能告诉你“撞了”,视频能告诉你“为什么撞”——前车怎么变道、当时车速多少、你是在哪一秒走了神。

这个差异直接决定了调试效率。面对一个复杂 Agent 任务,没有回放能力时,你只能靠猜加打印,加一轮日志让用户重跑一遍;有了回放,你拿到会话 ID 就可以本地复现整个过程,不用打扰用户。

3.2 事件模型:一条消息里至少装下四件事

可回放的前提是要先把事件模型设计好。我和团队在实践里沉淀出的最小事件结构包含四组信息:定位信息、因果信息、内容信息和成本信息,一次性写全。

下面是一个简化的事件记录 JSON:

{ "event_id": "evt_123456", "session_id": "sess_789", "step_id": "step_4", "parent_step_id": "step_3", "timestamp": "2025-06-18T10:24:33.128Z", "event_type": "plugin_call", "plugin_name": "wiki_retriever", "plugin_version": "1.2.0", "input": {"query": "什么是 Transformer"}, "output": {"docs": ["片段1", "片段2"], "count": 2}, "status": "success", "duration_ms": 235, "token_usage": {"prompt": 320, "completion": 120}, "error": null }

session_id和step_id解决“是哪次会话的哪一步”;parent_step_id解决“这一步是谁发起的”,构建出一棵因果树;plugin_name和plugin_version解决“是哪个插件、哪个版本干的活”;event_type标记不同种类的事件,如user_input、model_call、plugin_call、tool_result、error、session_end;input和output不一定存全量,但至少要存一个结构化的摘要;duration_ms和token_usage是排查性能问题必不可少的数字。

很多框架的日志里没有parent_step_id,这非常可惜。没有它,日志就只有时间线上的“先后”,没有逻辑上的“因果”。Agent 的编排是多层递归的——大步骤套小步骤,工具结果再喂回模型,如果不记录父子关系,你根本不知道某一次模型输出是吃了哪几个工具结果之后产生的。加了parent_step_id,你才能从根节点出发,把一次完整回答的推理链原样重建。

3.3 快照 vs 事件溯源:回放的两个实现流派

可回放日志的实现有两种主流思路,我分别说一下取舍。

第一种是定期快照加增量事件。每隔 N 步,或每到一个关键节点,把会话的完整状态(上下文消息列表、插件状态、变量值)存一次快照,两次快照之间的事件只存增量。回放时,先加载最近的一个快照,再叠加后续事件。这种方案的优点是回放启动快,不用从零开始推演;缺点是快照本身占用空间,而且如果快照之间的增量事件丢失,整个尾部就接不上了。

第二种是纯事件溯源,不存任何中间快照,所有状态变更都来自事件流。回放时,从会话的第一条事件开始,逐步重建状态。这种方案最安全,因为事件是唯一的事实来源,只要事件不丢,状态一定能重建;代价是回放一个超长会话时要重放成千上万条事件,耗时较长。

在 Agent 场景下,我的建议是“事件为主,快照为辅”。把每个原子操作都记成事件,这是底线;然后在会话超过一定步数(比如 50 步)时打一个状态快照,所有用户可见的中间答复也从快照里读取。这样既保留了完整的可追溯性,又控制了回放耗时。

这里还会牵扯到“代码回退”问题。你在热搜里可能见过 DeepSeek Harness 的代码回退相关讨论。日志本身不能直接回退代码,但通过记录每个插件版本的执行结果,你可以快速地做 A/B 对比——把插件降到旧版,再用录制的会话回放一遍,看是不是还复现同样的问题。我把这称作“版本锚点”:日志里不光要记插件名,必须记版本号,否则后端一升级,你连当前会话跑的是哪个版本的插件都说不清。

3.4 回放的典型玩法

回放日志不只是调试工具,实际用起来有三种典型玩法。

第一种是调试复现。用户那边出了诡异问题,你拿到会话 ID,在本地初始化一个回放环境,注入同样的插件版本和配置,把日志按时间顺序推到出错点,观察每一步的输入输出。定位效率比让用户录屏、导出一堆截图高一个数量级。很多时候,问题根本不是最后一步的报错,而是 20 步之前某个工具返回了格式错误,污染了后续所有上下文。

第二种是审计与复盘。Agent 在真实业务里执行了会“产生后果”的操作——发了 HTTP 请求、更新了文档、写了数据库。合规场景下,你必须有能力回答“这个 Agent 到底做了什么、为什么做”。可回放日志在这里就是铁证。它能把每一步的触发者、参数、结果都摊开,配合 token 消耗统计,还能精确算出一次任务花了多少钱、用了多少模型上下文。

第三种是回归测试与演示。你可以把一批经典的“黄金会话”日志存下来,每次改完主框架或插件代码,自动重放这些日志,比较输出是否和预期一致。这在 Agent 领域里特别重要,因为模型输出有随机性,但插件调参、工具选择的逻辑应该是可控的。如果一次重放里,Agent 在同样的输入下选择了完全不同的工具,那说明编排逻辑有隐患,而不是所谓的“模型太有创造力”。

4. 插件与日志的协同:全链路可观测性实战

4.1 用 trace_id 串联整条插件调用链

插件把事件抛给 Harness 统一收集,这是第一步。但如果每个插件各抛各的,没有一个贯穿始终的标识符,日志最终还是一堆散砂。所以 Harness 在会话创建时会生成一个trace_id,并在每次插件调用时生成一个span_id,这个 span 的父子关系正好对应前面说的step_id和parent_step_id。

trace_id 贯穿一次完整会话,span_id 定位一次具体调用。插件在执行时从 context 里拿到当前的 span_id,任何日志、事件、外部调用记录都自动挂到这条链路上。这样你在回放界面看到的不是一条平铺的时间线,而是一棵树——根是用户提问,枝是编排循环,叶是具体插件的执行细节。一次会话可能有几百条事件,没有这棵树,想精准定位“从哪个分支开始跑偏”会非常困难。

实际接入的时候,插件作者要注意一点:不要把 trace_id 和 span_id 当成可选项,随手构造。你自造一个“trace_001”这种字符串,一旦同一进程并发处理多个会话,日志就会互相串掉。正确的做法是完全信任 Harness 注入的 context,通过 context 统一去拿。

4.2 副作用记录:模型调用、工具调用、外部请求一个都不能少

Agent 不是纯计算系统,它是有副作用的。它真的会调外部 API、真的会写本地文件、真的会发送一封邮件。如果可回放日志只记录了“插件返回了什么文本”,而没有记录“插件到底对外部世界做了什么”,那么回放就只是在播一部没有声音、没有触感的默片,看起来很流畅,但你永远不知道自己不在现场时,系统对真实世界造成了什么影响。

副作用记录的核心原则,是把每一次对外调用都当成一等事件来记。你需要记录:调用了哪个外部端点、请求参数的摘要(敏感字段要做脱敏)、响应摘要、状态码、耗时、以及 token 消耗。如果响应体很大,不要全量存,存一个哈希值或截断摘要即可,但在日志里留下索引,需要时可以找到原始记录。

这里一定要提 token 消耗统计。用大模型跑 Agent,成本是肉眼可见的。每一个模型调用是prompt_tokens和completion_tokens,一次复杂任务跑下来,光分析用户输入可能就烧掉一大笔。会话日志里如果没有 token 记录,财务复盘时你只能对着账单傻眼。Harness 的做法是在事件模型里内置token_usage字段,每个模型插件都必须上报,最后按会话汇总。你在本地接入免费模型或者内网部署的模型服务时,token 的记录逻辑不变——字段照填,只是单价为零。

4.3 会话日志的存储与轮转策略

可回放日志比普通日志大得多。一条事件几十字节到几 KB,一次复杂会话可能产生上百条事件。存储方案我建议分三档:开发调试用 JSONL 文件,单机落地;中规模部署用 SQLite,查询方便还不用起服务;多实例部署或需要集中检索时,再上对象存储加外部数据库。

格式上,JSONL 是最自然的选择,一行一条事件,追加写,不会存在并发写同一个文件导致的锁竞争。SQLite 适合做时序检索,你可以按 session_id 建索引,查“某会话的所有事件”就是一次简单查询。

轮转策略不能省。生产环境里,我是按三个维度做轮转:保留时长——在线数据保留最近 30 天,超过的转到冷存储;体积上限——单会话日志超过 5 MB 时,只保留输入摘要、事件骨架和错误详情,丢弃完整输出体;敏感数据——在落盘之前做字段过滤,把用户身份信息、密钥、隐私内容替换成匿名标记。这一点在部署到局域网、多团队共用一套 Harness 时尤其重要,日志里混进了不该出现的内容,回放能力越强,泄露风险也越大。

5. 常见问题与排查技巧实录

5.1 插件加载报错与权限坑

插件加载阶段的问题,多半集中在三处:路径扫描失败、依赖缺失、初始化异常。

路径扫描失败最典型的就是前文说过的 Windows 权限问题。判断方法很简单:先尝试手动打开插件目录,如果资源管理器都进不去,那就是操作系统层权限的问题,和 Harness 无关。解决办法是给运行 Harness 的账号重新授权目录,或者把插件目录移到不受系统保护的用户目录下。

依赖缺失的问题一般报错信息里直接写着ModuleNotFoundError,但离线的环境会更隐蔽——可能在“联网机器上好使、内网机器一跑就挂”。我踩过这个坑之后养成了一个习惯:每个插件自带一个依赖清单文件,并且锁定版本号,Harness 启动时先做一次依赖预检,而不是等插件真跑到一半才炸。

初始化异常要重点看插件的on_load方法里干了什么。有团队在on_load里直接连接外部服务,服务一抖,整个 Harness 起不来。正确的姿势是on_load只做轻量初始化,真正的连接放到第一次执行时懒加载,并且要有重试和降级逻辑。

5.2 回放时状态不一致怎么定位

这是回放机制被问得最多的一个问题:我明明用原会话的日志回放,为什么结果和现场不一样?

原因通常出在三类地方。第一类是外部系统状态变了。插件第一次执行时读到的是旧数据库里的数据,回放时读到的已经是新数据了——结果当然不一样。这不是回放机制的 bug,而是副作用记录不完整的体现。你回放时要么把外部依赖也绑定到同一份测试数据,要么接受“回放只能复现流程,不能复现外部环境的变化”。

第二类是插件用了未隔离的全局变量。两个插件共享了一个模块级缓存,顺序不同,结果就跑偏。解决方法是插件状态必须全局唯一地绑定到会话 ID 或者 span ID,回放时按事件流把状态重新浇筑一遍。

第三类是随机性和时间函数。模型采样有温度,时间函数每次都不一样,如果你在调试时发现某一步结果对不上,先查这两个点。Harness 可以在回放模式下给插件注入固定的随机种子和模拟时钟,把不确定性因素锁死。

5.3 Agent 执行中断与空结果排查

Agent 任务执行到一半中断,是最让人头大的问题。一句agent execution terminated due to error几乎不提供任何信息,我在最初排查时也摸不着头脑。后来我学老实了:先看会话日志里最后一条成功事件的类型。如果是在model_call之后中断,大概率是模型返回格式异常,或者上下文超限;如果是在plugin_call之后中断,优先怀疑插件抛了未被捕获的异常;如果是网络层面的rpc error (-1): empty sid and service name,那多半是底层 RPC 服务端会话标识错误,连接都没建立成功。

我的建议是,遇到这类问题不要在主框架里反复打日志,而是直接用会话回放把最后几步完整复现。回放到断点之前,你能看到 Agent 当时拿着什么上下文、选择了什么插件、传入了什么参数,这才是定位问题的真正线索。很多所谓“随机出现”的中断,回放两三次后你就会发现,触发条件其实是固定的——只是现场日志太稀疏,你一直没看见。

下面放一个常见问题的速查表:

现象优先排查方向参考处理
插件加载报权限错目录位置、账号权限、杀毒拦截迁移插件目录、显式授权
内网装不了插件依赖离线安装源缺失预打包 wheelhouse、锁定版本
回放结果不一致外部状态、全局变量、随机性绑定测试数据、注入种子
任务执行中突然终止模型调用、插件异常、RPC 连接回放最后几步,看断点上下文
模型返回空结果上下文超限、输出格式异常拆分上下文、校验响应结构
token 消耗异常偏高插件循环调用、上下文累积压缩历史消息、缓存频繁结果

6. 我个人实操下来的一些体会

把 DeepSeek Harness 这套全插件化和会话日志回放机制梳理完,我最想强调的一点是:工程化不是“加功能”,而是“定边界”。插件化把业务能力的边界划清了,日志回放把运行过程的边界划清了,剩下的事,就是在边界之内高效地写代码。

踩过这么多次坑,我养成了几个习惯,分享出来供你参考。第一,任何新插件上线之前,先跑一次黄金会话回放再看效果,不要直接在生产环境上试错。第二,凡是会对外部世界产生副作用的插件,一定要把副作用记录当成功能的一部分来做,宁可日志丑一点,也不能没有。第三,尽早定下事件模型的规范化格式,后面对接存储、查询、可视化都会很快。第四,不要舍不得在日志上花存储空间——Agent 排障难,本质是信息不足,一条可能有用的日志胜过一百条猜测。

后续如果要扩展这套体系,我比较看好两个方向:一个是插件市场,把常用技能做成可复用、可分享、可版本管理的资产,团队之间互相复用;另一个是 Agent 记忆的跨会话打通,回放日志积累到一定程度,就能变成 Agent 的长期记忆来源,让它真正记住上次学到的东西。到时候,插件不仅是能力插槽,日志不仅是排查工具,它们会一起构成 Agent 持续进化的土壤。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询