LibreFang 配置参考

config.toml 的完整参考文档,涵盖 LibreFang Agent OS 中每一个可配置字段。


目录


概述

LibreFang 从以下 TOML 文件读取配置:

~/.librefang/config.toml

在 Windows 上,~ 解析为 C:\Users\<用户名>。如果无法确定用户主目录,则会使用系统临时目录作为后备路径。

核心行为:

  • 配置中的每个结构体都使用了 #[serde(default)],这意味着所有字段都是可选的。未填写的字段将使用文档中说明的默认值。
  • 通道配置节([channels.telegram][channels.discord] 等)采用 Option<T> 类型——缺少该节时,对应的通道适配器将被禁用。即使只写了节头(内容为空),也会以默认值启用该适配器。
  • 密钥绝不直接存储在 config.toml 中api_key_envbot_token_env 等字段保存的是环境变量的名称,实际密钥从该环境变量中读取,以防止密钥被意外提交到版本控制系统。
  • 敏感字段(api_keyshared_secret)在调试输出和日志中会被自动脱敏。

配置文件包含机制

LibreFang 支持通过 include 字段将配置拆分到多个文件中。这使得可以实现模块化配置(例如将通道配置、MCP 服务器配置或特定环境的覆盖配置分开存放)。

# ~/.librefang/config.toml
include = ["channels.toml", "mcp.toml", "overrides/prod.toml"]

规则:

  • 路径相对于根配置文件所在的目录。
  • 绝对路径会在启动时报错并被拒绝。
  • 包含 .. 路径穿越组件的路径出于安全原因会被拒绝。
  • 最大包含嵌套深度:10 层
  • 被包含的文件在根配置之前进行深度合并。根配置中的值始终覆盖被包含文件中的值。
  • 被包含的文件本身也可以包含 include 数组(受深度限制约束)。

此机制适用于将密钥放在具有更严格文件系统权限的独立文件中,或在多个环境之间共享基础配置。


最小配置

最简单的可用配置只需将 LLM 提供商的 API Key 设置为环境变量。如果没有配置文件,LibreFang 将以 Anthropic 作为默认提供商启动:

# ~/.librefang/config.toml
# 最小配置:仅在需要非默认模型时进行覆盖。
# 在环境变量中设置 ANTHROPIC_API_KEY。

[default_model]
provider = "anthropic"
model = "claude-sonnet-4-20250514"
api_key_env = "ANTHROPIC_API_KEY"

或者使用本地 Ollama 实例(无需 API Key):

[default_model]
provider = "ollama"
model = "llama3.2:latest"
base_url = "http://localhost:11434"
api_key_env = ""

完整配置示例

# ============================================================
# LibreFang Agent OS -- 完整配置参考
# ============================================================

# --- 顶层字段 ---
home_dir = "~/.librefang"             # LibreFang 主目录
data_dir = "~/.librefang/data"        # SQLite 数据库和数据文件
log_level = "info"                    # trace | debug | info | warn | error
api_listen = "127.0.0.1:4545"        # HTTP/WS API 绑定地址
network_enabled = false               # 启用 OFP 点对点网络
api_key = ""                          # API Bearer 令牌(空值 = 无需认证)
dashboard_user = ""                   # 仪表盘登录用户名(空值 = 无需登录)
dashboard_pass = ""                   # 仪表盘登录密码(支持 vault:KEY 语法)
mode = "default"                      # stable | default | dev
update_channel = "stable"             # stable | beta | rc — CLI 更新通道
language = "en"                       # CLI/消息的语言区域设置
usage_footer = "full"                 # off | tokens | cost | full
prompt_caching = true                 # 启用 LLM 提示词缓存
stable_prefix_mode = false            # 减少提示词缓存失效
max_cron_jobs = 500                   # 全局最大定时任务数
tool_timeout_secs = 300               # 所有工具的全局超时(秒)
cors_origin = []                      # CORS 允许的来源
include = []                          # 配置文件包含

[provider_urls]
# ollama = "http://192.168.1.100:11434/v1"

[provider_api_keys]
# nvidia = "NVIDIA_API_KEY"

[provider_regions]
# qwen = "intl"        # 使用 Qwen 国际端点 (dashscope-intl)
# minimax = "china"    # 使用 MiniMax 中国端点 (MINIMAX_CN_API_KEY)

# --- 工具超时 ---
[tool_timeouts]
agent_send = 600                       # agent_send 工具的覆盖
agent_spawn = 600                      # agent_spawn 工具的覆盖
"mcp_browser_*" = 900                  # 浏览器 MCP 工具的 glob 模式
shell_exec = 300                       # shell_exec 工具的覆盖

# --- 默认 LLM 提供商 ---
[default_model]
provider = "anthropic"
model = "claude-sonnet-4-20250514"
api_key_env = "ANTHROPIC_API_KEY"
# base_url = "https://api.anthropic.com"  # 可选覆盖

# --- 后备提供商 ---
[[fallback_providers]]
provider = "ollama"
model = "llama3.2:latest"
api_key_env = ""
# base_url = "http://localhost:11434"  # 省略则使用模型目录中的默认值

[[fallback_providers]]
provider = "groq"
model = "llama-3.3-70b-versatile"
api_key_env = "GROQ_API_KEY"

# --- 记忆系统 ---
[memory]
# sqlite_path = "~/.librefang/data/librefang.db"  # 省略则自动解析
embedding_model = "all-MiniLM-L6-v2"
consolidation_threshold = 10000
decay_rate = 0.1

# --- 网络(OFP 线路协议) ---
[network]
listen_addresses = ["/ip4/0.0.0.0/tcp/0"]
bootstrap_peers = []
mdns_enabled = true
max_peers = 50
shared_secret = ""                    # network_enabled = true 时必填

# --- 网页工具 ---
[web]
search_provider = "auto"              # auto | brave | jina | tavily | perplexity | duckduckgo
cache_ttl_minutes = 15
timeout_secs = 15

[web.brave]
api_key_env = "BRAVE_API_KEY"
max_results = 5
country = ""
search_lang = ""
freshness = ""

[web.tavily]
api_key_env = "TAVILY_API_KEY"
search_depth = "basic"                # basic | advanced
max_results = 5
include_answer = true

[web.jina]
api_key_env = "JINA_API_KEY"
max_results = 5

[web.perplexity]
api_key_env = "PERPLEXITY_API_KEY"
model = "sonar"

[web.fetch]
max_chars = 50000
max_response_bytes = 10485760         # 10 MB
timeout_secs = 30
readability = true

# --- 媒体理解 ---
[media]
image_description = true
audio_transcription = true
video_description = false
max_concurrency = 2
# image_provider = "openai"
# audio_provider = "openai"

# --- 链接理解 ---
[links]
enabled = false
max_links = 3
max_content_bytes = 102400
timeout_secs = 10

# --- MCP 服务器 ---
[[mcp_servers]]
name = "filesystem"
timeout_secs = 30
env = []
[mcp_servers.transport]
type = "stdio"
command = "npx"
args = ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"]

[[mcp_servers]]
name = "remote-tools"
timeout_secs = 60
env = ["REMOTE_API_KEY"]
[mcp_servers.transport]
type = "sse"
url = "https://mcp.example.com/events"

[[mcp_servers]]
name = "my-http-backend"
timeout_secs = 30
[mcp_servers.transport]
type = "http_compat"
base_url = "https://tools.example.com"
headers = [{name = "Authorization", value_env = "MY_API_KEY"}]
[[mcp_servers.transport.tools]]
name = "search"
description = "Search documents"
path = "/search"
method = "post"

# --- A2A 协议 ---
[a2a]
enabled = false
name = "LibreFang Agent OS"
description = ""
listen_path = "/a2a"

[[a2a.external_agents]]
name = "research-agent"
url = "https://agent.example.com/.well-known/agent.json"

# --- RBAC 用户 ---
[[users]]
name = "Alice"
role = "owner"                        # owner | admin | user | viewer
api_key_hash = ""
[users.channel_bindings]
telegram = "123456"
discord = "987654321"

[[users]]
name = "Bob"
role = "user"
[users.channel_bindings]
slack = "U0123ABCDEF"

# --- 通道适配器 ---
# (所有 45 个适配器的详细说明见下方"通道配置"章节)

[channels.telegram]
bot_token_env = "TELEGRAM_BOT_TOKEN"
allowed_users = []
# default_agent = "assistant"
poll_interval_secs = 1

[channels.discord]
bot_token_env = "DISCORD_BOT_TOKEN"
allowed_guilds = []
intents = 37376

[channels.slack]
app_token_env = "SLACK_APP_TOKEN"
bot_token_env = "SLACK_BOT_TOKEN"
allowed_channels = []

# [channels.qq]
# app_id = "your-app-id"
# app_secret_env = "QQ_BOT_APP_SECRET"

# [channels.wecom]
# bot_id = "YOUR_BOT_ID"
# secret_env = "WECOM_BOT_SECRET"

# [channels.wechat]
# bot_token_env = "WECHAT_BOT_TOKEN"   # 可选:重启时跳过二维码登录
# default_agent = "assistant"
# allowed_users = []

# --- 浏览器自动化 ---
[browser]
headless = true
viewport_width = 1280
viewport_height = 720
timeout_secs = 30
idle_timeout_secs = 300
max_sessions = 5

# --- 配置热重载 ---
[reload]
mode = "hybrid"                       # off | restart | hot | hybrid
debounce_ms = 500

# --- Shell 执行策略 ---
[exec_policy]
mode = "allowlist"                    # deny | allowlist | full
timeout_secs = 30
max_output_bytes = 102400
no_output_timeout_secs = 30

# --- 预算 ---
[budget]
max_hourly_usd = 0.0
max_daily_usd = 0.0
max_monthly_usd = 0.0
alert_threshold = 0.8
default_max_llm_tokens_per_hour = 0

# --- 扩展思维 ---
[thinking]
budget_tokens = 10000
stream_thinking = false

# --- 语音合成 ---
[tts]
enabled = false
max_text_length = 4096
timeout_secs = 30

[tts.openai]
voice = "alloy"
model = "tts-1"
format = "mp3"
speed = 1.0

# --- Docker 沙箱 ---
[docker]
enabled = false
image = "python:3.12-slim"
network = "none"
memory_limit = "512m"
cpu_limit = 1.0
timeout_secs = 60
read_only_root = true
mode = "off"                          # off | non_main | all
scope = "session"                     # session | agent | shared
cap_add = []                          # 例如 ["NET_ADMIN"]
tmpfs = ["/tmp:size=64m"]
pids_limit = 100

# --- 密钥库 ---
[vault]
enabled = true
# path = "~/.librefang/vault.enc"

# --- Webhook 触发器 ---
[webhook_triggers]
enabled = false
token_env = "LIBREFANG_WEBHOOK_TOKEN"
max_payload_bytes = 65536
rate_limit_per_minute = 30

# --- HTTP 代理 ---
[proxy]
# http_proxy = "http://proxy.corp.example:8080"
# https_proxy = "http://proxy.corp.example:8080"
# no_proxy = "localhost,127.0.0.1,.internal.corp"

# --- 会话 ---
[session]
retention_days = 0
max_sessions_per_agent = 0
cleanup_interval_hours = 24

# --- 终端 ---
[terminal]
enabled = true
# allow_remote = false
# allow_unauthenticated_remote = false
# allowed_origins = []
# require_proxy_headers = false
# tmux_enabled = true
# max_windows = 16
# tmux_binary_path = ""

# --- 队列 ---
[queue]
max_depth_per_agent = 0
max_depth_global = 0
task_ttl_secs = 3600

[queue.concurrency]
main_lane = 3
cron_lane = 2
subagent_lane = 3

# --- 审计 ---
[audit]
retention_days = 90

# --- 外部认证(OAuth2/OIDC) ---
[external_auth]
enabled = false
# issuer_url = "https://accounts.google.com"
# client_id = "your-client-id"
# client_secret_env = "LIBREFANG_OAUTH_CLIENT_SECRET"

# --- Vertex AI ---
[vertex_ai]
# project_id = "my-gcp-project"
# region = "us-central1"
# credentials_path = "/path/to/service-account.json"

# --- 上下文引擎 ---
[context_engine]
engine = "default"
# plugin = "qdrant-recall"

# --- 插件 ---
[plugins]
plugin_registries = []

各节详解

顶层字段

以下字段位于 config.toml 的根层级(不在任何 [section] 内部)。

