Skip to content

配置参考

Nahida Bot 从 YAML 文件、.env 文件和环境变量读取配置。值的合并优先级从高到低:

  1. CLI 参数(--debug--config-yaml
  2. .env 文件中的值
  3. YAML 配置文件
  4. 内置默认值

所有 YAML 值都支持环境变量插值,语法为 ${VAR}${VAR:fallback}


顶层设置

类型默认值说明
app_namestr"Nahida Bot"应用名称,用于日志、生命周期事件和 memory dreaming prompt
debugboolfalse调试模式。开启后若未显式设置 log_level,则强制为 DEBUG
log_levelstr"INFO"日志级别:TRACEDEBUGINFOWARNINGERROR
log_jsonbool|nullnullJSON 日志输出。null = 自动(生产环境用 JSON,调试模式用控制台)
log_filestr|nullnull可选日志文件路径。设置后会额外添加文件 handler,并自动创建父目录
log_file_levelstr|nullnull文件日志级别。null = 跟随 log_level,可设为 DEBUG 让文件收集更详细日志
log_file_jsonbooltrue文件日志是否使用 JSON Lines 格式
hoststr"127.0.0.1"服务器绑定地址(保留)
portint6185服务器绑定端口(保留)
db_pathstr"./data/nahida.db"SQLite 数据库文件路径
workspace_base_dirstr"./data/workspace"工作区存储目录
plugin_pathslist[str]["./plugins"]额外的插件扫描目录
discover_builtin_channelsbooltrue自动发现内置频道插件
system_promptstr"You are a helpful assistant."Agent 对话的默认系统提示词
default_providerstr""默认使用的 provider ID。空值 = 使用 providers 中的第一个
providersdict{}LLM provider 配置(见下文)
multimodalobject(见下文)图片/媒体处理配置
agentobject(见下文)Agent 循环配置
contextobject(见下文)上下文窗口预算配置
schedulerobject(见下文)定时任务调度配置
routerobject(见下文)消息路由配置
webapiobject(见下文)WebAPI 服务配置
webuiobject(见下文)WebUI 控制台配置
memoryobject(见下文)长期记忆与 embedding 配置
enable_silent_replybooltrue全局开关:是否允许 Agent 以 NO_REPLY 静默回复
model_routingdict{}Legacy,已忽略。 内部任务路由改用 model spec + ModelRouter

示例

yaml
app_name: "Nahida Bot"
debug: false
log_level: "INFO"
log_file: "./data/logs/nahida.log"
log_file_level: "DEBUG"
db_path: "./data/nahida.db"
system_prompt: "You are a helpful assistant."
default_provider: deepseek-main

LLM Providers

providers 是一个字典,每个键是自定义的 provider ID,用于 default_provider/model 命令中引用。

Provider 条目

类型默认值说明
typestr"openai-compatible"Provider 类型,见 Provider 类型
api_keystr""API 密钥,为空时跳过该 provider
base_urlstr""API 端点基础 URL
modelslist[]模型列表,第一个元素为默认模型
merge_system_messagesboolfalse发送前合并所有 system 消息为一条(用于需要单一 system 的后端)
stream_responsesboolfalseprovider 内部使用上游流式接口接收并聚合返回;不改变 channel 发送方式

stream_responses 当前支持 openai-compatible 族(含 deepseekglmgroq)、anthropic 族(含 minimax)和 openai-responses。开启后 provider 会持续读取上游 SSE 事件,最后仍返回一个完整 ProviderResponse;这主要用于长推理/重任务时区分“服务端仍在生成”与“服务端完全无响应”。当前不会把 token 级增量直接发送到聊天频道。

deepseek provider 还支持 thinking_enabled(默认 true)和 reasoning_effort;前者控制是否向请求体注入 thinking: {"type": "enabled"},后者可被运行时 reasoning.effort 覆盖。

Anthropic / Minimax 输出上限

类型默认值说明
max_tokensint16000Anthropic / Minimax 的输出 token 上限;适用于 anthropicminimax provider

模型条目

models 中的每个元素可以是纯字符串或对象:

yaml
models:
  - "deepseek-v4-pro"                      # 纯字符串
  - name: "Qwen/Qwen3.6-35B-A3B"           # 带 capabilities 的对象
    tags: [primary, vision]
    capabilities:
      image_input: true
      max_image_count: 4
      context_window: 128000

模型标签

每个模型可以声明 tags(字符串列表),供内部任务 model spec 解析使用。详见 Model Specs

类型默认值说明
tagslist[str][]模型标签,用于 model spec 的 tag 匹配

模型能力声明

capabilities 下按模型声明其支持的能力:

类型默认值说明
text_inputbooltrue接受文本输入
image_inputboolfalse原生接受图片输入
tool_callingbooltrue支持函数/工具调用
reasoningboolfalse支持推理/思维链 token
prompt_cacheboolfalse支持 prompt 缓存
prompt_cache_imagesboolfalse在 prompt 中缓存图片
explicit_context_cacheboolfalse需要显式缓存控制标记
prompt_cache_min_tokensint0缓存断点的最小 token 数
max_image_countint0每次请求最大图片数(0 = 不限)
max_image_bytesint0单张图片最大字节数(0 = 不限)
supported_image_mime_typeslist[str]["image/jpeg", "image/png", "image/webp"]接受的 MIME 类型
context_windowint|nullnull模型实际上下文窗口;声明后每轮按模型重算 prompt 预算
max_context_windowint|nullnull模型可配置的最大上下文窗口;当 context_window 为空时作为 fallback
effective_context_window_percentint95可用于 prompt 的上下文比例;默认保留 5% 余量
auto_compact_token_limitint|nullnull自动摘要/滑窗的软阈值;为空时按 90% context window 派生
image_generationboolfalse模型可通过内置工具生成图片
web_searchboolfalse模型支持内置网页搜索
file_searchboolfalse模型支持内置文件搜索
code_interpreterboolfalse模型支持内置代码解释器

OpenAI Responses API 选项

以下字段仅在 type: "openai-responses" 时生效:

类型默认值说明
store_responsesboolfalse启用响应持久化,用于 previous_response_id 链式调用
use_previous_response_idboolfalse开启后从历史 assistant metadata 中查找上一轮 response id,并只发送新增输入
reasoning_effortstrnull推理深度:"low""medium""high"
max_output_tokensintnull最大输出 token(替代 max_tokens
built_in_toolslist[str]null启用的内置工具:"web_search""file_search""image_generation""code_interpreter"

Provider 类型

类型说明
openai-compatibleOpenAICompatibleProvider通用 /chat/completions 端点
deepseekDeepSeekProviderDeepSeek(扩展 OpenAI 兼容,增加思维模式)
glmGLMProviderGLM / 智谱(完全 OpenAI 兼容)
groqGroqProviderGroq(OpenAI 兼容,不同的 reasoning 字段名)
anthropicAnthropicProviderAnthropic Claude(独立协议)
minimaxMinimaxProviderMinimax(Anthropic 兼容端点)
openai-responsesOpenAIResponsesProviderOpenAI Responses API(/v1/responses),支持内置工具和有状态链式调用

示例

yaml
providers:
  deepseek-main:
    type: deepseek
    api_key: "${DEEPSEEK_LLM_API_KEY}"
    base_url: "${DEEPSEEK_LLM_BASE_URL}"
    stream_responses: true
    models: ["deepseek-v4-pro", "deepseek-v4-flash"]

  siliconflow:
    type: "openai-compatible"
    api_key: "${SILICONFLOW_LLM_API_KEY}"
    base_url: "${SILICONFLOW_LLM_BASE_URL}"
    merge_system_messages: true
    stream_responses: true
    models:
      - "Pro/zai-org/GLM-5"
      - name: "Qwen/Qwen3.6-35B-A3B"
        capabilities:
          image_input: true
          max_image_count: 4
          max_image_bytes: 10485760

  minimax:
    type: minimax
    api_key: "${MINIMAX_LLM_API_KEY}"
    base_url: "https://api.minimaxi.com/anthropic"
    stream_responses: true
    models: ["MiniMax-M2.5"]

  openai:
    type: "openai-responses"
    api_key: "${OPENAI_API_KEY}"
    base_url: "https://api.openai.com"
    store_responses: true
    use_previous_response_id: false
    stream_responses: true
    reasoning_effort: "medium"
    built_in_tools: ["web_search", "image_generation"]
    models:
      - name: "gpt-5.2"
        capabilities:
          image_input: true
          image_generation: true
          web_search: true
          tool_calling: true
          reasoning: true

default_provider: deepseek-main

Model Specs

内部任务的模型配置使用单个 model spec 字符串。model spec 可以是 tag、provider/model 或裸模型名,统一由 ModelRouter.resolve() 解析。

常用默认 tag:

Tag用途
primary主对话模型
memorymemory dreaming / consolidation
embedding文本 embedding
reranker检索重排
vision图片理解 fallback
cheap低成本后台任务标记

示例:

yaml
memory:
  consolidation:
    rule_based_enabled: false
  embedding:
    model: embedding

multimodal:
  image_fallback_model: siliconflow/Qwen/Qwen3.6-35B-A3B

多模态 / 图片处理

multimodal 键下配置。

类型默认值说明
image_fallback_modestr"auto"主模型不支持图片时的策略:auto(自动调用 fallback 视觉模型)、tool(注入 image_understand 工具)、off(跳过图片)
media_context_policystr"cache_aware"历史中的媒体保留方式:cache_aware(近期图片保留原生块,旧的降级为描述)、native_recent(仅最新图片保留原生)、description_only(全部使用文本描述)
image_fallback_providerstr""Legacy 字段;建议把 provider 写进 image_fallback_model
image_fallback_modelstr""Fallback 视觉模型 spec;空则默认找 vision tag
max_images_per_turnint4每轮对话处理的最大图片数
max_image_bytesint10485760单张图片最大字节数(10 MB)
media_cache_ttl_secondsint3600媒体缓存过期时间(秒)

示例

yaml
multimodal:
  image_fallback_mode: "auto"
  media_context_policy: "cache_aware"
  image_fallback_model: "siliconflow/Qwen/Qwen3.6-35B-A3B"

Agent Loop

agent 键下配置。控制 LLM + 工具调用的迭代循环。

类型默认值说明
max_stepsint8每轮对话最大工具调用迭代次数
provider_timeout_secondsfloat120.0单次 LLM API 调用超时时间(秒)
retry_attemptsint2Provider 瞬态错误重试次数
retry_backoff_secondsfloat0.2重试退避间隔(秒)
tool_timeout_secondsfloat135.0单次工具执行超时时间(秒)
tool_retry_attemptsint1工具执行失败重试次数
tool_retry_backoff_secondsfloat0.1工具重试退避间隔(秒)
max_tool_log_charsint400工具结果日志截断长度
tool_use_system_promptstr(内置)注入的工具使用行为引导提示
provider_error_templatestr(内置)Provider 错误时的用户提示模板(支持 {code} 占位符)

Context Budget

context 键下配置。控制 prompt 上下文组装和 token 预算。 如果当前模型在 providers.*.models[].capabilities 中声明了 context_window, 运行时会优先使用模型窗口;这里的 max_tokens / reserved_tokens 是未知模型的 fallback。

类型默认值说明
max_tokensint272000未声明模型窗口时的 fallback context window
reserved_tokensint10000未声明模型窗口时为模型响应保留的 token 数
max_charsint|nullnull字符数预算覆盖(兼容旧逻辑,优先使用 max_tokens
reserved_charsint0使用 max_chars 时的字符保留数
summary_max_charsint2000历史消息摘要的最大字符数
reasoning_policystr"budget"reasoning chain 处理方式:strip(丢弃)、append(始终包含)、budget(预算内包含)
max_reasoning_tokensint2000reasoning chain 内容的 token 预算

Scheduler

scheduler 键下配置。控制基于 cron 的定时任务调度服务。

类型默认值说明
poll_interval_secondsfloat1.0调度器检查到期任务的间隔(秒)
max_concurrent_firesint5最大并发执行任务数
job_timeout_secondsfloat120.0单个定时任务执行超时(秒)
min_interval_secondsint60允许的最小 cron 间隔(防止过于频繁触发)
max_prompt_charsint12000定时任务 prompt 最大字符数
max_jobs_per_chatint20每个聊天会话的最大定时任务数
failure_retry_secondsint300任务失败后重试等待时间(秒)
max_consecutive_failuresint3连续失败多少次后自动禁用任务
memory_dreaming_enabledbooltrue是否启用内部记忆 dreaming 周期任务
memory_dreaming_interval_secondsint3600记忆 dreaming 周期(秒)
memory_dreaming_initial_delay_secondsint300应用启动后首次 dreaming 延迟(秒)
memory_dreaming_session_limitint20单次 dreaming 最多扫描的最近会话数
memory_dreaming_recent_turn_limitint40单个会话最多读取的最近 turns 数
memory_dreaming_provider_idstr""Legacy 字段;建议把 provider 写进 memory_dreaming_model
memory_dreaming_modelstr""dreaming 模型 spec;空则默认找 memory tag,失败后使用会话模型

Memory

memory 键下配置长期记忆检索和 embedding。默认保持 FTS-only,不会调用 embedding API。

类型默认值说明
enabledbooltrue是否启用 memory 子系统配置
retrieval.fts_enabledbooltrue是否允许使用 SQLite FTS/BM25 检索长期记忆
retrieval.vector_enabledboolfalse是否启用向量召回;需要 embedding.enabled=true
retrieval.hybrid_enabledbooltrueFTS 和 vector 同时可用时是否使用 RRF hybrid fusion
retrieval.vector_backendstr"json"向量后端:jsonsqlite-vecnone
retrieval.max_injected_itemsint5单轮最多注入的长期记忆条数
retrieval.max_injected_charsint4000单轮长期记忆注入字符预算
embedding.enabledboolfalse是否启用长期记忆 embedding
embedding.provider_idstr""Legacy 字段;建议把 provider 写进 embedding.model
embedding.modelstr""embedding 模型 spec;空则默认找 embedding tag
embedding.dimensionsint0embedding 维度;sqlite-vec 后端必须填写
embedding.batch_sizeint16embedding 批量大小
embedding.embed_after_consolidationbooltrueconsolidation/dreaming 写入长期记忆后是否刷新 embedding
consolidation.rule_based_enabledbooltrue是否启用每轮对话结束后的规则抽取;设为 false 后只保留后台 dreaming 和显式 memory_write//memory remember 写入

Router

router 键下配置。控制消息从频道到命令/Agent 的路由行为。

类型默认值说明
system_promptstr"You are a helpful assistant."Agent 系统提示词(建议使用顶层 system_prompt 字段)
max_history_turnsint200每个会话加载的最大对话历史轮数
agent_enabledbooltrue是否启用 Agent 循环(设为 false 进入纯命令模式)
command_timeout_secondsfloat30.0命令处理器执行超时(秒)
command_timeout_messagestr"Command timed out..."命令超时时显示的消息
reply_to_inboundbooltrue默认是否让回复引用触发消息;频道插件可用同名配置覆盖
show_reasoningboolfalse是否在回复中附带模型推理过程
reasoning_max_charsint2000推理过程显示的最大字符数
enable_silent_replybooltrue是否允许 Agent 使用 NO_REPLY 静默回复(运行时可通过 /reasoning 调整)
group_contextobject(见下文)群聊观察上下文注入配置

群聊观察上下文

router.group_context 下配置。控制群聊中未直接触发 bot 的消息作为上下文注入的行为。

类型默认值说明
enabledbooltrue是否启用群聊观察上下文注入
max_messagesint20注入的最大观察消息数
ttl_secondsint900观察消息过期时间(秒),超出的不注入
max_charsint4000观察上下文总字符预算

WebAPI

webapi 键下配置。控制 HTTP REST API 服务。

类型默认值说明
enabledboolfalse是否启用 WebAPI 服务
auth_tokenstr""API 认证令牌;请求需在 Authorization: Bearer <token> 中携带
cors_originslist[str]["*"]CORS 允许的来源列表
hoststr""绑定地址;空值跟随顶层 host
portint0绑定端口;0 表示自动分配

WebUI

webui 键下配置。控制浏览器端管理控制台。

类型默认值说明
enabledbooltrue是否启用 WebUI(需构建前端资源)
authobject(见下文)认证配置

WebUI 认证

webui.auth 下配置。

类型默认值说明
enabledbooltrue是否启用登录认证
admin_passwordstr""明文管理员密码;与 admin_password_hash 二选一
admin_password_hashstr""bcrypt 哈希密码;优先于明文密码
session_ttl_secondsint3600登录会话有效期(秒)
login_rate_per_minuteint5每分钟最大登录尝试次数
bind_session_to_ipbooltrue是否将 session 绑定到客户端 IP

频道插件

频道配置通过 extra="allow" 机制注入:顶层键名如果匹配某个插件 ID,对应的值会合并到该插件的配置中。

Telegram

telegram 键下配置。

类型默认值说明
bot_tokenstr""Telegram Bot API token(必填),可回退到 TELEGRAM_BOT_TOKEN 环境变量
proxystr""SOCKS5/HTTP 代理地址,如 socks5://127.0.0.1:1080
polling_timeoutint30Long polling 超时(秒)
polling_max_backofffloat30轮询错误时的最大退避延迟
allowed_chatslist[str][]聊天 ID 白名单,空 = 接受所有
reply_to_inboundbool | nullnull是否覆盖 router.reply_to_inboundnull/省略表示跟随全局
send_retry_attemptsint3发送限流时的重试次数
media_download_dirstr"./data/temp/media"媒体文件下载目录

示例

yaml
telegram:
  bot_token: "${TELEGRAM_BOT_TOKEN}"
  polling_timeout: 30
  allowed_chats: []

Milky (QQ)

milky 键下配置。需要先启动 Lagrange.Milky 实例。

连接

类型默认值说明
base_urlstr"http://127.0.0.1:3000"Milky HTTP 基础 URL
access_tokenstr""Milky API 访问令牌
api_prefixstr"/api"HTTP API 前缀
event_pathstr"/event"WebSocket 事件路径
ws_urlstr""完整的 WebSocket URL 覆盖(如 ws://host:3000/event

触发 / 访问控制

类型默认值说明
command_prefixstr"/"命令前缀
group_trigger_modestr"mention"群消息触发方式:mention(@机器人)、command(命令前缀)、always(全部消息)
reply_to_inboundbool | nullnull是否覆盖 router.reply_to_inboundnull/省略表示跟随全局
allowed_friendslist[str][]QQ 好友白名单,空 = 不限制
allowed_groupslist[str][]QQ 群白名单,空 = 不限制

超时 / 重连

类型默认值说明
connect_timeoutfloat10.0HTTP 连接超时(秒)
heartbeat_timeoutfloat30.0WebSocket 心跳超时(秒)
reconnect_initial_delayfloat1.0初始重连延迟(秒)
reconnect_max_delayfloat30.0最大重连延迟(秒)

发送 / 媒体 / 转发

类型默认值说明
send_retry_attemptsint3发送消息的重试次数
send_retry_backofffloat1.0重试退避间隔(秒)
max_text_lengthint4000出站文本最大长度
media_download_dirstr"./data/temp/media"媒体文件下载目录
enable_media_download_toolbooltrue是否注册媒体下载工具
resource_url_ttl_hintint300临时 URL 的 TTL 提示(秒)
cache_media_on_receivebooltrue收到消息时立即缓存媒体
max_forward_depthint3合并转发最大嵌套深度
max_forward_messagesint80单次合并转发最大消息数
forward_render_max_charsint12000转发渲染的文本预算(字符)
scene_cache_sizeint4096Peer-to-scene 缓存条目数

示例

yaml
milky:
  base_url: "http://127.0.0.1:3000"
  access_token: "${MILKY_ACCESS_TOKEN}"
  group_trigger_mode: "mention"
  allowed_friends: []
  allowed_groups: []

环境变量

所有 YAML 值均支持插值:

  • ${VAR_NAME} — 从 .env 文件或环境变量解析
  • ${VAR_NAME:fallback} — 解析并带回退值

配置中常用的环境变量:

变量使用者说明
TELEGRAM_BOT_TOKENTelegram 频道Bot API token
DEEPSEEK_LLM_API_KEYDeepSeek providerAPI 密钥
DEEPSEEK_LLM_BASE_URLDeepSeek providerAPI 基础 URL
SILICONFLOW_LLM_API_KEYSiliconFlow providerAPI 密钥
SILICONFLOW_LLM_BASE_URLSiliconFlow providerAPI 基础 URL
MINIMAX_LLM_API_KEYMinimax providerAPI 密钥
OPENAI_API_KEYOpenAI Responses providerAPI 密钥
MILKY_ACCESS_TOKENMilky 频道访问令牌
ENV_PATH配置加载器覆盖 .env 文件路径

变量通常存放在项目根目录的 .env 文件中。


完整示例

多 provider 的完整配置示例见项目根目录的 config-multiproviders.yaml

yaml
app_name: "Nahida Bot"
debug: false
log_level: "INFO"
log_file: "./data/logs/nahida.log"
log_file_level: "DEBUG"
db_path: "./data/nahida.db"
system_prompt: "You are a helpful assistant."
default_provider: deepseek-main
enable_silent_reply: true

providers:
  deepseek-main:
    type: deepseek
    api_key: "${DEEPSEEK_LLM_API_KEY}"
    base_url: "${DEEPSEEK_LLM_BASE_URL}"
    stream_responses: true
    models:
      - name: "deepseek-v4-pro"
        tags: [primary]
      - name: "deepseek-v4-flash"
        tags: [cheap]

  siliconflow:
    type: "openai-compatible"
    api_key: "${SILICONFLOW_LLM_API_KEY}"
    base_url: "${SILICONFLOW_LLM_BASE_URL}"
    merge_system_messages: true
    stream_responses: true
    models:
      - name: "Qwen/Qwen3-Embedding-8B"
        tags: [embedding]
      - name: "Qwen/Qwen3.6-35B-A3B"
        tags: [primary, vision]
        capabilities:
          image_input: true
          max_image_count: 4

multimodal:
  image_fallback_mode: "auto"
  media_context_policy: "cache_aware"
  image_fallback_model: "siliconflow/Qwen/Qwen3.6-35B-A3B"

router:
  max_history_turns: 200
  show_reasoning: false
  reasoning_max_chars: 2000
  group_context:
    enabled: true
    max_messages: 20
    ttl_seconds: 900

webapi:
  enabled: true
  auth_token: "${WEBAPI_AUTH_TOKEN}"
  cors_origins: ["*"]

webui:
  enabled: true
  auth:
    enabled: true
    admin_password: "${WEBUI_ADMIN_PASSWORD}"

memory:
  enabled: true
  retrieval:
    fts_enabled: true
  embedding:
    enabled: true
    model: "embedding"
  consolidation:
    rule_based_enabled: true

scheduler:
  memory_dreaming_enabled: true
  memory_dreaming_model: "memory"