LibreFang 配置参考
config.toml 的完整参考文档,涵盖 LibreFang Agent OS 中每一个可配置字段。
目录
- 概述
- 配置文件包含机制
- 最小配置
- 完整配置示例
- 各节详解
- 顶层字段
- [default_model]
- [memory]
- [auto_dream]
- [network]
- [web]
- [media]
- [links]
- [channels]
- [[mcp_servers]]
- [a2a]
- [[fallback_providers]]
- [[users]]
- 通道行为覆盖
- [browser]
- [reload]
- [exec_policy]
- [approval]
- [budget]
- [thinking]
- [tts]
- [docker]
- [canvas]
- [auto_reply]
- [broadcast]
- [inbox]
- [[bindings]]
- [pairing]
- [extensions]
- [vault]
- [webhook_triggers]
- [proxy]
- [[sidecar_channels]]
- [session]
- [terminal]
- [queue]
- [external_auth]
- [vertex_ai]
- [oauth]
- [auth_profiles]
- [tool_policy]
- [tool_timeouts]
- [proactive_memory]
- [context_engine]
- [audit]
- [health_check]
- [plugins]
- 环境变量
- 配置校验
概述
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_env和bot_token_env等字段保存的是环境变量的名称,实际密钥从该环境变量中读取,以防止密钥被意外提交到版本控制系统。 - 敏感字段(
api_key、shared_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_dir | path | ~/.librefang | LibreFang 主目录,存储配置、Agent、技能等。 |
data_dir | path | ~/.librefang/data | SQLite 数据库和持久化数据的目录。 |
log_level | string | "info" | 日志级别。可选值:trace、debug、info、warn、error。 |
api_listen | string | "127.0.0.1:4545" | HTTP/WebSocket/SSE API 服务器的绑定地址。别名:listen_addr。 |
network_enabled | bool | false | 启用 OFP 点对点网络层。 |
api_key | string | ""(空) | API 认证密钥。设置后,除 /api/health 外的所有端点均需要 Authorization: Bearer <key> 请求头。空值表示不需要认证(仅限本地开发使用)。 |
cors_origin | list of strings | [] | 除 localhost 外额外允许的 CORS 来源。例如 ["https://dash.example.com"]。 |
mode | string | "default" | 内核运行模式。见下表。 |
language | string | "en" | CLI 输出和系统消息的语言/区域代码。 |
usage_footer | string | "full" | 控制附加到回复末尾的用量信息。见下表。 |
prompt_caching | bool | true | 启用 LLM 提供商的提示词缓存。会在系统提示中添加缓存提示(Anthropic 使用 cache_control,OpenAI 自动前缀缓存)。 |
stable_prefix_mode | bool | false | 启用后,避免每轮对话都会变化的系统提示内容(如回忆记忆、标准上下文),从而提高提供商端的提示词缓存命中率。 |
max_cron_jobs | usize | 500 | 所有 Agent 的全局最大定时任务数。 |
workspaces_dir | path 或 null | null | Agent 工作区的根目录。默认为 ~/.librefang/workspaces。包含 Agent 工作目录和 hands/ 子目录(用于用户自定义 hands)。 |
include | list of strings | [] | 配置文件包含列表(相对路径)。详见配置文件包含机制。 |
provider_urls | map of string->string | {} | 提供商基础 URL 覆盖。将提供商 ID 映射到自定义基础 URL(例如 ollama = "http://192.168.1.100:11434/v1")。适用于自托管或代理端点。 |
provider_api_keys | map of string->string | {} | 提供商 API Key 环境变量覆盖。将提供商 ID 映射到存放密钥的环境变量名称(例如 nvidia = "NVIDIA_API_KEY")。未设置时,默认使用 {PROVIDER_UPPER}_API_KEY 的命名约定。 |
provider_regions | map of string->string | {} | 提供商区域选择。将提供商 ID 映射到提供商注册 TOML 中定义的区域名称(例如 qwen = "intl")。覆盖提供商的基础 URL,并可选择性覆盖其 API Key 环境变量。在 provider_urls 之前生效(优先级较低)。 |
tool_timeout_secs | u64 | 300 | 所有工具执行的全局超时(秒)。可通过 [tool_timeouts] 节按工具覆盖。 |
tool_timeouts | map 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"
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
provider | string | "anthropic" | 提供商名称。支持:anthropic、gemini、openai、groq、openrouter、deepseek、together、mistral、fireworks、ollama、vllm、lmstudio、perplexity、cohere、ai21、cerebras、sambanova、huggingface、xai、replicate。 |
model | string | "claude-sonnet-4-20250514" | 模型标识符。别名(如 sonnet、haiku、gpt-4o、gemini-flash)由模型目录自动解析。 |
api_key_env | string | "ANTHROPIC_API_KEY" | 存放 API Key 的环境变量名称。实际密钥在运行时从该环境变量读取,绝不存储在配置文件中。 |
base_url | string 或 null | null | 覆盖 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_path | path 或 null | null | SQLite 数据库文件的显式路径。为 null 时,默认为 {data_dir}/librefang.db。 |
embedding_model | string | "all-MiniLM-L6-v2" | 用于生成语义记忆搜索向量嵌入的模型名称。 |
embedding_provider | string 或 null | null | 嵌入提供商(例如 "openai"、"ollama")。为 null 时自动检测。 |
embedding_api_key_env | string 或 null | null | 存放嵌入提供商 API Key 的环境变量名称。 |
consolidation_threshold | u64 | 10000 | 触发自动整合(合并和清理旧条目)的存储记忆数量阈值。 |
consolidation_interval_hours | u64 | 24 | 记忆整合的运行间隔(小时)。0 = 禁用。 |
decay_rate | f32 | 0.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/
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
enabled | bool | false | 全局开关。为 false 时即使单个 agent 已开启也不会触发。 |
min_hours | f64 | 24.0 | 距离该 agent 上次整固的最小小时数,满足后才会再次触发。 |
min_sessions | u32 | 5 | 距离该 agent 上次整固之后,被触及的最少会话数,满足后才会再次触发。设为 0 则禁用该闸门。 |
check_interval_secs | u64 | 86400 | 兜底调度器的唤醒间隔(秒)。主触发路径是 AgentLoopEnd 钩子,此字段只控制从不 turn 的 agent 的兜底节奏。 |
timeout_secs | u64 | 600 | 单次梦境调用的超时时间(秒)。 |
lock_dir | string | "" | 锁目录的可选覆盖路径。为空则使用 <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_addresses | list of strings | ["/ip4/0.0.0.0/tcp/0"] | 监听的 libp2p 多地址。端口 0 表示自动分配。 |
bootstrap_peers | list of strings | [] | 用于 DHT 发现的引导节点多地址。 |
mdns_enabled | bool | true | 启用 mDNS 以自动发现本地网络中的对等节点。 |
max_peers | u32 | 50 | 最大同时连接的对等节点数。 |
shared_secret | string | ""(空) | OFP HMAC-SHA256 双向认证的预共享密钥。当 network_enabled = true 时必填。通信双方必须使用相同的密钥。日志中会脱敏处理。 |
[web]
配置 Agent 工具使用的网页搜索和网页抓取能力。
[web]
search_provider = "auto"
cache_ttl_minutes = 15
timeout_secs = 15
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
search_provider | string | "auto" | 使用的搜索引擎。见下表。 |
cache_ttl_minutes | u64 | 15 | 搜索/抓取结果的缓存时长(分钟)。0 = 禁用缓存。 |
timeout_secs | u64 | 15 | 所有网页搜索请求的 HTTP 超时时间(秒)。建议:大多数提供商使用 15,Jina 建议使用 30 以上。 |
search_provider 值说明:
| 值 | 说明 |
|---|---|
auto | 级联回退:根据可用的 API Key,依次尝试 Tavily、Brave、Jina、Perplexity、DuckDuckGo。 |
brave | Brave Search API。需要 BRAVE_API_KEY。 |
jina | Jina AI 搜索与信息定位。需要 JINA_API_KEY。 |
tavily | Tavily AI 原生搜索。需要 TAVILY_API_KEY。 |
perplexity | Perplexity AI 搜索。需要 PERPLEXITY_API_KEY。 |
duckduckgo | DuckDuckGo HTML 抓取。无需 API Key。 |
[web.brave]
[web.brave]
api_key_env = "BRAVE_API_KEY"
max_results = 5
country = ""
search_lang = ""
freshness = ""
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
api_key_env | string | "BRAVE_API_KEY" | 存放 Brave Search API Key 的环境变量名称。 |
max_results | usize | 5 | 返回的最大搜索结果数。 |
country | string | "" | 用于本地化结果的国家代码(例如 "US"、"GB")。空值 = 不过滤。 |
search_lang | string | "" | 语言代码(例如 "en"、"fr")。空值 = 不过滤。 |
freshness | string | "" | 时效性过滤。"pd" = 过去一天,"pw" = 过去一周,"pm" = 过去一月。空值 = 不过滤。 |
[web.tavily]
[web.tavily]
api_key_env = "TAVILY_API_KEY"
search_depth = "basic"
max_results = 5
include_answer = true
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
api_key_env | string | "TAVILY_API_KEY" | 存放 Tavily API Key 的环境变量名称。 |
search_depth | string | "basic" | 搜索深度:"basic" 快速返回结果,"advanced" 进行更深入的分析。 |
max_results | usize | 5 | 返回的最大搜索结果数。 |
include_answer | bool | true | 是否在结果中包含 Tavily 的 AI 生成答案摘要。 |
[web.jina]
[web.jina]
api_key_env = "JINA_API_KEY"
max_results = 5
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
api_key_env | string | "JINA_API_KEY" | 存放 Jina AI API Key 的环境变量名称。 |
max_results | usize | 5 | 返回的最大搜索结果数。 |
[web.perplexity]
[web.perplexity]
api_key_env = "PERPLEXITY_API_KEY"
model = "sonar"
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
api_key_env | string | "PERPLEXITY_API_KEY" | 存放 Perplexity API Key 的环境变量名称。 |
model | string | "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_chars | usize | 50000 | 抓取内容返回的最大字符数。超出部分将被截断。 |
max_response_bytes | usize | 10485760(10 MB) | HTTP 响应体的最大大小(字节)。 |
timeout_secs | u64 | 30 | HTTP 请求超时时间(秒)。 |
readability | bool | true | 启用 HTML 到 Markdown 的可读性提取。开启后,抓取的 HTML 会被转换为干净的 Markdown 格式。 |
ssrf_allowed_hosts | 字符串列表 | [] | 豁免 SSRF 拦截的主机/CIDR 列表。支持 CIDR 格式("10.0.0.0/8")、glob 前缀通配符("*.internal.example.com")以及字面 IP 或主机名。云元数据地址段(169.254.0.0/16、100.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_description | bool | true | 启用对传入图片附件的自动描述。 |
audio_transcription | bool | true | 启用对传入音频附件的自动转录。 |
video_description | bool | false | 启用视频描述。默认禁用(耗费大且速度慢)。 |
max_concurrency | usize | 2 | 并发媒体处理任务的最大数量。 |
image_provider | string 或 null | null | 首选的图片描述提供商。为 null 时根据可用提供商自动检测。 |
audio_provider | string 或 null | null | 首选的音频转录提供商。为 null 时根据可用提供商自动检测。 |
[links]
配置自动链接理解功能——自动抓取并总结传入消息中的 URL。
[links]
enabled = false
max_links = 3
max_content_bytes = 102400
timeout_secs = 10
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
enabled | bool | false | 启用自动链接理解。开启后,消息中的 URL 会被抓取并总结其内容,然后再交给 Agent 处理。 |
max_links | usize | 3 | 每条消息处理的最大链接数。多余的链接会被忽略。 |
max_content_bytes | usize | 102400(100 KB) | 每个链接抓取的最大内容大小(字节)。超出部分将被截断。 |
timeout_secs | u64 | 10 | 每个链接的抓取超时时间(秒)。 |
[channels]
所有 45 个通道适配器均在 [channels.<name>] 下配置。每个通道采用 Option<T> 类型——省略该节将完全禁用该适配器。即使只写了节头(内容为空),也会以默认值启用该适配器。
通用通道字段: 每个通道适配器除了自身特有的字段外,还支持以下通用字段:
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
default_agent | string 或 null | null | 默认将消息路由到的 Agent 名称。 |
account_id | string 或 null | null | 当前 Bot 实例的唯一标识符。用于通过 [[bindings]] 匹配规则进行多 Bot 路由。 |
overrides | object | (默认值) | 每个通道的行为覆盖配置。详见通道行为覆盖。 |
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.env:MATRIX_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_SECRET 与 LINE_CHANNEL_ACCESS_TOKEN 需写入 ~/.librefang/secrets.env。
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_SECRET 和 REDDIT_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.env:QQ_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.env:WECOM_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"
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
name | string | 必填 | MCP 服务器的显示名称。工具以 mcp_{name}_{tool} 的命名空间注册。 |
timeout_secs | u64 | 30 | 请求超时时间(秒)。 |
env | list of strings | [] | 传递给子进程的环境变量名称(仅 stdio 传输方式)。 |
传输方式变体(基于 type 的标记联合体):
type | 字段 | 说明 |
|---|---|---|
stdio | command(string)、args(list of strings,默认 []) | 启动子进程,通过 stdin/stdout 上的 JSON-RPC 通信。 |
sse | url(string) | 连接到 HTTP Server-Sent Events 端点。 |
http_compat | base_url(string)、headers(header 配置列表)、tools(工具配置列表) | 内置兼容适配器,用于没有原生 MCP 服务器的纯 HTTP/JSON 工具后端。每个工具映射到一个 HTTP 端点。 |
http_compat header 配置:
| 字段 | 类型 | 说明 |
|---|---|---|
name | string | HTTP 请求头名称(例如 "Authorization")。 |
value | string 或 null | 静态请求头值。 |
value_env | string 或 null | 用作请求头值的环境变量名称(密钥推荐使用此方式)。 |
http_compat 工具配置:
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
name | string | 必填 | 暴露给 LLM 的工具名称。 |
description | string | "" | 展示给 LLM 的工具描述。 |
path | string | 必填 | HTTP 路径(例如 "/search")。 |
method | string | "post" | HTTP 方法:get、post、put、patch、delete。 |
request_mode | string | "json_body" | 参数发送方式:json_body、query、none。 |
response_mode | string | "json" | 响应解析方式:json、text。 |
input_schema | object | {"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"
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
enabled | bool | false | 是否启用 A2A 协议。 |
name | string | "LibreFang Agent OS" | 在 well-known Agent 名片中展示的服务级显示名称。 |
description | string | "" | 在 well-known Agent 名片中展示的服务级描述。 |
listen_path | string | "/a2a" | A2A 端点的 URL 路径前缀。 |
external_agents | list of objects | [] | 要发现和交互的外部 A2A Agent 列表。 |
external_agents 条目:
| 字段 | 类型 | 说明 |
|---|---|---|
name | string | 外部 Agent 的显示名称。 |
url | string | Agent 名片端点 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"
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
provider | string | "" | 提供商名称(例如 "ollama"、"groq"、"openai")。 |
model | string | "" | 该提供商的模型标识符。 |
api_key_env | string | "" | API Key 的环境变量名称。本地提供商(ollama、vllm、lmstudio)留空。 |
base_url | string 或 null | null | 基础 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"
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
name | string | 必填 | 用户显示名称。 |
role | string | "user" | 用户在 RBAC 层级中的角色。 |
channel_bindings | map of string to string | {} | 将通道平台名称映射到平台特定用户 ID,实现跨通道的用户身份绑定。 |
api_key_hash | string 或 null | null | 用户个人 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 = []
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
model | string 或 null | null | 该通道的模型覆盖。为 null 时使用 Agent 的默认模型。 |
system_prompt | string 或 null | null | 该通道的系统提示词覆盖。 |
dm_policy | string | "respond" | Bot 处理私聊消息的方式。见下表。 |
group_policy | string | "mention_only" | Bot 处理群组消息的方式。见下表。 |
rate_limit_per_minute | u32 | 0 | 该通道的全局速率限制(每分钟消息数)。0 = 无限制。 |
rate_limit_per_user | u32 | 0 | 每个用户每分钟的最大消息数。0 = 无限制。 |
threading | bool | false | 启用线程回复(在支持的平台上)。 |
output_format | string 或 null | null | 覆盖输出格式。见下表。 |
usage_footer | string 或 null | null | 覆盖该通道的用量页脚模式。可选值:off、tokens、cost、full。 |
typing_mode | string 或 null | null | 输入状态指示器行为。见下表。默认为 instant。 |
disable_commands | bool | false | 关闭该通道所有内置斜杠命令。被拦截的命令作为普通文本转发给 Agent。 |
allowed_commands | list of strings | [] | 命令名白名单(不带 /)。非空时仅这些命令可用,其他命令转发给 Agent。 |
blocked_commands | list of strings | [] | 命令名黑名单(不带 /)。仅在 allowed_commands 为空时生效。 |
dm_policy 值说明:
| 值 | 说明 |
|---|---|
respond | 回复所有私聊消息(默认)。 |
allowed_only | 仅回复允许列表中用户的私聊消息。 |
ignore | 忽略所有私聊消息。 |
group_policy 值说明:
| 值 | 说明 |
|---|---|
all | 回复群聊中的所有消息。 |
mention_only | 仅在被 @ 提及时回复(默认)。 |
commands_only | 仅回复斜杠命令。 |
ignore | 忽略所有群组消息。 |
output_format 值说明:
| 值 | 说明 |
|---|---|
markdown | 标准 Markdown(默认)。 |
telegram_html | Telegram HTML 子集(<b>、<i>、<code> 等)。 |
slack_mrkdwn | Slack 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"
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
headless | bool | true | 以无头模式运行浏览器(不显示窗口)。 |
viewport_width | u32 | 1280 | 浏览器视口宽度(像素)。 |
viewport_height | u32 | 720 | 浏览器视口高度(像素)。 |
timeout_secs | u64 | 30 | 每个操作的超时时间(秒)。 |
idle_timeout_secs | u64 | 300 | 浏览器会话闲置超过此秒数后自动关闭。 |
max_sessions | usize | 5 | 最大并发浏览器会话数。 |
chromium_path | string 或 null | null | Chromium/Chrome 二进制文件路径。为 null 时自动检测。 |
[reload]
控制配置文件的自动监控和热重载。
[reload]
mode = "hybrid"
debounce_ms = 500
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
mode | string | "hybrid" | 重载模式。见下表。 |
debounce_ms | u64 | 500 | 检测到文件变更后,重载前的防抖窗口时长(毫秒)。 |
mode 值说明:
| 值 | 说明 |
|---|---|
off | 不自动重载。更改需手动重启。 |
restart | 任何配置变更都进行完整守护进程重启。 |
hot | 仅对安全的部分进行热重载(通道、技能、心跳)。 |
hybrid | 尽可能热重载;对需要重启的部分标记提示(默认)。 |
[exec_policy]
控制 Agent 通过 exec 和 shell 工具允许执行的 Shell 命令。
[exec_policy]
mode = "allowlist"
allowed_commands = ["git", "python3", "node"]
timeout_secs = 30
max_output_bytes = 102400
no_output_timeout_secs = 30
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
mode | string | "allowlist" | 安全模式。见下表。 |
safe_bins | list of strings | ["sleep","true","false","cat","sort","uniq","cut","tr","head","tail","wc","date","echo","printf","basename","dirname","pwd","env"] | 始终绕过白名单检查的命令(仅标准输入的 POSIX 工具)。 |
allowed_commands | list of strings | [] | 当 mode = "allowlist" 时额外允许的命令。 |
timeout_secs | u64 | 30 | 每条命令的最大挂钟执行时间(秒)。 |
max_output_bytes | usize | 102400 | stdout+stderr 合并输出的最大大小(字节)。默认 100 KB。 |
no_output_timeout_secs | u64 | 30 | 进程在此秒数内无输出则被终止。0 = 禁用。 |
mode 值说明:
| 值 | 别名 | 说明 |
|---|---|---|
deny | none、disabled | 阻止所有 Shell 执行。 |
allowlist | restricted | 仅允许 safe_bins 或 allowed_commands 中的命令(默认)。 |
full | allow、all、unrestricted | 允许所有命令。不安全——仅限开发使用。 |
[approval]
配置哪些工具在执行前需要明确的人工批准。引用 ApprovalPolicy 类型。
[approval]
require_approval = ["shell_exec"]
timeout_secs = 60
auto_approve_autonomous = false
auto_approve = false
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
require_approval | list of strings | ["shell_exec"] | 需要暂停执行并等待人工批准的工具名称列表。 |
timeout_secs | u64 | 60 | 审批请求的超时时间(秒)。 |
auto_approve_autonomous | bool | false | Agent 处于自主模式时自动批准工具执行。 |
auto_approve | bool | false | 自动批准所有工具执行(不安全,仅限开发使用)。 |
[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_usd | f64 | 0.0 | 所有 Agent 每小时的最大 LLM 费用(美元)。0.0 = 无限制。 |
max_daily_usd | f64 | 0.0 | 所有 Agent 每天的最大 LLM 费用(美元)。0.0 = 无限制。 |
max_monthly_usd | f64 | 0.0 | 所有 Agent 每月的最大 LLM 费用(美元)。0.0 = 无限制。 |
alert_threshold | f64 | 0.8 | 各限额的告警阈值(0.0-1.0 的比例)。设为 0.8 时,达到限额 80% 即记录告警日志。 |
default_max_llm_tokens_per_hour | u64 | 0 | 全局覆盖每个 Agent 的每小时 Token 预算。大于 0 时覆盖所有 Agent 自身的 Token 限制。0 = 保持各 Agent 自身的限制。 |
[thinking]
配置支持扩展思维(思维链推理)的模型(例如启用了 thinking 模式的 Claude 3.7 Sonnet)。
[thinking]
budget_tokens = 10000
stream_thinking = false
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
budget_tokens | u32 | 10000 | 分配给思维/推理阶段的最大 Token 数。 |
stream_thinking | bool | false | 是否将思维 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] 字段:
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
enabled | bool | false | 启用 TTS 合成。 |
provider | string 或 null | null | 默认 TTS 提供商:"openai" 或 "elevenlabs"。 |
max_text_length | usize | 4096 | 单次 TTS 请求的最大文本长度(字符数)。 |
timeout_secs | u64 | 30 | 每次 TTS 调用的请求超时时间(秒)。 |
[tts.openai] 字段:
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
voice | string | "alloy" | 语音名称。可选:alloy、echo、fable、onyx、nova、shimmer。 |
model | string | "tts-1" | TTS 模型:"tts-1"(快速)或 "tts-1-hd"(高质量)。 |
format | string | "mp3" | 输出格式:mp3、opus、aac、flac。 |
speed | f32 | 1.0 | 语速倍率(0.25 到 4.0)。 |
[tts.elevenlabs] 字段:
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
voice_id | string | "21m00Tcm4TlvDq8ikWAM" | ElevenLabs 语音 ID(默认:Rachel)。 |
model_id | string | "eleven_monolingual_v1" | ElevenLabs 模型 ID。 |
stability | f32 | 0.5 | 语音稳定性(0.0-1.0)。越高越稳定,但表现力越低。 |
similarity_boost | f32 | 0.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 = []
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
enabled | bool | false | 启用 Docker 沙箱用于代码执行。 |
image | string | "python:3.12-slim" | 沙箱容器使用的 Docker 镜像。 |
container_prefix | string | "librefang-sandbox" | 容器名称前缀。 |
workdir | string | "/workspace" | 容器内的工作目录。 |
network | string | "none" | 网络模式:"none"(隔离)、"bridge" 或自定义网络名称。 |
memory_limit | string | "512m" | 内存限制(例如 "256m"、"1g")。 |
cpu_limit | f64 | 1.0 | CPU 限制(例如 0.5、1.0、2.0)。 |
timeout_secs | u64 | 60 | 每条命令的最大执行时间(秒)。 |
read_only_root | bool | true | 将根文件系统挂载为只读。 |
mode | string | "off" | 激活模式。见下表。 |
scope | string | "session" | 容器生命周期范围。见下表。 |
reuse_cool_secs | u64 | 300 | 释放的容器在此秒数冷却后才可重用。 |
idle_timeout_secs | u64 | 86400 | 容器闲置超过此秒数后被销毁(默认 24 小时)。 |
max_age_secs | u64 | 604800 | 容器最大存活时间,超时后强制销毁(默认 7 天)。 |
blocked_mounts | list of strings | [] | 禁止绑定挂载到容器的宿主机路径。 |
cap_add | list of strings | [] | 添加到容器的 Linux 能力(例如 ["NET_ADMIN"])。请谨慎使用。 |
tmpfs | list of strings | ["/tmp:size=64m"] | 容器内的 tmpfs 挂载。每个条目格式为 "path:options"(例如 "/tmp:size=128m")。 |
pids_limit | u32 | 100 | 容器内的最大进程数。防止 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 = []
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
enabled | bool | false | 启用 Canvas 工具。 |
max_html_bytes | usize | 524288 | HTML 负载的最大大小(字节)。默认 512 KB。 |
allowed_tags | list of strings | [] | 用于净化的允许 HTML 标签名称。空列表 = 允许所有安全标签。 |
[auto_reply]
配置后台自动回复引擎,可以在无需人工交互的情况下自动回复传入消息。
[auto_reply]
enabled = false
max_concurrent = 3
timeout_secs = 120
suppress_patterns = ["/stop", "/pause"]
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
enabled | bool | false | 启用自动回复引擎。 |
max_concurrent | usize | 3 | 最大并发自动回复任务数。 |
timeout_secs | u64 | 120 | 每个自动回复任务的默认超时时间(秒)。 |
suppress_patterns | list of strings | ["/stop", "/pause"] | 抑制自动回复的传入消息匹配模式。 |
[broadcast]
配置消息广播,将单条传入消息同时路由到多个 Agent。
[broadcast]
strategy = "parallel"
routes = { "announcement-channel" = ["agent-a", "agent-b", "agent-c"] }
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
strategy | string | "parallel" | 投递策略。"parallel" = 同时发送给所有 Agent;"sequential" = 按顺序逐个发送。 |
routes | map of string to list of strings | {} | 将对等方/通道标识符映射到接收消息的 Agent 名称列表。 |
[inbox]
基于文件的异步外部命令输入收件箱。将文本文件放入监控目录后,文件内容会作为消息分发给 Agent。已处理的文件会被移动到 processed/ 子目录以避免重复投递。
[inbox]
enabled = true
directory = "~/.librefang/inbox/"
poll_interval_secs = 5
default_agent = "assistant"
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
enabled | bool | false | 启用收件箱目录监控。 |
directory | string 或 null | null | 监控的目录。默认为 $HOME_DIR/inbox/。支持 ~ 展开。 |
poll_interval_secs | u64 | 5 | 扫描目录新文件的间隔(秒)。最小值 1。 |
default_agent | string 或 null | null | 文件中未找到 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"]
顶层字段:
| 字段 | 类型 | 说明 |
|---|---|---|
agent | string | 匹配的消息路由到的目标 Agent 名称或 ID。 |
match_rule | object | 匹配条件。所有指定的(非空)字段必须全部匹配。 |
match_rule 字段:
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
channel | string 或 null | null | 要匹配的通道类型(例如 "discord"、"telegram"、"slack")。 |
account_id | string 或 null | null | 通道内特定的 Bot 账号 ID(用于多 Bot 场景)。 |
peer_id | string 或 null | null | 用于私聊路由的用户/对等方 ID。 |
guild_id | string 或 null | null | 服务器/Guild ID(Discord/Slack)。 |
roles | list 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"
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
enabled | bool | false | 启用设备配对。 |
max_devices | usize | 10 | 最大配对设备数。 |
token_expiry_secs | u64 | 300 | 配对令牌有效期(秒)。默认 5 分钟。 |
push_provider | string | "none" | 推送通知提供商:"none"、"ntfy" 或 "gotify"。 |
ntfy_url | string 或 null | null | ntfy 服务器 URL(当 push_provider = "ntfy" 时使用)。 |
ntfy_topic | string 或 null | null | 推送通知的 ntfy 主题。 |
[extensions]
配置 MCP 服务器的重连行为和健康监控。
[extensions]
auto_reconnect = true
reconnect_max_attempts = 10
reconnect_max_backoff_secs = 300
health_check_interval_secs = 60
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
auto_reconnect | bool | true | MCP 服务器断开连接时自动重连。 |
reconnect_max_attempts | u32 | 10 | 放弃前的最大重连尝试次数。 |
reconnect_max_backoff_secs | u64 | 300 | 重连尝试之间的最大退避时间(秒)。 |
health_check_interval_secs | u64 | 60 | 已连接扩展的健康检查间隔(秒)。 |
[vault]
配置用于存储敏感密钥的加密凭据库。
[vault]
enabled = true
# path = "~/.librefang/vault.enc"
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
enabled | bool | true | 启用凭据库。如果 vault.enc 已存在则自动检测。 |
path | path 或 null | null | 自定义凭据库文件路径。默认为 ~/.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
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
enabled | bool | false | 启用 Webhook 触发器端点。 |
token_env | string | "LIBREFANG_WEBHOOK_TOKEN" | 存放 Bearer 令牌的环境变量名称(不是令牌本身)。令牌长度必须大于等于 32 个字符。enabled = true 时必填。 |
max_payload_bytes | usize | 65536 | 入站负载的最大大小(字节)。默认 64 KB。 |
rate_limit_per_minute | u32 | 30 | 每个来源 IP 每分钟的最大 Webhook 请求数。 |
[proxy]
配置所有出站连接(LLM API、网页搜索、MCP 服务器等)使用的 HTTP 代理。环境变量 HTTP_PROXY、HTTPS_PROXY 和 NO_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_proxy | string 或 null | null | HTTP 代理 URL。回退到 HTTP_PROXY / http_proxy 环境变量。URL 中的凭据在日志中会被脱敏。 |
https_proxy | string 或 null | null | HTTPS 代理 URL。回退到 HTTPS_PROXY / https_proxy 环境变量。 |
no_proxy | string 或 null | null | 绕过代理的主机/域名逗号分隔列表。回退到 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"
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
name | string | 必填 | 此适配器的显示名称。 |
command | string | 必填 | 要运行的可执行文件(例如 "python3"、"/usr/local/bin/my-adapter")。 |
args | list of strings | [] | 传递给命令的参数。 |
env | map of string to string | {} | 传递给子进程的额外环境变量。 |
channel_type | string 或 null | null | 通道类型标识符。为 null 时默认为 Custom(<name>)。 |
[session]
配置空闲或多余会话的自动清理。
[session]
retention_days = 30
max_sessions_per_agent = 100
cleanup_interval_hours = 24
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
retention_days | u32 | 0 | 空闲会话在自动清理前的最大保留天数。0 = 无限制。 |
max_sessions_per_agent | u32 | 0 | 每个 Agent 的最大会话数(最旧的优先清理)。0 = 无限制。 |
cleanup_interval_hours | u32 | 24 | 后台清理任务的运行间隔(小时)。 |
[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"
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
enabled | bool | true | 终端功能总开关。设为 false 时,终端 WebSocket 端点会被完全禁用。 |
allow_remote | bool | false | 允许来自远程或反向代理的连接。当未配置认证时,还必须同时将 allow_unauthenticated_remote 设为 true,否则连接会被拒绝。默认行为是仅允许本地无认证访问。 |
allow_unauthenticated_remote | bool | false | 强制防呆开关。当 allow_remote = true 且未配置任何认证时,必须显式将本项设为 true 才能对外暴露未认证的 shell;否则即使 allow_remote = true,此类连接也会被拒绝。 |
allowed_origins | list of strings | [] | 除 localhost 之外,允许用于终端 WebSocket 连接的额外浏览器 Origin 列表。适用于 dashboard 部署在自定义域名下的情况。["*"] 表示允许任意 HTTP/HTTPS origin,应仅在明确知情的情况下使用。 |
require_proxy_headers | bool | false | 当为 true 时,没有代理头(X-Forwarded-For、X-Real-IP)的环回连接将被拒绝。仅在使用注入这些头的反向代理时启用。(旧名:trust_proxy_headers,仍作为别名兼容。) |
tmux_enabled | bool | true | 启用基于 tmux 的多窗口终端。仅当系统上存在 tmux 二进制文件时生效。 |
max_windows | u32 | 16 | 最大同时存在的 tmux 窗口数量。用于防止资源耗尽。 |
tmux_binary_path | string 或 null | null | tmux 二进制文件的显式路径。如果为 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_agent | u32 | 0 | 每个 Agent 的最大排队任务数。队列满时新任务被拒绝。0 = 无限制。 |
max_depth_global | u32 | 0 | 所有 Agent 的最大排队任务总数。0 = 无限制。 |
task_ttl_secs | u64 | 3600 | 未处理的任务在此秒数后过期。0 = 无限制。 |
[queue.concurrency] 字段:
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
main_lane | usize | 3 | 并发用户消息任务数。 |
cron_lane | usize | 2 | 并发定时任务数。 |
subagent_lane | usize | 3 | 并发子 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
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
enabled | bool | false | 启用外部认证。 |
issuer_url | string | "" | OIDC 发行者 URL,用于在 {issuer_url}/.well-known/openid-configuration 进行提供商发现。 |
client_id | string | "" | 在身份提供商注册的 OAuth2 客户端 ID。 |
client_secret_env | string | "LIBREFANG_OAUTH_CLIENT_SECRET" | 存放 OAuth2 客户端密钥的环境变量名称。 |
redirect_url | string | "http://127.0.0.1:4545/api/auth/callback" | OAuth2 授权码流程的回调 URL。 |
scopes | list of strings | ["openid","profile","email"] | 请求的 OAuth2 权限范围。 |
allowed_domains | list of strings | [] | 限制登录到这些邮箱域名。空列表 = 允许所有。 |
audience | string | "" | 要验证的 JWT audience 声明。为空时默认使用 client_id。 |
session_ttl_secs | u64 | 86400 | 会话令牌有效期(秒)。默认 24 小时。 |
providers | list of objects | [] | 多个 OIDC/OAuth2 提供商。配置后优先于上述单提供商字段。 |
对于多提供商配置,使用 [[external_auth.providers]],支持以下字段:id、display_name、issuer_url、auth_url、token_url、userinfo_url、jwks_uri、client_id、client_secret_env、redirect_url、scopes、allowed_domains、audience。
[vertex_ai]
配置 Google Cloud Vertex AI 作为 LLM 提供商。
[vertex_ai]
project_id = "my-gcp-project"
region = "us-central1"
credentials_path = "/path/to/service-account.json"
凭据按以下顺序解析:
- 配置中的
credentials_path(JSON 字符串或文件路径) VERTEX_AI_SERVICE_ACCOUNT_JSON环境变量GOOGLE_APPLICATION_CREDENTIALS环境变量(文件路径)gcloud auth print-access-tokenCLI 后备
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
project_id | string 或 null | null | GCP 项目 ID。回退到 VERTEX_AI_PROJECT_ID、GOOGLE_CLOUD_PROJECT,或服务账号 JSON 中的 project_id 字段。 |
region | string 或 null | null | Vertex AI 端点的 GCP 区域。回退到 VERTEX_AI_REGION 或 GOOGLE_CLOUD_REGION 环境变量。默认:"us-central1"。 |
credentials_path | string 或 null | null | GCP 服务账号 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_id | string 或 null | null | 用于 PKCE 流程的 Google OAuth2 客户端 ID。 |
github_client_id | string 或 null | null | 用于 PKCE 流程的 GitHub OAuth 应用客户端 ID。 |
microsoft_client_id | string 或 null | null | Microsoft(Entra ID / Azure AD)OAuth 应用客户端 ID。 |
slack_client_id | string 或 null | null | Slack 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 对象列表的映射:
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
name | string | 必填 | 配置文件名称(例如 "primary"、"secondary")。 |
api_key_env | string | 必填 | 存放该配置文件 API Key 的环境变量名称。 |
priority | u32 | 0 | Key 选择优先级。值越小越优先。 |
[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_rules | list of ToolPolicyRule | [] | 每个 Agent 的工具规则(最高优先级,最先检查)。 |
global_rules | list of ToolPolicyRule | [] | 应用于所有 Agent 的全局工具规则(在 agent 规则之后检查)。 |
groups | list of ToolGroup | [] | 命名工具组,便于在规则中重用。 |
subagent_max_depth | u32 | 10 | 子 Agent 最大生成深度。 |
subagent_max_concurrent | u32 | 5 | 最大并发子 Agent 数。 |
ToolPolicyRule 字段:
| 字段 | 类型 | 说明 |
|---|---|---|
pattern | string | 匹配工具名称的 Glob 模式(例如 "shell_*"、"web_*"、"mcp_github_*")。 |
effect | string | "allow" 或 "deny"。拒绝优先:只要有任何 deny 规则匹配,该工具就会被阻止,无论是否有 allow 规则。 |
ToolGroup 字段:
| 字段 | 类型 | 说明 |
|---|---|---|
name | string | 组名(例如 "web_tools"、"code_tools")。 |
tools | list 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_secs | u64 | 300 | 所有工具执行的全局超时(秒)。对于浏览器自动化或长时间运行的构建,请增加此值。 |
tool_timeouts | map of string->u64 | {} | 每个工具的超时覆盖。键是精确的工具名称或 glob 模式(例如 "mcp_browser_*")。精确匹配优先于 glob 模式;在多个 glob 模式中,最长的匹配模式获胜(最具体的优先)。当没有匹配项时,回退到 tool_timeout_secs。 |
解析顺序:
tool_timeouts中的精确工具名称匹配tool_timeouts中最长的匹配 glob 模式- 全局
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
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
enabled | bool | true | 主开关——为 false 时整个主动记忆子系统被禁用。 |
auto_memorize | bool | true | 每次 Agent 执行后自动提取并存储记忆。 |
auto_retrieve | bool | true | 每次 Agent 执行前自动检索相关记忆。 |
max_retrieve | usize | 10 | 每次查询检索的最大记忆数。 |
extraction_threshold | f32 | 0.7 | 近似重复检测的置信度阈值(0.0-1.0)。 |
extraction_model | string 或 null | null | 用于提取的 LLM 模型。支持 提供商/模型 格式(如 "anthropic/claude-haiku-4")、提供商:模型 格式,或裸模型名(使用默认提供商)。为 null 时使用基于规则的提取。没有单独的 extraction_provider 字段。 |
extract_categories | list of strings | ["user_preference", "important_fact", "task_context", "relationship"] | 从对话中提取的类别。 |
session_ttl_hours | u32 | 24 | 会话记忆的 TTL(小时)。超过此时间的记忆在每次 Agent 执行前被清理。 |
duplicate_threshold | f32 | 0.5 | 重复检测的相似度阈值(0.0-1.0)。有嵌入向量时使用余弦相似度,否则回退到 Jaccard 词重叠。 |
confidence_decay_rate | f64 | 0.01 | 每天的置信度衰减率。遵循指数衰减:conf x e^(-rate x days)。默认 0.01 约 70 天减半。 |
max_memories_per_agent | usize | 1000 | 每个 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"
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
engine | string | "default" | 内置引擎名称。目前仅支持 "default"。 |
plugin | string 或 null | null | 插件名称。解析为 ~/.librefang/plugins/<name>/plugin.toml。设置时优先于手动 hooks。 |
hooks.ingest | string 或 null | null | ingest 钩子的脚本路径(在收到新用户消息时调用)。 |
hooks.after_turn | string 或 null | null | after_turn 钩子的脚本路径(在每轮对话完成后调用)。 |
hooks.runtime | string 或 null | "python" | 运行钩子脚本的启动器。可选:python、native(直接执行预编译二进制)、v、node、deno、go、ruby、bash、bun、php、lua。未知值回退到 python 并打印 warning。 |
plugin_registries | list 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)默认带了 python、node、bash、native,开箱即用。其他 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_days | u32 | 90 | 审计日志条目的保留天数。0 = 无限期保留。 |
[health_check]
配置 LLM 提供商的定期健康检查。
[health_check]
health_check_interval_secs = 60
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
health_check_interval_secs | u64 | 60 | 提供商健康检查的间隔(秒)。 |
[plugins]
配置额外的插件注册表,用于搜索可安装的上下文引擎插件。
[plugins]
plugin_registries = ["acme-corp/librefang-plugins"]
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
plugin_registries | list 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
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
enabled | bool | false | 总开关。关闭时不追踪 prompt 版本,不运行实验 |
hash_prompts | bool | true | 计算 prompt 内容哈希用于去重 |
max_versions_per_agent | u32 | 50 | 每个 agent 最大 prompt 版本数,超出后自动清理最旧的非活跃版本 |
环境变量
以下是配置中引用的所有环境变量的完整表格。这些变量不由配置文件本身读取——它们在运行时由内核和通道适配器读取。
LLM 提供商密钥
| 变量 | 使用者 | 说明 |
|---|---|---|
ANTHROPIC_API_KEY | [default_model] | Anthropic API Key(Claude 系列模型)。 |
GEMINI_API_KEY | Gemini 驱动 | Google Gemini API Key。别名:GOOGLE_API_KEY。 |
OPENAI_API_KEY | OpenAI 兼容驱动 | OpenAI API Key。 |
GROQ_API_KEY | Groq 提供商 | Groq API Key(快速 Llama 推理)。 |
DEEPSEEK_API_KEY | DeepSeek 提供商 | DeepSeek API Key。 |
PERPLEXITY_API_KEY | Perplexity 提供商 / 网页搜索 | Perplexity API Key。 |
OPENROUTER_API_KEY | OpenRouter 提供商 | OpenRouter API Key。 |
TOGETHER_API_KEY | Together AI 提供商 | Together AI API Key。 |
MISTRAL_API_KEY | Mistral 提供商 | Mistral AI API Key。 |
FIREWORKS_API_KEY | Fireworks 提供商 | Fireworks AI API Key。 |
COHERE_API_KEY | Cohere 提供商 | Cohere API Key。 |
AI21_API_KEY | AI21 提供商 | AI21 Labs API Key。 |
CEREBRAS_API_KEY | Cerebras 提供商 | Cerebras API Key。 |
SAMBANOVA_API_KEY | SambaNova 提供商 | SambaNova API Key。 |
HUGGINGFACE_API_KEY | Hugging Face 提供商 | Hugging Face Inference API Key。 |
XAI_API_KEY | xAI 提供商 | xAI (Grok) API Key。 |
REPLICATE_API_KEY | Replicate 提供商 | 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_TOKEN | Telegram | 从 @BotFather 获取的 Bot API 令牌。 |
DISCORD_BOT_TOKEN | Discord | Discord Bot 令牌。 |
SLACK_APP_TOKEN | Slack | Slack 应用级令牌(xapp-),用于 Socket Mode。 |
SLACK_BOT_TOKEN | Slack | Slack Bot 令牌(xoxb-),用于 REST API。 |
WHATSAPP_ACCESS_TOKEN | WhatsApp Cloud API 访问令牌。 | |
WHATSAPP_VERIFY_TOKEN | Webhook 验证令牌。 | |
MATRIX_ACCESS_TOKEN | Matrix | Matrix 家服务器访问令牌。 |
EMAIL_PASSWORD | 邮箱密码或应用专用密码。 | |
TEAMS_APP_PASSWORD | Teams | Azure Bot Framework 应用密码。 |
MATTERMOST_TOKEN | Mattermost(sidecar) | Mattermost Bot 令牌(sidecar 适配器 —— 写入 ~/.librefang/secrets.env)。 |
TWITCH_OAUTH_TOKEN | Twitch | Twitch OAuth 令牌。 |
ROCKETCHAT_TOKEN | Rocket.Chat (sidecar) | Rocket.Chat 个人访问令牌(sidecar 适配器 —— 写入 ~/.librefang/secrets.env)。 |
ZULIP_API_KEY | Zulip (sidecar) | Zulip Bot API Key(sidecar 适配器——写入 ~/.librefang/secrets.env)。 |
XMPP_PASSWORD | XMPP | XMPP 账号密码。 |
GOOGLE_CHAT_SERVICE_ACCOUNT | Google Chat | 服务账号 JSON 密钥。 |
LINE_CHANNEL_SECRET | LINE (sidecar) | LINE Channel Secret(sidecar 适配器 —— 写入 ~/.librefang/secrets.env)。 |
LINE_CHANNEL_ACCESS_TOKEN | LINE (sidecar) | LINE Channel Access Token(librefang.sidecar.adapters.line)。 |
REDDIT_CLIENT_SECRET | Reddit 应用客户端密钥。 | |
REDDIT_PASSWORD | Reddit Bot 账号密码。 | |
MASTODON_ACCESS_TOKEN | Mastodon | Mastodon 访问令牌。 |
BLUESKY_APP_PASSWORD | Bluesky | Bluesky 应用密码。 |
FEISHU_APP_SECRET | Feishu | 飞书/Lark 应用密钥。 |
REVOLT_BOT_TOKEN | Revolt | Revolt Bot 令牌。 |
NEXTCLOUD_TOKEN | Nextcloud (sidecar) | Nextcloud Talk 应用密码 / OAuth bearer(librefang.sidecar.adapters.nextcloud)。 |
GUILDED_BOT_TOKEN | Guilded | Guilded Bot 令牌。 |
KEYBASE_PAPERKEY | Keybase | Keybase 纸钥匙。 |
THREEMA_SECRET | Threema | Threema Gateway API 密钥。 |
WEBEX_BOT_TOKEN | Webex (sidecar) | Webex Bot Bearer 令牌(librefang.sidecar.adapters.webex)。 |
PUMBLE_BOT_TOKEN | Pumble | Pumble Bot 令牌。 |
FLOCK_BOT_TOKEN | Flock | Flock Bot 令牌。 |
TWIST_TOKEN | Twist | Twist API 令牌。 |
MUMBLE_PASSWORD | Mumble | Mumble 服务器密码。 |
DINGTALK_APP_KEY | DingTalk | 钉钉 App Key / Client ID(sidecar 适配器 librefang.sidecar.adapters.dingtalk,仅 stream 模式)。 |
DINGTALK_APP_SECRET | DingTalk | 钉钉 App Secret / Client Secret(sidecar 适配器 librefang.sidecar.adapters.dingtalk,仅 stream 模式)。 |
GITTER_TOKEN | Gitter | Gitter 认证令牌。 |
NTFY_TOKEN | ntfy | ntfy 认证令牌(公共主题可选)。 |
GOTIFY_APP_TOKEN | Gotify | Gotify 应用令牌(发送)。 |
GOTIFY_CLIENT_TOKEN | Gotify | Gotify 客户端令牌(接收)。 |
WEBHOOK_SECRET | Webhook | 用于 Webhook 验证的 HMAC 签名密钥。 |
配置校验
KernelConfig::validate() 在启动时运行,返回一组警告(非致命错误)。内核仍会启动,但会逐条记录警告日志。
校验范围
对于每个已启用的通道(即其配置节存在于 TOML 中),校验器会检查对应的环境变量是否已设置且非空:
| 通道 | 检查的环境变量 |
|---|---|
| Telegram | bot_token_env |
| Discord | bot_token_env |
| Slack | app_token_env、bot_token_env(两者都检查) |
access_token_env | |
| Matrix | access_token_env |
password_env | |
| Teams | app_password_env |
| Mattermost | token_env |
| Google Chat | service_account_env |
| XMPP | password_env |
client_secret_env | |
| Mastodon | access_token_env |
| Bluesky | app_password_env |
| Feishu | app_secret_env |
| Revolt | bot_token_env |
| Guilded | bot_token_env |
| Keybase | paperkey_env |
| Threema | secret_env |
| Pumble | bot_token_env |
| Flock | bot_token_env |
| Twist | token_env |
| Mumble | password_env |
| DingTalk | sidecar — 由 librefang.sidecar.adapters.dingtalk 的 DINGTALK_APP_KEY / DINGTALK_APP_SECRET env 检查负责 |
| Gitter | token_env |
| ntfy | token_env(仅当 token_env 非空时;公共主题无需认证) |
| Gotify | app_token_env |
| Webhook | secret_env |
对于网页搜索提供商,校验器检查:
| 提供商 | 检查的环境变量 |
|---|---|
brave | web.brave.api_key_env |
jina | web.jina.api_key_env |
tavily | web.tavily.api_key_env |
perplexity | web.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_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 摘要的最大重试次数。 |
WASM 沙箱(运行时)
通过 SandboxConfig 内部配置(目前未在 config.toml 中暴露):
| 字段 | 默认值 | 说明 |
|---|---|---|
fuel_limit | 1000000 | 最大 CPU 指令预算。0 = 无限制。 |
max_memory_bytes | 16777216(16 MB) | WASM 线性内存上限。 |
timeout_secs | null(回退 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_threshold | 100 | Token 数低于此值的查询被归类为简单查询。 |
complex_threshold | 500 | Token 数高于此值的查询被归类为复杂查询。 |
自主模式护栏(Agent 清单)
在 Agent 清单中通过 AutonomousConfig 配置:
| 字段 | 默认值 | 说明 |
|---|---|---|
quiet_hours | null | 静默时段的 Cron 表达式(Agent 在此时间窗口暂停)。 |
max_iterations | 50 | 每次调用的最大工具使用迭代次数。 |
max_restarts | 10 | 永久停止前的最大自动重启次数。 |
heartbeat_interval_secs | 30 | 心跳健康检查的间隔(秒)。 |
heartbeat_channel | null | 发送心跳状态的通道(例如 "telegram")。 |