字段类型默认值说明
home_dirpath~/.librefangLibreFang 主目录,存储配置、Agent、技能等。
data_dirpath~/.librefang/dataSQLite 数据库和持久化数据的目录。
log_levelstring"info"日志级别。可选值:tracedebuginfowarnerror
api_listenstring"127.0.0.1:4545"HTTP/WebSocket/SSE API 服务器的绑定地址。别名:listen_addr
network_enabledboolfalse启用 OFP 点对点网络层。
api_keystring""(空)API 认证密钥。设置后,除 /api/health 外的所有端点均需要 Authorization: Bearer <key> 请求头。空值表示不需要认证(仅限本地开发使用)。
cors_originlist of strings[]除 localhost 外额外允许的 CORS 来源。例如 ["https://dash.example.com"]
modestring"default"内核运行模式。见下表。
languagestring"en"CLI 输出和系统消息的语言/区域代码。
usage_footerstring"full"控制附加到回复末尾的用量信息。见下表。
prompt_cachingbooltrue启用 LLM 提供商的提示词缓存。会在系统提示中添加缓存提示(Anthropic 使用 cache_control,OpenAI 自动前缀缓存)。
stable_prefix_modeboolfalse启用后,避免每轮对话都会变化的系统提示内容(如回忆记忆、标准上下文),从而提高提供商端的提示词缓存命中率。
max_cron_jobsusize500所有 Agent 的全局最大定时任务数。
workspaces_dirpath 或 nullnullAgent 工作区的根目录。默认为 ~/.librefang/workspaces。包含 Agent 工作目录和 hands/ 子目录(用于用户自定义 hands)。
includelist of strings[]配置文件包含列表(相对路径)。详见配置文件包含机制
provider_urlsmap of string->string{}提供商基础 URL 覆盖。将提供商 ID 映射到自定义基础 URL(例如 ollama = "http://192.168.1.100:11434/v1")。适用于自托管或代理端点。
provider_api_keysmap of string->string{}提供商 API Key 环境变量覆盖。将提供商 ID 映射到存放密钥的环境变量名称(例如 nvidia = "NVIDIA_API_KEY")。未设置时,默认使用 {PROVIDER_UPPER}_API_KEY 的命名约定。
provider_regionsmap of string->string{}提供商区域选择。将提供商 ID 映射到提供商注册 TOML 中定义的区域名称(例如 qwen = "intl")。覆盖提供商的基础 URL,并可选择性覆盖其 API Key 环境变量。在 provider_urls 之前生效(优先级较低)。
tool_timeout_secsu64300所有工具执行的全局超时(秒)。可通过 [tool_timeouts] 节按工具覆盖。
tool_timeoutsmap of string->u64{}每个工具的超时覆盖。键是精确的工具名称或 glob 模式。详见 [tool_timeouts] 节。

mode 值说明:

行为
stable保守模式:不自动更新,锁定模型版本,冻结技能注册表。使用 FallbackDriver
default均衡模式:标准运行。
dev开发者模式:启用实验性功能。

usage_footer 值说明:

行为
off不显示用量信息。
tokens仅显示 Token 数量。
cost仅显示预估费用。
full同时显示 Token 数量和预估费用(默认)。

[default_model]

配置 Agent 未指定自有模型时使用的主 LLM 提供商。

[default_model]
provider = "anthropic"
model = "claude-sonnet-4-20250514"
api_key_env = "ANTHROPIC_API_KEY"
# base_url = "https://api.anthropic.com"
字段类型默认值说明
providerstring"anthropic"提供商名称。支持:anthropicgeminiopenaigroqopenrouterdeepseektogethermistralfireworksollamavllmlmstudioperplexitycohereai21cerebrassambanovahuggingfacexaireplicate
modelstring"claude-sonnet-4-20250514"模型标识符。别名(如 sonnethaikugpt-4ogemini-flash)由模型目录自动解析。
api_key_envstring"ANTHROPIC_API_KEY"存放 API Key 的环境变量名称。实际密钥在运行时从该环境变量读取,绝不存储在配置文件中。
base_urlstring 或 nullnull覆盖 API 基础 URL。适用于代理或自托管端点。为 null 时,使用模型目录中提供商的默认 URL。

[memory]

配置基于 SQLite 的记忆基础设施,包括向量嵌入和记忆衰减。

[memory]
# sqlite_path = "/custom/path/librefang.db"
embedding_model = "all-MiniLM-L6-v2"
consolidation_threshold = 10000
decay_rate = 0.1
字段类型默认值说明
sqlite_pathpath 或 nullnullSQLite 数据库文件的显式路径。为 null 时,默认为 {data_dir}/librefang.db
embedding_modelstring"all-MiniLM-L6-v2"用于生成语义记忆搜索向量嵌入的模型名称。
embedding_providerstring 或 nullnull嵌入提供商(例如 "openai""ollama")。为 null 时自动检测。
embedding_api_key_envstring 或 nullnull存放嵌入提供商 API Key 的环境变量名称。
consolidation_thresholdu6410000触发自动整合(合并和清理旧条目)的存储记忆数量阈值。
consolidation_interval_hoursu6424记忆整合的运行间隔(小时)。0 = 禁用。
decay_ratef320.1记忆置信度衰减率。0.0 = 无衰减(记忆永不消退),1.0 = 快速衰减。取值范围 0.0 到 1.0。

[auto_dream]

后台记忆整固("梦境")—— 让选择开启的 agent 通过 4 阶段提示词(定位 / 收集 / 整固 / 修剪)反思并整理自己的记忆。触发是 事件驱动 的:agent 每完成一次 turn 即检查闸门;另保留一个稀疏的兜底调度器(默认每天一次)捕获长期不活动的 agent。默认关闭;每个 agent 还需在 manifest 中通过 auto_dream_enabled = true 单独开启。

[auto_dream]
enabled = false
min_hours = 24
min_sessions = 5
check_interval_secs = 86400
timeout_secs = 600
# lock_dir = ""   # 默认为 <data_dir>/auto_dream/
字段类型默认值说明
enabledboolfalse全局开关。为 false 时即使单个 agent 已开启也不会触发。
min_hoursf6424.0距离该 agent 上次整固的最小小时数,满足后才会再次触发。
min_sessionsu325距离该 agent 上次整固之后,被触及的最少会话数,满足后才会再次触发。设为 0 则禁用该闸门。
check_interval_secsu6486400兜底调度器的唤醒间隔(秒)。主触发路径是 AgentLoopEnd 钩子,此字段只控制从不 turn 的 agent 的兜底节奏。
timeout_secsu64600单次梦境调用的超时时间(秒)。
lock_dirstring""锁目录的可选覆盖路径。为空则使用 <data_dir>/auto_dream/,每个 agent 的锁存储为 <dir>/<agent_id>.lock

当所有闸门同时满足时才会触发:enabled = true、agent manifest 中 auto_dream_enabled = true、距离上次梦境至少 min_hours 小时、至少触及 min_sessions 个会话、以及能获取到该 agent 的文件锁。

每个 agent 的 opt-in 状态可在运行时通过 PUT /api/auto-dream/agents/{id}/enabled(请求体 {"enabled": bool})或 Web Dashboard 的设置页 → 梦境模式卡片切换 —— 新状态在下一次 turn 结束(事件驱动)或下一次兜底 tick 时生效,以先到者为准。完整参考(包含运行时工具限制、手动控制、审计事件)见 /zh/configuration/core#auto_dream


[network]

配置 OFP(LibreFang 协议)点对点网络层,使用 HMAC-SHA256 双向认证。

[network]
listen_addresses = ["/ip4/0.0.0.0/tcp/0"]
bootstrap_peers = []
mdns_enabled = true
max_peers = 50
shared_secret = "my-cluster-secret"
字段类型默认值说明
listen_addresseslist of strings["/ip4/0.0.0.0/tcp/0"]监听的 libp2p 多地址。端口 0 表示自动分配。
bootstrap_peerslist of strings[]用于 DHT 发现的引导节点多地址。
mdns_enabledbooltrue启用 mDNS 以自动发现本地网络中的对等节点。
max_peersu3250最大同时连接的对等节点数。
shared_secretstring""(空)OFP HMAC-SHA256 双向认证的预共享密钥。当 network_enabled = true必填。通信双方必须使用相同的密钥。日志中会脱敏处理。

[web]

配置 Agent 工具使用的网页搜索和网页抓取能力。

[web]
search_provider = "auto"
cache_ttl_minutes = 15
timeout_secs = 15
字段类型默认值说明
search_providerstring"auto"使用的搜索引擎。见下表。
cache_ttl_minutesu6415搜索/抓取结果的缓存时长(分钟)。0 = 禁用缓存。
timeout_secsu6415所有网页搜索请求的 HTTP 超时时间(秒)。建议:大多数提供商使用 15,Jina 建议使用 30 以上。

search_provider 值说明:

说明
auto级联回退:根据可用的 API Key,依次尝试 Tavily、Brave、Jina、Perplexity、DuckDuckGo。
braveBrave Search API。需要 BRAVE_API_KEY
jinaJina AI 搜索与信息定位。需要 JINA_API_KEY
tavilyTavily AI 原生搜索。需要 TAVILY_API_KEY
perplexityPerplexity AI 搜索。需要 PERPLEXITY_API_KEY
duckduckgoDuckDuckGo HTML 抓取。无需 API Key。

[web.brave]

[web.brave]
api_key_env = "BRAVE_API_KEY"
max_results = 5
country = ""
search_lang = ""
freshness = ""
字段类型默认值说明
api_key_envstring"BRAVE_API_KEY"存放 Brave Search API Key 的环境变量名称。
max_resultsusize5返回的最大搜索结果数。
countrystring""用于本地化结果的国家代码(例如 "US""GB")。空值 = 不过滤。
search_langstring""语言代码(例如 "en""fr")。空值 = 不过滤。
freshnessstring""时效性过滤。"pd" = 过去一天,"pw" = 过去一周,"pm" = 过去一月。空值 = 不过滤。

[web.tavily]

[web.tavily]
api_key_env = "TAVILY_API_KEY"
search_depth = "basic"
max_results = 5
include_answer = true
字段类型默认值说明
api_key_envstring"TAVILY_API_KEY"存放 Tavily API Key 的环境变量名称。
search_depthstring"basic"搜索深度:"basic" 快速返回结果,"advanced" 进行更深入的分析。
max_resultsusize5返回的最大搜索结果数。
include_answerbooltrue是否在结果中包含 Tavily 的 AI 生成答案摘要。

[web.jina]

[web.jina]
api_key_env = "JINA_API_KEY"
max_results = 5
字段类型默认值说明
api_key_envstring"JINA_API_KEY"存放 Jina AI API Key 的环境变量名称。
max_resultsusize5返回的最大搜索结果数。

[web.perplexity]

[web.perplexity]
api_key_env = "PERPLEXITY_API_KEY"
model = "sonar"
字段类型默认值说明
api_key_envstring"PERPLEXITY_API_KEY"存放 Perplexity API Key 的环境变量名称。
modelstring"sonar"用于搜索查询的 Perplexity 模型。

[web.fetch]

[web.fetch]
max_chars = 50000
max_response_bytes = 10485760
timeout_secs = 30
readability = true

