12 Factor 方法论合并知识图谱 / 分组目录 / 依赖与工具显式化 / 依赖与工具显式化

依赖与工具显式化

桥接主题高级桥接主题GT05 · 依赖与工具显式化

What · 是什么

显式声明依赖 / 工具,不隐式依赖环境
App 显式声明并隔离全部依赖,绝不依赖系统级隐式包存在(dependencies.md)
Agent 把工具建模为 LLM 的结构化输出,触发确定性代码执行(factor-04)
App 声明清单 + 隔离工具必须同时使用,仅其一不满足十二因子(dependencies.md)
Agent 的工具即 intent schema:LLM 输出 JSON 描述确定性代码该做什么(factor-04)
隐式依赖无法保证存在与版本兼容,这是两侧共同的显式化动机(dependencies.md)
工具决策(LLM)与工具执行(代码)分离,使工具可组合可测试(factor-04)
App shell out 系统工具需 vendored 而非假设存在(dependencies.md)
Agent 的 BAML 工具类(Add/Subtract/Multiply/Divide)即声明式的工具清单(tool_calculator.baml)

Why · 为什么

原理 · Principle

系统级 site packages 等隐式依赖的存在与版本无法保证(dependencies.md)

ImageMagick/curl 等系统工具未来系统可能不存在或不兼容(dependencies.md)

显式声明简化新开发者搭建:仅需语言运行时+依赖管理器即可确定性 build(dependencies.md)

Agent 侧把工具当结构化输出解锁无限组合与可测试性(factor-04)

决策与执行分离让 LLM 决定做什么、代码控制怎么做,避免工具被误执行(factor-04)

How · 怎么做

App:Bundler 用 Gemfile manifest 声明 + bundle exec 隔离(dependencies.md)
App:Python 用 Pip 声明 + Virtualenv 隔离,两步分开(dependencies.md)
App:C 用 Autoconf 声明 + 静态链接隔离(dependencies.md)
Agent:tool_calculator.baml 定义四则工具类,带 intent 常量与参数类型(tool_calculator.baml)
Agent:agent.baml 用 union 类型 CalculatorTools 聚合工具,作为 DetermineNextStep 返回类型(agent.baml)
Agent:handleNextStep 用 switch(intent) 分派到确定性执行,结果 push 回 thread(agent.ts)
Agent:生成客户端 baml_client 由 BAML 编译器产出,与 baml_src 声明同步(agent.ts import + generators.baml)
Agent:未知 intent 分支有兜底 else,不默认放行(factor-01/04 代码)

两体系对照 · App 侧 | Agent 侧 | 差异根源

App 侧Agent 侧差异根源
Gemfile manifest 完整精确声明依赖,bundle exec 保证隐式不泄漏(dependencies.md)工具是带 schema 的 intent 类,LLM 输出即工具调用对象(tool_calculator.baml)App 显式化对象是库与包(代码依赖);Agent 显式化对象是行为能力与副作用(工具调用)
Pip(声明)+ Virtualenv(隔离)双工具模式(dependencies.md)divide 等高风险工具被 agentLoop 返回 thread 而非直接执行,强制审批(agent.ts)App 用 manifest+bundler 隔离运行时;Agent 用 schema+生成客户端契约化决策面
确定性 build command:bundle install / lein deps(dependencies.md)工具类以 union 组合进单一返回类型,天然可扩展(agent.baml)Agent 的工具声明还隐含授权边界:工具即权限,需额外关注安全
不 shell out ImageMagick/curl,需要则 vendored 进 app(dependencies.md)switch(intent) 是确定性执行面,工具行为不随 LLM 波动(agent.ts handleNextStep)App 依赖在构建期解析;Agent 工具在运行循环中按 intent 实时分派
开发与生产统一应用同一份显式依赖规范(dependencies.md)工具结果作为事件回填上下文,支撑下一轮决策(factor-04 pattern + agent.ts)差异根源:App 依赖静态引入、Agent 工具动态选择,后者需结合控制流治理
依赖声明让新开发者一条命令跑通(dependencies.md)BAML 生成客户端版本由 generators.baml 锁定,避免声明与实现漂移(generators.baml)
系统级包只在运行时隐式可用即违规(dependencies.md)工具即行为能力的声明:新增能力=新增 intent 类+执行分支(agent.baml + agent.ts)

相关边

实践资源 · 源码引用