工具流水线与系统提示词¶
工具的注册、JSON Schema 动态生成、三阶段执行流水线与系统提示词动态拼装。
在 DSH 中,大模型所能调用的工具不是零散暴露的裸函数,而是通过 作用域化的 ToolRegistry 与 严格的执行流水线(Execution Pipeline) 纳管的。
核心文件速查¶
| 路径 | 职责 | 重要度 |
|---|---|---|
packages/core/tools/src/index.ts |
工具注册表与 tools/* 执行流水线 |
⭐⭐⭐ |
packages/core/system-prompt/src/index.ts |
动态系统提示词拼装器 | ⭐⭐⭐ |
packages/fs/tool-fs/src/index.ts |
read, write, edit 核心文件工具 |
⭐⭐⭐ |
packages/shell/tool-bash/src/index.ts |
bash 执行与后台作业工具 |
⭐⭐⭐ |
动态系统提示词拼装(System Prompt Assembler)¶
DSH 拒绝使用单一硬编码的 System Prompt 文件。
ctx.systemPrompt 维护了一个有序的提示词片段注册表。每个插件均可向系统提示词注册专属片段(Section):
┌────────────────────────────────────────────────────────────┐
│ Dynamic System Prompt Tree │
│ │
│ [Order 000] Persona & Identity (核心人设与行动原则) │
│ [Order 100] Workspace Context (当前工作目录、文件树状态) │
│ [Order 200] Sandboxing & Permissions (当前沙箱权限等级) │
│ [Order 300] Tool Instructions (各激活工具的使用指南) │
│ [Order 400] Dynamic Skills (当前匹配并注入的 Skill 指令) │
│ [Order 500] User Instructions (用户自定义 CLAUDE.md/AGENTS) │
└────────────────────────────────────────────────────────────┘
每个 Step 开始前,ctx.systemPrompt.assemble(ctx) 会按优先级排序并自动拼接所有活跃片段,确保提示词随当前加载的插件动态自适应。
工具的三阶段执行流水线¶
当大模型发起 tool/call 时,DSH 不会立刻执行工具,而是将其送入三阶段拦截流水线:
Model Tool Call Event
│
▼
┌───────────────────────────────────┐
│ 1. tools/pre-execute │
│ - 参数 JSON Schema 校验 │
│ - 沙箱权限检查 (Sandbox Policy) │
│ - 用户交互审批 (User Approval) │
└─────────────────┬─────────────────┘
│ (Approved)
▼
┌───────────────────────────────────┐
│ 2. tools/execute │
│ - 执行具体的底层实现 │
│ - 超时保护与中断信号 (AbortSignal)│
└─────────────────┬─────────────────┘
│
▼
┌───────────────────────────────────┐
│ 3. tools/post-execute │
│ - 结果脱敏与安全过滤 │
│ - Spill 大输出外溢检查 │
│ - 记录 tool/result 会话事件 │
└─────────────────┬─────────────────┘
│
▼
Return to Agent Loop
1. Pre-Execute 阶段(鉴权与审批)¶
在执行前,流水线会检查该工具是否属于危险操作(如写文件、执行 bash)。如果当前审批策略为 ask,系统会在此暂停,弹出交互卡片向用户请求授权。
2. Execute 阶段(受控执行)¶
工具执行受沙箱(Sandbox)和超时策略(Guard)保护。如果命令超时或收到取消信号,底层子进程会被立即 SIGKILL 杀死。
3. Post-Execute 阶段(外溢截流)¶
如果工具输出了超长内容(例如 500KB 的日志),spill 插件会在此介入,自动将内容写入本地文件,并替换为带标记的摘要引用。
本章思考与自测¶
- 思考题:如果大模型调用了一个不存在的工具名称,DSH 会直接抛出异常崩溃,还是作为错误结果返回给模型?为什么?
- 自测题:在
tools/pre-execute阶段,如果用户点击了"拒绝(Deny)",会话日志中会记录什么事件?大模型在下一个 Step 会接收到什么反馈?