DB-GPT Agent 中间件系统实战:生命周期 Hook 驱动的插件化扩展与 Skill 技能注入
发布时间:2026/10/10 5:33:23 锦皓数字建站

人工智能AI 应用AI AgentRAG本地部署数据分析【免费下载链接】DB-GPTopen-source agentic AI data assistant for the next generation of AI Data products.项目地址https://gitcode.com/GitHub_Trending/db/DB-GPT点击查看免费下载DB-GPT 在dbgpt/agent/middleware模块中实现了一套面向 Agent 的中间件系统借鉴了 deepagents 的AgentMiddleware模式让插件能够挂接到 Agent 的初始化、思考、执行与回复生成等完整生命周期事件上。本文将以 middleware 模块 README 为核心骨架结合仓库源码逐层拆解AgentMiddleware、MiddlewareManager、MiddlewareAgent与SkillsMiddlewareV2的架构设计、Hook 机制与调用链实现并给出可直接运行的技能加载、自定义中间件与迁移实战示例。读完本文你将能够基于 DB-GPT 的生命周期 Hook 编写自定义中间件用 SKILL.md 技能包为 Agent 注入领域能力并把存量SkillsAgent/ConversableAgent平滑迁移到新中间件体系。中间件系统架构概览中间件系统由四个核心构件组成它们的分工如下组件作用AgentMiddleware所有中间件的抽象基类定义了一组可覆写的生命周期 Hook 方法MiddlewareManager中间件的注册、注销与执行管理器负责按顺序调用已注册且启用的中间件MiddlewareAgent继承自ConversableAgent的中间件增强型 Agent在关键生命周期节点触发 HookSkillsMiddlewareV2基于新中间件体系的技能中间件把 SKILL.md 技能注入 Agent 生命周期从源码结构看中间件模块位于 packages/dbgpt-core/src/dbgpt/agent/middleware/其中base.py 定义了AgentMiddleware与MiddlewareManageragent.py 定义了AgentConfig与MiddlewareAgentexample.py 提供了三个可直接运行的用法示例。技能相关模块位于 packages/dbgpt-core/src/dbgpt/agent/skill/其中 middleware.py 是渐进式披露Progressive Disclosure技能的原始实现middleware_v2.py 是将其改造为AgentMiddleware子类的新版本。中间件生命周期 Hook 全景中间件可以挂接以下生命周期事件覆盖 Agent 从初始化到回复产出的完整过程Hook触发时机before_initAgent 初始化之前after_initAgent 初始化之后before_generate_reply生成回复之前after_generate_reply生成回复之后before_thinking思考thinking步骤之前after_thinking思考thinking步骤之后before_act执行act步骤之前after_act执行act步骤之后modify_system_prompt系统提示词发送给 LLM 之前可对其修改在 base.py 中每个 Hook 方法都有明确的签名约定before_init(agent, **kwargs)/after_init(agent, **kwargs)返回Optional[Dict]返回的状态字典会合并进中间件共享状态before_generate_reply(agent, context: AgentGenerateContext, **kwargs)context携带AgentGenerateContext可读取context.message.content拿到用户输入after_generate_reply(agent, context, reply_message: AgentMessage, **kwargs)reply_message即模型产出的回复消息after_thinking(agent, context, llm_reply: str, model_name: str, **kwargs)额外传入 LLM 原始回复与模型名before_act(agent, context, message, **kwargs)/after_act(agent, context, action_output, **kwargs)围绕工具/动作执行前后modify_system_prompt(agent, original_prompt: str, contextNone) - str接收原始提示词返回修改后的提示词。所有 Hook 均为async方法默认返回Nonemodify_system_prompt默认原样返回original_prompt即基类提供空实现子类只需覆写感兴趣的事件即可无需实现全部 Hook。快速上手三种典型用法1. 使用 MiddlewareAgent 集成 Skills最简单的入门方式是直接使用MiddlewareAgent通过AgentConfig开启中间件与技能并声明技能源目录from dbgpt.agent.core.profile.base import ProfileConfig from dbgpt.agent.core.agent import AgentContext from dbgpt.agent.middleware.agent import MiddlewareAgent, AgentConfig profile ProfileConfig( nameassistant, roleAI Assistant, goalHelp users with their tasks using available skills., ) config AgentConfig( enable_middlewareTrue, enable_skillsTrue, skill_sources[ /path/to/skills/user, /path/to/skills/project, ], ) agent MiddlewareAgent( profileprofile, agent_configconfig, ) agent_context AgentContext( conv_idtest_conv_001, ) await agent.bind(agent_context).build()AgentConfig在 agent.py 中定义各字段含义与默认值如下字段默认值说明enable_middlewareTrue是否启用中间件系统enable_skillsTrue是否启用技能中间件skill_sourcesNone技能源目录列表可同时配置多个后声明的目录优先级更高skill_auto_loadTrue是否自动加载技能skill_auto_matchTrue是否根据用户输入自动匹配技能skill_inject_to_promptTrue是否把技能信息注入系统提示词当enable_middleware与enable_skills同时为True且存在skill_sources时MiddlewareAgent.__init__会自动构造SkillsMiddlewareV2并注册进MiddlewareManager见 agent.py。仓库内的官方示例 example.py 还展示了在AgentContext中传入languagezh-CN的写法可用于多语言会话场景。2. 创建自定义中间件继承AgentMiddleware覆写关心的 Hook 即可。下面是一个打印日志的中间件在回复生成前后输出用户输入与模型回复from dbgpt.agent.middleware.base import AgentMiddleware class LoggingMiddleware(AgentMiddleware): Custom middleware for logging. async def before_generate_reply(self, agent, context, **kwargs): Called before generating a reply. print(fBefore generate reply: {context.message.content}) async def after_generate_reply(self, agent, context, reply_message, **kwargs): Called after generating a reply. print(fAfter generate reply: {reply_message.content}) agent MiddlewareAgent(profileprofile) agent.register_middleware(LoggingMiddleware())MiddlewareAgent提供register_middleware/unregister_middleware两个方法底层委托给MiddlewareManager.register/MiddlewareManager.unregister。注册后中间件即进入执行队列无需额外操作。也可以通过middleware.enable()/middleware.disable()动态启停某个中间件——MiddlewareManager执行时只调用enabled为True的中间件见 base.py。3. 直接使用 SkillsMiddlewareV2如果不经过 Agent也可以在应用层直接实例化SkillsMiddlewareV2独立完成技能的加载、列示与匹配from dbgpt.agent.skill.middleware_v2 import SkillsMiddlewareV2 skills_middleware SkillsMiddlewareV2( sources[/path/to/skills/user], auto_loadTrue, auto_matchTrue, inject_to_system_promptTrue, ) skills skills_middleware.load_skills() for name, skill in skills.items(): print(f{name}: {skill.metadata.description}) matched_skills skills_middleware.match_skills(research quantum computing)SkillsMiddlewareV2的构造函数参数与AgentConfig中的技能字段一一对应sources技能源、auto_load初始化即加载、auto_match按输入自动匹配、inject_to_system_prompt注入系统提示词。其内部委托原始的SkillsMiddleware完成实际加载逻辑见 middleware_v2.py。SKILL.md 技能格式规范技能以目录形式组织目录内必须包含一个带 YAML frontmatter 的SKILL.md文件/skills/user/web-research/ ├── SKILL.md # 必选YAML frontmatter markdown 指令 └── helper.py # 可选辅助文件frontmatter 字段--- name: web-research description: Structured approach to conducting thorough web research version: 1.0.0 author: Your Name skill_type: research tags: [web, research, analysis] allowed-tools: web-search license: MIT --- # Web Research Skill ## When to Use - User asks you to research a topic - You need to gather information from the web - Research requires structured approach ## Workflow 1. Define research scope 2. Search for relevant information 3. Evaluate sources 4. Synthesize findings 5. Present results其中name与description为必填项。源码层面的解析规则在 middleware.py 中实现值得注意的细节包括命名规范_validate_skill_name要求 name 最长 64 字符仅允许小写字母、数字与单个连字符正则^[a-z0-9](-[a-z0-9])*$不允许首尾连字符与连续连字符middleware.py大小限制SKILL.md文件超过MAX_SKILL_FILE_SIZE10 MB会被跳过description超过 1024 字符会被截断并记录警告allowed-toolsfrontmatter 中以空格分隔的字符串会被拆分为允许使用的工具列表缺失校验无有效 frontmatter、frontmatter 不是映射、或缺少name/description的文件都会被跳过并输出 warning 日志其余字段version、author、license、skill_type、tags均有默认值兜底。仓库自带了一组可直接参考的真实技能包例如 skills/agent-browser/SKILL.md无头浏览器自动化、skills/csv-data-analysis/SKILL.mdCSV/Excel 深度数据分析后者还演示了技能如何通过execute_skill_script_file调用scripts/csv_analyzer.py并借助html_interpreter注入报告模板的完整工作流。更多技能机制说明可参阅 skills/README.md 与 skills/INTEGRATION_GUIDE.md。中间件系统的源码级实现AgentMiddleware 与 MiddlewareManagerAgentMiddleware在 base.py 中实现除了九个生命周期 Hook 外还内置了_enabled开关与enabled属性。MiddlewareManagerbase.py则承担三方面职责注册管理register/unregister维护中间件有序列表注册时按顺序追加、去重并打印Registered middleware: xxx日志状态共享get_state/set_state/update_state提供跨中间件的键值状态存储各 Hook 返回的Dict会被合并进_state批量执行为每个 Hook 提供对应的execute_*方法。所有execute_*都遍历中间件列表、跳过enabledFalse的中间件并把非空返回值合并进combined_state返回。execute_modify_system_prompt则采用链式管道语义——前一个中间件修改后的 prompt 会作为后一个中间件的输入依次传递。MiddlewareAgent 的 Hook 调用链MiddlewareAgent在 agent.py 中通过覆写ConversableAgent的核心方法把 Hook 精确嵌入各生命周期节点build()先执行before_init再调用super().build()最后执行after_initagent.py_a_init_reply_message()在初始化回复消息前执行before_generate_reply构造携带received_message的AgentGenerateContextthinking()调用 LLM 前执行before_thinking拿到(llm_reply, model_name)后执行after_thinking并把回复与模型名透传给 Hookagent.pyact()动作执行前后分别调用before_act/after_actafter_act会把ActionOutput传给 Hookagent.pybuild_system_prompt()先调用父类构建原始提示词再交给execute_modify_system_prompt做链式改写agent.py。模块还提供了便捷工厂函数create_middleware_agent(profile, agent_config, agent_context, **kwargs)用于快速构造并返回配置好的MiddlewareAgent实例。SkillsMiddlewareV2 如何融入生命周期SkillsMiddlewareV2是中间件体系的第一个官方插件它覆写了三个 Hook 来完成技能能力注入middleware_v2.pyafter_init若auto_loadTrue加载所有技能并把skills_loaded、skills_count、skills_sources写入中间件状态before_generate_reply若auto_matchTrue从context.message.content提取用户输入并调用match_skills命中的技能名列表matched_skills、matched_skills_count会写回状态供后续环节读取modify_system_prompt若inject_to_system_promptTrue把create_skills_prompt_section()生成的技能区块拼接到原始提示词之前。技能区块的内容由 middleware.py 中的SKILLS_SYSTEM_PROMPT模板生成它向 LLM 明示了三件事可用技能的名称与描述列表含读取路径、渐进式披露的使用方式先看元信息、按需读取完整指令、访问辅助文件、以及触发时机示例如research X匹配 web-research 技能。match_skills的实现是纯关键词启发式从技能描述中抽取when/use/for/to等触发词再与用户输入做小写包含匹配middleware.py。与 DeepAgents 的对比原文档给出了新中间件体系与 deepagents 的对照核心差异在于 Hook 粒度与后端抽象特性DeepAgentsDB-GPT新后端支持Filesystem、State、RemoteFilesystem规划中中间件 Hookbefore_agent、wrap_model_call完整生命周期 Hook九个事件技能格式SKILL.md with YAMLSKILL.md with YAML渐进式披露支持支持异步支持支持支持可以看出DB-GPT 的中间件在技能格式与异步模型上对齐了 deepagents 的设计但在 Hook 覆盖面上更广——从初始化、思考、执行到回复生成均有独立的插入点而不只是包一层模型调用。迁移指南从 SkillsAgent 迁移到 MiddlewareAgent如果正在使用dbgpt.agent.skill.agent中的旧式SkillsAgent可按如下方式平滑迁移# 旧写法 from dbgpt.agent.skill.agent import SkillsAgent, SkillsAgentConfig config SkillsAgentConfig(skill_sources[/path/to/skills]) agent SkillsAgent(profileprofile, skills_configconfig) # 新写法 from dbgpt.agent.middleware.agent import MiddlewareAgent, AgentConfig config AgentConfig(skill_sources[/path/to/skills]) agent MiddlewareAgent(profileprofile, agent_configconfig)迁移后技能加载、自动匹配、系统提示词注入等能力由MiddlewareAgent内部的SkillsMiddlewareV2承接职责与旧SkillsAgentConfig的auto_load、auto_match、inject_to_system_prompt、lazy_content_load字段一一对应。旧式SkillsAgent的更多 APIload_skills、match_skills、set_skill、clear_active_skills、get_skills_summary等仍保留在 skill/agent.py 中可供参考。为现有 ConversableAgent 添加中间件不需要整体换成MiddlewareAgent也可以在自定义 Agent 内手动集成MiddlewareManagerfrom dbgpt.agent.core.base_agent import ConversableAgent from dbgpt.agent.middleware.base import MiddlewareManager class MyAgent(ConversableAgent): def __init__(self, **kwargs): super().__init__(**kwargs) self.middleware_manager MiddlewareManager() async def build(self, is_retry_chatFalse): await self.middleware_manager.execute_before_init(self) await super().build(is_retry_chat) await self.middleware_manager.execute_after_init(self) return self这段代码展示了最小集成路径构造MiddlewareManager、在build()前后触发before_init/after_init。如需覆盖更多生命周期事件参照上一节MiddlewareAgent的调用链在对应方法中调用execute_before_generate_reply、execute_before_thinking、execute_before_act、execute_modify_system_prompt等即可。ConversableAgent本身位于 packages/dbgpt-core/src/dbgpt/agent/core/base_agent.py是 DB-GPT 所有对话型 Agent 的基类。文件结构与后续演进方向中间件与技能子系统的源码布局如下对照 middleware/README.md 的 File Structure 小节packages/dbgpt-core/src/dbgpt/agent/ ├── middleware/ │ ├── __init__.py # 导出 AgentMiddleware、MiddlewareManager、MiddlewareAgent 等 │ ├── base.py # AgentMiddleware、MiddlewareManager │ ├── agent.py # MiddlewareAgent、AgentConfig、create_middleware_agent │ └── example.py # 官方用法示例 └── skill/ ├── base.py # Skill、SkillBase、SkillMetadata、SkillType ├── middleware.py # 原始 SkillsMiddleware渐进式披露 ├── middleware_v2.py # SkillsMiddlewareV2新中间件体系 ├── agent.py # SkillsAgent旧 ├── manage.py # SkillManager注册、检索、脚本/资源执行与安全控制 ├── loader.py # SkillLoader、SkillBuilder └── parameters.py # SkillParameters原文档列出的未来改进方向包括技能存储的后端抽象filesystem、state、remote技能热加载hot-reloading技能依赖管理与版本管理技能执行监控与分析技能市场marketplace集成。此外从 skill/manage.py 可以看出技能子系统已经在向可执行方向演进SkillManager支持通过execute_script/execute_skill_script_file/get_skill_resource在沙箱代码服务中执行技能的 Python/Shell 脚本并通过DBGPT_DISABLE_PERSONAL_SKILL_SCRIPT_EXECUTION环境变量对skills/user下的个人技能脚本执行做安全开关对应的行为验证可参考 skill/tests/test_manage.py 中的测试用例。这些能力与中间件体系结合后一个典型的应用场景是用户上传 CSV 文件 →before_generate_reply自动匹配csv-data-analysis技能 →modify_system_prompt注入技能指引 → Agent 调用execute_skill_script_file运行分析脚本并产出报告整个流程完全由中间件 Hook 编排驱动。总结DB-GPT 的 Agent 中间件系统把横切关注点日志、技能注入、上下文增强、观测等从 Agent 核心逻辑中解耦出来通过九个生命周期 Hook 提供了细粒度的插入点AgentMiddleware定义契约、MiddlewareManager负责编排与状态共享、MiddlewareAgent完成调用链接线、SkillsMiddlewareV2则作为首个开箱即用的中间件把 SKILL.md 技能包的渐进式披露能力无缝接入 Agent 生命周期。无论是为现有 Agent 添加插件能力还是打造自己的领域技能包都可以基于这套体系低成本落地。赞分享人工智能AI 应用AI AgentRAG本地部署数据分析【免费下载链接】DB-GPTopen-source agentic AI data assistant for the next generation of AI Data products.项目地址https://gitcode.com/GitHub_Trending/db/DB-GPT点击查看免费下载相关推荐多人协作开发 AI 项目怎么起步AI 知识库里的 4 步实战指南直接照做多人协作开发 AI 项目怎么起步AI 知识库里的 4 步实战指南直接照做 鱼皮 ai guide 是一个持续更新的 AI 知识库覆盖 DeepSeek 使文档教程知识库人工智能Serverless Framework 自定义插件开发实战生命周期 Hook、CLI 能力扩展与 NPM 分发Serverless Framework 自定义插件开发实战生命周期 Hook、CLI 能力扩展与 NPM 分发 导读 Serverless Framewor开发工具CLI云原生后端ppf-contact-solver可扩展性设计支持更大规模模拟的GPU并行架构ppf contact solver可扩展性设计支持更大规模模拟的GPU并行架构 在物理模拟领域处理大规模接触问题一直是技术挑战。ppf contact s物理引擎高性能计算上一篇如何系统学习神经网络与深度学习邱锡鹏《神经网络与深度学习》对比其他AI教材的5大优势下一篇WingetUI终极安装指南三步快速部署Windows最佳包管理界面工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。