第 31 章

配置 Deep Agents

通过 config.toml、环境变量、Hooks 和 MCP 服务器深度定制 Deep Agents Code

从"开箱即用"到"按需调优"的完整配置指南

为什么需要它

你有没有试过在多个项目间切换不同的 LLM Provider?

无配置管理的困境

  • API 密钥散落在各个 .env 文件中,无法统一管理
  • 不同项目需要不同模型参数,只能手动反复调整
  • 本地 Ollama 和云端 API 切来切去,没有统一的 Provider 管理
  • 主题、更新策略各自为政,团队协作配置不一致
  • 想对生命周期事件做自动化?没有钩子机制

Deep Agents 的解法

  • 所有配置集中在 ~/.deepagents/,一处管理所有设置
  • 全局 + 项目级 .env 文件,灵活覆盖不冲突
  • Provider 配置支持按模型覆盖参数,精细控制每个模型
  • 自定义主题 + 终端映射,自动适配不同环境
  • Hooks 钩子系统响应生命周期事件,自动化一切
问题核心:当你从"试玩一个 Agent"走向"日常使用一个 Agent",你就需要管理密钥、切换模型、调整参数、自动化流程。Deep Agents Code 的配置系统就是为这个阶段准备的。

配置文件总览

所有配置集中在 ~/.deepagents/ 目录下

文件格式用途
config.toml TOML 模型默认值、Provider 设置、构造函数参数、Profile 覆盖、主题、更新设置
.env Dotenv 全局 API 密钥和密钥(如 OPENAI_API_KEY)
hooks.json JSON 订阅 Deep Agents Code 生命周期事件的外部工具
.mcp.json JSON 全局 MCP 服务器定义

目录结构

~/.deepagents/
  config.toml      # 主配置文件:模型、Provider、主题、更新等
  .env             # API 密钥(所有项目共享)
  hooks.json       # 生命周期钩子(响应 Agent 事件)
  .mcp.json        # MCP 服务器定义(全局工具扩展)
  .state/          # 运行时状态(自动管理,不要手动修改)

快速开始

  • /auth — 管理 Provider 凭证
  • /model — 切换模型
  • /agents — 切换 Agent
  • /theme — 切换主题
  • /reload — 重载配置
注意:~/.deepagents/.state/ 目录下的文件保存运行时状态,由系统自动管理,不要手动修改。

Provider 凭证

两种方式管理 API 密钥:/auth 命令或环境变量

Deep Agents Code 按以下优先级检查凭证:已存储的密钥 > 环境变量。

推荐:/auth 命令

在任意会话中输入 /auth 打开凭证管理器。

标签含义
credentials set已有密钥可用
missing XXX_KEY未设置,按 Enter 粘贴
local provider无需凭证(如 Ollama)
implicit auth隐式认证(如 Vertex AI)
custom auth使用 class_path 自行管理认证(mTLS、JWT 等)

密钥仅保存在本地

CI/无头模式:环境变量

适合非交互式运行,写入 ~/.deepagents/.env 或导出环境变量:

# 适用于 CI/CD 或无头模式——密钥在 shell 关闭后失效
export ANTHROPIC_API_KEY="sk-ant-..."
export OPENAI_API_KEY="sk-..."
export DEEPSEEK_API_KEY="sk-..."         # DeepSeek V4 系列(需安装 langchain-deepseek)

工具凭证(如 TAVILY_API_KEY)只能通过环境变量设置,/auth 不管理。

优先级链:已存储密钥 > shell 环境变量 > 项目 .env > 全局 ~/.deepagents/.env。/reload 会重新读取 .env 文件,无需重启。

环境变量加载

两级 .env 文件 + shell 环境变量,优先级清晰不冲突

加载顺序

  1. 项目 .env — 当前工作目录
  2. 全局 ~/.deepagents/.env — 所有项目共享

已在 shell 中设置的值永远不会被覆盖。

优先级(高到低)

  1. shell 环境变量
  2. 项目 .env
  3. 全局 ~/.deepagents/.env
