LibreFang 配置参考

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


目录


概述

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

~/.librefang/config.toml

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

核心行为:

  • 配置中的每个结构体都使用了 #[serde(default)],这意味着所有字段都是可选的。未填写的字段将使用文档中说明的默认值。
  • 通道配置节([channels.discord][channels.slack] 等)采用 Option<T> 类型——缺少该节时,对应的通道适配器将被禁用。即使只写了节头(内容为空),也会以默认值启用该适配器。Telegram 现已改为 sidecar 模式,使用 [[sidecar_channels]] 而非 [channels.telegram]
  • 密钥绝不直接存储在 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 个适配器的详细说明见下方"通道配置"章节)

# Telegram 使用 sidecar 适配器(内置通道已在 #5241 中移除):
[[sidecar_channels]]
name = "telegram"
command = "python3"
args = ["-m", "librefang.sidecar.adapters.telegram"]
channel_type = "telegram"
[sidecar_channels.env]
TELEGRAM_BOT_TOKEN = "..."

# Discord (sidecar)
[[sidecar_channels]]
name = "discord"
command = "python3"
args = ["-m", "librefang.sidecar.adapters.discord"]
channel_type = "discord"
[sidecar_channels.env]
DISCORD_BOT_TOKEN = "..."

# Slack (sidecar)
[[sidecar_channels]]
name = "slack"
command = "python3"
args = ["-m", "librefang.sidecar.adapters.slack"]
channel_type = "slack"
[sidecar_channels.env]
SLACK_APP_TOKEN = "xapp-..."
SLACK_BOT_TOKEN = "xoxb-..."

# [[sidecar_channels]]
# name = "qq"
# command = "python3"
# args = ["-m", "librefang.sidecar.adapters.qq"]
# channel_type = "qq"
# [sidecar_channels.env]
# QQ_APP_ID = "your-app-id"

# 企业微信(WeCom):见下方 sidecar 示例(原 [channels.wecom])
# [[sidecar_channels]]
# name = "wecom"
# command = "python3"
# args = ["-m", "librefang.sidecar.adapters.wecom"]
# channel_type = "wecom"
# [sidecar_channels.env]
# WECOM_BOT_ID = "aibxxxxxxx"

# 微信已迁移为 sidecar:
# [[sidecar_channels]]
# name = "wechat"
# command = "python3"
# args = ["-m", "librefang.sidecar.adapters.wechat"]
# channel_type = "wechat"
# [sidecar_channels.env]
# WECHAT_BOT_TOKEN = ""               # 留空触发二维码登录

