DeepSeek-Agent-Harness-2026终极指南-第15章第70节-从demo到产品-配置化与插件化:让用户自定义一切

发布时间:2026/10/4 17:07:53
DeepSeek-Agent-Harness-2026终极指南-第15章第70节-从demo到产品-配置化与插件化:让用户自定义一切
配置化与插件化让用户自定义一切硬编码的工具和角色只能满足你自己插件化才能让 DeepPilot 成为平台。这一节借鉴 DSH一切皆插件的思想让工具和技能都能即插即用。本文导航为什么必须插件化约定式自动发现tools/ 目录即插件技能插件化skills/ 目录角色插件化roles/ 目录用户配置层deeppilot.toml第三方工具接入协议小结为什么必须插件化硬编码的问题# 硬编码每加一个工具就要改源码fromdeep_pilot.file_toolsimportread_file,write_file,edit_filefromdeep_pilot.bash_toolsimportrun_bashfromdeep_pilot.search_toolsimportglob_files,grep_searchfromdeep_pilot.web_toolsimportweb_search,web_fetch registryToolRegistry()registry.register(read_file)registry.register(write_file)# ... 每加一个工具都要改这里插件化的好处维度硬编码插件化新增工具改源码 重新发布丢进 tools/ 目录用户定制不可能自定义 tools/my_tool.py第三方扩展不可能遵循协议即可接入版本管理整体升级插件独立版本约定式自动发现tools/ 目录即插件目录结构deep_pilot/ ├── tools/ # 内置工具 │ ├── file_tools.py │ ├── bash_tools.py │ ├── search_tools.py │ └── web_tools.py ├── skills/ # 内置技能 │ ├── coding.md │ ├── debugging.md │ └── review.md ├── roles/ # 内置角色 │ ├── researcher.yaml │ ├── coder.yaml │ └── reviewer.yaml └── plugins/ # 用户插件可选 ├── tools/ ├── skills/ └── roles/工具自动发现# deep_pilot/plugin_loader.py —— 插件加载器from__future__importannotationsimportimportlibimportpkgutilfrompathlibimportPathfromtypingimportCallablefromdeep_pilot.tool_registryimportToolRegistry,toolfromdeep_pilot.loggerimportget_logger loggerget_logger(__name__)defdiscover_tools(search_paths:list[Path]|NoneNone)-ToolRegistry: 自动发现并注册所有工具。 扫描 tools/ 目录和 plugins/tools/ 目录 找到所有带 tool 装饰器的函数自动注册。 registryToolRegistry()# 默认搜索路径ifsearch_pathsisNone:search_paths[Path(__file__).parent/tools,# 内置工具Path.cwd()/plugins/tools,# 用户插件]fortool_dirinsearch_paths:ifnottool_dir.exists():continuelogger.info(f扫描工具目录:{tool_dir})# 遍历目录中的 .py 文件forpy_fileintool_dir.glob(*.py):ifpy_file.name.startswith(_):continue# 动态导入模块module_namepy_file.stemtry:specimportlib.util.spec_from_file_location(module_name,py_file)moduleimportlib.util.module_from_spec(spec)spec.loader.exec_module(module)# 找到所有带 _tool_meta 属性的函数tool 装饰器会设置forname,objinvars(module).items():ifcallable(obj)andhasattr(obj,_tool_meta):registry.register(obj)logger.info(f ✓ 注册工具:{obj._tool_meta[name]})exceptExceptionase:logger.error(f ✗ 加载工具失败{py_file}:{e})logger.info(f共注册{len(registry)}个工具)returnregistry用户自定义工具示例用户只需在plugins/tools/下创建文件# plugins/tools/jira_tool.py —— 用户自定义 Jira 工具fromdeep_pilot.tool_registryimporttooltool(jira_search,搜索 Jira 工单。输入 JQL 查询语句返回匹配的工单列表。)defjira_search(jql:str,max_results:int10)-str:搜索 Jira 工单importrequests# 从环境变量读取配置importos jira_urlos.getenv(JIRA_URL,https://jira.example.com)jira_tokenos.getenv(JIRA_TOKEN)resprequests.get(f{jira_url}/rest/api/3/search,params{jql:jql,maxResults:max_results},headers{Authorization:fBearer{jira_token}},)issuesresp.json().get(issues,[])return\n.join(f{i[key]}:{i[fields][summary]}foriinissues)零配置DeepPilot 启动时自动发现并注册这个工具。技能插件化skills/ 目录技能文件是 Markdown更简单# deep_pilot/skills_loader.py —— 增强版frompathlibimportPathclassSkillsLoader:def__init__(self,search_paths:list[Path]|NoneNone):self.search_pathssearch_pathsor[Path(__file__).parent/skills,Path.cwd()/plugins/skills,]self._cache:dict[str,str]{}self._discover()def_discover(self):发现所有技能文件forskill_dirinself.search_paths:ifnotskill_dir.exists():continueformd_fileinskill_dir.glob(*.md):skill_namemd_file.stem self._cache[skill_name]md_file.read_text(encodingutf-8)defload(self,skill_name:str)-str|None:加载指定技能returnself._cache.get(skill_name)deflist_skills(self)-list[str]:列出所有可用技能returnlist(self._cache.keys())用户自定义技能# plugins/skills/deploy.md # 部署技能 当用户要求部署应用时按以下步骤操作 1. 检查 Dockerfile 是否存在 2. 构建 Docker 镜像docker build -t app:latest . 3. 推送到镜像仓库docker push app:latest 4. 更新 Kubernetes 部署kubectl rollout restart deployment/app 注意事项 - 部署前必须确认用户在白名单中 - 生产环境部署需要二次确认角色插件化roles/ 目录角色用 YAML 定义更直观# roles/architect.yaml —— 架构师角色name:architectdisplay_name:架构师description:负责系统设计和架构决策system_prompt:|你是一位资深架构师专注于系统设计和技术选型。核心原则-简单优于复杂-可演进优于一步到位-文档先于代码 当用户提出需求时 1. 先理解业务场景和约束 2. 给出 2-3 个方案对比 3. 推荐最优方案并说明理由 4. 画出架构图用 Mermaidtools:-read_file-glob-grep# 架构师不需要写代码所以不给 write_file/edit_file角色加载器# deep_pilot/roles_loader.pyfrompathlibimportPathimportyamlclassRolesLoader:def__init__(self,search_paths:list[Path]|NoneNone):self.search_pathssearch_pathsor[Path(__file__).parent/roles,Path.cwd()/plugins/roles,]self._roles:dict[str,dict]{}self._discover()def_discover(self):forrole_dirinself.search_paths:ifnotrole_dir.exists():continueforyaml_fileinrole_dir.glob(*.yaml):withopen(yaml_file,encodingutf-8)asf:roleyaml.safe_load(f)self._roles[role[name]]roledefget_role(self,name:str)-dict|None:returnself._roles.get(name)deflist_roles(self)-list[str]:returnlist(self._roles.keys())用户配置层deeppilot.toml配置文件设计# deeppilot.toml —— 用户配置文件 [general] model deepseek-flash workspace . max_iterations 50 verbose false [tools] # 启用/禁用工具 enabled [file_tools, bash_tools, search_tools, web_tools] disabled [] # 工具特定配置 [tools.web_search] max_results 5 timeout 10 [tools.bash] timeout 30 allowed_commands [git, ls, cat, python] [context] max_tokens 8000 auto_compact true inject_file_tree true file_tree_max_depth 3 [plugins] # 插件目录 tools_dir plugins/tools skills_dir plugins/skills roles_dir plugins/roles [logging] level INFO file logs/deeppilot.log配置加载# deep_pilot/config.py —— 增强版frompathlibimportPathtry:importtomllib# Python 3.11exceptImportError:importtomliastomllibfrompydanticimportBaseModelfrompydantic_settingsimportBaseSettingsclassPluginConfig(BaseModel):tools_dir:strplugins/toolsskills_dir:strplugins/skillsroles_dir:strplugins/rolesclassSettings(BaseSettings):# 基础配置环境变量优先deepseek_api_key:SecretStr deepseek_base_url:strhttps://api.deepseek.com/v1deepseek_model:strdeepseek-flash# 从 deeppilot.toml 加载classmethoddeffrom_toml(cls,path:PathPath(deeppilot.toml))-Settings:ifpath.exists():withopen(path,rb)asf:configtomllib.load(f)# 合并配置returncls(**config.get(general,{}))returncls()第三方工具接入协议协议规范第三方工具只需遵循简单协议即可接入# 第三方工具协议# 1. 文件放在 plugins/tools/ 目录# 2. 使用 tool 装饰器声明工具# 3. 函数签名def tool_name(arg1: type1, arg2: type2) - str# 4. 返回字符串会自动截断fromdeep_pilot.tool_registryimporttooltool(namegithub_issue,description创建 GitHub Issue。输入标题和描述返回 Issue 链接。)defgithub_issue(title:str,body:str,labels:list[str]|NoneNone)-str:创建 GitHub Issue# 实现...returnfhttps://github.com/owner/repo/issues/123插件市场未来plugins/ ├── official/ # 官方插件 │ ├── github/ │ ├── jira/ │ └── slack/ ├── community/ # 社区插件用户下载 │ ├── kubernetes/ │ ├── aws/ │ └── database/ └── custom/ # 用户自定义 └── my_tool.py未来可以做一个插件市场用户一键安装deeppilot plugininstallkubernetes deeppilot plugininstallaws-s3小结约定式发现tools/、skills/、roles/目录即插件丢进去就自动加载。用户自定义不用改源码在plugins/目录下创建文件即可扩展。第三方协议遵循tool装饰器规范任何工具都能接入。配置层deeppilot.toml统一管理环境变量优先。插件市场未来一键安装社区插件。DeepPilot 从工具进化为平台用户生态从此打开。下节预告DeepPilot v1.0 功能完备该发布给全世界了。下一节PyPI 上架实战pyproject.toml发布配置、uv build打包、TestPyPI 试发、正式发布——让别人pip install deeppilot就能用上你写的 Agent。如果觉得本文对你有帮助欢迎点赞、收藏、关注三连本系列持续更新中关注不迷路~