# ~/.deepagents/.env — 全局共享密钥(所有项目通用)
ANTHROPIC_API_KEY=sk-ant-...       # Anthropic Claude 系列模型
OPENAI_API_KEY=sk-...              # OpenAI GPT 系列模型
DEEPSEEK_API_KEY=sk-...            # DeepSeek V4 系列(需安装 langchain-deepseek)
LANGSMITH_API_KEY=lsv2_...         # LangSmith 追踪和沙箱
TAVILY_API_KEY=tvly-...            # Tavily 网络搜索工具
Tavily 网络搜索:内置 web_search 工具使用 Tavily。按照以下三步配置即可启用。

步骤 1:获取密钥

在 tavily.com 注册并复制密钥(以 tvly- 开头)。免费额度足以满足大多数 Deep Agents Code 使用场景。

步骤 2:添加到环境

将密钥添加到 ~/.deepagents/.env:

TAVILY_API_KEY=tvly-...

或在 shell 中导出:export TAVILY_API_KEY=tvly-...

使用 DEEPAGENTS_CODE_ 前缀隔离(仅作用于 Deep Agents,不影响其他工具):

# 前缀隔离——仅 Deep Agents Code 读取此密钥,不影响其他工具
DEEPAGENTS_CODE_TAVILY_API_KEY=tvly-...

步骤 3:重载或重启

在已有会话中运行 /reload 重新读取 .env 文件。下次启动时,"Web search disabled" 通知将消失,Agent 即可调用 web_search。

图:环境变量三级优先级加载链

前缀覆盖机制

DEEPAGENTS_CODE_ 前缀让 Deep Agents 读取独立的密钥值

前缀的核心用途:为 Deep Agents Code 指定独立密钥,不影响其他工具读取同名环境变量。

# ~/.deepagents/.env

# 仅覆盖 Deep Agents Code 使用的 OPENAI_API_KEY,其他工具仍读取原始值
DEEPAGENTS_CODE_OPENAI_API_KEY=sk-cli-only

# 设为空值可屏蔽shell 中导出的密钥,使 Deep Agents Code 无法使用它
DEEPAGENTS_CODE_ANTHROPIC_API_KEY=

读取逻辑

Deep Agents Code 先检查 DEEPAGENTS_CODE_{NAME},然后回退到 {NAME}。

这意味着你可以为 Deep Agents 单独配置一套密钥,而不影响已导出的 shell 变量。

动态重载

执行 /reload 时会重新读取 .env 文件并加载带前缀的值。

因此你可以无需重启即可轮换密钥。

典型场景:你的 OPENAI_API_KEY 已在 shell 中为其他工具导出,但 Deep Agents 需要用不同的密钥或代理端点——用 DEEPAGENTS_CODE_OPENAI_API_KEY 即可隔离。

默认模型与 Agent

在 config.toml 中设置长期偏好,命令行切换不会覆盖默认值

# ~/.deepagents/config.toml

[models]
default = "ollama:qwen3:4b"                          # 长期偏好
recent = "google-genai:gemini-3.1-pro-preview"       # 最近 /model 切换(自动写入)

[agents]
default = "backend-dev"    # 长期偏好(Ctrl+S 固定)
recent = "frontend-dev"    # 最近 /agents 切换(自动写入)

模型优先级

  • default 始终优先于 recent
  • /model 只写入 recent,不覆盖 default
  • 清除默认:/model --default --clear

Agent 优先级

  • default 始终优先于 recent
  • Enter 写入 recent,Ctrl+S 写入 default
  • -a 参数覆盖两者
  • -r / --resume 绕过两者,恢复线程原来的 Agent
设计意图:默认值是你的"长期偏好",不受会话中临时切换影响。这样你可以放心用 /model 试试新模型,不会丢失你的日常首选。

Provider 配置

每个 Provider 是 [models.providers] 下的一个 TOML 表

[models.providers.<name>]
models = ["gpt-4o"]                   # 切换器中显示的模型
api_key_env = "OPENAI_API_KEY"        # 密钥环境变量名
base_url = "https://api.openai.com/v1"  # 可选:覆盖默认 URL
class_path = "my_package.models:MyChatModel"  # 可选:自定义 Provider
enabled = true                         # 可选:是否在切换器中显示