# 可选:允许 Agent 访问内部服务(自托管 / K8s 部署)。
# 云元数据端点(169.254.x.x、100.64.x.x)无论如何都会被阻止。
# ssrf_allowed_hosts = [
#   "10.0.0.0/8",                # CIDR — 整个私有子网
#   "*.internal.example.com",    # glob — 所有子域名
#   "svc.cluster.local",         # 字面主机名
# ]
字段类型默认值说明
max_charsusize50000抓取内容返回的最大字符数。超出部分将被截断。
max_response_bytesusize10485760(10 MB)HTTP 响应体的最大大小(字节)。
timeout_secsu6430HTTP 请求超时时间(秒)。
readabilitybooltrue启用 HTML 到 Markdown 的可读性提取。开启后,抓取的 HTML 会被转换为干净的 Markdown 格式。
ssrf_allowed_hosts字符串列表[]豁免 SSRF 拦截的主机/CIDR 列表。支持 CIDR 格式("10.0.0.0/8")、glob 前缀通配符("*.internal.example.com")以及字面 IP 或主机名。云元数据地址段(169.254.0.0/16100.64.0.0/10无论如何都会被拦截,不受此列表影响。

[media]

配置媒体理解能力(图片描述、音频转录、视频描述),用于处理包含附件的消息。

[media]
image_description = true
audio_transcription = true
video_description = false
max_concurrency = 2
# image_provider = "openai"   # 省略则自动检测
# audio_provider = "openai"   # 省略则自动检测
字段类型默认值说明
image_descriptionbooltrue启用对传入图片附件的自动描述。
audio_transcriptionbooltrue启用对传入音频附件的自动转录。
video_descriptionboolfalse启用视频描述。默认禁用(耗费大且速度慢)。
max_concurrencyusize2并发媒体处理任务的最大数量。
image_providerstring 或 nullnull首选的图片描述提供商。为 null 时根据可用提供商自动检测。
audio_providerstring 或 nullnull首选的音频转录提供商。为 null 时根据可用提供商自动检测。

配置自动链接理解功能——自动抓取并总结传入消息中的 URL。

[links]
enabled = false
max_links = 3
max_content_bytes = 102400
timeout_secs = 10
字段类型默认值说明
enabledboolfalse启用自动链接理解。开启后,消息中的 URL 会被抓取并总结其内容,然后再交给 Agent 处理。
max_linksusize3每条消息处理的最大链接数。多余的链接会被忽略。
max_content_bytesusize102400(100 KB)每个链接抓取的最大内容大小(字节)。超出部分将被截断。
timeout_secsu6410每个链接的抓取超时时间(秒)。

[channels]

所有 45 个通道适配器均在 [channels.<name>] 下配置。每个通道采用 Option<T> 类型——省略该节将完全禁用该适配器。即使只写了节头(内容为空),也会以默认值启用该适配器。

通用通道字段: 每个通道适配器除了自身特有的字段外,还支持以下通用字段:

字段类型默认值说明
default_agentstring 或 nullnull默认将消息路由到的 Agent 名称。
account_idstring 或 nullnull当前 Bot 实例的唯一标识符。用于通过 [[bindings]] 匹配规则进行多 Bot 路由。
overridesobject(默认值)每个通道的行为覆盖配置。详见通道行为覆盖

[channels.telegram]

[channels.telegram]
bot_token_env = "TELEGRAM_BOT_TOKEN"
allowed_users = []
# default_agent = "assistant"
poll_interval_secs = 1
# api_url = "https://api.telegram.org"  # 覆盖用于本地 Bot API 服务器
# account_id = "my-telegram-bot"
字段类型默认值说明
bot_token_envstring"TELEGRAM_BOT_TOKEN"存放 Telegram Bot API 令牌的环境变量。
allowed_userslist of i64[]允许交互的 Telegram 用户 ID 列表。空列表 = 允许所有人。
default_agentstring 或 nullnull消息路由的目标 Agent 名称。
poll_interval_secsu641长轮询间隔(秒)。
account_idstring 或 nullnull用于多 Bot 路由的唯一 Bot 实例标识符。
api_urlstring 或 nullnull覆盖 Telegram Bot API 基础 URL。适用于本地 Bot API 服务器实例。默认为 https://api.telegram.org
overridesobject(默认值)每个通道的行为覆盖配置。详见通道行为覆盖

[channels.discord]

[channels.discord]
bot_token_env = "DISCORD_BOT_TOKEN"
allowed_guilds = []
# default_agent = "assistant"
intents = 37376
ignore_bots = true
# account_id = "my-discord-bot"
字段类型默认值说明
bot_token_envstring"DISCORD_BOT_TOKEN"存放 Discord Bot 令牌的环境变量。
allowed_guildslist of u64[]允许的服务器(Guild)ID 列表。空列表 = 允许所有。
default_agentstring 或 nullnull消息路由的目标 Agent 名称。
allowed_userslist of strings[]允许交互的 Discord 用户 ID 列表。空列表 = 允许所有。
intentsu6437376Gateway Intents 位掩码。默认 = GUILD_MESSAGES | DIRECT_MESSAGES | MESSAGE_CONTENT(37376)。
ignore_botsbooltruetrue 时,忽略来自其他 Bot 的消息。
account_idstring 或 nullnull用于多 Bot 路由的唯一 Bot 实例标识符。
overridesobject(默认值)每个通道的行为覆盖配置。详见通道行为覆盖

[channels.slack]

[channels.slack]
app_token_env = "SLACK_APP_TOKEN"
bot_token_env = "SLACK_BOT_TOKEN"
allowed_channels = []
# account_id = "my-slack-bot"
字段类型默认值说明
app_token_envstring"SLACK_APP_TOKEN"存放 Slack 应用级令牌(xapp-)的环境变量,用于 Socket Mode。
bot_token_envstring"SLACK_BOT_TOKEN"存放 Slack Bot 令牌(xoxb-)的环境变量,用于 REST API。
allowed_channelslist of strings[]允许的频道 ID 列表。空列表 = 允许所有。
default_agentstring 或 nullnull消息路由的目标 Agent 名称。
account_idstring 或 nullnull用于多 Bot 路由的唯一 Bot 实例标识符。
overridesobject(默认值)每个通道的行为覆盖配置。详见通道行为覆盖

[channels.whatsapp]

[channels.whatsapp]
access_token_env = "WHATSAPP_ACCESS_TOKEN"
verify_token_env = "WHATSAPP_VERIFY_TOKEN"
phone_number_id = ""
webhook_port = 8443
allowed_users = []
# gateway_url_env = "WHATSAPP_WEB_GATEWAY_URL"  # 用于 QR/Web 模式
# account_id = "my-whatsapp-bot"
# owner_numbers = []   # 可选的管理员手机号
字段类型默认值说明
access_token_envstring"WHATSAPP_ACCESS_TOKEN"存放 WhatsApp Cloud API 访问令牌的环境变量。
verify_token_envstring"WHATSAPP_VERIFY_TOKEN"存放 Webhook 验证令牌的环境变量。
phone_number_idstring""WhatsApp Business 手机号 ID。
webhook_portu168443监听 Webhook 回调的端口。
gateway_url_envstring"WHATSAPP_WEB_GATEWAY_URL"存放 WhatsApp Web 网关 URL 的环境变量。设置后,发送消息将通过 QR/Web 网关而非 Cloud API 路由。
allowed_userslist of strings[]允许的手机号列表。空列表 = 允许所有。
default_agentstring 或 nullnull消息路由的目标 Agent 名称。
account_idstring 或 nullnull用于多 Bot 路由的唯一 Bot 实例标识符。
owner_numberslist of strings[]对此 Bot 实例拥有管理权限的手机号列表。
overridesobject(默认值)每个通道的行为覆盖配置。详见通道行为覆盖

[channels.signal]

[channels.signal]
api_url = "http://localhost:8080"
phone_number = ""
allowed_users = []
字段类型默认值说明
api_urlstring"http://localhost:8080"signal-cli REST API 的 URL。
phone_numberstring""Bot 注册的手机号。
allowed_userslist of strings[]允许的手机号列表。空列表 = 允许所有。
default_agentstring 或 nullnull消息路由的目标 Agent 名称。

[channels.matrix]

[channels.matrix]
homeserver_url = "https://matrix.org"
user_id = "@librefang:matrix.org"
access_token_env = "MATRIX_ACCESS_TOKEN"
allowed_rooms = []
字段类型默认值说明
homeserver_urlstring"https://matrix.org"Matrix 家服务器 URL。
user_idstring""Bot 用户 ID(例如 "@librefang:matrix.org")。
access_token_envstring"MATRIX_ACCESS_TOKEN"存放 Matrix 访问令牌的环境变量。
allowed_roomslist of strings[]监听的房间 ID 列表。空列表 = 所有已加入的房间。
default_agentstring 或 nullnull消息路由的目标 Agent 名称。

[channels.email]

[channels.email]
imap_host = "imap.gmail.com"
imap_port = 993
smtp_host = "smtp.gmail.com"
smtp_port = 587
username = "bot@example.com"
password_env = "EMAIL_PASSWORD"
poll_interval_secs = 30
folders = ["INBOX"]
allowed_senders = []
字段类型默认值说明
imap_hoststring""IMAP 服务器主机名。
imap_portu16993IMAP 服务器端口(993 用于 TLS)。
smtp_hoststring""SMTP 服务器主机名。
smtp_portu16587SMTP 服务器端口(587 用于 STARTTLS)。
usernamestring""用于 IMAP 和 SMTP 的邮箱地址。
password_envstring"EMAIL_PASSWORD"存放邮箱密码或应用专用密码的环境变量。
poll_interval_secsu6430IMAP 轮询间隔(秒)。
folderslist of strings["INBOX"]监控的 IMAP 文件夹。
allowed_senderslist of strings[]仅处理来自这些发件人的邮件。空列表 = 全部处理。
default_agentstring 或 nullnull消息路由的目标 Agent 名称。

[channels.teams]

[channels.teams]
app_id = ""
app_password_env = "TEAMS_APP_PASSWORD"
webhook_port = 3978
allowed_tenants = []
字段类型默认值说明
app_idstring""Azure Bot 应用 ID。
app_password_envstring"TEAMS_APP_PASSWORD"存放 Azure Bot Framework 应用密码的环境变量。
webhook_portu163978Bot Framework 入站 Webhook 端口。
allowed_tenantslist of strings[]允许的 Azure AD 租户 ID 列表。空列表 = 允许所有。
default_agentstring 或 nullnull消息路由的目标 Agent 名称。

[channels.mattermost]

[channels.mattermost]
server_url = "https://mattermost.example.com"
token_env = "MATTERMOST_TOKEN"
allowed_channels = []
字段类型默认值说明
server_urlstring""Mattermost 服务器 URL。
token_envstring"MATTERMOST_TOKEN"存放 Mattermost Bot 令牌的环境变量。
allowed_channelslist of strings[]监听的频道 ID 列表。空列表 = 所有频道。
default_agentstring 或 nullnull消息路由的目标 Agent 名称。

[channels.irc]

[channels.irc]
server = "irc.libera.chat"
port = 6667
nick = "librefang"
# password_env = "IRC_PASSWORD"
channels = ["#librefang"]
use_tls = false
字段类型默认值说明
serverstring"irc.libera.chat"IRC 服务器主机名。
portu166667IRC 服务器端口。
nickstring"librefang"Bot 昵称。
password_envstring 或 nullnull存放服务器密码的环境变量(可选)。
channelslist of strings[]要加入的 IRC 频道(例如 ["#librefang", "#general"])。
use_tlsboolfalse是否使用 TLS 连接。
default_agentstring 或 nullnull消息路由的目标 Agent 名称。

[channels.google_chat]

[channels.google_chat]
service_account_env = "GOOGLE_CHAT_SERVICE_ACCOUNT"
space_ids = []
webhook_port = 8444
字段类型默认值说明
service_account_envstring"GOOGLE_CHAT_SERVICE_ACCOUNT"存放服务账号 JSON 密钥的环境变量。
space_idslist of strings[]监听的 Google Chat 聊天室 ID 列表。
webhook_portu168444入站 Webhook 端口。
default_agentstring 或 nullnull消息路由的目标 Agent 名称。

[channels.twitch]

[channels.twitch]
oauth_token_env = "TWITCH_OAUTH_TOKEN"
channels = ["mychannel"]
nick = "librefang"
字段类型默认值说明
oauth_token_envstring"TWITCH_OAUTH_TOKEN"存放 Twitch OAuth 令牌的环境变量。
channelslist of strings[]要加入的 Twitch 频道(不带 # 前缀)。
nickstring"librefang"在 Twitch 聊天中的 Bot 昵称。
default_agentstring 或 nullnull消息路由的目标 Agent 名称。

[channels.rocketchat]

[channels.rocketchat]
server_url = "https://rocketchat.example.com"
token_env = "ROCKETCHAT_TOKEN"
user_id = ""
allowed_channels = []
字段类型默认值说明
server_urlstring""Rocket.Chat 服务器 URL。
token_envstring"ROCKETCHAT_TOKEN"存放 Rocket.Chat 认证令牌的环境变量。
user_idstring""Bot 用户 ID。
allowed_channelslist of strings[]监听的频道 ID 列表。空列表 = 所有频道。
default_agentstring 或 nullnull消息路由的目标 Agent 名称。

[channels.zulip]

[channels.zulip]
server_url = "https://zulip.example.com"
bot_email = "bot@zulip.example.com"
api_key_env = "ZULIP_API_KEY"
streams = []
字段类型默认值说明
server_urlstring""Zulip 服务器 URL。
bot_emailstring""在 Zulip 中注册的 Bot 邮箱地址。
api_key_envstring"ZULIP_API_KEY"存放 Zulip API Key 的环境变量。
streamslist of strings[]监听的 Stream 名称列表。空列表 = 所有 Stream。
default_agentstring 或 nullnull消息路由的目标 Agent 名称。

[channels.xmpp]

[channels.xmpp]
jid = "bot@jabber.org"
password_env = "XMPP_PASSWORD"
server = ""
port = 5222
rooms = []
字段类型默认值说明
jidstring""XMPP JID(例如 "bot@jabber.org")。
password_envstring"XMPP_PASSWORD"存放 XMPP 密码的环境变量。
serverstring""XMPP 服务器主机名。为空时默认使用 JID 的域名。
portu165222XMPP 服务器端口。
roomslist of strings[]要加入的 MUC(多人聊天)房间。
default_agentstring 或 nullnull消息路由的目标 Agent 名称。

[channels.line]

[channels.line]
channel_secret_env = "LINE_CHANNEL_SECRET"
access_token_env = "LINE_CHANNEL_ACCESS_TOKEN"
webhook_port = 8450
字段类型默认值说明
channel_secret_envstring"LINE_CHANNEL_SECRET"存放 LINE Channel Secret 的环境变量。
access_token_envstring"LINE_CHANNEL_ACCESS_TOKEN"存放 LINE Channel Access Token 的环境变量。
webhook_portu168450入站 Webhook 端口。
default_agentstring 或 nullnull消息路由的目标 Agent 名称。

[channels.viber]

[channels.viber]
auth_token_env = "VIBER_AUTH_TOKEN"
webhook_url = ""
webhook_port = 8451
字段类型默认值说明
auth_token_envstring"VIBER_AUTH_TOKEN"存放 Viber Bot 认证令牌的环境变量。
webhook_urlstring""Viber Webhook 端点的公网 URL。
webhook_portu168451入站 Webhook 端口。
default_agentstring 或 nullnull消息路由的目标 Agent 名称。

[channels.messenger]

[channels.messenger]
page_token_env = "MESSENGER_PAGE_TOKEN"
verify_token_env = "MESSENGER_VERIFY_TOKEN"
webhook_port = 8452
字段类型默认值说明
page_token_envstring"MESSENGER_PAGE_TOKEN"存放 Facebook 页面访问令牌的环境变量。
verify_token_envstring"MESSENGER_VERIFY_TOKEN"存放 Webhook 验证令牌的环境变量。
webhook_portu168452入站 Webhook 端口。
default_agentstring 或 nullnull消息路由的目标 Agent 名称。

[channels.reddit]

[channels.reddit]
client_id = ""
client_secret_env = "REDDIT_CLIENT_SECRET"
username = ""
password_env = "REDDIT_PASSWORD"
subreddits = []
字段类型默认值说明
client_idstring""Reddit 应用客户端 ID。
client_secret_envstring"REDDIT_CLIENT_SECRET"存放 Reddit 客户端密钥的环境变量。
usernamestring""Reddit Bot 用户名。
password_envstring"REDDIT_PASSWORD"存放 Reddit Bot 密码的环境变量。
subredditslist of strings[]要监控的子版块名称。
default_agentstring 或 nullnull消息路由的目标 Agent 名称。

[channels.mastodon]

[channels.mastodon]
instance_url = "https://mastodon.social"
access_token_env = "MASTODON_ACCESS_TOKEN"
字段类型默认值说明
instance_urlstring""Mastodon 实例 URL(例如 "https://mastodon.social")。
access_token_envstring"MASTODON_ACCESS_TOKEN"存放 Mastodon 访问令牌的环境变量。
default_agentstring 或 nullnull消息路由的目标 Agent 名称。

[channels.bluesky]

[channels.bluesky]
identifier = "mybot.bsky.social"
app_password_env = "BLUESKY_APP_PASSWORD"
service_url = "https://bsky.social"
字段类型默认值说明
identifierstring""Bluesky 用户名或 DID。
app_password_envstring"BLUESKY_APP_PASSWORD"存放 Bluesky 应用密码的环境变量。
service_urlstring"https://bsky.social"PDS(个人数据服务器)URL。
default_agentstring 或 nullnull消息路由的目标 Agent 名称。

[channels.feishu]

[channels.feishu]
app_id = ""
app_secret_env = "FEISHU_APP_SECRET"
webhook_port = 8453
字段类型默认值说明
app_idstring""飞书/Lark 应用 ID。
app_secret_envstring"FEISHU_APP_SECRET"存放飞书应用密钥的环境变量。
webhook_portu168453入站 Webhook 端口。
default_agentstring 或 nullnull消息路由的目标 Agent 名称。

[channels.revolt]

[channels.revolt]
bot_token_env = "REVOLT_BOT_TOKEN"
api_url = "https://api.revolt.chat"
字段类型默认值说明
bot_token_envstring"REVOLT_BOT_TOKEN"存放 Revolt Bot 令牌的环境变量。
api_urlstring"https://api.revolt.chat"Revolt API 基础 URL。
default_agentstring 或 nullnull消息路由的目标 Agent 名称。

[channels.nextcloud]

[channels.nextcloud]
server_url = "https://nextcloud.example.com"
token_env = "NEXTCLOUD_TOKEN"
allowed_rooms = []
字段类型默认值说明
server_urlstring""Nextcloud 服务器 URL。
token_envstring"NEXTCLOUD_TOKEN"存放 Nextcloud Talk 认证令牌的环境变量。
allowed_roomslist of strings[]监听的房间令牌列表。空列表 = 所有房间。
default_agentstring 或 nullnull消息路由的目标 Agent 名称。

[channels.guilded]

[channels.guilded]
bot_token_env = "GUILDED_BOT_TOKEN"
server_ids = []
字段类型默认值说明
bot_token_envstring"GUILDED_BOT_TOKEN"存放 Guilded Bot 令牌的环境变量。
server_idslist of strings[]监听的服务器 ID 列表。空列表 = 所有服务器。
default_agentstring 或 nullnull消息路由的目标 Agent 名称。

[channels.keybase]

[channels.keybase]
username = ""
paperkey_env = "KEYBASE_PAPERKEY"
allowed_teams = []
字段类型默认值说明
usernamestring""Keybase 用户名。
paperkey_envstring"KEYBASE_PAPERKEY"存放 Keybase 纸钥匙的环境变量。
allowed_teamslist of strings[]监听的团队名称列表。空列表 = 仅私聊。
default_agentstring 或 nullnull消息路由的目标 Agent 名称。

[channels.threema]

[channels.threema]
threema_id = ""
secret_env = "THREEMA_SECRET"
webhook_port = 8454
字段类型默认值说明
threema_idstring""Threema Gateway ID。
secret_envstring"THREEMA_SECRET"存放 Threema API 密钥的环境变量。
webhook_portu168454入站 Webhook 端口。
default_agentstring 或 nullnull消息路由的目标 Agent 名称。

[channels.nostr]

[channels.nostr]
private_key_env = "NOSTR_PRIVATE_KEY"
relays = ["wss://relay.damus.io"]
字段类型默认值说明
private_key_envstring"NOSTR_PRIVATE_KEY"存放 Nostr 私钥(nsec 或十六进制格式)的环境变量。
relayslist of strings["wss://relay.damus.io"]要连接的 Nostr 中继 WebSocket URL 列表。
default_agentstring 或 nullnull消息路由的目标 Agent 名称。

[channels.webex]

[channels.webex]
bot_token_env = "WEBEX_BOT_TOKEN"
allowed_rooms = []
字段类型默认值说明
bot_token_envstring"WEBEX_BOT_TOKEN"存放 Webex Bot 令牌的环境变量。
allowed_roomslist of strings[]监听的房间 ID 列表。空列表 = 所有房间。
default_agentstring 或 nullnull消息路由的目标 Agent 名称。

[channels.pumble]

[channels.pumble]
bot_token_env = "PUMBLE_BOT_TOKEN"
webhook_port = 8455
字段类型默认值说明
bot_token_envstring"PUMBLE_BOT_TOKEN"存放 Pumble Bot 令牌的环境变量。
webhook_portu168455入站 Webhook 端口。
default_agentstring 或 nullnull消息路由的目标 Agent 名称。

[channels.flock]

[channels.flock]
bot_token_env = "FLOCK_BOT_TOKEN"
webhook_port = 8456
字段类型默认值说明
bot_token_envstring"FLOCK_BOT_TOKEN"存放 Flock Bot 令牌的环境变量。
webhook_portu168456入站 Webhook 端口。
default_agentstring 或 nullnull消息路由的目标 Agent 名称。

[channels.twist]

[channels.twist]
token_env = "TWIST_TOKEN"
workspace_id = ""
allowed_channels = []
字段类型默认值说明
token_envstring"TWIST_TOKEN"存放 Twist API 令牌的环境变量。
workspace_idstring""Twist 工作区 ID。
allowed_channelslist of strings[]监听的频道 ID 列表。空列表 = 所有频道。
default_agentstring 或 nullnull消息路由的目标 Agent 名称。

[channels.mumble]

[channels.mumble]
host = "mumble.example.com"
port = 64738
username = "librefang"
password_env = "MUMBLE_PASSWORD"
channel = ""
字段类型默认值说明
hoststring""Mumble 服务器主机名。
portu1664738Mumble 服务器端口。
usernamestring"librefang"Bot 在 Mumble 中的用户名。
password_envstring"MUMBLE_PASSWORD"存放 Mumble 服务器密码的环境变量。
channelstring""要加入的 Mumble 频道。
default_agentstring 或 nullnull消息路由的目标 Agent 名称。

[channels.dingtalk]

支持两种模式:stream(默认,推荐)和 webhook(传统)。

# Stream 模式(推荐 — 无需公网 IP)
[channels.dingtalk]
receive_mode = "stream"
app_key_env = "DINGTALK_APP_KEY"
app_secret_env = "DINGTALK_APP_SECRET"

# Webhook 模式(传统)
[channels.dingtalk]
receive_mode = "webhook"
access_token_env = "DINGTALK_ACCESS_TOKEN"
secret_env = "DINGTALK_SECRET"
webhook_port = 8457
字段类型默认值说明
receive_modestring"stream"连接模式:"stream""webhook"
app_key_envstring"DINGTALK_APP_KEY"存放钉钉 App Key 的环境变量(stream 模式)。
app_secret_envstring"DINGTALK_APP_SECRET"存放钉钉 App Secret 的环境变量(stream 模式)。
access_token_envstring"DINGTALK_ACCESS_TOKEN"存放钉钉 Webhook 访问令牌的环境变量(webhook 模式)。
secret_envstring"DINGTALK_SECRET"存放钉钉签名密钥的环境变量(webhook 模式)。
webhook_portu168457入站 Webhook 端口(仅 webhook 模式)。
robot_codestring 或 nullnullStream 模式回复使用的机器人编码(默认使用 app_key)。
default_agentstring 或 nullnull消息路由的目标 Agent 名称。

[channels.discourse]

[channels.discourse]
base_url = "https://forum.example.com"
api_key_env = "DISCOURSE_API_KEY"
api_username = "system"
categories = []
字段类型默认值说明
base_urlstring""Discourse 论坛基础 URL。
api_key_envstring"DISCOURSE_API_KEY"存放 Discourse API Key 的环境变量。
api_usernamestring"system"Discourse API 用户名。
categorieslist of strings[]要监控的分类标识(slug)。
default_agentstring 或 nullnull消息路由的目标 Agent 名称。

[channels.gitter]

[channels.gitter]
token_env = "GITTER_TOKEN"
room_id = ""
字段类型默认值说明
token_envstring"GITTER_TOKEN"存放 Gitter 认证令牌的环境变量。
room_idstring""监听的 Gitter 房间 ID。
default_agentstring 或 nullnull消息路由的目标 Agent 名称。

[channels.ntfy]

[channels.ntfy]
server_url = "https://ntfy.sh"
topic = "my-agent-topic"
token_env = "NTFY_TOKEN"
字段类型默认值说明
server_urlstring"https://ntfy.sh"ntfy 服务器 URL。支持自托管。
topicstring""要订阅/发布的主题。
token_envstring"NTFY_TOKEN"存放认证令牌的环境变量。公共主题可选。
default_agentstring 或 nullnull消息路由的目标 Agent 名称。

[channels.gotify]

[channels.gotify]
server_url = "https://gotify.example.com"
app_token_env = "GOTIFY_APP_TOKEN"
client_token_env = "GOTIFY_CLIENT_TOKEN"
字段类型默认值说明
server_urlstring""Gotify 服务器 URL。
app_token_envstring"GOTIFY_APP_TOKEN"存放 Gotify 应用令牌(用于发送消息)的环境变量。
client_token_envstring"GOTIFY_CLIENT_TOKEN"存放 Gotify 客户端令牌(通过 WebSocket 接收消息)的环境变量。
default_agentstring 或 nullnull消息路由的目标 Agent 名称。

[channels.webhook]

[channels.webhook]
secret_env = "WEBHOOK_SECRET"
listen_port = 8460
# callback_url = "https://example.com/webhook"
字段类型默认值说明
secret_envstring"WEBHOOK_SECRET"存放用于验证入站 Webhook 的 HMAC 签名密钥的环境变量。
listen_portu168460监听入站 Webhook 请求的端口。
callback_urlstring 或 nullnull发送出站消息的 POST 目标 URL。
default_agentstring 或 nullnull消息路由的目标 Agent 名称。

[channels.linkedin]

[channels.linkedin]
access_token_env = "LINKEDIN_ACCESS_TOKEN"
organization_id = ""
字段类型默认值说明
access_token_envstring"LINKEDIN_ACCESS_TOKEN"存放 LinkedIn OAuth2 访问令牌的环境变量。
organization_idstring""LinkedIn 组织 ID,用于消息收发。
default_agentstring 或 nullnull消息路由的目标 Agent 名称。

[channels.qq]

使用 QQ 机器人开放平台官方 API 的 QQ Bot 通道适配器。

[channels.qq]
app_id = "your-app-id"
app_secret_env = "QQ_BOT_APP_SECRET"
allowed_users = []
# default_agent = "assistant"
# account_id = "my-qq-bot"
字段类型默认值说明
app_idstring""在 QQ 开放平台注册的 QQ Bot 应用 ID。
app_secret_envstring"QQ_BOT_APP_SECRET"存放 QQ Bot 应用密钥的环境变量。实际密钥绝不存储在配置中。
allowed_userslist of strings[]允许交互的 QQ 用户 ID 列表。空列表 = 允许所有。
default_agentstring 或 nullnull消息路由的目标 Agent 名称。
account_idstring 或 nullnull用于多 Bot 路由的唯一 Bot 实例标识符。
overridesobject(默认值)每个通道的行为覆盖配置。详见通道行为覆盖

[channels.wecom]

企业微信(WeCom)智能机器人通道适配器。通过 WebSocket 连接到 wss://openws.work.weixin.qq.com

[channels.wecom]
bot_id = "YOUR_BOT_ID"
secret_env = "WECOM_BOT_SECRET"
# account_id = "my-wecom-bot"
# default_agent = "assistant"
字段类型默认值说明
bot_idstring""企业微信管理后台的智能机器人 Bot ID。
secret_envstring"WECOM_BOT_SECRET"存放机器人密钥的环境变量。
account_idstring 或 nullnull用于多 Bot 路由的唯一 Bot 实例标识符。
default_agentstring 或 nullnull消息路由的目标 Agent 名称。
overridesobject(默认值)每个通道的行为覆盖配置。详见通道行为覆盖

[channels.wechat]

微信个人账号通道适配器,使用腾讯的 iLink Bot API。通过扫码登录连接,无需 API Key 或开发者账号。

[channels.wechat]
# bot_token_env = "WECHAT_BOT_TOKEN"  # 可选:上次会话的持久化令牌
allowed_users = []
# default_agent = "assistant"
# account_id = "my-wechat-bot"
字段类型默认值说明
bot_token_envstring"WECHAT_BOT_TOKEN"存放上次二维码登录会话持久化令牌的环境变量。设置后可在重启时跳过二维码登录。
allowed_userslist of strings[]允许交互的微信用户 ID(格式:hash@im.wechat)。空列表 = 允许所有。
default_agentstring 或 nullnull消息路由的目标 Agent 名称。
account_idstring 或 nullnull用于多 Bot 路由的唯一 Bot 实例标识符。
overridesobject(默认值)每个通道的行为覆盖配置。详见通道行为覆盖

[[mcp_servers]]

MCP(模型上下文协议)服务器连接提供外部工具集成。每个条目是 [[mcp_servers]] 数组中的一个独立元素。

[[mcp_servers]]
name = "filesystem"
timeout_secs = 30
env = []

[mcp_servers.transport]
type = "stdio"
command = "npx"
args = ["-y", "@modelcontextprotocol/server-filesystem", "/home/user/docs"]
[[mcp_servers]]
name = "remote-api"
timeout_secs = 60
env = ["GITHUB_PERSONAL_ACCESS_TOKEN"]

[mcp_servers.transport]
type = "sse"
url = "https://mcp.example.com/sse"
[[mcp_servers]]
name = "my-http-backend"
timeout_secs = 30

[mcp_servers.transport]
type = "http_compat"
base_url = "https://tools.example.com"
headers = [{name = "Authorization", value_env = "MY_API_KEY"}]

[[mcp_servers.transport.tools]]
name = "search"
description = "Search documents"
path = "/search"
method = "post"
字段类型默认值说明
namestring必填MCP 服务器的显示名称。工具以 mcp_{name}_{tool} 的命名空间注册。
timeout_secsu6430请求超时时间(秒)。
envlist of strings[]传递给子进程的环境变量名称(仅 stdio 传输方式)。

传输方式变体(基于 type 的标记联合体):

type字段说明
stdiocommand(string)、args(list of strings,默认 []启动子进程,通过 stdin/stdout 上的 JSON-RPC 通信。
sseurl(string)连接到 HTTP Server-Sent Events 端点。
http_compatbase_url(string)、headers(header 配置列表)、tools(工具配置列表)内置兼容适配器,用于没有原生 MCP 服务器的纯 HTTP/JSON 工具后端。每个工具映射到一个 HTTP 端点。

http_compat header 配置:

字段类型说明
namestringHTTP 请求头名称(例如 "Authorization")。
valuestring 或 null静态请求头值。
value_envstring 或 null用作请求头值的环境变量名称(密钥推荐使用此方式)。

http_compat 工具配置:

字段类型默认值说明
namestring必填暴露给 LLM 的工具名称。
descriptionstring""展示给 LLM 的工具描述。
pathstring必填HTTP 路径(例如 "/search")。
methodstring"post"HTTP 方法:getpostputpatchdelete
request_modestring"json_body"参数发送方式:json_bodyquerynone
response_modestring"json"响应解析方式:jsontext
input_schemaobject{"type":"object"}工具输入参数的 JSON Schema。

[a2a]

Agent 间协议(A2A)配置,实现跨 LibreFang 实例的 Agent 间通信。

[a2a]
enabled = true
name = "LibreFang Agent OS"
description = "My production agent OS"
listen_path = "/a2a"

[[a2a.external_agents]]
name = "research-agent"
url = "https://agent.example.com/.well-known/agent.json"

[[a2a.external_agents]]
name = "code-reviewer"
url = "https://reviewer.example.com/.well-known/agent.json"
字段类型默认值说明
enabledboolfalse是否启用 A2A 协议。
namestring"LibreFang Agent OS"在 well-known Agent 名片中展示的服务级显示名称。
descriptionstring""在 well-known Agent 名片中展示的服务级描述。
listen_pathstring"/a2a"A2A 端点的 URL 路径前缀。
external_agentslist of objects[]要发现和交互的外部 A2A Agent 列表。

external_agents 条目:

字段类型说明
namestring外部 Agent 的显示名称。
urlstringAgent 名片端点 URL(通常为 /.well-known/agent.json)。

[[fallback_providers]]

后备提供商链。当主 LLM 提供商([default_model])失败时,按顺序尝试这些后备提供商。

[[fallback_providers]]
provider = "ollama"
model = "llama3.2:latest"
api_key_env = ""
# base_url = "http://localhost:11434"

[[fallback_providers]]
provider = "groq"
model = "llama-3.3-70b-versatile"
api_key_env = "GROQ_API_KEY"
字段类型默认值说明
providerstring""提供商名称(例如 "ollama""groq""openai")。
modelstring""该提供商的模型标识符。
api_key_envstring""API Key 的环境变量名称。本地提供商(ollama、vllm、lmstudio)留空。
base_urlstring 或 nullnull基础 URL 覆盖。为 null 时使用模型目录默认值。

[[users]]

RBAC 多用户配置。用户可以被分配角色,并绑定到各通道平台的身份标识。

[[users]]
name = "Alice"
role = "owner"
api_key_hash = "sha256_hash_of_api_key"

[users.channel_bindings]
telegram = "123456"
discord = "987654321"
slack = "U0ABCDEFG"
字段类型默认值说明
namestring必填用户显示名称。
rolestring"user"用户在 RBAC 层级中的角色。
channel_bindingsmap of string to string{}将通道平台名称映射到平台特定用户 ID,实现跨通道的用户身份绑定。
api_key_hashstring 或 nullnull用户个人 API Key 的 SHA256 哈希值,用于认证 API 访问。

角色层级(从最高到最低权限):

角色说明
owner完全管理权限。可以管理所有 Agent、用户和配置。
admin可以管理 Agent 和大多数设置。无法修改 owner 账户。
user可以与 Agent 交互。管理能力有限。
viewer只读访问。可以查看 Agent 回复,但无法发送消息。

通道行为覆盖

每个通道适配器都支持 [channels.<name>.overrides] 子表,用于按通道自定义 Agent 行为。

[channels.telegram.overrides]
model = "claude-haiku-4-5-20251001"
system_prompt = "You are a concise Telegram assistant."
dm_policy = "respond"
group_policy = "mention_only"
rate_limit_per_minute = 0
rate_limit_per_user = 10
threading = true
output_format = "telegram_html"
usage_footer = "tokens"
typing_mode = "instant"
disable_commands = false
allowed_commands = []
blocked_commands = []
字段类型默认值说明
modelstring 或 nullnull该通道的模型覆盖。为 null 时使用 Agent 的默认模型。
system_promptstring 或 nullnull该通道的系统提示词覆盖。
dm_policystring"respond"Bot 处理私聊消息的方式。见下表。
group_policystring"mention_only"Bot 处理群组消息的方式。见下表。
rate_limit_per_minuteu320该通道的全局速率限制(每分钟消息数)。0 = 无限制。
rate_limit_per_useru320每个用户每分钟的最大消息数。0 = 无限制。
threadingboolfalse启用线程回复(在支持的平台上)。
output_formatstring 或 nullnull覆盖输出格式。见下表。
usage_footerstring 或 nullnull覆盖该通道的用量页脚模式。可选值:offtokenscostfull
typing_modestring 或 nullnull输入状态指示器行为。见下表。默认为 instant
disable_commandsboolfalse关闭该通道所有内置斜杠命令。被拦截的命令作为普通文本转发给 Agent。
allowed_commandslist of strings[]命令名白名单(不带 /)。非空时仅这些命令可用,其他命令转发给 Agent。
blocked_commandslist of strings[]命令名黑名单(不带 /)。仅在 allowed_commands 为空时生效。

dm_policy 值说明:

说明
respond回复所有私聊消息(默认)。
allowed_only仅回复允许列表中用户的私聊消息。
ignore忽略所有私聊消息。

group_policy 值说明:

说明
all回复群聊中的所有消息。
mention_only仅在被 @ 提及时回复(默认)。
commands_only仅回复斜杠命令。
ignore忽略所有群组消息。

output_format 值说明:

说明
markdown标准 Markdown(默认)。
telegram_htmlTelegram HTML 子集(<b><i><code> 等)。
slack_mrkdwnSlack mrkdwn 格式(*bold*_italic_`code`)。
plain_text无格式标记。

typing_mode 值说明:

说明
instant收到消息后立即发送输入状态指示(默认)。
message仅在 LLM 返回第一个文本增量时发送输入状态指示。
thinking仅在 LLM 推理/思考阶段发送输入状态指示。
never从不发送输入状态指示。

[browser]

配置 Agent 工具 browser_* 使用的无头浏览器自动化引擎。

[browser]
headless = true
viewport_width = 1280
viewport_height = 720
timeout_secs = 30
idle_timeout_secs = 300
max_sessions = 5
# chromium_path = "/usr/bin/chromium"
字段类型默认值说明
headlessbooltrue以无头模式运行浏览器(不显示窗口)。
viewport_widthu321280浏览器视口宽度(像素)。
viewport_heightu32720浏览器视口高度(像素)。
timeout_secsu6430每个操作的超时时间(秒)。
idle_timeout_secsu64300浏览器会话闲置超过此秒数后自动关闭。
max_sessionsusize5最大并发浏览器会话数。
chromium_pathstring 或 nullnullChromium/Chrome 二进制文件路径。为 null 时自动检测。

[reload]

控制配置文件的自动监控和热重载。

[reload]
mode = "hybrid"
debounce_ms = 500
字段类型默认值说明
modestring"hybrid"重载模式。见下表。
debounce_msu64500检测到文件变更后,重载前的防抖窗口时长(毫秒)。

mode 值说明:

说明
off不自动重载。更改需手动重启。
restart任何配置变更都进行完整守护进程重启。
hot仅对安全的部分进行热重载(通道、技能、心跳)。
hybrid尽可能热重载;对需要重启的部分标记提示(默认)。

[exec_policy]

控制 Agent 通过 execshell 工具允许执行的 Shell 命令。

[exec_policy]
mode = "allowlist"
allowed_commands = ["git", "python3", "node"]
timeout_secs = 30
max_output_bytes = 102400
no_output_timeout_secs = 30
字段类型默认值说明
modestring"allowlist"安全模式。见下表。
safe_binslist of strings["sleep","true","false","cat","sort","uniq","cut","tr","head","tail","wc","date","echo","printf","basename","dirname","pwd","env"]始终绕过白名单检查的命令(仅标准输入的 POSIX 工具)。
allowed_commandslist of strings[]mode = "allowlist" 时额外允许的命令。
timeout_secsu6430每条命令的最大挂钟执行时间(秒)。
max_output_bytesusize102400stdout+stderr 合并输出的最大大小(字节)。默认 100 KB。
no_output_timeout_secsu6430进程在此秒数内无输出则被终止。0 = 禁用。

mode 值说明:

别名说明
denynonedisabled阻止所有 Shell 执行。
allowlistrestricted仅允许 safe_binsallowed_commands 中的命令(默认)。
fullallowallunrestricted允许所有命令。不安全——仅限开发使用。

[approval]

配置哪些工具在执行前需要明确的人工批准。引用 ApprovalPolicy 类型。

[approval]
require_approval = ["shell_exec"]
timeout_secs = 60
auto_approve_autonomous = false
auto_approve = false
字段类型默认值说明
require_approvallist of strings["shell_exec"]需要暂停执行并等待人工批准的工具名称列表。
timeout_secsu6460审批请求的超时时间(秒)。
auto_approve_autonomousboolfalseAgent 处于自主模式时自动批准工具执行。
auto_approveboolfalse自动批准所有工具执行(不安全,仅限开发使用)。

[budget]

设置 LLM API 费用的全局支出限制。所有限制默认为 0.0(无限制)。

[budget]
max_hourly_usd = 1.00
max_daily_usd = 10.00
max_monthly_usd = 50.00
alert_threshold = 0.8
default_max_llm_tokens_per_hour = 0
字段类型默认值说明
max_hourly_usdf640.0所有 Agent 每小时的最大 LLM 费用(美元)。0.0 = 无限制。
max_daily_usdf640.0所有 Agent 每天的最大 LLM 费用(美元)。0.0 = 无限制。
max_monthly_usdf640.0所有 Agent 每月的最大 LLM 费用(美元)。0.0 = 无限制。
alert_thresholdf640.8各限额的告警阈值(0.0-1.0 的比例)。设为 0.8 时,达到限额 80% 即记录告警日志。
default_max_llm_tokens_per_houru640全局覆盖每个 Agent 的每小时 Token 预算。大于 0 时覆盖所有 Agent 自身的 Token 限制。0 = 保持各 Agent 自身的限制。

[thinking]

配置支持扩展思维(思维链推理)的模型(例如启用了 thinking 模式的 Claude 3.7 Sonnet)。

[thinking]
budget_tokens = 10000
stream_thinking = false
字段类型默认值说明
budget_tokensu3210000分配给思维/推理阶段的最大 Token 数。
stream_thinkingboolfalse是否将思维 Token 流式传输给客户端(在 API 响应流中可见)。

[tts]

配置语音合成(Text-to-Speech)功能。

[tts]
enabled = false
provider = "openai"          # openai | elevenlabs
max_text_length = 4096
timeout_secs = 30

[tts.openai]
voice = "alloy"
model = "tts-1"
format = "mp3"
speed = 1.0

[tts.elevenlabs]
voice_id = "21m00Tcm4TlvDq8ikWAM"
model_id = "eleven_monolingual_v1"
stability = 0.5
similarity_boost = 0.75

[tts] 字段:

字段类型默认值说明
enabledboolfalse启用 TTS 合成。
providerstring 或 nullnull默认 TTS 提供商:"openai""elevenlabs"
max_text_lengthusize4096单次 TTS 请求的最大文本长度(字符数)。
timeout_secsu6430每次 TTS 调用的请求超时时间(秒)。

[tts.openai] 字段:

字段类型默认值说明
voicestring"alloy"语音名称。可选:alloyechofableonyxnovashimmer
modelstring"tts-1"TTS 模型:"tts-1"(快速)或 "tts-1-hd"(高质量)。
formatstring"mp3"输出格式:mp3opusaacflac
speedf321.0语速倍率(0.25 到 4.0)。

[tts.elevenlabs] 字段:

字段类型默认值说明
voice_idstring"21m00Tcm4TlvDq8ikWAM"ElevenLabs 语音 ID(默认:Rachel)。
model_idstring"eleven_monolingual_v1"ElevenLabs 模型 ID。
stabilityf320.5语音稳定性(0.0-1.0)。越高越稳定,但表现力越低。
similarity_boostf320.75语音相似度增强(0.0-1.0)。

[docker]

配置用于隔离代码执行的 Docker 容器沙箱。

[docker]
enabled = false
image = "python:3.12-slim"
container_prefix = "librefang-sandbox"
workdir = "/workspace"
network = "none"
memory_limit = "512m"
cpu_limit = 1.0
timeout_secs = 60
read_only_root = true
mode = "off"
scope = "session"
reuse_cool_secs = 300
idle_timeout_secs = 86400
max_age_secs = 604800
blocked_mounts = []
字段类型默认值说明
enabledboolfalse启用 Docker 沙箱用于代码执行。
imagestring"python:3.12-slim"沙箱容器使用的 Docker 镜像。
container_prefixstring"librefang-sandbox"容器名称前缀。
workdirstring"/workspace"容器内的工作目录。
networkstring"none"网络模式:"none"(隔离)、"bridge" 或自定义网络名称。
memory_limitstring"512m"内存限制(例如 "256m""1g")。
cpu_limitf641.0CPU 限制(例如 0.51.02.0)。
timeout_secsu6460每条命令的最大执行时间(秒)。
read_only_rootbooltrue将根文件系统挂载为只读。
modestring"off"激活模式。见下表。
scopestring"session"容器生命周期范围。见下表。
reuse_cool_secsu64300释放的容器在此秒数冷却后才可重用。
idle_timeout_secsu6486400容器闲置超过此秒数后被销毁(默认 24 小时)。
max_age_secsu64604800容器最大存活时间,超时后强制销毁(默认 7 天)。
blocked_mountslist of strings[]禁止绑定挂载到容器的宿主机路径。
cap_addlist of strings[]添加到容器的 Linux 能力(例如 ["NET_ADMIN"])。请谨慎使用。
tmpfslist of strings["/tmp:size=64m"]容器内的 tmpfs 挂载。每个条目格式为 "path:options"(例如 "/tmp:size=128m")。
pids_limitu32100容器内的最大进程数。防止 Fork 炸弹。

mode 值说明:

说明
off禁用 Docker 沙箱(默认)。
non_main仅对非主(子)Agent 使用 Docker。
all对所有 Agent 使用 Docker。

scope 值说明:

说明
session每个会话一个容器,会话结束时销毁(默认)。
agent每个 Agent 一个容器,跨会话重用。
shared所有 Agent 共享容器池。

[canvas]

配置 Canvas(Agent 到 UI)工具,允许 Agent 在仪表盘中渲染 HTML。

[canvas]
enabled = false
max_html_bytes = 524288
allowed_tags = []
字段类型默认值说明
enabledboolfalse启用 Canvas 工具。
max_html_bytesusize524288HTML 负载的最大大小(字节)。默认 512 KB。
allowed_tagslist of strings[]用于净化的允许 HTML 标签名称。空列表 = 允许所有安全标签。

[auto_reply]

配置后台自动回复引擎,可以在无需人工交互的情况下自动回复传入消息。

[auto_reply]
enabled = false
max_concurrent = 3
timeout_secs = 120
suppress_patterns = ["/stop", "/pause"]
字段类型默认值说明
enabledboolfalse启用自动回复引擎。
max_concurrentusize3最大并发自动回复任务数。
timeout_secsu64120每个自动回复任务的默认超时时间(秒)。
suppress_patternslist of strings["/stop", "/pause"]抑制自动回复的传入消息匹配模式。

[broadcast]

配置消息广播,将单条传入消息同时路由到多个 Agent。

[broadcast]
strategy = "parallel"
routes = { "announcement-channel" = ["agent-a", "agent-b", "agent-c"] }
字段类型默认值说明
strategystring"parallel"投递策略。"parallel" = 同时发送给所有 Agent;"sequential" = 按顺序逐个发送。
routesmap of string to list of strings{}将对等方/通道标识符映射到接收消息的 Agent 名称列表。

[inbox]

基于文件的异步外部命令输入收件箱。将文本文件放入监控目录后,文件内容会作为消息分发给 Agent。已处理的文件会被移动到 processed/ 子目录以避免重复投递。

[inbox]
enabled = true
directory = "~/.librefang/inbox/"
poll_interval_secs = 5
default_agent = "assistant"
字段类型默认值说明
enabledboolfalse启用收件箱目录监控。
directorystring 或 nullnull监控的目录。默认为 $HOME_DIR/inbox/。支持 ~ 展开。
poll_interval_secsu645扫描目录新文件的间隔(秒)。最小值 1。
default_agentstring 或 nullnull文件中未找到 agent: 指令时路由到的 Agent 名称。

文件格式: 纯文本文件(.txt.md.json.py 等)。第一行可以包含 agent:<name> 指令以指定目标 Agent;其余部分作为消息正文发送。没有指令的文件使用 default_agent

安全限制: 大于 1 MB 的文件会被跳过。二进制文件(非文本扩展名)会被跳过。空文件会被移动到 processed/ 但不发送。

使用示例:

指定目标 Agent:

cat > ~/.librefang/inbox/task.txt << 'EOF'
agent:code-reviewer
Please review this code for security issues:

def login(user, password):
    query = f"SELECT * FROM users WHERE name='{user}' AND pass='{password}'"
    return db.execute(query)
EOF

发送到默认 Agent:

echo "Summarize today's system logs" > ~/.librefang/inbox/summarize.txt

定时任务:

# crontab -e
0 9 * * * grep ERROR /var/log/app.log > ~/.librefang/inbox/daily_errors.txt

CI/CD 构建后处理:

echo "agent:devops
Build failed, please analyze:
$(tail -100 build.log)" > ~/.librefang/inbox/build_$(date +%s).txt

批量处理:

for doc in ~/reports/*.md; do
  cp "$doc" ~/.librefang/inbox/
done

检查收件箱状态:

curl -s http://127.0.0.1:4545/api/inbox/status
# {"enabled":true,"pending_count":3,"processed_count":12,...}

[[bindings]]

Agent 绑定将特定的通道/账号/对等方组合路由到特定的 Agent。更具体的绑定(非空字段越多)优先级越高。

[[bindings]]
agent = "support-agent"
[bindings.match_rule]
channel = "telegram"
guild_id = "123456"

[[bindings]]
agent = "vip-agent"
[bindings.match_rule]
channel = "discord"
peer_id = "987654321"
roles = ["premium"]

顶层字段:

字段类型说明
agentstring匹配的消息路由到的目标 Agent 名称或 ID。
match_ruleobject匹配条件。所有指定的(非空)字段必须全部匹配。

match_rule 字段:

字段类型默认值说明
channelstring 或 nullnull要匹配的通道类型(例如 "discord""telegram""slack")。
account_idstring 或 nullnull通道内特定的 Bot 账号 ID(用于多 Bot 场景)。
peer_idstring 或 nullnull用于私聊路由的用户/对等方 ID。
guild_idstring 或 nullnull服务器/Guild ID(Discord/Slack)。
roleslist of strings[]基于角色的路由;用户必须拥有其中至少一个角色。

具体度评分(分值越高越先匹配):peer_id(+8)> guild_id(+4)> roles(+2)= account_id(+2)> channel(+1)。


[pairing]

配置 LibreFang 移动端伴侣应用的设备配对和推送通知。

[pairing]
enabled = false
max_devices = 10
token_expiry_secs = 300
push_provider = "ntfy"
ntfy_url = "https://ntfy.sh"
ntfy_topic = "my-librefang-notifications"
字段类型默认值说明
enabledboolfalse启用设备配对。
max_devicesusize10最大配对设备数。
token_expiry_secsu64300配对令牌有效期(秒)。默认 5 分钟。
push_providerstring"none"推送通知提供商:"none""ntfy""gotify"
ntfy_urlstring 或 nullnullntfy 服务器 URL(当 push_provider = "ntfy" 时使用)。
ntfy_topicstring 或 nullnull推送通知的 ntfy 主题。

[extensions]

配置 MCP 服务器的重连行为和健康监控。

[extensions]
auto_reconnect = true
reconnect_max_attempts = 10
reconnect_max_backoff_secs = 300
health_check_interval_secs = 60
字段类型默认值说明
auto_reconnectbooltrueMCP 服务器断开连接时自动重连。
reconnect_max_attemptsu3210放弃前的最大重连尝试次数。
reconnect_max_backoff_secsu64300重连尝试之间的最大退避时间(秒)。
health_check_interval_secsu6460已连接扩展的健康检查间隔(秒)。

[vault]

配置用于存储敏感密钥的加密凭据库。

[vault]
enabled = true
# path = "~/.librefang/vault.enc"
字段类型默认值说明
enabledbooltrue启用凭据库。如果 vault.enc 已存在则自动检测。
pathpath 或 nullnull自定义凭据库文件路径。默认为 ~/.librefang/vault.enc

[webhook_triggers]

允许外部系统通过经过认证的 HTTP Webhook 在 /hooks/wake/hooks/agent 端点触发 Agent 操作。

[webhook_triggers]
enabled = true
token_env = "LIBREFANG_WEBHOOK_TOKEN"
max_payload_bytes = 65536
rate_limit_per_minute = 30
字段类型默认值说明
enabledboolfalse启用 Webhook 触发器端点。
token_envstring"LIBREFANG_WEBHOOK_TOKEN"存放 Bearer 令牌的环境变量名称(不是令牌本身)。令牌长度必须大于等于 32 个字符。enabled = true 时必填。
max_payload_bytesusize65536入站负载的最大大小(字节)。默认 64 KB。
rate_limit_per_minuteu3230每个来源 IP 每分钟的最大 Webhook 请求数。

[proxy]

配置所有出站连接(LLM API、网页搜索、MCP 服务器等)使用的 HTTP 代理。环境变量 HTTP_PROXYHTTPS_PROXYNO_PROXY 也作为后备选项被识别。

[proxy]
http_proxy = "http://proxy.corp.example:8080"
https_proxy = "http://proxy.corp.example:8080"
no_proxy = "localhost,127.0.0.1,.internal.corp"
字段类型默认值说明
http_proxystring 或 nullnullHTTP 代理 URL。回退到 HTTP_PROXY / http_proxy 环境变量。URL 中的凭据在日志中会被脱敏。
https_proxystring 或 nullnullHTTPS 代理 URL。回退到 HTTPS_PROXY / https_proxy 环境变量。
no_proxystring 或 nullnull绕过代理的主机/域名逗号分隔列表。回退到 NO_PROXY / no_proxy 环境变量。

[[sidecar_channels]]

Sidecar 通道适配器允许外部进程(使用任何编程语言编写)充当通道适配器。通过 stdin/stdout 上的换行分隔 JSON 进行通信。

[[sidecar_channels]]
name = "my-custom-channel"
command = "python3"
args = ["adapters/my_adapter.py"]
channel_type = "custom_platform"
[sidecar_channels.env]
MY_API_TOKEN = "secret"
字段类型默认值说明
namestring必填此适配器的显示名称。
commandstring必填要运行的可执行文件(例如 "python3""/usr/local/bin/my-adapter")。
argslist of strings[]传递给命令的参数。
envmap of string to string{}传递给子进程的额外环境变量。
channel_typestring 或 nullnull通道类型标识符。为 null 时默认为 Custom(<name>)

[session]

配置空闲或多余会话的自动清理。

[session]
retention_days = 30
max_sessions_per_agent = 100
cleanup_interval_hours = 24
字段类型默认值说明
retention_daysu320空闲会话在自动清理前的最大保留天数。0 = 无限制。
max_sessions_per_agentu320每个 Agent 的最大会话数(最旧的优先清理)。0 = 无限制。
cleanup_interval_hoursu3224后台清理任务的运行间隔(小时)。

[terminal]

配置交互式终端 WebSocket 端点的访问控制。

[terminal]
enabled = true
allow_remote = false
allowed_origins = ["https://dashboard.example.com"]
tmux_enabled = true
max_windows = 16
# tmux_binary_path = "/usr/local/bin/tmux"
字段类型默认值说明
enabledbooltrue终端功能总开关。设为 false 时,终端 WebSocket 端点会被完全禁用。
allow_remoteboolfalse允许来自远程或反向代理的连接。当未配置认证时,还必须同时将 allow_unauthenticated_remote 设为 true,否则连接会被拒绝。默认行为是仅允许本地无认证访问。
allow_unauthenticated_remoteboolfalse强制防呆开关。当 allow_remote = true 且未配置任何认证时,必须显式将本项设为 true 才能对外暴露未认证的 shell;否则即使 allow_remote = true,此类连接也会被拒绝。
allowed_originslist of strings[]除 localhost 之外,允许用于终端 WebSocket 连接的额外浏览器 Origin 列表。适用于 dashboard 部署在自定义域名下的情况。["*"] 表示允许任意 HTTP/HTTPS origin,应仅在明确知情的情况下使用。
require_proxy_headersboolfalse当为 true 时,没有代理头(X-Forwarded-For、X-Real-IP)的环回连接将被拒绝。仅在使用注入这些头的反向代理时启用。(旧名:trust_proxy_headers,仍作为别名兼容。)
tmux_enabledbooltrue启用基于 tmux 的多窗口终端。仅当系统上存在 tmux 二进制文件时生效。
max_windowsu3216最大同时存在的 tmux 窗口数量。用于防止资源耗尽。
tmux_binary_pathstring 或 nullnulltmux 二进制文件的显式路径。如果为 null,则通过 PATH 解析。

说明:

  • 对于非浏览器客户端,缺少 Origin 头是允许的。
  • allow_remote = true 不会关闭认证;如果已配置 API Key 或 dashboard 凭据,远程客户端仍然需要提供有效认证。
  • 对浏览器访问,优先使用明确的 HTTPS origin,而不是 "*"
  • [rate_limit] 中的 ws_terminal_messages_per_minute(默认值:3600)控制交互式终端会话的每连接 WebSocket 消息吞吐量。

[queue]

配置 Agent 命令队列,包括深度限制、TTL 和分通道并发度。

[queue]
max_depth_per_agent = 100
max_depth_global = 1000
task_ttl_secs = 3600

[queue.concurrency]
main_lane = 3
cron_lane = 2
subagent_lane = 3

[queue] 字段:

字段类型默认值说明
max_depth_per_agentu320每个 Agent 的最大排队任务数。队列满时新任务被拒绝。0 = 无限制。
max_depth_globalu320所有 Agent 的最大排队任务总数。0 = 无限制。
task_ttl_secsu643600未处理的任务在此秒数后过期。0 = 无限制。

[queue.concurrency] 字段:

字段类型默认值说明
main_laneusize3并发用户消息任务数。
cron_laneusize2并发定时任务数。
subagent_laneusize3并发子 Agent 调用任务数。

[external_auth]

配置 OAuth2/OIDC 外部认证,允许用户通过 Google、GitHub、Okta、Auth0 或 Keycloak 等身份提供商登录。

[external_auth]
enabled = true
issuer_url = "https://accounts.google.com"
client_id = "your-client-id.apps.googleusercontent.com"
client_secret_env = "LIBREFANG_OAUTH_CLIENT_SECRET"
redirect_url = "http://127.0.0.1:4545/api/auth/callback"
scopes = ["openid", "profile", "email"]
allowed_domains = ["example.com"]
session_ttl_secs = 86400
字段类型默认值说明
enabledboolfalse启用外部认证。
issuer_urlstring""OIDC 发行者 URL,用于在 {issuer_url}/.well-known/openid-configuration 进行提供商发现。
client_idstring""在身份提供商注册的 OAuth2 客户端 ID。
client_secret_envstring"LIBREFANG_OAUTH_CLIENT_SECRET"存放 OAuth2 客户端密钥的环境变量名称。
redirect_urlstring"http://127.0.0.1:4545/api/auth/callback"OAuth2 授权码流程的回调 URL。
scopeslist of strings["openid","profile","email"]请求的 OAuth2 权限范围。
allowed_domainslist of strings[]限制登录到这些邮箱域名。空列表 = 允许所有。
audiencestring""要验证的 JWT audience 声明。为空时默认使用 client_id
session_ttl_secsu6486400会话令牌有效期(秒)。默认 24 小时。
providerslist of objects[]多个 OIDC/OAuth2 提供商。配置后优先于上述单提供商字段。

对于多提供商配置,使用 [[external_auth.providers]],支持以下字段:iddisplay_nameissuer_urlauth_urltoken_urluserinfo_urljwks_uriclient_idclient_secret_envredirect_urlscopesallowed_domainsaudience


[vertex_ai]

配置 Google Cloud Vertex AI 作为 LLM 提供商。

[vertex_ai]
project_id = "my-gcp-project"
region = "us-central1"
credentials_path = "/path/to/service-account.json"

凭据按以下顺序解析:

  1. 配置中的 credentials_path(JSON 字符串或文件路径)
  2. VERTEX_AI_SERVICE_ACCOUNT_JSON 环境变量
  3. GOOGLE_APPLICATION_CREDENTIALS 环境变量(文件路径)
  4. gcloud auth print-access-token CLI 后备
字段类型默认值说明
project_idstring 或 nullnullGCP 项目 ID。回退到 VERTEX_AI_PROJECT_IDGOOGLE_CLOUD_PROJECT,或服务账号 JSON 中的 project_id 字段。
regionstring 或 nullnullVertex AI 端点的 GCP 区域。回退到 VERTEX_AI_REGIONGOOGLE_CLOUD_REGION 环境变量。默认:"us-central1"
credentials_pathstring 或 nullnullGCP 服务账号 JSON 密钥文件的路径,或原始 JSON 字符串。

[oauth]

配置仪表盘使用的 PKCE(Proof Key for Code Exchange)流程的 OAuth 客户端 ID。

[oauth]
google_client_id = "your-google-client-id.apps.googleusercontent.com"
github_client_id = "your-github-app-client-id"
microsoft_client_id = "your-azure-app-client-id"
slack_client_id = "your-slack-app-client-id"
字段类型默认值说明
google_client_idstring 或 nullnull用于 PKCE 流程的 Google OAuth2 客户端 ID。
github_client_idstring 或 nullnull用于 PKCE 流程的 GitHub OAuth 应用客户端 ID。
microsoft_client_idstring 或 nullnullMicrosoft(Entra ID / Azure AD)OAuth 应用客户端 ID。
slack_client_idstring 或 nullnullSlack OAuth 应用客户端 ID。

[auth_profiles]

为每个提供商配置多个 API Key 配置文件,以实现当某个 Key 被限速或用尽时的轮换。

[auth_profiles]
anthropic = [
  {name = "primary", api_key_env = "ANTHROPIC_API_KEY_1", priority = 0},
  {name = "secondary", api_key_env = "ANTHROPIC_API_KEY_2", priority = 1},
]
openai = [
  {name = "main", api_key_env = "OPENAI_API_KEY", priority = 0},
]

值是从提供商名称到 AuthProfile 对象列表的映射:

字段类型默认值说明
namestring必填配置文件名称(例如 "primary""secondary")。
api_key_envstring必填存放该配置文件 API Key 的环境变量名称。
priorityu320Key 选择优先级。值越小越优先。

[tool_policy]

配置全局工具访问规则、分组和递归深度限制。引用 ToolPolicy 类型。

[tool_policy]
subagent_max_depth = 10
subagent_max_concurrent = 5

[[tool_policy.global_rules]]
pattern = "shell_*"
effect = "deny"

[[tool_policy.groups]]
name = "web_tools"
tools = ["web_search", "web_fetch"]
字段类型默认值说明
agent_ruleslist of ToolPolicyRule[]每个 Agent 的工具规则(最高优先级,最先检查)。
global_ruleslist of ToolPolicyRule[]应用于所有 Agent 的全局工具规则(在 agent 规则之后检查)。
groupslist of ToolGroup[]命名工具组,便于在规则中重用。
subagent_max_depthu3210子 Agent 最大生成深度。
subagent_max_concurrentu325最大并发子 Agent 数。

ToolPolicyRule 字段:

字段类型说明
patternstring匹配工具名称的 Glob 模式(例如 "shell_*""web_*""mcp_github_*")。
effectstring"allow""deny"。拒绝优先:只要有任何 deny 规则匹配,该工具就会被阻止,无论是否有 allow 规则。

ToolGroup 字段:

字段类型说明
namestring组名(例如 "web_tools""code_tools")。
toolslist of strings包含在该组中的工具名称模式。

[tool_timeouts]

配置每个工具的执行超时时间。全局默认超时适用于所有工具,除非被精确名称或 glob 模式覆盖。

# 所有工具的全局默认超时(秒)
tool_timeout_secs = 300

# 每个工具的超时覆盖(精确匹配或 glob 模式)
[tool_timeouts]
agent_send = 600
agent_spawn = 600
"mcp_browser_*" = 900
shell_exec = 300
字段类型默认值说明
tool_timeout_secsu64300所有工具执行的全局超时(秒)。对于浏览器自动化或长时间运行的构建,请增加此值。
tool_timeoutsmap of string->u64{}每个工具的超时覆盖。键是精确的工具名称或 glob 模式(例如 "mcp_browser_*")。精确匹配优先于 glob 模式;在多个 glob 模式中,最长的匹配模式获胜(最具体的优先)。当没有匹配项时,回退到 tool_timeout_secs

解析顺序:

  1. tool_timeouts 中的精确工具名称匹配
  2. tool_timeouts 中最长的匹配 glob 模式
  3. 全局 tool_timeout_secs

[proactive_memory]

配置主动记忆提取(mem0 风格的自动记忆管理)。引用 ProactiveMemoryConfig 类型。

[proactive_memory]
enabled = true
auto_memorize = true
auto_retrieve = true
max_retrieve = 10
extraction_threshold = 0.7
# extraction_model = "gpt-4o-mini"             # 使用默认提供商
# extraction_model = "anthropic/claude-haiku-4" # 指定特定提供商
# extraction_model = "anthropic:claude-haiku-4" # 冒号格式也可用
extract_categories = ["user_preference", "important_fact", "task_context", "relationship"]
session_ttl_hours = 24
duplicate_threshold = 0.5
confidence_decay_rate = 0.01
max_memories_per_agent = 1000
字段类型默认值说明
enabledbooltrue主开关——为 false 时整个主动记忆子系统被禁用。
auto_memorizebooltrue每次 Agent 执行后自动提取并存储记忆。
auto_retrievebooltrue每次 Agent 执行前自动检索相关记忆。
max_retrieveusize10每次查询检索的最大记忆数。
extraction_thresholdf320.7近似重复检测的置信度阈值(0.0-1.0)。
extraction_modelstring 或 nullnull用于提取的 LLM 模型。支持 提供商/模型 格式(如 "anthropic/claude-haiku-4")、提供商:模型 格式,或裸模型名(使用默认提供商)。为 null 时使用基于规则的提取。没有单独的 extraction_provider 字段。
extract_categorieslist of strings["user_preference", "important_fact", "task_context", "relationship"]从对话中提取的类别。
session_ttl_hoursu3224会话记忆的 TTL(小时)。超过此时间的记忆在每次 Agent 执行前被清理。
duplicate_thresholdf320.5重复检测的相似度阈值(0.0-1.0)。有嵌入向量时使用余弦相似度,否则回退到 Jaccard 词重叠。
confidence_decay_ratef640.01每天的置信度衰减率。遵循指数衰减:conf x e^(-rate x days)。默认 0.01 约 70 天减半。
max_memories_per_agentusize1000每个 Agent 的最大记忆数。超出时淘汰最旧/置信度最低的条目。0 = 无上限。

[context_engine]

配置可插拔的上下文组装引擎,控制 Agent 记忆如何被召回并组装到提示词中。

[context_engine]
engine = "default"
# plugin = "qdrant-recall"    # 解析为 ~/.librefang/plugins/qdrant-recall/

[context_engine.hooks]
# ingest = "~/.librefang/scripts/my_recall.py"
# after_turn = "~/.librefang/scripts/my_indexer.py"
# runtime = "python"   # python(默认)| native | v | node | deno | go | ruby | bash | bun | php | lua

[[context_engine.plugin_registries]]
name = "Official"
github_repo = "librefang/librefang-registry"
字段类型默认值说明
enginestring"default"内置引擎名称。目前仅支持 "default"
pluginstring 或 nullnull插件名称。解析为 ~/.librefang/plugins/<name>/plugin.toml。设置时优先于手动 hooks
hooks.ingeststring 或 nullnullingest 钩子的脚本路径(在收到新用户消息时调用)。
hooks.after_turnstring 或 nullnullafter_turn 钩子的脚本路径(在每轮对话完成后调用)。
hooks.runtimestring 或 null"python"运行钩子脚本的启动器。可选:pythonnative(直接执行预编译二进制)、vnodedenogorubybashbunphplua。未知值回退到 python 并打印 warning。
plugin_registrieslist of objects官方注册表插件注册表(GitHub owner/repo),用于浏览可安装的插件。

钩子脚本使用语言无关的 JSON-over-stdin/stdout 协议 —— 根据脚本选对应的 runtime:

# Go 插件
[context_engine.hooks]
ingest = "~/.librefang/plugins/my-go-recall/hooks/ingest.go"
runtime = "go"

# V 编译成原生二进制
[context_engine.hooks]
ingest = "~/.librefang/plugins/fast-recall/hooks/ingest"
runtime = "native"

检查 runtime 可用性

调用 GET /api/plugins/doctor 会扫描主机上所有支持的 runtime,返回每个 runtime 检测到的版本和缺失时的安装提示,并把已安装的插件和它们声明的 runtime 对照起来,标出哪些插件因为 runtime 缺失无法运行。

官方 Docker 镜像里的 runtime

官方镜像(基于 node:lts-bookworm-slim)默认带了 pythonnodebashnative,开箱即用。其他 runtime 为了控制镜像体积没打包,需要的话自己 FROM 后 extend:

# V
RUN git clone --depth 1 https://github.com/vlang/v /opt/v \
    && make -C /opt/v && ln -s /opt/v/v /usr/local/bin/v

# Deno
RUN curl -fsSL https://deno.land/install.sh | DENO_INSTALL=/usr/local sh

# Go
RUN curl -fsSL https://go.dev/dl/go1.23.0.linux-amd64.tar.gz | tar -C /usr/local -xz \
    && ln -s /usr/local/go/bin/go /usr/local/bin/go

# Ruby
RUN apt-get update && apt-get install -y --no-install-recommends ruby && rm -rf /var/lib/apt/lists/*

# Bun
RUN curl -fsSL https://bun.sh/install | BUN_INSTALL=/usr/local bash

# PHP
RUN apt-get update && apt-get install -y --no-install-recommends php-cli && rm -rf /var/lib/apt/lists/*

# Lua(Lua 脚手架模板用到 dkjson)
RUN apt-get update && apt-get install -y --no-install-recommends lua5.4 lua-dkjson && rm -rf /var/lib/apt/lists/*

如果插件声明的 runtime 不在 PATH 上,对应的 hook 会返回 LauncherNotFound 错误并附上安装提示 —— 其他插件继续正常运行,只有配置不对的那个受影响。


[audit]

配置审计日志保留策略。

[audit]
retention_days = 90
字段类型默认值说明
retention_daysu3290审计日志条目的保留天数。0 = 无限期保留。

[health_check]

配置 LLM 提供商的定期健康检查。

[health_check]
health_check_interval_secs = 60
字段类型默认值说明
health_check_interval_secsu6460提供商健康检查的间隔(秒)。

[plugins]

配置额外的插件注册表,用于搜索可安装的上下文引擎插件。

[plugins]
plugin_registries = ["acme-corp/librefang-plugins"]
字段类型默认值说明
plugin_registrieslist of strings[]额外的 GitHub owner/repo 插件注册表。与 context_engine.plugin_registries 合并。

[prompt_intelligence]

配置 Prompt 版本管理和 A/B 实验功能。启用后,LibreFang 自动追踪 prompt 版本历史,支持运行 A/B 实验对比不同 prompt 变体。详细文档见 Prompt 智能指南

[prompt_intelligence]
enabled = false
hash_prompts = true
max_versions_per_agent = 50
字段类型默认值说明
enabledboolfalse总开关。关闭时不追踪 prompt 版本,不运行实验
hash_promptsbooltrue计算 prompt 内容哈希用于去重
max_versions_per_agentu3250每个 agent 最大 prompt 版本数,超出后自动清理最旧的非活跃版本

环境变量

以下是配置中引用的所有环境变量的完整表格。这些变量不由配置文件本身读取——它们在运行时由内核和通道适配器读取。

LLM 提供商密钥

变量使用者说明
ANTHROPIC_API_KEY[default_model]Anthropic API Key(Claude 系列模型)。
GEMINI_API_KEYGemini 驱动Google Gemini API Key。别名:GOOGLE_API_KEY
OPENAI_API_KEYOpenAI 兼容驱动OpenAI API Key。
GROQ_API_KEYGroq 提供商Groq API Key(快速 Llama 推理)。
DEEPSEEK_API_KEYDeepSeek 提供商DeepSeek API Key。
PERPLEXITY_API_KEYPerplexity 提供商 / 网页搜索Perplexity API Key。
OPENROUTER_API_KEYOpenRouter 提供商OpenRouter API Key。
TOGETHER_API_KEYTogether AI 提供商Together AI API Key。
MISTRAL_API_KEYMistral 提供商Mistral AI API Key。
FIREWORKS_API_KEYFireworks 提供商Fireworks AI API Key。
COHERE_API_KEYCohere 提供商Cohere API Key。
AI21_API_KEYAI21 提供商AI21 Labs API Key。
CEREBRAS_API_KEYCerebras 提供商Cerebras API Key。
SAMBANOVA_API_KEYSambaNova 提供商SambaNova API Key。
HUGGINGFACE_API_KEYHugging Face 提供商Hugging Face Inference API Key。
XAI_API_KEYxAI 提供商xAI (Grok) API Key。
REPLICATE_API_KEYReplicate 提供商Replicate API Key。

网页搜索密钥

变量使用者说明
BRAVE_API_KEY[web.brave]Brave Search API Key。
JINA_API_KEY[web.jina]Jina AI Search API Key。
TAVILY_API_KEY[web.tavily]Tavily Search API Key。
PERPLEXITY_API_KEY[web.perplexity]Perplexity Search API Key(与 LLM 提供商共用)。

通道令牌

变量通道说明
TELEGRAM_BOT_TOKENTelegram从 @BotFather 获取的 Bot API 令牌。
DISCORD_BOT_TOKENDiscordDiscord Bot 令牌。
SLACK_APP_TOKENSlackSlack 应用级令牌(xapp-),用于 Socket Mode。
SLACK_BOT_TOKENSlackSlack Bot 令牌(xoxb-),用于 REST API。
WHATSAPP_ACCESS_TOKENWhatsAppWhatsApp Cloud API 访问令牌。
WHATSAPP_VERIFY_TOKENWhatsAppWebhook 验证令牌。
MATRIX_ACCESS_TOKENMatrixMatrix 家服务器访问令牌。
EMAIL_PASSWORDEmail邮箱密码或应用专用密码。
TEAMS_APP_PASSWORDTeamsAzure Bot Framework 应用密码。
MATTERMOST_TOKENMattermostMattermost Bot 令牌。
TWITCH_OAUTH_TOKENTwitchTwitch OAuth 令牌。
ROCKETCHAT_TOKENRocket.ChatRocket.Chat 认证令牌。
ZULIP_API_KEYZulipZulip Bot API Key。
XMPP_PASSWORDXMPPXMPP 账号密码。
GOOGLE_CHAT_SERVICE_ACCOUNTGoogle Chat服务账号 JSON 密钥。
LINE_CHANNEL_SECRETLINELINE Channel Secret。
LINE_CHANNEL_ACCESS_TOKENLINELINE Channel Access Token。
VIBER_AUTH_TOKENViberViber Bot 认证令牌。
MESSENGER_PAGE_TOKENMessengerFacebook 页面访问令牌。
MESSENGER_VERIFY_TOKENMessengerWebhook 验证令牌。
REDDIT_CLIENT_SECRETRedditReddit 应用客户端密钥。
REDDIT_PASSWORDRedditReddit Bot 账号密码。
MASTODON_ACCESS_TOKENMastodonMastodon 访问令牌。
BLUESKY_APP_PASSWORDBlueskyBluesky 应用密码。
FEISHU_APP_SECRETFeishu飞书/Lark 应用密钥。
REVOLT_BOT_TOKENRevoltRevolt Bot 令牌。
NEXTCLOUD_TOKENNextcloudNextcloud Talk 认证令牌。
GUILDED_BOT_TOKENGuildedGuilded Bot 令牌。
KEYBASE_PAPERKEYKeybaseKeybase 纸钥匙。
THREEMA_SECRETThreemaThreema Gateway API 密钥。
NOSTR_PRIVATE_KEYNostrNostr 私钥(nsec 或十六进制格式)。
WEBEX_BOT_TOKENWebexWebex Bot 令牌。
PUMBLE_BOT_TOKENPumblePumble Bot 令牌。
FLOCK_BOT_TOKENFlockFlock Bot 令牌。
TWIST_TOKENTwistTwist API 令牌。
MUMBLE_PASSWORDMumbleMumble 服务器密码。
DINGTALK_APP_KEYDingTalk钉钉 App Key / Client ID(stream 模式)。
DINGTALK_APP_SECRETDingTalk钉钉 App Secret / Client Secret(stream 模式)。
DINGTALK_ACCESS_TOKENDingTalk钉钉 Webhook 访问令牌(webhook 模式)。
DINGTALK_SECRETDingTalk钉钉签名密钥(webhook 模式)。
DISCOURSE_API_KEYDiscourseDiscourse API Key。
GITTER_TOKENGitterGitter 认证令牌。
NTFY_TOKENntfyntfy 认证令牌(公共主题可选)。
GOTIFY_APP_TOKENGotifyGotify 应用令牌(发送)。
GOTIFY_CLIENT_TOKENGotifyGotify 客户端令牌(接收)。
WEBHOOK_SECRETWebhook用于 Webhook 验证的 HMAC 签名密钥。
LINKEDIN_ACCESS_TOKENLinkedInLinkedIn OAuth2 访问令牌。

配置校验

KernelConfig::validate() 在启动时运行,返回一组警告(非致命错误)。内核仍会启动,但会逐条记录警告日志。

校验范围

对于每个已启用的通道(即其配置节存在于 TOML 中),校验器会检查对应的环境变量是否已设置且非空:

通道检查的环境变量
Telegrambot_token_env
Discordbot_token_env
Slackapp_token_envbot_token_env(两者都检查)
WhatsAppaccess_token_env
Matrixaccess_token_env
Emailpassword_env
Teamsapp_password_env
Mattermosttoken_env
Zulipapi_key_env
Twitchoauth_token_env
Rocket.Chattoken_env
Google Chatservice_account_env
XMPPpassword_env
LINEaccess_token_env
Viberauth_token_env
Messengerpage_token_env
Redditclient_secret_env
Mastodonaccess_token_env
Blueskyapp_password_env
Feishuapp_secret_env
Revoltbot_token_env
Nextcloudtoken_env
Guildedbot_token_env
Keybasepaperkey_env
Threemasecret_env
Nostrprivate_key_env
Webexbot_token_env
Pumblebot_token_env
Flockbot_token_env
Twisttoken_env
Mumblepassword_env
DingTalkapp_key_env(stream)或 access_token_env(webhook)
Discourseapi_key_env
Gittertoken_env
ntfytoken_env(仅当 token_env 非空时;公共主题无需认证)
Gotifyapp_token_env
Webhooksecret_env
LinkedInaccess_token_env

对于网页搜索提供商,校验器检查:

提供商检查的环境变量
braveweb.brave.api_key_env
jinaweb.jina.api_key_env
tavilyweb.tavily.api_key_env
perplexityweb.perplexity.api_key_env
duckduckgo(无需检查——不需要 API Key)
auto(无需检查——级联回退会处理缺失的 Key)

不在校验范围内的内容

  • [default_model] 中的 api_key_env 不会被 validate() 检查。缺失的 LLM Key 会在驱动首次使用时产生运行时错误。
  • [network] 中的 shared_secret 不会对照 network_enabled 进行校验。如果启用了网络但密钥为空,认证将在连接时失败。
  • MCP 服务器配置不在配置加载时校验。连接错误会在后台 MCP 连接阶段暴露。
  • Agent 清单有自己独立的校验流程。

相关配置

部分子系统有自己的配置,不在 config.toml 中,但值得了解:

会话压缩

通过 config.toml 中的 [compaction] 部分配置:

[compaction]
threshold_messages = 30       # 消息数超过此值时触发压缩
keep_recent = 10              # 压缩后逐字保留的最近消息数
max_summary_tokens = 1024     # LLM 摘要的最大 Token 数
token_threshold_ratio = 0.7   # 估算 Token 超过上下文窗口此比例时触发
max_chunk_chars = 80000       # 每个摘要分块的最大字符数
max_retries = 3               # LLM 摘要的最大重试次数
字段默认值说明
threshold_messages30会话消息数超过此值时触发压缩。
keep_recent10压缩后保留的最近消息数量(逐字保留)。
max_summary_tokens1024LLM 对压缩消息生成摘要的最大 Token 数。
token_threshold_ratio0.7估算 Token 超过上下文窗口此比例时触发压缩。
max_chunk_chars80000每个摘要分块的最大字符数。
max_retries3LLM 摘要的最大重试次数。

WASM 沙箱(运行时)

通过 SandboxConfig 内部配置(目前未在 config.toml 中暴露):

字段默认值说明
fuel_limit1000000最大 CPU 指令预算。0 = 无限制。
max_memory_bytes16777216(16 MB)WASM 线性内存上限。
timeout_secsnull(回退 30 秒)基于 epoch 中断的挂钟超时时间。

模型路由(Agent 清单)

在 Agent 清单中通过 ModelRoutingConfig 配置:

字段默认值说明
simple_model"claude-haiku-4-5-20251001"简单查询使用的模型。
medium_model"claude-sonnet-4-20250514"中等复杂度查询使用的模型。
complex_model"claude-sonnet-4-20250514"复杂查询使用的模型。
simple_threshold100Token 数低于此值的查询被归类为简单查询。
complex_threshold500Token 数高于此值的查询被归类为复杂查询。

自主模式护栏(Agent 清单)

在 Agent 清单中通过 AutonomousConfig 配置:

字段默认值说明
quiet_hoursnull静默时段的 Cron 表达式(Agent 在此时间窗口暂停)。
max_iterations50每次调用的最大工具使用迭代次数。
max_restarts10永久停止前的最大自动重启次数。
heartbeat_interval_secs30心跳健康检查的间隔(秒)。
heartbeat_channelnull发送心跳状态的通道(例如 "telegram")。