~/.deepagents/ 目录中。主要配置文件如下:
| 文件 | 格式 | 用途 |
|---|---|---|
config.toml | TOML | 模型默认值、提供程序设置、构造函数参数、配置文件覆盖、主题、更新设置、MCP 信任存储 |
.env | Dotenv | 全局 API 密钥和密钥 |
hooks.json | JSON | 订阅 CLI 生命周期事件的外部工具 |
.mcp.json | JSON | 全局 MCP 服务器定义 |
环境变量
CLI 从 dotenv 文件加载环境变量,因此您无需在 shell 配置文件中export API 密钥,也无需在项目间复制 .env 文件。
加载顺序和优先级
启动时加载两个.env 文件:
- 项目
.env— 当前工作目录中的.env文件(如果存在) - 全局
~/.deepagents/.env— 一个共享文件,作为所有项目的后备
.env > 全局 .env。shell 中已设置的值永远不会被覆盖——包括在 /reload 时。
DEEPAGENTS_CLI_ 前缀
所有 CLI 特定的环境变量都使用 DEEPAGENTS_CLI_ 前缀(例如 DEEPAGENTS_CLI_AUTO_UPDATE、DEEPAGENTS_CLI_DEBUG)。完整列表请参见 CLI 环境变量参考。
该前缀还用作 CLI 读取的任何环境变量(包括第三方凭据)的覆盖机制。CLI 首先检查 DEEPAGENTS_CLI_{NAME},然后回退到 {NAME}:
~/.deepagents/.env
/reload 时,CLI 会重新读取 .env 文件并获取带前缀的值,因此您可以轮换密钥而无需重启。
示例
将 API 密钥存储在~/.deepagents/.env 中一次:
.env 来按需覆盖每个项目。
配置文件
~/.deepagents/config.toml 允许您自定义模型提供程序、设置默认值并向模型构造函数传递额外参数。
默认和最近模型
[models].default 始终优先于 [models].recent。/model 命令仅写入 [models].recent,因此您配置的默认值永远不会被会话中的切换覆盖。要删除默认值,请使用 /model --default --clear 或从配置文件中删除 default 键。
提供程序配置
每个提供程序都是[models.providers] 下的一个 TOML 表:
保存 API 密钥的环境变量的名称(例如
"OPENAI_API_KEY"),而不是密钥本身。CLI 在启动时从此环境变量读取凭据,以在创建模型之前验证访问权限。大多数聊天模型包会自动从默认环境变量读取。请参阅提供程序参考表,了解每个提供程序检查的变量。转发给模型构造函数的额外关键字参数。扁平键(例如
temperature = 0)应用于此提供程序的每个模型。模型键控的子表(例如 [params."gpt-4o"])仅覆盖该模型的单个值;合并是浅层的(模型在冲突时获胜)。不要在 params 中放置凭据(例如 api_key)。请使用 api_key_env 指向环境变量。(高级)覆盖模型运行时配置文件中的字段(例如
max_input_tokens)。扁平键应用于此提供程序的每个模型。模型键控的子表(例如 [profile."claude-sonnet-4-5"])仅覆盖该模型的单个值;合并是浅层的(模型在冲突时获胜)。这些覆盖在模型创建后应用,因此它们对上下文限制显示、自动摘要以及读取配置文件的任何其他功能生效。用于任意模型提供程序。
module.path:ClassName 格式的完全限定 Python 类。设置后,CLI 将直接导入并实例化此类以用于提供程序 <name>。该类必须是 BaseChatModel 的子类。此提供程序是否出现在
/model 选择器中。设置为 false 可隐藏从已安装包自动发现的提供程序(例如,您不希望干扰切换器的传递依赖项)。您仍然可以通过 /model provider:model 或 --model 直接使用禁用的提供程序。模型构造函数参数
任何提供程序都可以使用params 表向模型构造函数传递额外参数:
每模型覆盖
如果特定模型需要不同的参数,请在params 下添加一个模型键控的子表,以覆盖单个值,而无需复制整个提供程序配置:
ollama:qwen3:4b获取{temperature: 0.5, num_ctx: 4000}— 模型覆盖获胜。ollama:llama3获取{temperature: 0, num_ctx: 8192}— 无覆盖,仅使用提供程序级参数。
使用 --model-params 进行 CLI 覆盖
对于无需编辑配置文件的一次性调整,可以在启动时或通过 /model 命令在会话中传递 JSON 对象:
在 TUI 内部
--model-params 不能与 --default 结合使用。
配置文件覆盖(高级)
覆盖模型运行时配置文件中的字段,以更改 CLI 解释模型功能的方式。最常见的用例是降低max_input_tokens 以更早触发自动摘要——这对于测试或限制上下文使用非常有用:
params 相同——模型级别的值在冲突时获胜:
使用 --profile-override 进行 CLI 配置文件覆盖(高级)
要在运行时覆盖模型配置文件字段而无需编辑配置文件,请通过 --profile-override 传递 JSON 对象:
--profile-override。
--profile-override 值在会话中的 /model 热交换期间持续存在——切换模型会将覆盖重新应用于新模型。
自定义基本 URL
某些提供程序包接受base_url 来覆盖默认端点。例如,langchain-ollama 通过底层 ollama 客户端默认为 http://localhost:11434。要指向其他位置,请在配置中设置 base_url:
兼容 API
对于公开与 OpenAI 或 Anthropic 兼容的 API 的提供程序,您可以通过将base_url 指向提供程序的端点来使用现有的 langchain-openai 或 langchain-anthropic 包:
提供程序在官方规范之上添加的任何功能都不会被捕获。如果提供程序提供专用的 LangChain 集成包,建议优先使用该包。
将模型添加到交互式切换器
某些提供程序(例如langchain-ollama)不捆绑模型配置文件数据(完整列表请参见提供程序参考)。在这种情况下,交互式 /model 切换器不会列出该提供程序的模型。您可以通过在配置文件中为提供程序定义 models 列表来填补这一空白:
/model 切换器现在将包含一个 Ollama 部分,其中列出了这些模型。
这完全是可选的。您始终可以通过指定完整名称直接切换到任何模型:
任意提供程序
您可以使用class_path 使用任何 LangChain BaseChatModel 子类。CLI 直接导入并实例化该类——无需内置提供程序包。
api_key_env 和 base_url 是可选的。class_path 提供程序预计会在内部处理自己的身份验证——当您的模型使用自定义身份验证(JWT 令牌、专有标头、mTLS 等)而不是标准 API 密钥时非常有用:
/model xyz:abc-xyz-1 或 --model xyz:abc-xyz-1 切换到模型。
Deep Agents 需要工具调用支持。如果您的自定义模型支持工具调用但 CLI 不知道,请在提供程序配置文件中声明:将
max_input_tokens 设置为您的模型支持的值,以启用准确的上下文长度跟踪和自动摘要。deepagents-cli 相同的 Python 环境中:
my_custom:my-model-v1(通过 /model 或 --model)时,模型名称 (my-model-v1) 将作为 model kwarg 传递:
<package>.data._profiles 中的 _PROFILES 字典中提供模型配置文件,而不是在 models 键下定义它们。有关更多信息,请参阅 LangChain 模型配置文件。
技能额外允许目录
默认情况下,当 CLI 加载技能时,它会验证解析后的技能文件路径是否保持在标准技能目录之一内。这可以防止技能目录内的符号链接读取这些根目录之外的任意文件。 如果您将共享技能资产存储在非标准位置,并使用标准技能目录中的符号链接来引用它们,则可以将该位置添加到包含允许列表中。这不会添加新的技能发现位置:技能仍然仅从标准目录中发现。添加到技能包含允许列表的路径。支持
~ 扩展。DEEPAGENTS_CLI_EXTRA_SKILLS_DIRS 环境变量设置为冒号分隔的列表:
/reload 时生效。
主题
使用/theme 打开交互式主题选择器。导航列表以实时预览主题,按 Enter 将您的选择持久化到 config.toml。
CLI 附带许多内置主题。默认主题是 langchain,这是一个具有 LangChain 品牌颜色的深色主题。所选主题持久化在 [ui] 下:
用户定义主题
在config.toml 中的 [themes.<name>] 部分下定义自定义主题。每个部分都需要 label(字符串)。dark(布尔值)如果省略则默认为 false——对于深色主题设置为 true。所有颜色字段都是可选的——省略的字段将根据 dark 标志回退到内置的深色或浅色调色板。
/theme 选择器中。
覆盖内置主题颜色
要调整内置主题的颜色而不创建新主题,请使用[themes.<builtin-name>] 部分。仅读取颜色字段——label 和 dark 从内置主题继承:
[themes.*] 部分的更改在 /reload 时生效。
自动更新
CLI 可以自动检查并安装更新。- 配置文件
- 环境变量
/update 斜杠命令手动检查和安装更新,该命令会绕过缓存并内联报告成功或失败。
升级后,CLI 会在下次启动时显示“新功能”横幅,并提供指向更改日志的链接。
在会话退出时,如果在会话期间检测到更新版本,则会显示更新横幅作为提醒。
受管部署
安装脚本 支持以 root 身份运行,针对 macOS MDM 工具(Kandji、Jamf 等),这些工具在最小的 root 环境中执行脚本。 当id -u 为 0 时,脚本:
- 解析真实控制台用户的
HOME(通过/dev/console或/Users目录扫描) - 在每个安装步骤后,使用
chown将所有创建的文件更改回目标用户
DEEPAGENTS_CLI_AUTO_UPDATE=1,或将包含 [update] auto_update = true 的 config.toml 部署到 ~/.deepagents/config.toml。要完全抑制自动更新和更新检查,请设置 DEEPAGENTS_CLI_NO_UPDATE_CHECK=1。
CLI 环境变量参考
所有 CLI 特定的环境变量都使用DEEPAGENTS_CLI_ 前缀。请参阅 DEEPAGENTS_CLI_ 前缀 了解该前缀如何也用作第三方凭据的覆盖。
启用自动 CLI 更新(
1、true 或 yes)。启用详细调试日志记录到文件。
调试日志文件的路径。
覆盖代理跟踪的 LangSmith 项目名称。请参阅使用 LangSmith 跟踪。
设置后禁用自动更新检查。
允许的 shell 命令的逗号分隔列表(或
recommended / all)。将用户标识符附加到 LangSmith 跟踪元数据。
外部编辑器
按Ctrl+X 或键入 /editor 以在外部编辑器中编写提示。CLI 会检查 $VISUAL,然后检查 $EDITOR,最后回退到 vi(macOS/Linux)或 notepad(Windows)。GUI 编辑器(VS Code、Cursor、Zed、Sublime Text、Windsurf)会自动接收 --wait 标志,因此 CLI 会阻塞直到您关闭文件。
Hooks
Hooks 允许外部程序响应 CLI 生命周期事件。在~/.deepagents/hooks.json 中配置命令,CLI 会在事件触发时将 JSON 有效负载通过管道传输到每个匹配命令的 stdin。
Hooks 在后台线程中以“发射后不管”的方式运行——它们从不阻塞 CLI,失败会被记录而不会中断您的会话。
设置
创建~/.deepagents/hooks.json:
~/deepagents-events.log。
Hook 配置
配置文件包含一个hooks 数组。每个条目具有:
要运行的命令和参数。无 shell 扩展:如果需要,请使用
["bash", "-c", "..."]。要订阅的事件名称。省略或留空以接收所有事件。
events 过滤器,因此它会接收 CLI 发出的每个事件。
有效负载格式
每个 hook 命令在 stdin 上接收一个带有"event" 键以及事件特定字段的 JSON 对象:
事件参考
session.start
当代理会话开始时触发(交互式和非交互式模式)。
会话线程标识符。
session.end
当会话退出时触发。
会话线程标识符。
user.prompt
在交互模式下,当用户提交聊天消息时触发。
无附加字段。
input.required
当代理需要人工输入(人机交互中断)时触发。
无附加字段。
permission.request
在一个或多个工具调用需要用户权限时,在批准对话框之前触发。
请求批准的工具名称。
tool.error
当工具调用返回错误时触发。
出错的工具名称。
task.complete
当代理完成当前任务时触发(流式循环结束,没有进一步中断)。
会话线程标识符。
context.compact
在 CLI 压缩(摘要)对话上下文之前触发。
无附加字段。
执行模型
- 后台线程:Hook 子进程通过
asyncio.to_thread在线程中运行,因此主事件循环永远不会被阻塞。 - 并发分发:当多个 hook 匹配一个事件时,它们会在一个线程池中并发运行。
- 5 秒超时:每个命令有 5 秒超时。超过此时间的命令将被终止。
- 发射后不管:错误按 hook 捕获,并在调试/警告级别记录。失败的 hook 永远不会崩溃或阻塞 CLI。
- 延迟加载:配置文件在第一次事件分发时读取一次,并在会话的其余部分缓存。
- 无 shell 扩展:命令直接执行(不通过 shell)。如果需要 shell 功能(如管道或变量扩展),请包装在
["bash", "-c", "..."]中。
Hook 示例
将所有事件记录到文件
将所有事件记录到文件
任务完成时桌面通知(macOS)
任务完成时桌面通知(macOS)
Python 处理程序
Python 处理程序
编写一个处理程序脚本,从 stdin 读取 JSON 有效负载:
my_handler.py
~/.deepagents/hooks.json
安全注意事项
Hook 遵循与 Git hook 或 shell 别名相同的信任模型——任何可以写入~/.deepagents/hooks.json 的用户都可以执行任意命令。这是设计使然:
- 无命令注入:有效负载数据仅作为 JSON 流向 stdin,从不流向命令行参数。
json.dumps处理转义。 - 默认无 shell:命令以
shell=False运行,防止 shell 注入。 - 配置格式错误:无效的 JSON 或意外类型会产生记录的警告,而不是安全问题。
通过 MCP 将这些文档连接到 Claude、VSCode 等,以获取实时答案。