[models.providers.<name>.params]
temperature = 0          # 适用于此 Provider 的所有模型
max_tokens = 4096

[models.providers.<name>.params."gpt-4o"]
temperature = 0.7        # 仅覆盖 gpt-4o 的 temperature
字段类型说明
modelsstring[]切换器中显示的模型列表,可选
api_key_envstring密钥环境变量的名称(非密钥本身)
base_urlstring覆盖 Provider 默认 URL
paramsobject传递给构造函数的额外参数
profileobject覆盖模型运行时 Profile
class_pathstring自定义模型类的完全限定路径
enabledboolean是否在 /model 切换器中显示
图:TOML 配置嵌套与覆盖层级

按模型覆盖参数

在 params 下用模型名为键的子表,覆盖个别值无需复制整个配置

[models.providers.ollama]
models = ["qwen3:4b", "llama3"]  # 在 /model 切换器中显示的模型列表

[models.providers.ollama.params]
temperature = 0       # Provider 级别默认:确定性输出,适合代码生成
num_ctx = 8192        # 上下文窗口大小(token 数)

[models.providers.ollama.params."qwen3:4b"]
temperature = 0.5     # 模型级覆盖:qwen3:4b 用更高 temperature 增加多样性
num_ctx = 4000        # 模型级覆盖:qwen3:4b 使用更小的上下文窗口

qwen3:4b 最终参数

  • temperature: 0.5 — 模型级覆盖
  • num_ctx: 4000 — 模型级覆盖

llama3 最终参数

  • temperature: 0 — Provider 级默认
  • num_ctx: 8192 — Provider 级默认
合并策略:浅合并——模型子表中存在的键替换 Provider 级别的同名键,仅存在于 Provider 级别的键则保留。也可通过 --model-params CLI 标志临时覆盖,优先级高于配置文件。

Profile 覆盖

高级功能:覆盖模型运行时 Profile,改变 Deep Agents 解读模型能力的方式

最常见的用例是降低 max_input_tokens 以更早触发自动摘要——适用于测试或限制上下文使用量。

# 应用于此 Provider 的所有模型(触发自动摘要的阈值)
[models.providers.anthropic.profile]
max_input_tokens = 4096   # 限制最大输入 token,超出时自动压缩上下文

# 此模型获得更高的限制(模型级覆盖优先)
[models.providers.anthropic.profile."claude-sonnet-4-5"]
max_input_tokens = 8192   # claude-sonnet-4-5 单独放宽到 8192

配置文件方式

在 config.toml 中设置 Profile 覆盖,持久生效。优先级链:

模型默认值 < config.toml profile < CLI --profile-override

CLI 临时覆盖

dcode --profile-override \
  '{"max_input_tokens": 4096}'

# 与 --model 结合
dcode --model google-genai:gemini-3.1-pro \
  --profile-override \
  '{"max_input_tokens": 4096}'

--profile-override 在 /model 热切换后持续有效。

生效范围:上下文限制显示、自动摘要阈值、能力检查等所有读取 Profile 的功能都会使用覆盖后的值。

自定义端点

通过 base_url 指向代理、网关或兼容 API

自定义 Base URL

某些 Provider 接受 base_url 来覆盖默认端点:

[models.providers.ollama]
base_url = "http://your-host:port"  # 指向局域网或远程 Ollama 实例

OpenAI 兼容 API

复用 langchain-openai 包指向兼容端点:

[models.providers.openai]
base_url = "https://api.example.com/v1"  # 兼容 OpenAI 的自定义端点
api_key_env = "EXAMPLE_API_KEY"        # 指向存放密钥的环境变量名
models = ["my-model"]                 # 在切换器中显示的模型列表

Anthropic 兼容 API

复用 langchain-anthropic 包指向兼容端点:

[models.providers.anthropic]
base_url = "https://api.example.com"  # 兼容 Anthropic 的自定义端点
api_key_env = "EXAMPLE_API_KEY"       # 指向存放密钥的环境变量名
models = ["my-model"]                # 在切换器中显示的模型列表