# --- 浏览器自动化 ---
[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(默认值)每个通道的行为覆盖配置。详见通道行为覆盖

Telegram

Telegram 现已改为 sidecar 模式,[channels.telegram] 配置块不再被接受。请改用 [[sidecar_channels]]

[[sidecar_channels]]
name = "telegram"
command = "python3"
args = ["-m", "librefang.sidecar.adapters.telegram"]
channel_type = "telegram"
[sidecar_channels.env]
TELEGRAM_BOT_TOKEN = "..."
# ALLOWED_USERS = "111,@alice"

Sidecar 适配器保留了所有原有运行语义。详见 [[sidecar_channels]] 章节。

Discord(sidecar)

Discord 已于 v2026.5 迁移为进程外 sidecar 适配器,请改用 [[sidecar_channels]] 配置。

[[sidecar_channels]]
name = "discord"
command = "python3"
args = ["-m", "librefang.sidecar.adapters.discord"]
channel_type = "discord"

[sidecar_channels.env]
DISCORD_BOT_TOKEN = "..."
# DISCORD_ALLOWED_GUILDS = "123,456"
# DISCORD_ALLOWED_USERS = "789"
# DISCORD_INTENTS = "37376"
# DISCORD_IGNORE_BOTS = "true"
# DISCORD_MENTION_PATTERNS = "hey bot,!ask"
# DISCORD_ACCOUNT_ID = "guild-42"

Sidecar 保留原内置适配器的运行语义——Gateway Intents、allowed_guilds / allowed_users 过滤、@mention 检测,以及通过 channel_role_mapping.discord 的 RBAC 映射。完整的 supervisor 字段(restart、backoff、ready timeout、message buffer 等)参见下方 [[sidecar_channels]] 章节。

Slack(sidecar)

Slack 已于 v2026.5 迁移为进程外 sidecar 适配器,请改用 [[sidecar_channels]] 配置。

[[sidecar_channels]]
name = "slack"
command = "python3"
args = ["-m", "librefang.sidecar.adapters.slack"]
channel_type = "slack"

[sidecar_channels.env]
SLACK_APP_TOKEN = "xapp-..."
SLACK_BOT_TOKEN = "xoxb-..."
# SLACK_ALLOWED_CHANNELS = "C0123,C0456"
# SLACK_UNFURL_LINKS = "false"
# SLACK_FORCE_FLAT_REPLIES = "false"
# SLACK_REACTIONS = "true"
# SLACK_ACCOUNT_ID = "workspace-prod"

Sidecar 保留原内置适配器的运行语义——Socket Mode WebSocket + Web API、allowed_channels 过滤(DM 豁免)、Block Kit 交互回调、thread 回复上下文、eyes / check 反应、通过 SLACK_ACCOUNT_ID 的多 Bot 路由。基于 channel_role_mapping.slack 的工作区角色 RBAC 不再在线读取——详见 CHANGELOG 中的 regression 说明。

WhatsApp(Sidecar)

WhatsApp 已迁移至 Python sidecar(librefang.sidecar.adapters.whatsapp)。原 [channels.whatsapp] 块不再识别。两种模式(Meta Cloud API + Web/QR Baileys 网关)均保留。详见频道配置指南中的 WhatsApp 部分

Signal(Sidecar)

Signal 已从进程内 Rust 适配器迁移到进程外 Python sidecar(librefang.sidecar.adapters.signal),后端通过独立运行的 signal-cli-rest-api 容器对接 signal-cli。原有 [channels.signal] 块不再识别 —— 改为声明 [[sidecar_channels]]

[[sidecar_channels]]
name = "signal"
command = "python3"
args = ["-m", "librefang.sidecar.adapters.signal"]
channel_type = "signal"
[sidecar_channels.env]
SIGNAL_API_URL = "https://signal-cli.example.com"
SIGNAL_NUMBER  = "+15555550100"
# SIGNAL_ALLOWED_USERS = "+15555550199,+15555550200"  # 可选
# SIGNAL_ACCOUNT_ID = "prod-bot"                       # 可选
# SIGNAL_POLL_INTERVAL_SECS = "2"                      # 可选
# SIGNAL_ALLOW_LOCAL = "1"                             # localhost 部署时显式放行

Sidecar 沿用 Rust 适配器相同的 SSRF 保护:SIGNAL_API_URL 必须解析到公网地址,除非显式设置 SIGNAL_ALLOW_LOCAL=1。可选的 SIGNAL_API_KEY 写入 ~/.librefang/secrets.env

Matrix(Sidecar)

Matrix 已从进程内 Rust 适配器迁移到进程外 Python sidecar(librefang.sidecar.adapters.matrix),通过 Matrix Client-Server API 的 /sync 长轮询对接 homeserver。原有 [channels.matrix] 块不再识别 —— 改为声明 [[sidecar_channels]]

[[sidecar_channels]]
name = "matrix"
command = "python3"
args = ["-m", "librefang.sidecar.adapters.matrix"]
channel_type = "matrix"
[sidecar_channels.env]
MATRIX_HOMESERVER_URL = "https://matrix.org"
MATRIX_USER_ID = "@librefang:matrix.org"
# MATRIX_ALLOWED_ROOMS = "!abc:matrix.org,!def:matrix.org"  # 可选
# MATRIX_ACCOUNT_ID = "prod-bot"                             # 可选
# MATRIX_MAX_UPLOAD_BYTES = "52428800"                       # 可选,默认 50 MiB

密钥放在 ~/.librefang/secrets.envMATRIX_ACCESS_TOKEN(Bot 在 homeserver 上的 access token,与 Element 一致)。

Email(IMAP + SMTP,sidecar)

Email 现以 Python sidecar 适配器(librefang.sidecar.adapters.email)提供。原 in-process [channels.email] 配置块已被移除。请改为通过 [[sidecar_channels]] 条目声明——详见频道配置指南中的 Email 部分

Microsoft Teams(Sidecar)

Teams 现以 Python sidecar 适配器(librefang.sidecar.adapters.teams)提供。原 in-process [channels.teams] 配置块已被移除。请改为通过 [[sidecar_channels]] 条目声明——详见频道配置指南中的 Microsoft Teams 部分

Mattermost(Sidecar)

Mattermost 已从进程内 Rust 适配器迁移到进程外 Python sidecar(librefang.sidecar.adapters.mattermost)。原有 [channels.mattermost] 块不再识别 —— 改为声明 [[sidecar_channels]]

[[sidecar_channels]]
name = "mattermost"
command = "python3"
args = ["-m", "librefang.sidecar.adapters.mattermost"]
channel_type = "mattermost"
[sidecar_channels.env]
MATTERMOST_SERVER_URL = "https://mattermost.example.com"
# MATTERMOST_ALLOWED_CHANNELS = "ch-id-1,ch-id-2"   # 可选
# MATTERMOST_ACCOUNT_ID = "team-prod"               # 可选

MATTERMOST_TOKEN 写入 ~/.librefang/secrets.env

Google Chat

Google Chat 由 Python sidecar adapter (librefang.sidecar.adapters.google_chat) 提供。Sidecar 迁移已移除进程内 [channels.google_chat] 配置块。请改为 [[sidecar_channels]] —— 详见频道配置指南中的 Google Chat 部分

Twitch

Twitch 由 Python sidecar 适配器 (librefang.sidecar.adapters.twitch) 提供。原 in-process [channels.twitch] 配置块已在 sidecar 迁移中移除。请改用 [[sidecar_channels]] 条目:

[[sidecar_channels]]
name = "twitch"
command = "python3"
args = ["-m", "librefang.sidecar.adapters.twitch"]
channel_type = "twitch"
[sidecar_channels.env]
TWITCH_NICK = "librefang-bot"
TWITCH_CHANNELS = "channel1,channel2"      # 逗号分隔,不带 '#'
# TWITCH_ACCOUNT_ID = "prod"                # 可选,多机器人路由
# TWITCH_RATE_LIMIT_MSGS = "20"             # 非 mod 账号 20/30s;mod 可设为 100
# TWITCH_RATE_LIMIT_SECS = "30"

TWITCH_OAUTH_TOKEN 写入 ~/.librefang/secrets.env,Dashboard 的 Channels 页面填表后会自动写入。oauth: 前缀缺失时会自动补齐。

Sidecar 默认通过 TLS 连接 irc.chat.twitch.tv:6697(原 Rust 适配器使用明文 6667,每次重连都会泄露 OAuth 令牌)。明文模式仅在 TWITCH_PLAINTEXT=1 下用于本地 mock 监听 — 生产环境严禁开启。

Rocket.Chat

Rocket.Chat 现以 Python sidecar 适配器(librefang.sidecar.adapters.rocketchat)提供。原 in-process [channels.rocketchat] 配置块已在 sidecar 迁移中移除。请改为通过 [[sidecar_channels]] 条目声明:

[[sidecar_channels]]
name = "rocketchat"
command = "python3"
args = ["-m", "librefang.sidecar.adapters.rocketchat"]
channel_type = "rocketchat"
[sidecar_channels.env]
ROCKETCHAT_SERVER_URL = "https://chat.example.com"
ROCKETCHAT_USER_ID = "abc123"
# ROCKETCHAT_CHANNELS = "GENERAL,room2"        # 可选;留空 = 所有已加入频道
# ROCKETCHAT_ACCOUNT_ID = "prod"                # 可选,多 Bot 路由键
# ROCKETCHAT_POLL_INTERVAL_SECS = "2"           # 可选,默认 2,下限 1

ROCKETCHAT_TOKEN(个人访问令牌)应写入 ~/.librefang/secrets.env——在仪表板的 Channels 页面填写 Rocket.Chat 表单时会自动写入。

Zulip

Zulip 现在由 Python sidecar 适配器(librefang.sidecar.adapters.zulip)提供。原 in-process 的 [channels.zulip] 配置块在 sidecar 迁移中已移除。请改用 [[sidecar_channels]] 声明:

[[sidecar_channels]]
name = "zulip"
command = "python3"
args = ["-m", "librefang.sidecar.adapters.zulip"]
channel_type = "zulip"
[sidecar_channels.env]
ZULIP_SERVER_URL = "https://myorg.zulipchat.com"
ZULIP_BOT_EMAIL  = "bot-bot@myorg.zulipchat.com"
# ZULIP_STREAMS = "engineering, general"      # 可选;空 = 所有已订阅 Stream
# ZULIP_ACCOUNT_ID = "prod"                   # 可选,多 Bot 路由 key

ZULIP_API_KEY 应写入 ~/.librefang/secrets.env——在仪表板的 Channels 页面填写 Zulip 表单时会自动写入。Sidecar 把入站 topic 暴露为 thread_id 并在出站时回写(回复留在原 topic),在 /users/me/register/events/messages 四条 REST 路径上都遵守 429 的 Retry-After,并按 message.id 去重以防止 queue 重新注册后重发同一条消息。

LINE

LINE 由 Python sidecar 适配器(librefang.sidecar.adapters.line)提供,进程内 [channels.line] 配置块已在 sidecar 迁移中移除。请改用 [[sidecar_channels]] 形式声明 —— sidecar 自身运行 HTTP Webhook 服务器(不再挂载在 LibreFang API 端口上),因此 LINE Developers 控制台注册的 URL 现在为 https://<sidecar-host>:<LINE_WEBHOOK_PORT><LINE_WEBHOOK_PATH>

[[sidecar_channels]]
name = "line"
command = "python3"
args = ["-m", "librefang.sidecar.adapters.line"]
channel_type = "line"
[sidecar_channels.env]
LINE_WEBHOOK_PORT = "9090"
# LINE_WEBHOOK_PATH = "/webhook"
# LINE_ACCOUNT_ID = "production"

LINE_CHANNEL_SECRETLINE_CHANNEL_ACCESS_TOKEN 需写入 ~/.librefang/secrets.env

Reddit

Reddit 由 Python sidecar 适配器(librefang.sidecar.adapters.reddit)提供,进程内 [channels.reddit] 配置块已在 sidecar 迁移中移除。请以 [[sidecar_channels]] 形式声明:

[[sidecar_channels]]
name = "reddit"
command = "python3"
args = ["-m", "librefang.sidecar.adapters.reddit"]
channel_type = "reddit"
[sidecar_channels.env]
REDDIT_CLIENT_ID = "abc123"
REDDIT_USERNAME = "librefang-bot"
REDDIT_SUBREDDITS = "rust,programming"   # 逗号分隔
# REDDIT_ACCOUNT_ID = "prod"              # 可选,用于多 Bot 路由
# REDDIT_USER_AGENT = "myorg-bot/1.0 (by /u/me)"   # 覆盖默认 User-Agent

REDDIT_CLIENT_SECRETREDDIT_PASSWORD 应放在 ~/.librefang/secrets.env 中 —— 仪表盘的 Channels 页面会在你填写 Reddit 表单时自动写入。

Mastodon

Mastodon 已迁移为 sidecar 专用,原 [channels.mastodon] 配置块不再被接受。请以 [[sidecar_channels]] 形式声明:

[[sidecar_channels]]
name = "mastodon"
command = "python3"
args = ["-m", "librefang.sidecar.adapters.mastodon"]
channel_type = "mastodon"
[sidecar_channels.env]
MASTODON_INSTANCE_URL = "https://mastodon.social"
# MASTODON_VISIBILITY = "unlisted"          # public | unlisted | private | direct
# MASTODON_MAX_MESSAGE_LEN = "500"          # 实例若放宽限制可调高
# MASTODON_ACCOUNT_ID = "prod"              # 可选,多 bot 路由键

MASTODON_ACCESS_TOKEN(OAuth bearer)写入 ~/.librefang/secrets.env——在仪表盘 Channels 页填写 Mastodon 表单时会自动写入。

Bluesky

Bluesky 由 Python sidecar 适配器 (librefang.sidecar.adapters.bluesky) 提供。原 [channels.bluesky] 配置块已在 sidecar 迁移中移除,请改用 [[sidecar_channels]]

[[sidecar_channels]]
name = "bluesky"
command = "python3"
args = ["-m", "librefang.sidecar.adapters.bluesky"]
channel_type = "bluesky"
[sidecar_channels.env]
BLUESKY_IDENTIFIER = "mybot.bsky.social"
# BLUESKY_SERVICE_URL = "https://bsky.social"   # 自定义 PDS
# BLUESKY_ACCOUNT_ID = "prod"                   # 可选,多 bot 路由键

BLUESKY_APP_PASSWORD(Bluesky 应用密码)写入 ~/.librefang/secrets.env——在仪表盘 Channels 页填写 Bluesky 表单时会自动写入。

飞书 / Lark(sidecar)

飞书 / Lark 现以 Python sidecar 适配器(librefang.sidecar.adapters.feishu)提供。原 in-process [channels.feishu] 配置块已被移除。请改为通过 [[sidecar_channels]] 条目声明 —— 详见频道集成指南中的飞书 / Lark 部分

Nextcloud Talk

Nextcloud Talk 现以 Python sidecar 适配器(librefang.sidecar.adapters.nextcloud)提供。在迁移过程中,原 in-process [channels.nextcloud] 配置块已被移除。请改为通过 [[sidecar_channels]] 条目声明 Nextcloud:

[[sidecar_channels]]
name = "nextcloud"
command = "python3"
args = ["-m", "librefang.sidecar.adapters.nextcloud"]
channel_type = "nextcloud"
[sidecar_channels.env]
NEXTCLOUD_SERVER_URL = "https://cloud.example.com"
# NEXTCLOUD_ROOMS = "abc123,def456"           # 可选;留空 = 所有已加入房间
# NEXTCLOUD_ACCOUNT_ID = "prod"               # 可选,多 Bot 路由键
# NEXTCLOUD_POLL_INTERVAL_SECS = "3"          # 可选,默认 3,下限 1

NEXTCLOUD_TOKEN(应用密码 / OAuth bearer)写入 ~/.librefang/secrets.env——在仪表板的 Channels 页面填写 Nextcloud 表单时会自动写入。

Webex (sidecar)

Webex 已在 v2026.5 中迁移为 out-of-process sidecar;请使用 [[sidecar_channels]] 块代替 [channels.webex]

[[sidecar_channels]]
name = "webex"
command = "python3"
args = ["-m", "librefang.sidecar.adapters.webex"]
channel_type = "webex"

[sidecar_channels.env]
# WEBEX_ALLOWED_ROOMS = "Y2lz...A,Y2lz...B"  # 可选,留空 = 所有房间
# WEBEX_ACCOUNT_ID = "org-prod"              # 可选,多机器人路由键

WEBEX_BOT_TOKEN(Bot Bearer 令牌,来自 developer.webex.com)应放在 ~/.librefang/secrets.env——在仪表板 Channels 页面填写 Webex 表单时会自动写入。

钉钉(DingTalk,sidecar)

钉钉现以 Python sidecar 适配器(librefang.sidecar.adapters.dingtalk)提供,仅 stream 模式。原 in-process [channels.dingtalk] 配置块已被移除。请改为通过 [[sidecar_channels]] 条目声明——详见频道配置指南中的 DingTalk 部分

原 in-process webhook 模式(HMAC-SHA256 校验 timestamp + secret + body未迁移——依赖 webhook 模式的运维需要在钉钉后台改用 stream 订阅。

ntfy

ntfy 由 Python sidecar adapter (librefang.sidecar.adapters.ntfy) 提供。Sidecar 迁移已移除进程内 [channels.ntfy] 配置块。请改为 [[sidecar_channels]] —— 详见频道配置指南中的 ntfy 部分

Gotify

Gotify 已迁移为 sidecar 专用,原 [channels.gotify] 配置块不再被接受。请以 [[sidecar_channels]] 形式声明:

[[sidecar_channels]]
name = "gotify"
command = "python3"
args = ["-m", "librefang.sidecar.adapters.gotify"]
channel_type = "gotify"
[sidecar_channels.env]
GOTIFY_SERVER_URL = "https://gotify.example.com"
# GOTIFY_ACCOUNT_ID = "prod"    # 可选,多 bot 路由键

GOTIFY_APP_TOKEN(发送)和 GOTIFY_CLIENT_TOKEN(订阅)写入 ~/.librefang/secrets.env——在仪表盘 Channels 页填写 Gotify 表单时会自动写入。

Webhook(Sidecar)

Webhook 已迁移到 Python sidecar(librefang.sidecar.adapters.webhook)。原 [channels.webhook] 块不再识别。改为声明 [[sidecar_channels]]——详见频道配置指南中的 Webhook 部分

QQ Bot(Sidecar)

QQ 已从进程内 Rust 适配器迁移到进程外 Python sidecar(librefang.sidecar.adapters.qq),通过 WebSocket(网关)+ REST(token + 出站)与 QQ 开放平台通信。原有 [channels.qq] 块不再识别 —— 改为声明 [[sidecar_channels]]

[[sidecar_channels]]
name = "qq"
command = "python3"
args = ["-m", "librefang.sidecar.adapters.qq"]
channel_type = "qq"
[sidecar_channels.env]
QQ_APP_ID = "your-app-id"
# QQ_ALLOWED_USERS = "openid-1,openid-2"   # 可选
# QQ_ACCOUNT_ID = "prod-bot"               # 可选
# QQ_INTENTS = "1073746435"                # 可选,覆盖 intents bitmask

密钥放在 ~/.librefang/secrets.envQQ_APP_SECRET(QQ 开放平台控制台里的 clientSecret)。

企业微信(sidecar)

企业微信(WeCom)已从 in-process Rust 适配器迁移到 out-of-process Python sidecar(librefang.sidecar.adapters.wecom)。Sidecar 使用 WebSocket 连接到 wss://openws.work.weixin.qq.com,凭智能机器人的 Bot ID 和 Secret 鉴权。Callback 模式(HTTP webhook + AES-CBC-256 入站解密)不再支持 —— Python 标准库没有 AES,而 sidecar SDK 按惯例只用 stdlib。原先使用 callback 模式的运维人员需要在企业微信管理后台将机器人切换到 WebSocket 模式。

原有 [channels.wecom] 不再识别,请改为 [[sidecar_channels]]

[[sidecar_channels]]
name = "wecom"
command = "python3"
args = ["-m", "librefang.sidecar.adapters.wecom"]
channel_type = "wecom"

[sidecar_channels.env]
WECOM_BOT_ID = "aibxxxxxxx"
# WECOM_ALLOWED_USERS = "alice,bob"
# WECOM_ACCOUNT_ID    = "prod-bot"

密钥放在 ~/.librefang/secrets.envWECOM_BOT_SECRET(企业微信管理后台里的机器人密钥)。

微信(WeChat,sidecar)

微信(个人账号经 iLink 协议)现以 Python sidecar 适配器(librefang.sidecar.adapters.wechat)提供。原 in-process [channels.wechat] 配置块已被移除。请改为通过 [[sidecar_channels]] 条目声明 —— 详见频道配置指南中的 WeChat 部分


[[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] 子表已不再被识别——详见频道配置指南里的迁移对照表。下方仅作迁移前结构的历史参考。

通道行为覆盖(历史参考)

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

[channels.discord.overrides]
model = "claude-haiku-4-5-20251001"
system_prompt = "You are a concise Discord assistant."
dm_policy = "respond"
group_policy = "mention_only"
rate_limit_per_minute = 0
rate_limit_per_user = 10
threading = true
output_format = "markdown"
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_TOKENMattermost(sidecar)Mattermost Bot 令牌(sidecar 适配器 —— 写入 ~/.librefang/secrets.env)。
TWITCH_OAUTH_TOKENTwitchTwitch OAuth 令牌。
ROCKETCHAT_TOKENRocket.Chat (sidecar)Rocket.Chat 个人访问令牌(sidecar 适配器 —— 写入 ~/.librefang/secrets.env)。
ZULIP_API_KEYZulip (sidecar)Zulip Bot API Key(sidecar 适配器——写入 ~/.librefang/secrets.env)。
XMPP_PASSWORDXMPPXMPP 账号密码。
GOOGLE_CHAT_SERVICE_ACCOUNTGoogle Chat服务账号 JSON 密钥。
LINE_CHANNEL_SECRETLINE (sidecar)LINE Channel Secret(sidecar 适配器 —— 写入 ~/.librefang/secrets.env)。
LINE_CHANNEL_ACCESS_TOKENLINE (sidecar)LINE Channel Access Token(librefang.sidecar.adapters.line)。
REDDIT_CLIENT_SECRETRedditReddit 应用客户端密钥。
REDDIT_PASSWORDRedditReddit Bot 账号密码。
MASTODON_ACCESS_TOKENMastodonMastodon 访问令牌。
BLUESKY_APP_PASSWORDBlueskyBluesky 应用密码。
FEISHU_APP_SECRETFeishu飞书/Lark 应用密钥。
REVOLT_BOT_TOKENRevoltRevolt Bot 令牌。
NEXTCLOUD_TOKENNextcloud (sidecar)Nextcloud Talk 应用密码 / OAuth bearer(librefang.sidecar.adapters.nextcloud)。
GUILDED_BOT_TOKENGuildedGuilded Bot 令牌。
KEYBASE_PAPERKEYKeybaseKeybase 纸钥匙。
THREEMA_SECRETThreemaThreema Gateway API 密钥。
WEBEX_BOT_TOKENWebex (sidecar)Webex Bot Bearer 令牌(librefang.sidecar.adapters.webex)。
PUMBLE_BOT_TOKENPumblePumble Bot 令牌。
FLOCK_BOT_TOKENFlockFlock Bot 令牌。
TWIST_TOKENTwistTwist API 令牌。
MUMBLE_PASSWORDMumbleMumble 服务器密码。
DINGTALK_APP_KEYDingTalk钉钉 App Key / Client ID(sidecar 适配器 librefang.sidecar.adapters.dingtalk,仅 stream 模式)。
DINGTALK_APP_SECRETDingTalk钉钉 App Secret / Client Secret(sidecar 适配器 librefang.sidecar.adapters.dingtalk,仅 stream 模式)。
GITTER_TOKENGitterGitter 认证令牌。
NTFY_TOKENntfyntfy 认证令牌(公共主题可选)。
GOTIFY_APP_TOKENGotifyGotify 应用令牌(发送)。
GOTIFY_CLIENT_TOKENGotifyGotify 客户端令牌(接收)。
WEBHOOK_SECRETWebhook用于 Webhook 验证的 HMAC 签名密钥。

配置校验

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
Google Chatservice_account_env
XMPPpassword_env
Redditclient_secret_env
Mastodonaccess_token_env
Blueskyapp_password_env
Feishuapp_secret_env
Revoltbot_token_env
Guildedbot_token_env
Keybasepaperkey_env
Threemasecret_env
Pumblebot_token_env
Flockbot_token_env
Twisttoken_env
Mumblepassword_env
DingTalksidecar — 由 librefang.sidecar.adapters.dingtalkDINGTALK_APP_KEY / DINGTALK_APP_SECRET env 检查负责
Gittertoken_env
ntfytoken_env(仅当 token_env 非空时;公共主题无需认证)
Gotifyapp_token_env
Webhooksecret_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")。