nanobot 配置与环境变量索引
对应源码
| 控制面 | 源码 |
|---|---|
| 配置路径与加载 | nanobot/config/paths.py、nanobot/config/loader.py::load_config |
| 环境变量展开 | nanobot/config/loader.py::resolve_config_env_vars |
| 字段、默认值和验证 | nanobot/config/schema.py |
| Agent/Runner 行为 | nanobot/agent/loop.py、nanobot/agent/runner.py |
| Provider、Tool、Channel 读取 | nanobot/providers/、nanobot/agent/tools/、nanobot/channels/ |
本页只收录学习源码和调试时最常用的控制点。完整字段、Provider 和 Channel 配置请查 官方 Configuration 文档 与 nanobot/config/schema.py。
1. 配置从哪里来
flowchart LR F["配置文件"] --> L["load_config()"] L --> P["Pydantic Config"] P --> E["resolve_config_env_vars()"] E --> R["Provider / AgentLoop / Gateway / Tools"]
关键源码:
nanobot/config/paths.py:配置和 workspace 路径;nanobot/config/loader.py::load_config:读取与解析;nanobot/config/loader.py::resolve_config_env_vars:递归替换字符串中出现的${VAR};nanobot/config/schema.py:字段、默认值、别名和验证。
不要在日志或笔记里打印 key
配置可写成
"apiKey": "${DEEPSEEK_API_KEY}"。若变量不存在,解析阶段会报错;排查时只确认变量是否存在,不输出它的值。
2. Agent 默认行为
配置路径均以序列化后的 camelCase 形式表达。
| 配置路径 | 默认值 | 控制边界 | 主要读取位置 |
|---|---|---|---|
agents.defaults.workspace | ~/.nanobot/workspace | Session、Memory、Skills 和文件类工具的工作根 | AgentDefaults、runtime 组装 |
agents.defaults.modelPreset | null | 有值时优先使用命名 preset | nanobot/agent/model_presets.py |
agents.defaults.model | anthropic/claude-opus-4-5 | 未使用 preset 时的默认模型 | Provider snapshot 构建 |
agents.defaults.provider | auto | 显式 Provider 或自动检测 | nanobot/providers/factory.py |
agents.defaults.maxTokens | 8192 | 单次生成上限 | generation settings |
agents.defaults.contextWindowTokens | 200000 | 上下文预算与压缩判断 | Context/compaction |
agents.defaults.maxToolIterations | 200 | Runner 模型—工具循环上限 | AgentRunner |
agents.defaults.maxConcurrentSubagents | 1 | 同一 runtime 可并发的 subagent 数 | Subagent manager |
agents.defaults.maxToolResultChars | 16000 | 回填模型的工具结果字符上限 | Runner/tool result 处理 |
agents.defaults.providerRetryMode | standard | 标准或持续重试策略 | Provider 调用边界 |
agents.defaults.reasoningEffort | null | 传给支持该能力的 Provider | generation settings |
agents.defaults.timezone | UTC | Cron、时间提示等时区语义 | Loop/Cron |
agents.defaults.unifiedSession | false | 是否跨 Channel 共用 Session | nanobot/session/keys.py |
agents.defaults.disabledSkills | [] | 禁止加载哪些 Skill | SkillsLoader |
agents.defaults.idleCompactAfterMinutes | 15 | 空闲多久后允许压缩,0 禁用 | AgentLoop |
agents.defaults.maxMessages | 120 | 回放历史条数上限;0 仍使用默认 120 | Session/Context |
agents.defaults.consolidationRatio | 0.5 | 压缩后希望保留的预算比例 | Consolidator |
agents.defaults.dream.enabled | true | 是否注册 Dream 周期任务 | Dream/Gateway |
agents.defaults.dream.intervalH | 2 | 默认 Dream 间隔 | DreamConfig.build_schedule() |
3. 模型与 Provider
| 配置区域 | 作用 |
|---|---|
modelPresets.<name> | 命名组合:model、provider、maxTokens、contextWindowTokens、temperature、reasoningEffort |
providers.<name>.apiKey | Provider 凭据,可引用 ${VAR} |
providers.<name>.apiBase | 自定义服务地址 |
providers.<name>.extraHeaders | 附加 HTTP header |
providers.<name>.extraBody | 附加请求 body |
providers.<name>.extraQuery | 附加 query 参数 |
providers.openai.apiType | auto、chat_completions 或 responses;当前只允许用于内置 OpenAI 配置 |
DeepSeek 的注册事实位于 nanobot/providers/registry.py:
Provider 名:deepseek
默认凭据环境变量:DEEPSEEK_API_KEY其他 Provider 的 key 和默认 endpoint 应直接查 registry,不要从名称猜:
rg -n "ProviderSpec|env_key=|api_base=" nanobot/providers/registry.py4. Tool、安全和 MCP
| 配置路径 | 作用 | 注意 |
|---|---|---|
tools.restrictToWorkspace | 启用应用层 workspace 限制意图 | 不自动等于 OS sandbox |
tools.exec.* | shell 执行、超时、路径和 sandbox 相关配置 | 以 nanobot/agent/tools/shell.py::ExecToolConfig 为准 |
tools.file.* | 文件工具配置 | 以 nanobot/agent/tools/filesystem.py::FileToolsConfig 为准 |
tools.web.* | 搜索和抓取配置 | 以 nanobot/agent/tools/web.py::WebToolsConfig 为准 |
tools.mcpServers.<name> | stdio、SSE 或 Streamable HTTP MCP 连接 | 见下表 |
tools.ssrfWhitelist | 允许绕过 SSRF 阻断的 CIDR | 只添加明确可信范围 |
tools.webuiAllowLocalServiceAccess | WebUI Full Access 下是否允许检查 localhost 服务 | 不应理解为全局关闭 SSRF |
一个 MCP server 的核心字段:
| 字段 | 含义 |
|---|---|
type | stdio、sse、streamableHttp;省略时自动判断 |
command、args、env、cwd | stdio 进程 |
url、headers | 网络 transport |
toolTimeout | 单次 MCP Tool 超时,默认 30 秒 |
enabledTools | 允许注册的工具;["*"] 表示全部,[] 表示不注册 |
5. Channel、API 与 Gateway
| 配置路径 | 默认值 | 说明 |
|---|---|---|
channels.sendProgress | true | 是否向 Channel 发送文本进度 |
channels.sendToolHints | false | 是否发送工具提示 |
channels.showReasoning | true | Channel 实现支持时是否显示 reasoning |
channels.extractDocumentText | true | 是否预提取文档附件文本 |
channels.sendMaxRetries | 3 | 投递总尝试次数,包含第一次 |
channels.<name>.* | 由各 Channel 定义 | ChannelsConfig 允许额外字段 |
api.host / api.port | 127.0.0.1 / 8900 | OpenAI-compatible API |
api.timeout | 120.0 | 每个 API 请求超时秒数 |
gateway.host / gateway.port | 127.0.0.1 / 18790 | Gateway/WebUI 服务 |
gateway.heartbeat.* | 见 HeartbeatConfig | Heartbeat 的启用、间隔和保留消息数 |
6. 调试时最重要的环境变量
| 环境变量 | 默认/语义 | 读取位置 |
|---|---|---|
DEEPSEEK_API_KEY | DeepSeek 凭据 | Provider registry/config 解析 |
NANOBOT_MAX_CONCURRENT_REQUESTS | 默认 3;<=0 表示不设全局并发上限 | nanobot/agent/loop.py |
NANOBOT_LLM_TIMEOUT_S | 默认 300 秒;0 禁用 Runner 外层 LLM wall timeout | nanobot/agent/runner.py |
NANOBOT_STREAM_IDLE_TIMEOUT_S | 默认 90 秒,最大 3600;无效或非正数回退默认值 | nanobot/providers/base.py |
NANOBOT_OPENAI_COMPAT_TIMEOUT_S | 默认 120 秒;无效或非正数回退默认值 | nanobot/providers/openai_compat_provider.py |
NANOBOT_WORKSPACE_SANDBOX_PROVIDER | 记录/指定 workspace sandbox provider 语义 | nanobot/security/workspace_access.py |
NANOBOT_WORKSPACE_SANDBOX_ENFORCED | 标记 sandbox 是否强制 | 同上 |
NANOBOT_SANDBOX_ENFORCED | 兼容性环境标记 | 同上 |
三种“超时”不是同一层
api.timeout管 HTTP 请求,NANOBOT_LLM_TIMEOUT_S管一次 Runner 的模型等待边界,NANOBOT_STREAM_IDLE_TIMEOUT_S管流已经开始后的空闲停顿。定位超时时先确认是哪一层报错。
7. 配置没有生效时
按以下顺序检查:
- 运行进程实际加载了哪个配置路径;
- 字段名是否被 schema 接受,别名是否正确;
${VAR}是否在启动进程的环境中存在;modelPreset是否覆盖了散列的 model/provider 字段;- Gateway 是否需要重启或 runtime refresh;
- 修改的是全局 Channel 字段还是某个 Channel 的覆盖字段;
- 日志显示的 active Provider/model 是否与预期一致。
返回:速查参考