DeepSeek 兼容 API

复用 langchain-deepseek 包指向兼容端点(如硅基流动 SiliconFlow):

[models.providers.deepseek]
base_url = "https://api.siliconflow.cn/v1"  # 兼容 DeepSeek 的第三方端点
api_key_env = "DEEPSEEK_API_KEY"             # 密钥环境变量名
models = ["deepseek-v4-pro", "deepseek-v4-flash"]  # V4 系列模型
重要提示:OpenAI Provider 默认使用 Responses API,大多数兼容网关并未实现。如果你的 Provider 仅支持 Chat Completions API,请显式禁用:
[models.providers.openai.params]
use_responses_api = false  # 禁用 Responses API,回退到 Chat Completions API
选择原则:如果兼容 Provider 提供了专用的 LangChain 集成包,优先使用它。通用兼容模式无法识别 Provider 在官方规范之上添加的扩展功能。

切换器添加模型

某些 Provider 不内置模型 Profile,需要手动配置切换器列表

[models.providers.ollama]
models = ["llama3", "mistral", "codellama"]  # 手动列出模型,绕过 Profile 筛选

配置后,/model 切换器会出现 Ollama 分区并列出这些模型。

手动配置 models 列表

  • 适用于所有 Provider
  • 列表中的模型绕过 Profile 筛选条件
  • 始终显示在切换器中
  • 新发布模型的最佳添加方式

Ollama 自动发现

  • 当守护进程可达时自动生效
  • 自动发现本地已拉取的模型
  • 拉取新模型后运行 /reload 刷新
  • 关闭:DEEPAGENTS_CODE_OLLAMA_DISCOVERY=0
直接切换:无论模型是否在切换器中,你始终可以通过 /model ollama:llama3 直接切换。models 列表只是让模型出现在交互式选择器中。

自定义 Provider

用 class_path 接入任何 LangChain BaseChatModel 子类

[models.providers.my_custom]
class_path = "my_package.models:MyChatModel"  # 模块路径:类名格式
api_key_env = "MY_API_KEY"                    # 密钥环境变量名(非密钥本身)
base_url = "https://my-endpoint.example.com"  # 自定义 API 端点

[models.providers.my_custom.params]
temperature = 0     # 确定性输出,适合代码生成
max_tokens = 4096   # 最大输出 token 数

实例化过程

切换到 my_custom:my-model-v1 时:

MyChatModel(
  model="my-model-v1",     # 自动传入你选择的模型名
  base_url="...",          # 来自 config.toml 的 base_url
  api_key="...",           # 来自 api_key_env 指向的环境变量
  temperature=0,             # 来自 params 配置
  max_tokens=4096            # 来自 params 配置
)

安装要求

Provider 包必须与 deepagents-code 安装在同一 Python 环境中:

# uv tool 安装方式
uv tool install deepagents-code \
  --with my_package
工具调用要求:Deep Agents Code 要求模型支持 Tool Calling。如果自定义模型支持但未被识别,在 Profile 中声明:[models.providers.xyz.profile] tool_calling = true

自定义认证示例

适用于 mTLS、JWT、自定义请求头等认证方式:

[models.providers.xyz]
class_path = "abc.integrations.deepagents:DeepAgentsXYZChat"  # 自定义认证类
models = ["abc-xyz-1"]  # 在切换器中显示的模型

[models.providers.xyz.params]
bypass_auth = true   # 跳过标准认证,由自定义类内部处理
temperature = 0

完整 Profile 声明

[models.providers.xyz.profile]
tool_calling = true        # 声明模型支持工具调用(必须为 true)
max_input_tokens = 128000  # 最大输入 token 数,用于上下文追踪和自动摘要

设置 max_input_tokens 以启用准确的上下文长度跟踪和自动摘要。

Provider 软件包 Profile 字典:你的 Provider 软件包可以选择在 <package>.data._profiles 中的 _PROFILES 字典中提供模型 Profile,而无需在 models 键下定义它们。更多信息请参阅 LangChain 模型 Profile。
安全提醒:class_path 会从你的配置文件执行任意 Python 代码。这与 pyproject.toml 构建脚本的信任模型相同 — 你控制自己的机器。

