《AI Agent 工程实战》2.1 分层配置:pydantic-settings 加载与校验
本节用 pydantic-settings 2.15.0 把 ResearchCopilot 散落的配置收成一个可校验的 Settings 对象,演示「默认值 → 配置文件 → 环境变量 → 显式参数」四级来源合并与 Field 校验。我们真跑两段代码:一段展示高层来源逐级覆盖低层,一段展示非法值被拒绝并给出清晰报错,并说明配置对象该如何注入服务。
category
本节用 pydantic-settings 2.15.0 把 ResearchCopilot 散落的配置收成一个可校验的 Settings 对象,演示「默认值 → 配置文件 → 环境变量 → 显式参数」四级来源合并与 Field 校验。我们真跑两段代码:一段展示高层来源逐级覆盖低层,一段展示非法值被拒绝并给出清晰报错,并说明配置对象该如何注入服务。
本节给 minagent 加上 token 预算:先讲清上下文窗口、成本、延迟三重约束,再用一个不依赖 tiktoken 的字符近似函数估算 token;随后实现保留 system + 最近 N 轮 + 工具结果摘要的截断策略,并把裁剪逻辑包成 BudgetedModel 包装器,真跑展示裁剪前后的消息条数与近似 token 数。
本节给 Model 协议接上真实供应商:以 Anthropic SDK(anthropic 1.13.0)为例,把 minagent 的 Message 翻译成 SDK 入参、把 SDK 响应折叠回 ModelResponse,密钥只用 os.environ 读取、示例默认不真调。重点讲「录制夹具」:把一次真实响应存成 JSON,离线用 RecordedModel 重放,做到零凭据可回归。
本节把「调用大模型」抽象成 minagent 的 Model 协议:用一个 complete(messages, tools) 方法屏蔽供应商差异,用统一的 ModelResponse 承载回复、停止原因与用量。我们讲清协议为什么存在、complete 与 stream 如何取舍,再给出 EchoModel 与 ScriptedModel 两个可运行实现,并验证它们可以互换。
本节把 ResearchCopilot 落成 monorepo:packages/researchcopilot 是 Python 服务包,packages/web 是 TS 前端包。给出 pyproject.toml 与 package.json 片段,在本机真跑 pytest、node --test、tsc --noEmit 并贴出输出,最后给出 GitHub Actions CI 形态。
本节给 ResearchCopilot 画出四层边界:卷一的 minagent 引擎层、FastAPI 服务层、异步 worker 层、Postgres 加 Redis 的存储层。我们用一张 ASCII 图和一张职责表说清每层管什么、不该管什么,用可跑的检查脚本钉死依赖方向,并完整走一遍一个提问从进来到出结果、跨四层的时序。
本节为 ResearchCopilot 立下 3 个可验收的核心用例:单跳事实问答、多跳研究并输出带引用报告、后台周期 digest。每个用例都给出量化验收标准与落地章节映射,并明确列出不做通用聊天、不做 MCP Server 实现、不做多租户计费这三条边界,把项目范围钉死在可交付的一小块上。
本节写下全书的测试基石 FakeModel:一个按脚本列表吐响应的假模型,脚本元素可以是文本、ToolCall 列表或 ModelResponse,它记录每次调用入参、脚本耗尽即抛 RuntimeError。随后用一个极简循环跑通「add 到 mul 再文本收敛」,打印完整轨迹并断言两次运行逐字节一致。
本节给 Agent 一个可执行的最小定义——模型 + 工具 + 循环 + 状态,并把它落成 minagent/types.py 里的 Role、ToolCall、Message、ModelResponse 四个类型;重点讲清 Message.to_wire() 如何把对象变成模型能消费的线格式,再用一段离线断言脚本实测「序列化到反序列化再回放」全程往返一致。
本节为 minagent 搭好双栈环境与仓库骨架:用 Python 3.14.6 建虚拟环境并配置中科大 PyPI 镜像,用 Node 26.5.0 备好 TypeScript 对照线;再建出 minagent/ 包与 tests/ 目录,git init 并完成首个提交,最后用一行命令实测验证解释器版本。