Skills 白名单

为 Skill 的符号链接添加额外的允许目录

默认情况下,Deep Agents Code 验证 Skill 文件路径保持在标准 Skill 目录之内,防止符号链接读取任意文件。如果你将共享 Skill 存储在非标准位置:

[skills]
extra_allowed_dirs = [
    "~/shared-skills",     # 家目录下的共享技能(支持 ~ 展开)
    "/opt/team-skills",    # 团队共享的技能目录(绝对路径)
]

配置文件方式

在 config.toml 的 [skills] 节中添加 extra_allowed_dirs。支持 ~ 展开。

更改在 /reload 后生效。

环境变量方式

export DEEPAGENTS_CODE_EXTRA_SKILLS_DIRS="\
~/shared-skills:/opt/team-skills"

冒号分隔的路径列表。环境变量优先于配置文件。

注意:这不会添加新的 Skill 发现位置——Skill 仍然只从标准目录中发现。它只是允许已发现的 Skill 中的符号链接指向白名单中的路径。

主题配置

内置主题、自定义主题和终端映射

切换主题

/theme 打开交互式选择器,实时预览,按 Enter 保存到 config.toml:

[ui]
theme = "langchain-dark"  # /theme 选择器按 Enter 后自动写入

自定义主题

[themes.my-solarized]
label = "My Solarized"     # 在 /theme 选择器中显示的名称
dark = true                 # 标记为深色主题
primary = "#268BD2"         # 主色调(蓝色)
warning = "#B58900"         # 警告色(黄色)

[themes."ocean breeze"]
label = "Ocean Breeze"      # 选择器中显示的名称
primary = "#0077B6"         # 主色调(海蓝色)
background = "#CAF0F8"      # 背景色(浅蓝色)

覆盖内置主题

[themes.langchain]
primary = "#FF5500"  # 只覆盖主色调,其他字段保留内置默认值

只读取颜色字段,label 和 dark 从内置主题继承。省略的字段保留原值。

终端映射

[ui.terminal_themes]
"Apple_Terminal" = "langchain-light"  # macOS 终端使用浅色主题
"iTerm.app" = "langchain"             # iTerm2 使用默认主题
"vscode" = "langchain-dark"            # VS Code 终端使用深色主题

根据 TERM_PROGRAM 自动切换主题。

解析优先级:DEEPAGENTS_CODE_THEME 环境变量 > 终端映射 > [ui] theme > 内置默认值。
高级:选择器快捷键、解析顺序、终端标识符

选择器快捷键

  • N — 在显示标签和规范注册表键之间切换
  • T — 将高亮的主题保存到当前 TERM_PROGRAM 对应的终端映射中

常见 TERM_PROGRAM 值

终端TERM_PROGRAM
Apple TerminalApple_Terminal
iTerm2iTerm.app
WezTermWezTerm
VS Code 终端vscode
Ghosttyghostty

解析顺序(启动时)

  1. DEEPAGENTS_CODE_THEME 环境变量(显式覆盖)
  2. 当前 TERM_PROGRAM 对应的终端映射
  3. [ui] theme 保存的偏好
  4. 内置默认值(langchain)

自动更新

让 Deep Agents Code 自动检查并安装更新

配置文件

[update]
auto_update = true  # 启用自动更新,会话开始时检查 PyPI 并升级

环境变量

# 环境变量方式(优先于 config.toml)
export DEEPAGENTS_CODE_AUTO_UPDATE=1

环境变量优先于配置文件。

设置行为
auto_update = true 会话开始时检查 PyPI,自动使用检测到的安装方式(uv、Homebrew 或 pip)升级
auto_update = false(默认) 显示更新提示和安装命令,不自动升级
/update 命令 手动检查并安装更新,绕过缓存

升级后 "what's new" 横幅

升级后,Deep Agents Code 在下次启动时显示 "what's new" 横幅,附带更新日志链接。

会话退出更新提醒

在会话退出时,如果在会话期间检测到了更新版本,会显示更新横幅作为提醒。

托管部署:在 MDM 工具中设置 DEEPAGENTS_CODE_AUTO_UPDATE=1 或部署含 [update] auto_update = true 的 config.toml。完全禁止更新检查:DEEPAGENTS_CODE_NO_UPDATE_CHECK=1。

托管部署

以 root 身份运行安装脚本,支持 MDM 工具管理

安装脚本支持以 root 身份运行,适用于在最小化 root 环境中执行脚本的 macOS MDM 工具(Kandji、Jamf 等)。

Root 模式行为

当 id -u 为 0 时,脚本会:

  1. 解析真实控制台用户的 HOME(通过 /dev/console 或 /Users 目录扫描)
  2. 在每个安装步骤后将所有创建的文件 chown 回目标用户

预配置自动更新

  • 在用户 shell 配置文件中设置 DEEPAGENTS_CODE_AUTO_UPDATE=1
  • 或部署包含 [update] auto_update = true 的 config.toml
  • 完全禁止更新检查:DEEPAGENTS_CODE_NO_UPDATE_CHECK=1
非 root 不受影响:所有 root 专用代码路径在不以 root 运行时会自动跳过。

外部编辑器

按 Ctrl+X 或输入 /editor 在外部编辑器中编写提示

Deep Agents Code 依次检查 $VISUAL、$EDITOR,然后回退到 vi(macOS/Linux)或 notepad(Windows)。

# 在 shell 配置文件中设置(~/.zshrc、~/.bashrc 等)
export VISUAL="code"    # 优先使用 VS Code(GUI 编辑器,自动注入 --wait 阻塞等待)
export EDITOR="nvim"    # VISUAL 不可用时的后备编辑器

GUI 编辑器支持

VS Code、Cursor、Zed、Sublime Text、Windsurf 等 GUI 编辑器会自动接收 --wait 标志,使 Deep Agents Code 阻塞等待直到你关闭文件。

典型场景

  • 编写长提示词——在编辑器中利用完整编辑能力
  • 粘贴多行代码——避免终端粘贴问题
  • 使用编辑器的 AI 补全增强提示词质量

Hooks 钩子

让外部程序对 Deep Agents Code 生命周期事件做出响应

在 ~/.deepagents/hooks.json 中配置命令,每当事件触发时,JSON 负载通过管道传递给命令的标准输入。

{
  "hooks": [
    {
      "command": ["bash", "-c", "cat >> ~/deepagents-events.log"],  // 将事件 JSON 追加到日志文件
      "events": ["session.start", "session.end"]  // 仅监听会话开始和结束事件
    }
  ]
}

配置字段

字段类型说明
commandlist[str]要运行的命令及参数(必填)
eventslist[str]订阅的事件名,留空接收所有

执行模型

  • 后台线程——不阻塞主循环
  • 并发分派——多 Hook 并行运行
  • 5 秒超时——超时自动终止
  • 即发即弃——失败只记日志,不会崩溃
  • 无 shell 展开——需要时用 bash -c 包装
  • 懒加载——配置文件在首次事件分派时读取一次,并在会话的剩余时间内缓存

负载格式

每个 Hook 命令在标准输入上接收一个 JSON 对象:

{
  "event": "session.start",   // 事件名称
  "thread_id": "abc123"      // 会话线程 ID(用于追踪关联事件)
}

包含 "event" 键和事件特定字段。

Hook 事件

八种生命周期事件,覆盖从会话开始到上下文压缩

事件触发时机关键字段
session.startAgent 会话开始thread_id
session.end会话退出thread_id
user.prompt用户提交消息—
input.requiredAgent 需要人工输入—
permission.request工具调用需要审批tool_names
tool.error工具调用返回错误tool_names
task.completeAgent 完成任务thread_id
context.compact上下文压缩前—

记录所有事件到 JSONL

{
  "hooks": [{
    "command": ["bash", "-c",
      "jq -c . >> ~/.deepagents/hook-events.jsonl"],  // 用 jq 压缩为单行 JSON 后追加到文件
    "events": []  // 空数组 = 接收所有事件
  }]
}

空 events 数组接收所有事件。

macOS 桌面通知

{
  "hooks": [{
    "command": ["bash", "-c",
      "osascript -e 'display notification \"Agent finished\" with title \"Deep Agents\"'"
    ],
    "events": ["task.complete"]
  }]
}

Python 处理器

import json, sys
payload = json.load(sys.stdin)  # 从标准输入读取 JSON 负载
event = payload["event"]
if event == "session.start":
    # 将会话 ID 输出到 stderr,避免干扰 stdout 的 Agent 输出
    print(f"Session: {payload['thread_id']}",
          file=sys.stderr)
安全提醒:只添加你信任的来源的 Hooks。Hook 拥有与你的用户账户相同的权限。负载数据通过 JSON 流向标准输入,不会注入命令行参数。
图:八种生命周期 Hook 触发时序

环境变量速查

所有 DEEPAGENTS_CODE_ 前缀环境变量一览

变量名用途
AUTO_UPDATE 启用自动更新(1/true/yes)
DEBUG 启用详细调试日志输出到文件
DEBUG_FILE 调试日志文件路径(默认 /tmp/deepagents_debug.log)
EXTRA_SKILLS_DIRS 冒号分隔的 Skill 白名单路径
LANGSMITH_PROJECT 覆盖 LangSmith 链路追踪项目名
NO_UPDATE_CHECK 完全禁止自动更新检查
SHELL_ALLOW_LIST 允许执行的 shell 命令(或 recommended/all)
USER_ID 附加到 LangSmith 追踪元数据的用户标识
前缀覆盖:所有第三方凭证也可用前缀覆盖,例如 DEEPAGENTS_CODE_OPENAI_API_KEY 为 Deep Agents Code 单独指定密钥,不影响其他工具。

动手练习

配置一个完整的本地 + 云端混合开发环境

现在轮到你了。根据以下需求,完成 Deep Agents Code 的配置:

需求:
1. 本地使用 Ollama 的 qwen3:4b 作为默认模型
2. 云端备选 google-genai:gemini-3.1-pro-preview
3. Ollama 指向局域网内的 192.168.1.100:11434
4. qwen3:4b 使用 temperature=0.5,其他 Ollama 模型使用 temperature=0
5. 启用 Tavily 网络搜索
6. 任务完成时发送桌面通知
7. 使用 iTerm 时自动应用深色主题

任务 1:配置凭证

  • 你会用 /auth 还是环境变量?为什么?
  • .env 文件应该写在哪里?

任务 2:编写 config.toml

  • 如何配置 Ollama 的 base_url?
  • 如何为 qwen3:4b 单独设置 temperature?

任务 3:配置 Hooks 和主题

  • hooks.json 应该怎么写?
  • 终端映射怎么配置?

本章回顾

到这里,你已经掌握了 Deep Agents Code 的完整配置体系

你学到了什么

  • 四大配置文件:config.toml、.env、hooks.json、.mcp.json
  • Provider 凭证管理:/auth + 环境变量双通道
  • 环境变量优先级和 DEEPAGENTS_CODE_ 前缀覆盖
  • Provider 配置:params 按模型覆盖、Profile 覆盖
  • 自定义端点和自定义 Provider
  • 主题系统:自定义、覆盖、终端映射
  • Hooks 钩子:生命周期事件和自动化

核心原则

  • 分层覆盖:全局默认 < 项目覆盖 < CLI 参数
  • 按模型精细控制:Provider 级默认 + 模型级覆盖
  • 安全优先:密钥本地存储,Hook 负载不注入命令行
  • 热重载:/reload 无需重启即可应用更改
  • 兼容开放:支持任何 BaseChatModel 子类和兼容 API
核心理念:Deep Agents Code 的配置系统遵循"约定优于配置"——开箱即用时零配置即可工作,但当你需要精细控制时,每一层都可以被覆盖和定制。从个人开发到团队协作,从本地模型到云端 API,同一套配置体系覆盖所有场景。

延伸阅读

继续本课程

官方文档

配置相关