Local branch had diverged from origin/master (sibling commits on the same base). Rewrote local history linearly on top of origin/master, folding in all local content: exa/hot-platform discovery hunters, leaks ledger, nightly sweep orchestrator, updated .gitignore and skill docs, plus the latest hunt output and vault state. Remote-only files (vault keys, channel scripts) were restored rather than dropped, so the resulting tree is a full union of both sides.
1 line
716 KiB
JSON
1 line
716 KiB
JSON
{"repo": "ai1379/nahida-bot", "files": {"config.yaml": {"64963d80b74a9f103ae27ce983eb90cc18051040": {"t": 1785746309.283075, "n": 15635, "h": "ccd3d59b1ee247a2", "c": "# Nahida Bot 配置文件\n# 参见 nahida_bot.core.config.Settings 了解所有可用字段\n\n# ── 应用 ──────────────────────────────────────────────\napp_name: \"Nahida Bot\"\ndebug: false\nlog_level: \"INFO\" # DEBUG / INFO / WARNING / ERROR(控制台级别)\n# log_json: true # 设为 true 输出 JSON 格式日志(生产环境推荐)\n# 可复盘基线(agent-loop 修复 Phase 0):默认把应用日志落盘到 JSON Lines 文件,\n# 文件级别 DEBUG 以便保留 agent_loop.run_completed 的 terminal_state/reason、\n# provider 协议异常、context 来源等字段。控制台仍保持 INFO,不被 DEBUG 刷屏。\nlog_file: \"./data/logs/nahida.log\"\nlog_file_level: \"DEBUG\"\nlog_file_json: true\n# 按文件大小滚动日志:单文件达到 log_file_max_bytes 后轮转,最多保留\n# log_file_backup_count 个历史备份(nahida.log.1、nahida.log.2 …)。\n# max_bytes=0 表示不滚动(日志文件会无限增长)。默认 10 MiB × 5 份。\nlog_file_max_bytes: 10485760 # 单个日志文件上限(字节),0 = 不滚动\nlog_file_backup_count: 5 # 保留的滚动备份数\ndependency_log_level: \"WARNING\" # 三方库默认日志级别;避免 DEBUG 时被 httpx/websockets 等刷屏\n# logger_levels: # 可选:按 logger 名覆盖(注意:会同时作用于控制台与文件)\n# nahida_bot.agent: \"DEBUG\"\n# plugin.rss-notifier: \"DEBUG\"\n# httpx: \"WARNING\"\n\n# ── 服务器 ────────────────────────────────────────────\nhost: \"127.0.0.1\"\nport: 6185\n\n# ── 数据库 ────────────────────────────────────────────\ndb_path: \"./data/nahida.db\"\n\n# ── Workspace ─────────────────────────────────────────\nworkspace_base_dir: \"./data/workspace\"\n\n# ── 插件 ──────────────────────────────────────────────\nplugin_paths:\n - \"./plugins\"\n\n# ── Agent / Router ────────────────────────────────────\nsystem_prompt: \"You are a helpful assistant.\"\n\n# ── LLM Providers(dict 格式,key 即 provider id)───\n# 默认配置已经是多 provider。每个 provider 有独立的 api_key、base_url 和 models。\n# models 的第一个元素是该 provider 的默认模型;每个模型可以是字符串,\n# 也可以是 {name, tags, capabilities} 对象。通过 /model 命令可在聊天中切换模型。\n#\n# 没有配置 api_key 的 provider 会在启动时被跳过;因此可以只填写实际使用的后端。\nproviders:\n deepseek-main:\n type: deepseek\n api_key: \"${DEEPSEEK_LLM_API_KEY:}\"\n base_url: \"${DEEPSEEK_LLM_BASE_URL:https://api.deepseek.com}\"\n # 内部使用 SSE 接收并聚合,可避免长推理期间普通读超时误判。\n stream_responses: true\n # thinking_enabled: false # 关闭 DeepSeek thinking mode\n models:\n - name: \"deepseek-v4-pro\"\n tags: [primary]\n - name: \"deepseek-v4-flash\"\n tags: [cheap, memory]\n\n siliconflow:\n type: \"openai-compatible\"\n api_key: \"${SILICONFLOW_LLM_API_KEY:}\"\n base_url: \"${SILICONFLOW_LLM_BASE_URL:https://api.siliconflow.cn/v1}\"\n merge_system_messages: true\n stream_responses: true\n models:\n - name: \"Qwen/Qwen3-Embedding-8B\"\n tags: [embedding]\n - name: \"Pro/zai-org/GLM-5\"\n tags: [vision]\n - name: \"Qwen/Qwen3.6-35B-A3B\"\n tags: [vision]\n capabilities:\n image_input: true\n max_image_count: 4\n max_image_bytes: 10485760\n\n minimax:\n type: minimax\n api_key: \"${MINIMAX_LLM_API_KEY:}\"\n base_url: \"https://api.minimaxi.com/anthropic\"\n max_tokens: 16000\n stream_responses: true\n models:\n - name: \"MiniMax-M2.5\"\n tags: [cheap]\n - name: \"MiniMax-M2.7\"\n - name: \"MiniMax-M3\"\n\n # OpenAI Responses API(可选)\n # 使用 /responses 端点,支持内置工具(web_search、image_generation 等)\n # 和有状态对话链(previous_response_id)。Reasoning 摘要可通过\n # reasoning_effort 参数控制深度。\n # stream_responses=true 时同样在 provider 内部流式接收并聚合返回。\n openai:\n type: \"openai-responses\"\n api_key: \"${OPENAI_API_KEY:}\"\n base_url: \"${OPENAI_API_BASE_URL:https://api.openai.com/v1}\"\n store_responses: true\n use_previous_response_id: false\n stream_responses: true\n reasoning_effort: \"medium\"\n # built_in_tools: [\"web_search\", \"image_generation\"]\n models:\n - name: \"gpt-5.4\"\n capabilities:\n image_input: true\n image_generation: true\n web_search: true\n tool_calling: true\n reasoning: true\n\ndefault_provider: deepseek-main # 可选,默认使用 providers 中的第一个 key\n\n# ── 多模态 / 图片理解 ─────────────────────────────────\n# image_fallback_mode:\n# auto: 主模型不支持 image_input 时,自动调用 fallback vision 模型生成描述\n# tool: 主模型不支持 image_input 时,注入 image_understand 工具,由主模型按需调用\n# off: 不处理图片,只保留普通文本\n# media_context_policy:\n# cache_aware: 最近图片尽量保留原生内容块,旧图片降级为描述\n# native_recent: 仅最近图片保留原生内容块\n# description_only: 历史图片只使用描述\nmultimodal:\n image_fallback_mode: \"auto\"\n media_context_policy: \"cache_aware\"\n image_fallback_provider: \"\" # Legacy;建议把 provider 写进 image_fallback_model\n image_fallback_model: \"siliconflow/Qwen/Qwen3.6-35B-A3B\"\n max_images_per_turn: 4\n max_image_bytes: 10485760\n media_cache_ttl_seconds: 3600\n\n# ── 插件配置 ──────────────────────────────────────────\n# Settings 的 extra=\"allow\" 机制:顶层 key 如果不是已知字段,\n# 且值为 dict,则按 plugin id 匹配。enabled 由框架消费,其余字段注入插件配置。\n\nbuiltin-commands:\n # send_local_attachment 默认只允许发送 active workspace 内的相对路径。\n # 如确实需要发送工作区外的本地文件,可打开下面开关。\n allow_external_attachment_paths: false\n # 可选白名单目录;为空表示打开上方开关后允许任意绝对路径。\n # external_attachment_roots:\n # - \"<absolute-directory>\"\n external_attachment_roots: []\n\n# OpenAI-compatible 图片生成(可选)\n# 启用后注册 /draw、/生图 命令和 image_generate tool。\n# image_generation:\n# enabled: true\n# provider: default\n# backends:\n# default:\n# type: openai-images\n# api_key: \"${IMAGE_API_KEY}\"\n# base_url: \"${IMAGE_BASE_URL}\"\n# model: \"gpt-image-1\"\n# timeout_seconds: 600\n# download_timeout_seconds: 120\n# trust_env: false\n# force_close_connections: true\n# output_dir: \"generated/images\"\n# auto_send: true\n# max_images_per_24h: 20\n\ngithub-notifier:\n # 目标仓库;保持 OWNER/REPO 时插件会视为未配置,不会启动 webhook/polling。\n repo: \"OWNER/REPO\"\n # typed chat address 列表,例如 milky:group:123456789 或 telegram:private:123456789。\n target_chat_addresses: []\n webhook:\n enabled: true\n path: \"github\" # 最终路径: /webhooks/github\n secret: \"${GITHUB_WEBHOOK_SECRET:}\"\n polling:\n enabled: true # webhook 不可用时的 fallback;首次轮询只建立基线\n interval_seconds: 60\n api_base_url: \"https://api.github.com\"\n token: \"${GITHUB_TOKEN:}\" # 私有仓库或更高 rate limit 时填写\n registration:\n enabled: false # 开启后可在聊天中使用 /github_watch 动态订阅\n\n# RSS/Atom 订阅通知(外部插件 plugins/rss-notifier)\n# rss-notifier:\n# enabled: true\n# # 默认推送目标;feed 未设置 target_chat_addresses 时使用这里。\n# target_chat_addresses:\n# - \"milky:group:123456789\"\n# feeds:\n# - url: \"https://example.com/feed.xml\"\n# title: \"Example\"\n# polling:\n# enabled: true\n# interval_seconds: 300\n# rendering:\n# mode: \"standard\" # compact / standard / rich\n# max_text_chars: 500\n# max_paragraphs: 3\n# include_images: true\n# max_images: 1\n# send_image_attachments: true # 下载图片并作为 photo 附件发送;失败时退化为图片链接\n# max_image_bytes: 5000000\n# registration:\n# enabled: true # 开启后可在聊天中使用 /rss_sub 动态订阅\n\nconversation_joiner:\n # 主动入话题默认关闭。开启前需要对应群频道启用 group_context_capture,\n # 让未触发消息先进入 MessageObserved。\n enabled: false\n model: cheap # model spec;没有 cheap tag 时可改成 provider/model,或留空使用默认模型\n threshold: 0.75\n max_context_messages: 12\n max_context_chars: 3000\n cooldown_seconds: 300\n max_triggers_per_hour: 3\n debounce_seconds: 20\n decision_timeout_seconds: 8\n persona_context:\n enabled: true # 启用后秘书模型会读取 workspace 中的人设文件辅助判断是否自然入话题\n files:\n - SOUL.md\n max_chars: 4000 # 注入秘书模型的人设上下文总字符上限\n cache_ttl_seconds: 60 # persona 文件缓存时间,避免每条候选消息都读文件\n prefilter:\n ignore_commands: true\n ignore_mentions: true\n min_text_chars: 4\n keyword_hints: []\n sample_rate: 0.15 # 普通候选消息进入秘书模型的采样概率\n keyword_sample_rate: 1.0 # 命中 keyword_hints 后进入秘书模型的采样概率\n groups: {}\n # groups:\n # milky:group:123456789:\n # enabled: true\n # threshold: 0.78\n # cooldown_seconds: 300\n engagement:\n enabled: false # 打开后进入 observing/joining/engaged/cooling 状态机\n join_state_ttl_seconds: 600\n idle_exit_seconds: 180\n max_engaged_seconds: 1800\n response_cooldown_seconds: 45\n engagement_score_alpha: 0.2\n engagement_score_exit_threshold: 0.2\n score_decay_half_life_seconds: 600\n score_decay_floor: 0.0\n batching:\n window_seconds: 8 # 后续群消息进入 batch 的短窗口\n max_messages: 6 # 窗口内消息过多时提前 flush\n max_chars: 2000\n flush_on_mention: true\n continue_gate:\n enabled: true # 每个 flushed batch 交给秘书模型判断是否继续接话\n model: cheap\n threshold: 0.55\n min_messages: 1\n evaluate_interval_seconds: 8\n exit_gate:\n enabled: true\n low_value_threshold: 0.35\n low_value_strikes: 3\n min_messages_per_window: 1\n activity_window_seconds: 120\n\ntelegram:\n enabled: true\n bot_token: \"${TELEGRAM_BOT_TOKEN:}\"\n # group_trigger_mode: \"always\" # none / mention / command / always\n # group_context_capture: false # mention/command 模式下,是否记录未触发群消息作为上下文\n # reply_to_inbound: null # true/false 覆盖 router.reply_to_inbound;null/省略表示跟随全局\n # proxy: \"${TELEGRAM_PROXY:}\" # SOCKS5/HTTP 代理,如 socks5://127.0.0.1:1080\n # polling_timeout: 30\n # allowed_chats: []\n\n# Milky QQ Channel(可选)\n# 启用前请先启动 Lagrange.Milky,并确保 nahida_bot/channels/milky/plugin.yaml\n# 可被内置 channel discovery 扫描到。保持注释状态不会启用 Milky。\n#\n# milky:\n# enabled: true\n# base_url: \"http://127.0.0.1:3000\"\n# access_token: \"${MILKY_ACCESS_TOKEN:}\"\n# api_prefix: \"/api\"\n# event_path: \"/event\"\n# # ws_url: \"ws://127.0.0.1:3000/event\" # 可选:覆盖由 base_url 推导出的 WS 地址\n# command_prefix: \"/\"\n# group_trigger_mode: \"mention\" # none / mention / command / always\n# group_context_capture: false # true 时,未触发群消息只记录为上下文,可供 conversation_joiner 判断\n# reply_to_inbound: null # true/false 覆盖 router.reply_to_inbound;null/省略表示跟随全局\n# allowed_friends: [] # QQ 号白名单;空列表表示不限制\n# allowed_groups: [] # 群号白名单;空列表表示不限制\n# connect_timeout: 10.0\n# heartbeat_timeout: 30.0\n# reconnect_initial_delay: 1.0\n# reconnect_max_delay: 30.0\n# send_retry_attempts: 3\n# send_retry_backoff: 1.0\n# max_text_length: 4000\n# media_download_dir: \"./data/temp/media\"\n# enable_media_download_tool: true\n# resource_url_ttl_hint: 300\n# cache_media_on_receive: true\n# max_forward_depth: 3\n# max_forward_messages: 80\n# forward_render_max_chars: 12000\n# scene_cache_size: 4096\n\n# ── Agent Loop ──────────────────────────────────────────\n# 控制 Agent 循环的行为:迭代轮数、超时、重试策略等。\n# 以下均为默认值,不写则使用默认值。\n#\n# agent:\n# max_steps: 8 # 最大工具调用迭代轮数\n# provider_timeout_seconds: 120.0 # 单次 LLM 调用超时(秒)\n# retry_attempts: 2 # LLM 调用重试次数\n# retry_backoff_seconds: 0.2 # 重试退避间隔(秒)\n# tool_timeout_seconds: 135.0 # 工具执行超时(秒)\n# tool_retry_attempts: 1 # 工具执行重试次数\n# tool_retry_backoff_seconds: 0.1 # 工具重试退避间隔(秒)\n# max_tool_log_chars: 400 # 工具日志截断长度\n# # tool_use_system_prompt: \"...\" # 注入的工具使用提示\n# # provider_error_template: \"...\" # Provider 错误消息模板\n\n# ── Agent Runtime(canonical ledger,修复 #24 地基)─────────\n# Phase 1:best-effort 把每个 run 的 canonical 事件流与执行回执落库(附加双写,\n# 不改对外行为)。reading/重放端属 Phase 5。默认代码里为 false;这里置 true 以采集数据。\nagent_runtime:\n canonical_ledger_enabled: true\n # Phase 5:把每个 run 的有序 tool transcript 落到 agent_runs.transcript_json,\n # 下一轮由 TranscriptProjector 投影成成对 tool_use/tool_result 注入历史,\n # 替代被剥离的纯文本叙述(#24 根因)。默认代码里为 false;这里置 true 采集数据。\n # 旧 run(无 transcript_json)自动回退到原文本历史路径。\n transcript_replay_enabled: true\n\n# ── Context Budget ──────────────────────────────────────\n# 控制未知模型 fallback 上下文窗口和 reasoning chain 预算。\n# 模型声明 providers.*.models[].capabilities.context_window 时优先使用模型窗口。\n# 以下均为默认值,不写则使用默认值。\n#\n# context:\n# max_tokens: 272000 # 未声明模型窗口时的 fallback context window\n# reserved_tokens: 10000 # 未声明模型窗口时为输出保留的 token\n# # max_chars: null # 字符数上限(兼容旧逻辑,优先使用 max_tokens)\n# # reserved_chars: 0 # 字符保留数\n# summary_max_chars: 2000 # 历史摘要最大字符数\n# reasoning_policy: \"budget\" # strip / append / budget\n# max_reasoning_tokens: 2000 # reasoning chain token 预算\n\n# ── Identity / delegated authorization ────────────────\n# Identity must be enabled for the privileged-tool gate and tickets to apply.\n# Admins are authenticated account keys assembled from channel + account id;\n# being linked to a Person does not make an account an admin.\n#\n# identity:\n# enabled: false\n# admins:\n# - channel: \"milky\"\n# platform_account_id: \"123456789\"\n# authorization_tickets:\n# enabled: false # explicit opt-in\n# challenge_ttl_seconds: 600 # requester waits for admin approval\n# grant_ttl_seconds: 300 # approved one-use grant lifetime\n# max_grant_ttl_seconds: 900 # hard cap for /auth approve TTL\n\n# ── Scheduler ──────────────────────────────────────────\n# 控制定时任务调度行为。\n# 以下均为默认值,不写则使用默认值。\n#\n# scheduler:\n# poll_interval_seconds: 1.0 # 调度轮询间隔(秒)\n# max_concurrent_fires: 5 # 最大并发执行数\n# job_timeout_seconds: 120.0 # 单任务超时(秒)\n# min_interval_seconds: 60 # cron 最小间隔\n# max_prompt_chars: 12000 # 定时任务 prompt 最大字符数\n# max_jobs_per_chat: 20 # 每个会话最大任务数\n# failure_retry_seconds: 300 # 失败重试等待(秒)\n# max_consecutive_failures: 3 # 连续失败上限\n# memory_dreaming_enabled: true # 是否启用内部记忆 dreaming\n# memory_dreaming_interval_seconds: 3600 # dreaming 周期(秒)\n# memory_dreaming_initial_delay_seconds: 300 # 启动后首次 dreaming 延迟\n# memory_dreaming_session_limit: 20 # 单次最多扫描会话数\n# memory_dreaming_recent_turn_limit: 40 # 单会话最多读取 turns 数\n# memory_dreaming_provider_id: \"\" # Legacy;建议改用 memory_dreaming_model\n# memory_dreaming_model: \"\" # model spec;空则默认找 memory tag,失败后走会话模型\n\n# ── Router ─────────────────────────────────────────────\n# 控制消息路由行为。system_prompt 使用顶层 system_prompt 字段。\n# 以下均为默认值,不写则使用默认值。\n#\n# router:\n# # system_prompt: \"...\" # 与顶层 system_prompt 重复,优先使用顶层字段\n# max_history_turns: 200 # 最大历史轮数\n# agent_enabled: true # 是否启用 Agent\n# command_timeout_seconds: 30.0 # 命令执行超时(秒)\n# command_timeout_message: \"Command timed out. Please try again later.\"\n# reply_to_inbound: true # 默认是否引用回复触发消息;平台插件可覆盖\n# group_context:\n# enabled: true # 是否在触发时注入 observed-only 群上下文\n# max_messages: 20 # 最多注入最近多少条未触发群消息\n# ttl_seconds: 900 # 只注入最近 N 秒内的群上下文;0 表示不按时间过滤\n# max_chars: 4000 # 群上下文注入块最大字符数\n# topic_gap_seconds: 300 # 群消息静默超过此值视为新话题;0 关闭\n# continuity_gap_seconds: 1800 # 对话连续性判定(秒):当前触发与上次对话 turn 间隔超过此值则视为新对话,丢弃旧 history;0 关闭\n\n# ── Model Tags / Specs ─────────────────────────────────\n# providers 的 models 中用 tags 字段标记模型角色:\n# primary / cheap / memory / embedding / reranker / vision\n# 需要内部模型的配置项都接受一个 model spec 字符串;这个字符串可以是 tag,\n# 也可以是 provider/model 或裸模型名。\n\n# ── Memory ─────────────────────────────────────────────\n# 长期记忆检索和 embedding 配置。默认只启用 SQLite FTS;vector/hybrid\n# 需要显式开启,并在 providers.models 中配置带 embedding tag 的模型。\n#\n# memory:\n# enabled: true\n# retrieval:\n# fts_enabled: true\n# vector_enabled: false # 开启后对长期记忆使用 hybrid 检索\n# hybrid_enabled: true\n# vector_backend: json # json / sqlite-vec / none\n# max_injected_items: 5\n# max_injected_chars: 4000\n# embedding:\n# enabled: false\n# model: \"\" # model spec;空则默认找 embedding tag\n# dimensions: 0 # 0 = auto-detect via probe embed call\n# batch_size: 16\n# embed_after_consolidation: true\n# consolidation:\n# rule_based_enabled: true # 是否启用每轮对话后的规则抽取;false 时只保留 dreaming/显式写入\n"}, "d4416e1e132c1b41da9801454fd3c4f9f7bd8de2": {"t": 1785761612.2494686, "n": 15635, "h": "ccd3d59b1ee247a2", "c": "# Nahida Bot 配置文件\n# 参见 nahida_bot.core.config.Settings 了解所有可用字段\n\n# ── 应用 ──────────────────────────────────────────────\napp_name: \"Nahida Bot\"\ndebug: false\nlog_level: \"INFO\" # DEBUG / INFO / WARNING / ERROR(控制台级别)\n# log_json: true # 设为 true 输出 JSON 格式日志(生产环境推荐)\n# 可复盘基线(agent-loop 修复 Phase 0):默认把应用日志落盘到 JSON Lines 文件,\n# 文件级别 DEBUG 以便保留 agent_loop.run_completed 的 terminal_state/reason、\n# provider 协议异常、context 来源等字段。控制台仍保持 INFO,不被 DEBUG 刷屏。\nlog_file: \"./data/logs/nahida.log\"\nlog_file_level: \"DEBUG\"\nlog_file_json: true\n# 按文件大小滚动日志:单文件达到 log_file_max_bytes 后轮转,最多保留\n# log_file_backup_count 个历史备份(nahida.log.1、nahida.log.2 …)。\n# max_bytes=0 表示不滚动(日志文件会无限增长)。默认 10 MiB × 5 份。\nlog_file_max_bytes: 10485760 # 单个日志文件上限(字节),0 = 不滚动\nlog_file_backup_count: 5 # 保留的滚动备份数\ndependency_log_level: \"WARNING\" # 三方库默认日志级别;避免 DEBUG 时被 httpx/websockets 等刷屏\n# logger_levels: # 可选:按 logger 名覆盖(注意:会同时作用于控制台与文件)\n# nahida_bot.agent: \"DEBUG\"\n# plugin.rss-notifier: \"DEBUG\"\n# httpx: \"WARNING\"\n\n# ── 服务器 ────────────────────────────────────────────\nhost: \"127.0.0.1\"\nport: 6185\n\n# ── 数据库 ────────────────────────────────────────────\ndb_path: \"./data/nahida.db\"\n\n# ── Workspace ─────────────────────────────────────────\nworkspace_base_dir: \"./data/workspace\"\n\n# ── 插件 ──────────────────────────────────────────────\nplugin_paths:\n - \"./plugins\"\n\n# ── Agent / Router ────────────────────────────────────\nsystem_prompt: \"You are a helpful assistant.\"\n\n# ── LLM Providers(dict 格式,key 即 provider id)───\n# 默认配置已经是多 provider。每个 provider 有独立的 api_key、base_url 和 models。\n# models 的第一个元素是该 provider 的默认模型;每个模型可以是字符串,\n# 也可以是 {name, tags, capabilities} 对象。通过 /model 命令可在聊天中切换模型。\n#\n# 没有配置 api_key 的 provider 会在启动时被跳过;因此可以只填写实际使用的后端。\nproviders:\n deepseek-main:\n type: deepseek\n api_key: \"${DEEPSEEK_LLM_API_KEY:}\"\n base_url: \"${DEEPSEEK_LLM_BASE_URL:https://api.deepseek.com}\"\n # 内部使用 SSE 接收并聚合,可避免长推理期间普通读超时误判。\n stream_responses: true\n # thinking_enabled: false # 关闭 DeepSeek thinking mode\n models:\n - name: \"deepseek-v4-pro\"\n tags: [primary]\n - name: \"deepseek-v4-flash\"\n tags: [cheap, memory]\n\n siliconflow:\n type: \"openai-compatible\"\n api_key: \"${SILICONFLOW_LLM_API_KEY:}\"\n base_url: \"${SILICONFLOW_LLM_BASE_URL:https://api.siliconflow.cn/v1}\"\n merge_system_messages: true\n stream_responses: true\n models:\n - name: \"Qwen/Qwen3-Embedding-8B\"\n tags: [embedding]\n - name: \"Pro/zai-org/GLM-5\"\n tags: [vision]\n - name: \"Qwen/Qwen3.6-35B-A3B\"\n tags: [vision]\n capabilities:\n image_input: true\n max_image_count: 4\n max_image_bytes: 10485760\n\n minimax:\n type: minimax\n api_key: \"${MINIMAX_LLM_API_KEY:}\"\n base_url: \"https://api.minimaxi.com/anthropic\"\n max_tokens: 16000\n stream_responses: true\n models:\n - name: \"MiniMax-M2.5\"\n tags: [cheap]\n - name: \"MiniMax-M2.7\"\n - name: \"MiniMax-M3\"\n\n # OpenAI Responses API(可选)\n # 使用 /responses 端点,支持内置工具(web_search、image_generation 等)\n # 和有状态对话链(previous_response_id)。Reasoning 摘要可通过\n # reasoning_effort 参数控制深度。\n # stream_responses=true 时同样在 provider 内部流式接收并聚合返回。\n openai:\n type: \"openai-responses\"\n api_key: \"${OPENAI_API_KEY:}\"\n base_url: \"${OPENAI_API_BASE_URL:https://api.openai.com/v1}\"\n store_responses: true\n use_previous_response_id: false\n stream_responses: true\n reasoning_effort: \"medium\"\n # built_in_tools: [\"web_search\", \"image_generation\"]\n models:\n - name: \"gpt-5.4\"\n capabilities:\n image_input: true\n image_generation: true\n web_search: true\n tool_calling: true\n reasoning: true\n\ndefault_provider: deepseek-main # 可选,默认使用 providers 中的第一个 key\n\n# ── 多模态 / 图片理解 ─────────────────────────────────\n# image_fallback_mode:\n# auto: 主模型不支持 image_input 时,自动调用 fallback vision 模型生成描述\n# tool: 主模型不支持 image_input 时,注入 image_understand 工具,由主模型按需调用\n# off: 不处理图片,只保留普通文本\n# media_context_policy:\n# cache_aware: 最近图片尽量保留原生内容块,旧图片降级为描述\n# native_recent: 仅最近图片保留原生内容块\n# description_only: 历史图片只使用描述\nmultimodal:\n image_fallback_mode: \"auto\"\n media_context_policy: \"cache_aware\"\n image_fallback_provider: \"\" # Legacy;建议把 provider 写进 image_fallback_model\n image_fallback_model: \"siliconflow/Qwen/Qwen3.6-35B-A3B\"\n max_images_per_turn: 4\n max_image_bytes: 10485760\n media_cache_ttl_seconds: 3600\n\n# ── 插件配置 ──────────────────────────────────────────\n# Settings 的 extra=\"allow\" 机制:顶层 key 如果不是已知字段,\n# 且值为 dict,则按 plugin id 匹配。enabled 由框架消费,其余字段注入插件配置。\n\nbuiltin-commands:\n # send_local_attachment 默认只允许发送 active workspace 内的相对路径。\n # 如确实需要发送工作区外的本地文件,可打开下面开关。\n allow_external_attachment_paths: false\n # 可选白名单目录;为空表示打开上方开关后允许任意绝对路径。\n # external_attachment_roots:\n # - \"<absolute-directory>\"\n external_attachment_roots: []\n\n# OpenAI-compatible 图片生成(可选)\n# 启用后注册 /draw、/生图 命令和 image_generate tool。\n# image_generation:\n# enabled: true\n# provider: default\n# backends:\n# default:\n# type: openai-images\n# api_key: \"${IMAGE_API_KEY}\"\n# base_url: \"${IMAGE_BASE_URL}\"\n# model: \"gpt-image-1\"\n# timeout_seconds: 600\n# download_timeout_seconds: 120\n# trust_env: false\n# force_close_connections: true\n# output_dir: \"generated/images\"\n# auto_send: true\n# max_images_per_24h: 20\n\ngithub-notifier:\n # 目标仓库;保持 OWNER/REPO 时插件会视为未配置,不会启动 webhook/polling。\n repo: \"OWNER/REPO\"\n # typed chat address 列表,例如 milky:group:123456789 或 telegram:private:123456789。\n target_chat_addresses: []\n webhook:\n enabled: true\n path: \"github\" # 最终路径: /webhooks/github\n secret: \"${GITHUB_WEBHOOK_SECRET:}\"\n polling:\n enabled: true # webhook 不可用时的 fallback;首次轮询只建立基线\n interval_seconds: 60\n api_base_url: \"https://api.github.com\"\n token: \"${GITHUB_TOKEN:}\" # 私有仓库或更高 rate limit 时填写\n registration:\n enabled: false # 开启后可在聊天中使用 /github_watch 动态订阅\n\n# RSS/Atom 订阅通知(外部插件 plugins/rss-notifier)\n# rss-notifier:\n# enabled: true\n# # 默认推送目标;feed 未设置 target_chat_addresses 时使用这里。\n# target_chat_addresses:\n# - \"milky:group:123456789\"\n# feeds:\n# - url: \"https://example.com/feed.xml\"\n# title: \"Example\"\n# polling:\n# enabled: true\n# interval_seconds: 300\n# rendering:\n# mode: \"standard\" # compact / standard / rich\n# max_text_chars: 500\n# max_paragraphs: 3\n# include_images: true\n# max_images: 1\n# send_image_attachments: true # 下载图片并作为 photo 附件发送;失败时退化为图片链接\n# max_image_bytes: 5000000\n# registration:\n# enabled: true # 开启后可在聊天中使用 /rss_sub 动态订阅\n\nconversation_joiner:\n # 主动入话题默认关闭。开启前需要对应群频道启用 group_context_capture,\n # 让未触发消息先进入 MessageObserved。\n enabled: false\n model: cheap # model spec;没有 cheap tag 时可改成 provider/model,或留空使用默认模型\n threshold: 0.75\n max_context_messages: 12\n max_context_chars: 3000\n cooldown_seconds: 300\n max_triggers_per_hour: 3\n debounce_seconds: 20\n decision_timeout_seconds: 8\n persona_context:\n enabled: true # 启用后秘书模型会读取 workspace 中的人设文件辅助判断是否自然入话题\n files:\n - SOUL.md\n max_chars: 4000 # 注入秘书模型的人设上下文总字符上限\n cache_ttl_seconds: 60 # persona 文件缓存时间,避免每条候选消息都读文件\n prefilter:\n ignore_commands: true\n ignore_mentions: true\n min_text_chars: 4\n keyword_hints: []\n sample_rate: 0.15 # 普通候选消息进入秘书模型的采样概率\n keyword_sample_rate: 1.0 # 命中 keyword_hints 后进入秘书模型的采样概率\n groups: {}\n # groups:\n # milky:group:123456789:\n # enabled: true\n # threshold: 0.78\n # cooldown_seconds: 300\n engagement:\n enabled: false # 打开后进入 observing/joining/engaged/cooling 状态机\n join_state_ttl_seconds: 600\n idle_exit_seconds: 180\n max_engaged_seconds: 1800\n response_cooldown_seconds: 45\n engagement_score_alpha: 0.2\n engagement_score_exit_threshold: 0.2\n score_decay_half_life_seconds: 600\n score_decay_floor: 0.0\n batching:\n window_seconds: 8 # 后续群消息进入 batch 的短窗口\n max_messages: 6 # 窗口内消息过多时提前 flush\n max_chars: 2000\n flush_on_mention: true\n continue_gate:\n enabled: true # 每个 flushed batch 交给秘书模型判断是否继续接话\n model: cheap\n threshold: 0.55\n min_messages: 1\n evaluate_interval_seconds: 8\n exit_gate:\n enabled: true\n low_value_threshold: 0.35\n low_value_strikes: 3\n min_messages_per_window: 1\n activity_window_seconds: 120\n\ntelegram:\n enabled: true\n bot_token: \"${TELEGRAM_BOT_TOKEN:}\"\n # group_trigger_mode: \"always\" # none / mention / command / always\n # group_context_capture: false # mention/command 模式下,是否记录未触发群消息作为上下文\n # reply_to_inbound: null # true/false 覆盖 router.reply_to_inbound;null/省略表示跟随全局\n # proxy: \"${TELEGRAM_PROXY:}\" # SOCKS5/HTTP 代理,如 socks5://127.0.0.1:1080\n # polling_timeout: 30\n # allowed_chats: []\n\n# Milky QQ Channel(可选)\n# 启用前请先启动 Lagrange.Milky,并确保 nahida_bot/channels/milky/plugin.yaml\n# 可被内置 channel discovery 扫描到。保持注释状态不会启用 Milky。\n#\n# milky:\n# enabled: true\n# base_url: \"http://127.0.0.1:3000\"\n# access_token: \"${MILKY_ACCESS_TOKEN:}\"\n# api_prefix: \"/api\"\n# event_path: \"/event\"\n# # ws_url: \"ws://127.0.0.1:3000/event\" # 可选:覆盖由 base_url 推导出的 WS 地址\n# command_prefix: \"/\"\n# group_trigger_mode: \"mention\" # none / mention / command / always\n# group_context_capture: false # true 时,未触发群消息只记录为上下文,可供 conversation_joiner 判断\n# reply_to_inbound: null # true/false 覆盖 router.reply_to_inbound;null/省略表示跟随全局\n# allowed_friends: [] # QQ 号白名单;空列表表示不限制\n# allowed_groups: [] # 群号白名单;空列表表示不限制\n# connect_timeout: 10.0\n# heartbeat_timeout: 30.0\n# reconnect_initial_delay: 1.0\n# reconnect_max_delay: 30.0\n# send_retry_attempts: 3\n# send_retry_backoff: 1.0\n# max_text_length: 4000\n# media_download_dir: \"./data/temp/media\"\n# enable_media_download_tool: true\n# resource_url_ttl_hint: 300\n# cache_media_on_receive: true\n# max_forward_depth: 3\n# max_forward_messages: 80\n# forward_render_max_chars: 12000\n# scene_cache_size: 4096\n\n# ── Agent Loop ──────────────────────────────────────────\n# 控制 Agent 循环的行为:迭代轮数、超时、重试策略等。\n# 以下均为默认值,不写则使用默认值。\n#\n# agent:\n# max_steps: 8 # 最大工具调用迭代轮数\n# provider_timeout_seconds: 120.0 # 单次 LLM 调用超时(秒)\n# retry_attempts: 2 # LLM 调用重试次数\n# retry_backoff_seconds: 0.2 # 重试退避间隔(秒)\n# tool_timeout_seconds: 135.0 # 工具执行超时(秒)\n# tool_retry_attempts: 1 # 工具执行重试次数\n# tool_retry_backoff_seconds: 0.1 # 工具重试退避间隔(秒)\n# max_tool_log_chars: 400 # 工具日志截断长度\n# # tool_use_system_prompt: \"...\" # 注入的工具使用提示\n# # provider_error_template: \"...\" # Provider 错误消息模板\n\n# ── Agent Runtime(canonical ledger,修复 #24 地基)─────────\n# Phase 1:best-effort 把每个 run 的 canonical 事件流与执行回执落库(附加双写,\n# 不改对外行为)。reading/重放端属 Phase 5。默认代码里为 false;这里置 true 以采集数据。\nagent_runtime:\n canonical_ledger_enabled: true\n # Phase 5:把每个 run 的有序 tool transcript 落到 agent_runs.transcript_json,\n # 下一轮由 TranscriptProjector 投影成成对 tool_use/tool_result 注入历史,\n # 替代被剥离的纯文本叙述(#24 根因)。默认代码里为 false;这里置 true 采集数据。\n # 旧 run(无 transcript_json)自动回退到原文本历史路径。\n transcript_replay_enabled: true\n\n# ── Context Budget ──────────────────────────────────────\n# 控制未知模型 fallback 上下文窗口和 reasoning chain 预算。\n# 模型声明 providers.*.models[].capabilities.context_window 时优先使用模型窗口。\n# 以下均为默认值,不写则使用默认值。\n#\n# context:\n# max_tokens: 272000 # 未声明模型窗口时的 fallback context window\n# reserved_tokens: 10000 # 未声明模型窗口时为输出保留的 token\n# # max_chars: null # 字符数上限(兼容旧逻辑,优先使用 max_tokens)\n# # reserved_chars: 0 # 字符保留数\n# summary_max_chars: 2000 # 历史摘要最大字符数\n# reasoning_policy: \"budget\" # strip / append / budget\n# max_reasoning_tokens: 2000 # reasoning chain token 预算\n\n# ── Identity / delegated authorization ────────────────\n# Identity must be enabled for the privileged-tool gate and tickets to apply.\n# Admins are authenticated account keys assembled from channel + account id;\n# being linked to a Person does not make an account an admin.\n#\n# identity:\n# enabled: false\n# admins:\n# - channel: \"milky\"\n# platform_account_id: \"123456789\"\n# authorization_tickets:\n# enabled: false # explicit opt-in\n# challenge_ttl_seconds: 600 # requester waits for admin approval\n# grant_ttl_seconds: 300 # approved one-use grant lifetime\n# max_grant_ttl_seconds: 900 # hard cap for /auth approve TTL\n\n# ── Scheduler ──────────────────────────────────────────\n# 控制定时任务调度行为。\n# 以下均为默认值,不写则使用默认值。\n#\n# scheduler:\n# poll_interval_seconds: 1.0 # 调度轮询间隔(秒)\n# max_concurrent_fires: 5 # 最大并发执行数\n# job_timeout_seconds: 120.0 # 单任务超时(秒)\n# min_interval_seconds: 60 # cron 最小间隔\n# max_prompt_chars: 12000 # 定时任务 prompt 最大字符数\n# max_jobs_per_chat: 20 # 每个会话最大任务数\n# failure_retry_seconds: 300 # 失败重试等待(秒)\n# max_consecutive_failures: 3 # 连续失败上限\n# memory_dreaming_enabled: true # 是否启用内部记忆 dreaming\n# memory_dreaming_interval_seconds: 3600 # dreaming 周期(秒)\n# memory_dreaming_initial_delay_seconds: 300 # 启动后首次 dreaming 延迟\n# memory_dreaming_session_limit: 20 # 单次最多扫描会话数\n# memory_dreaming_recent_turn_limit: 40 # 单会话最多读取 turns 数\n# memory_dreaming_provider_id: \"\" # Legacy;建议改用 memory_dreaming_model\n# memory_dreaming_model: \"\" # model spec;空则默认找 memory tag,失败后走会话模型\n\n# ── Router ─────────────────────────────────────────────\n# 控制消息路由行为。system_prompt 使用顶层 system_prompt 字段。\n# 以下均为默认值,不写则使用默认值。\n#\n# router:\n# # system_prompt: \"...\" # 与顶层 system_prompt 重复,优先使用顶层字段\n# max_history_turns: 200 # 最大历史轮数\n# agent_enabled: true # 是否启用 Agent\n# command_timeout_seconds: 30.0 # 命令执行超时(秒)\n# command_timeout_message: \"Command timed out. Please try again later.\"\n# reply_to_inbound: true # 默认是否引用回复触发消息;平台插件可覆盖\n# group_context:\n# enabled: true # 是否在触发时注入 observed-only 群上下文\n# max_messages: 20 # 最多注入最近多少条未触发群消息\n# ttl_seconds: 900 # 只注入最近 N 秒内的群上下文;0 表示不按时间过滤\n# max_chars: 4000 # 群上下文注入块最大字符数\n# topic_gap_seconds: 300 # 群消息静默超过此值视为新话题;0 关闭\n# continuity_gap_seconds: 1800 # 对话连续性判定(秒):当前触发与上次对话 turn 间隔超过此值则视为新对话,丢弃旧 history;0 关闭\n\n# ── Model Tags / Specs ─────────────────────────────────\n# providers 的 models 中用 tags 字段标记模型角色:\n# primary / cheap / memory / embedding / reranker / vision\n# 需要内部模型的配置项都接受一个 model spec 字符串;这个字符串可以是 tag,\n# 也可以是 provider/model 或裸模型名。\n\n# ── Memory ─────────────────────────────────────────────\n# 长期记忆检索和 embedding 配置。默认只启用 SQLite FTS;vector/hybrid\n# 需要显式开启,并在 providers.models 中配置带 embedding tag 的模型。\n#\n# memory:\n# enabled: true\n# retrieval:\n# fts_enabled: true\n# vector_enabled: false # 开启后对长期记忆使用 hybrid 检索\n# hybrid_enabled: true\n# vector_backend: json # json / sqlite-vec / none\n# max_injected_items: 5\n# max_injected_chars: 4000\n# embedding:\n# enabled: false\n# model: \"\" # model spec;空则默认找 embedding tag\n# dimensions: 0 # 0 = auto-detect via probe embed call\n# batch_size: 16\n# embed_after_consolidation: true\n# consolidation:\n# rule_based_enabled: true # 是否启用每轮对话后的规则抽取;false 时只保留 dreaming/显式写入\n"}, "3f8b4769081531daf366a7316a893cc5b287242c": {"t": 1785761613.518503, "n": 15608, "h": "cc416276f0fc190d", "c": "# Nahida Bot 配置文件\n# 参见 nahida_bot.core.config.Settings 了解所有可用字段\n\n# ── 应用 ──────────────────────────────────────────────\napp_name: \"Nahida Bot\"\ndebug: false\nlog_level: \"INFO\" # DEBUG / INFO / WARNING / ERROR(控制台级别)\n# log_json: true # 设为 true 输出 JSON 格式日志(生产环境推荐)\n# 可复盘基线(agent-loop 修复 Phase 0):默认把应用日志落盘到 JSON Lines 文件,\n# 文件级别 DEBUG 以便保留 agent_loop.run_completed 的 terminal_state/reason、\n# provider 协议异常、context 来源等字段。控制台仍保持 INFO,不被 DEBUG 刷屏。\nlog_file: \"./data/logs/nahida.log\"\nlog_file_level: \"DEBUG\"\nlog_file_json: true\n# 按文件大小滚动日志:单文件达到 log_file_max_bytes 后轮转,最多保留\n# log_file_backup_count 个历史备份(nahida.log.1、nahida.log.2 …)。\n# max_bytes=0 表示不滚动(日志文件会无限增长)。默认 10 MiB × 5 份。\nlog_file_max_bytes: 10485760 # 单个日志文件上限(字节),0 = 不滚动\nlog_file_backup_count: 5 # 保留的滚动备份数\ndependency_log_level: \"WARNING\" # 三方库默认日志级别;避免 DEBUG 时被 httpx/websockets 等刷屏\n# logger_levels: # 可选:按 logger 名覆盖(注意:会同时作用于控制台与文件)\n# nahida_bot.agent: \"DEBUG\"\n# plugin.rss-notifier: \"DEBUG\"\n# httpx: \"WARNING\"\n\n# ── 服务器 ────────────────────────────────────────────\nhost: \"127.0.0.1\"\nport: 6185\n\n# ── 数据库 ────────────────────────────────────────────\ndb_path: \"./data/nahida.db\"\n\n# ── Workspace ─────────────────────────────────────────\nworkspace_base_dir: \"./data/workspace\"\n\n# ── 插件 ──────────────────────────────────────────────\nplugin_paths:\n - \"./plugins\"\n\n# ── Agent / Router ────────────────────────────────────\nsystem_prompt: \"You are a helpful assistant.\"\n\n# ── LLM Providers(dict 格式,key 即 provider id)───\n# 默认配置已经是多 provider。每个 provider 有独立的 api_key、base_url 和 models。\n# models 的第一个元素是该 provider 的默认模型;每个模型可以是字符串,\n# 也可以是 {name, tags, capabilities} 对象。通过 /model 命令可在聊天中切换模型。\n#\n# 没有配置 api_key 的 provider 会在启动时被跳过;因此可以只填写实际使用的后端。\nproviders:\n deepseek-main:\n type: deepseek\n api_key: \"${DEEPSEEK_LLM_API_KEY:}\"\n base_url: \"${DEEPSEEK_LLM_BASE_URL:https://api.deepseek.com}\"\n # 内部使用 SSE 接收并聚合,可避免长推理期间普通读超时误判。\n stream_responses: true\n # thinking_enabled: false # 关闭 DeepSeek thinking mode\n models:\n - name: \"deepseek-v4-pro\"\n tags: [primary]\n - name: \"deepseek-v4-flash\"\n tags: [cheap, memory]\n\n siliconflow:\n type: \"openai-compatible\"\n api_key: \"${SILICONFLOW_LLM_API_KEY:}\"\n base_url: \"${SILICONFLOW_LLM_BASE_URL:https://api.siliconflow.cn/v1}\"\n merge_system_messages: true\n stream_responses: true\n models:\n - name: \"Qwen/Qwen3-Embedding-8B\"\n tags: [embedding]\n - name: \"Pro/zai-org/GLM-5\"\n tags: [vision]\n - name: \"Qwen/Qwen3.6-35B-A3B\"\n tags: [vision]\n capabilities:\n image_input: true\n max_image_count: 4\n max_image_bytes: 10485760\n\n minimax:\n type: minimax\n api_key: \"${MINIMAX_LLM_API_KEY:}\"\n base_url: \"https://api.minimaxi.com/anthropic\"\n max_tokens: 16000\n stream_responses: true\n models:\n - name: \"MiniMax-M2.5\"\n tags: [cheap]\n - name: \"MiniMax-M2.7\"\n\n # OpenAI Responses API(可选)\n # 使用 /responses 端点,支持内置工具(web_search、image_generation 等)\n # 和有状态对话链(previous_response_id)。Reasoning 摘要可通过\n # reasoning_effort 参数控制深度。\n # stream_responses=true 时同样在 provider 内部流式接收并聚合返回。\n openai:\n type: \"openai-responses\"\n api_key: \"${OPENAI_API_KEY:}\"\n base_url: \"${OPENAI_API_BASE_URL:https://api.openai.com/v1}\"\n store_responses: true\n use_previous_response_id: false\n stream_responses: true\n reasoning_effort: \"medium\"\n # built_in_tools: [\"web_search\", \"image_generation\"]\n models:\n - name: \"gpt-5.4\"\n capabilities:\n image_input: true\n image_generation: true\n web_search: true\n tool_calling: true\n reasoning: true\n\ndefault_provider: deepseek-main # 可选,默认使用 providers 中的第一个 key\n\n# ── 多模态 / 图片理解 ─────────────────────────────────\n# image_fallback_mode:\n# auto: 主模型不支持 image_input 时,自动调用 fallback vision 模型生成描述\n# tool: 主模型不支持 image_input 时,注入 image_understand 工具,由主模型按需调用\n# off: 不处理图片,只保留普通文本\n# media_context_policy:\n# cache_aware: 最近图片尽量保留原生内容块,旧图片降级为描述\n# native_recent: 仅最近图片保留原生内容块\n# description_only: 历史图片只使用描述\nmultimodal:\n image_fallback_mode: \"auto\"\n media_context_policy: \"cache_aware\"\n image_fallback_provider: \"\" # Legacy;建议把 provider 写进 image_fallback_model\n image_fallback_model: \"siliconflow/Qwen/Qwen3.6-35B-A3B\"\n max_images_per_turn: 4\n max_image_bytes: 10485760\n media_cache_ttl_seconds: 3600\n\n# ── 插件配置 ──────────────────────────────────────────\n# Settings 的 extra=\"allow\" 机制:顶层 key 如果不是已知字段,\n# 且值为 dict,则按 plugin id 匹配。enabled 由框架消费,其余字段注入插件配置。\n\nbuiltin-commands:\n # send_local_attachment 默认只允许发送 active workspace 内的相对路径。\n # 如确实需要发送工作区外的本地文件,可打开下面开关。\n allow_external_attachment_paths: false\n # 可选白名单目录;为空表示打开上方开关后允许任意绝对路径。\n # external_attachment_roots:\n # - \"<absolute-directory>\"\n external_attachment_roots: []\n\n# OpenAI-compatible 图片生成(可选)\n# 启用后注册 /draw、/生图 命令和 image_generate tool。\n# image_generation:\n# enabled: true\n# provider: default\n# backends:\n# default:\n# type: openai-images\n# api_key: \"${IMAGE_API_KEY}\"\n# base_url: \"${IMAGE_BASE_URL}\"\n# model: \"gpt-image-1\"\n# timeout_seconds: 600\n# download_timeout_seconds: 120\n# trust_env: false\n# force_close_connections: true\n# output_dir: \"generated/images\"\n# auto_send: true\n# max_images_per_24h: 20\n\ngithub-notifier:\n # 目标仓库;保持 OWNER/REPO 时插件会视为未配置,不会启动 webhook/polling。\n repo: \"OWNER/REPO\"\n # typed chat address 列表,例如 milky:group:123456789 或 telegram:private:123456789。\n target_chat_addresses: []\n webhook:\n enabled: true\n path: \"github\" # 最终路径: /webhooks/github\n secret: \"${GITHUB_WEBHOOK_SECRET:}\"\n polling:\n enabled: true # webhook 不可用时的 fallback;首次轮询只建立基线\n interval_seconds: 60\n api_base_url: \"https://api.github.com\"\n token: \"${GITHUB_TOKEN:}\" # 私有仓库或更高 rate limit 时填写\n registration:\n enabled: false # 开启后可在聊天中使用 /github_watch 动态订阅\n\n# RSS/Atom 订阅通知(外部插件 plugins/rss-notifier)\n# rss-notifier:\n# enabled: true\n# # 默认推送目标;feed 未设置 target_chat_addresses 时使用这里。\n# target_chat_addresses:\n# - \"milky:group:123456789\"\n# feeds:\n# - url: \"https://example.com/feed.xml\"\n# title: \"Example\"\n# polling:\n# enabled: true\n# interval_seconds: 300\n# rendering:\n# mode: \"standard\" # compact / standard / rich\n# max_text_chars: 500\n# max_paragraphs: 3\n# include_images: true\n# max_images: 1\n# send_image_attachments: true # 下载图片并作为 photo 附件发送;失败时退化为图片链接\n# max_image_bytes: 5000000\n# registration:\n# enabled: true # 开启后可在聊天中使用 /rss_sub 动态订阅\n\nconversation_joiner:\n # 主动入话题默认关闭。开启前需要对应群频道启用 group_context_capture,\n # 让未触发消息先进入 MessageObserved。\n enabled: false\n model: cheap # model spec;没有 cheap tag 时可改成 provider/model,或留空使用默认模型\n threshold: 0.75\n max_context_messages: 12\n max_context_chars: 3000\n cooldown_seconds: 300\n max_triggers_per_hour: 3\n debounce_seconds: 20\n decision_timeout_seconds: 8\n persona_context:\n enabled: true # 启用后秘书模型会读取 workspace 中的人设文件辅助判断是否自然入话题\n files:\n - SOUL.md\n max_chars: 4000 # 注入秘书模型的人设上下文总字符上限\n cache_ttl_seconds: 60 # persona 文件缓存时间,避免每条候选消息都读文件\n prefilter:\n ignore_commands: true\n ignore_mentions: true\n min_text_chars: 4\n keyword_hints: []\n sample_rate: 0.15 # 普通候选消息进入秘书模型的采样概率\n keyword_sample_rate: 1.0 # 命中 keyword_hints 后进入秘书模型的采样概率\n groups: {}\n # groups:\n # milky:group:123456789:\n # enabled: true\n # threshold: 0.78\n # cooldown_seconds: 300\n engagement:\n enabled: false # 打开后进入 observing/joining/engaged/cooling 状态机\n join_state_ttl_seconds: 600\n idle_exit_seconds: 180\n max_engaged_seconds: 1800\n response_cooldown_seconds: 45\n engagement_score_alpha: 0.2\n engagement_score_exit_threshold: 0.2\n score_decay_half_life_seconds: 600\n score_decay_floor: 0.0\n batching:\n window_seconds: 8 # 后续群消息进入 batch 的短窗口\n max_messages: 6 # 窗口内消息过多时提前 flush\n max_chars: 2000\n flush_on_mention: true\n continue_gate:\n enabled: true # 每个 flushed batch 交给秘书模型判断是否继续接话\n model: cheap\n threshold: 0.55\n min_messages: 1\n evaluate_interval_seconds: 8\n exit_gate:\n enabled: true\n low_value_threshold: 0.35\n low_value_strikes: 3\n min_messages_per_window: 1\n activity_window_seconds: 120\n\ntelegram:\n enabled: true\n bot_token: \"${TELEGRAM_BOT_TOKEN:}\"\n # group_trigger_mode: \"always\" # none / mention / command / always\n # group_context_capture: false # mention/command 模式下,是否记录未触发群消息作为上下文\n # reply_to_inbound: null # true/false 覆盖 router.reply_to_inbound;null/省略表示跟随全局\n # proxy: \"${TELEGRAM_PROXY:}\" # SOCKS5/HTTP 代理,如 socks5://127.0.0.1:1080\n # polling_timeout: 30\n # allowed_chats: []\n\n# Milky QQ Channel(可选)\n# 启用前请先启动 Lagrange.Milky,并确保 nahida_bot/channels/milky/plugin.yaml\n# 可被内置 channel discovery 扫描到。保持注释状态不会启用 Milky。\n#\n# milky:\n# enabled: true\n# base_url: \"http://127.0.0.1:3000\"\n# access_token: \"${MILKY_ACCESS_TOKEN:}\"\n# api_prefix: \"/api\"\n# event_path: \"/event\"\n# # ws_url: \"ws://127.0.0.1:3000/event\" # 可选:覆盖由 base_url 推导出的 WS 地址\n# command_prefix: \"/\"\n# group_trigger_mode: \"mention\" # none / mention / command / always\n# group_context_capture: false # true 时,未触发群消息只记录为上下文,可供 conversation_joiner 判断\n# reply_to_inbound: null # true/false 覆盖 router.reply_to_inbound;null/省略表示跟随全局\n# allowed_friends: [] # QQ 号白名单;空列表表示不限制\n# allowed_groups: [] # 群号白名单;空列表表示不限制\n# connect_timeout: 10.0\n# heartbeat_timeout: 30.0\n# reconnect_initial_delay: 1.0\n# reconnect_max_delay: 30.0\n# send_retry_attempts: 3\n# send_retry_backoff: 1.0\n# max_text_length: 4000\n# media_download_dir: \"./data/temp/media\"\n# enable_media_download_tool: true\n# resource_url_ttl_hint: 300\n# cache_media_on_receive: true\n# max_forward_depth: 3\n# max_forward_messages: 80\n# forward_render_max_chars: 12000\n# scene_cache_size: 4096\n\n# ── Agent Loop ──────────────────────────────────────────\n# 控制 Agent 循环的行为:迭代轮数、超时、重试策略等。\n# 以下均为默认值,不写则使用默认值。\n#\n# agent:\n# max_steps: 8 # 最大工具调用迭代轮数\n# provider_timeout_seconds: 120.0 # 单次 LLM 调用超时(秒)\n# retry_attempts: 2 # LLM 调用重试次数\n# retry_backoff_seconds: 0.2 # 重试退避间隔(秒)\n# tool_timeout_seconds: 135.0 # 工具执行超时(秒)\n# tool_retry_attempts: 1 # 工具执行重试次数\n# tool_retry_backoff_seconds: 0.1 # 工具重试退避间隔(秒)\n# max_tool_log_chars: 400 # 工具日志截断长度\n# # tool_use_system_prompt: \"...\" # 注入的工具使用提示\n# # provider_error_template: \"...\" # Provider 错误消息模板\n\n# ── Agent Runtime(canonical ledger,修复 #24 地基)─────────\n# Phase 1:best-effort 把每个 run 的 canonical 事件流与执行回执落库(附加双写,\n# 不改对外行为)。reading/重放端属 Phase 5。默认代码里为 false;这里置 true 以采集数据。\nagent_runtime:\n canonical_ledger_enabled: true\n # Phase 5:把每个 run 的有序 tool transcript 落到 agent_runs.transcript_json,\n # 下一轮由 TranscriptProjector 投影成成对 tool_use/tool_result 注入历史,\n # 替代被剥离的纯文本叙述(#24 根因)。默认代码里为 false;这里置 true 采集数据。\n # 旧 run(无 transcript_json)自动回退到原文本历史路径。\n transcript_replay_enabled: true\n\n# ── Context Budget ──────────────────────────────────────\n# 控制未知模型 fallback 上下文窗口和 reasoning chain 预算。\n# 模型声明 providers.*.models[].capabilities.context_window 时优先使用模型窗口。\n# 以下均为默认值,不写则使用默认值。\n#\n# context:\n# max_tokens: 272000 # 未声明模型窗口时的 fallback context window\n# reserved_tokens: 10000 # 未声明模型窗口时为输出保留的 token\n# # max_chars: null # 字符数上限(兼容旧逻辑,优先使用 max_tokens)\n# # reserved_chars: 0 # 字符保留数\n# summary_max_chars: 2000 # 历史摘要最大字符数\n# reasoning_policy: \"budget\" # strip / append / budget\n# max_reasoning_tokens: 2000 # reasoning chain token 预算\n\n# ── Identity / delegated authorization ────────────────\n# Identity must be enabled for the privileged-tool gate and tickets to apply.\n# Admins are authenticated account keys assembled from channel + account id;\n# being linked to a Person does not make an account an admin.\n#\n# identity:\n# enabled: false\n# admins:\n# - channel: \"milky\"\n# platform_account_id: \"123456789\"\n# authorization_tickets:\n# enabled: false # explicit opt-in\n# challenge_ttl_seconds: 600 # requester waits for admin approval\n# grant_ttl_seconds: 300 # approved one-use grant lifetime\n# max_grant_ttl_seconds: 900 # hard cap for /auth approve TTL\n\n# ── Scheduler ──────────────────────────────────────────\n# 控制定时任务调度行为。\n# 以下均为默认值,不写则使用默认值。\n#\n# scheduler:\n# poll_interval_seconds: 1.0 # 调度轮询间隔(秒)\n# max_concurrent_fires: 5 # 最大并发执行数\n# job_timeout_seconds: 120.0 # 单任务超时(秒)\n# min_interval_seconds: 60 # cron 最小间隔\n# max_prompt_chars: 12000 # 定时任务 prompt 最大字符数\n# max_jobs_per_chat: 20 # 每个会话最大任务数\n# failure_retry_seconds: 300 # 失败重试等待(秒)\n# max_consecutive_failures: 3 # 连续失败上限\n# memory_dreaming_enabled: true # 是否启用内部记忆 dreaming\n# memory_dreaming_interval_seconds: 3600 # dreaming 周期(秒)\n# memory_dreaming_initial_delay_seconds: 300 # 启动后首次 dreaming 延迟\n# memory_dreaming_session_limit: 20 # 单次最多扫描会话数\n# memory_dreaming_recent_turn_limit: 40 # 单会话最多读取 turns 数\n# memory_dreaming_provider_id: \"\" # Legacy;建议改用 memory_dreaming_model\n# memory_dreaming_model: \"\" # model spec;空则默认找 memory tag,失败后走会话模型\n\n# ── Router ─────────────────────────────────────────────\n# 控制消息路由行为。system_prompt 使用顶层 system_prompt 字段。\n# 以下均为默认值,不写则使用默认值。\n#\n# router:\n# # system_prompt: \"...\" # 与顶层 system_prompt 重复,优先使用顶层字段\n# max_history_turns: 200 # 最大历史轮数\n# agent_enabled: true # 是否启用 Agent\n# command_timeout_seconds: 30.0 # 命令执行超时(秒)\n# command_timeout_message: \"Command timed out. Please try again later.\"\n# reply_to_inbound: true # 默认是否引用回复触发消息;平台插件可覆盖\n# group_context:\n# enabled: true # 是否在触发时注入 observed-only 群上下文\n# max_messages: 20 # 最多注入最近多少条未触发群消息\n# ttl_seconds: 900 # 只注入最近 N 秒内的群上下文;0 表示不按时间过滤\n# max_chars: 4000 # 群上下文注入块最大字符数\n# topic_gap_seconds: 300 # 群消息静默超过此值视为新话题;0 关闭\n# continuity_gap_seconds: 1800 # 对话连续性判定(秒):当前触发与上次对话 turn 间隔超过此值则视为新对话,丢弃旧 history;0 关闭\n\n# ── Model Tags / Specs ─────────────────────────────────\n# providers 的 models 中用 tags 字段标记模型角色:\n# primary / cheap / memory / embedding / reranker / vision\n# 需要内部模型的配置项都接受一个 model spec 字符串;这个字符串可以是 tag,\n# 也可以是 provider/model 或裸模型名。\n\n# ── Memory ─────────────────────────────────────────────\n# 长期记忆检索和 embedding 配置。默认只启用 SQLite FTS;vector/hybrid\n# 需要显式开启,并在 providers.models 中配置带 embedding tag 的模型。\n#\n# memory:\n# enabled: true\n# retrieval:\n# fts_enabled: true\n# vector_enabled: false # 开启后对长期记忆使用 hybrid 检索\n# hybrid_enabled: true\n# vector_backend: json # json / sqlite-vec / none\n# max_injected_items: 5\n# max_injected_chars: 4000\n# embedding:\n# enabled: false\n# model: \"\" # model spec;空则默认找 embedding tag\n# dimensions: 0 # 0 = auto-detect via probe embed call\n# batch_size: 16\n# embed_after_consolidation: true\n# consolidation:\n# rule_based_enabled: true # 是否启用每轮对话后的规则抽取;false 时只保留 dreaming/显式写入\n"}, "ceb5235357df9fa0e297752c53950e974a46bea7": {"t": 1785761616.1864805, "n": 15576, "h": "25b1ad03fd9b9ebb", "c": "# Nahida Bot 配置文件\n# 参见 nahida_bot.core.config.Settings 了解所有可用字段\n\n# ── 应用 ──────────────────────────────────────────────\napp_name: \"Nahida Bot\"\ndebug: false\nlog_level: \"INFO\" # DEBUG / INFO / WARNING / ERROR(控制台级别)\n# log_json: true # 设为 true 输出 JSON 格式日志(生产环境推荐)\n# 可复盘基线(agent-loop 修复 Phase 0):默认把应用日志落盘到 JSON Lines 文件,\n# 文件级别 DEBUG 以便保留 agent_loop.run_completed 的 terminal_state/reason、\n# provider 协议异常、context 来源等字段。控制台仍保持 INFO,不被 DEBUG 刷屏。\nlog_file: \"./data/logs/nahida.log\"\nlog_file_level: \"DEBUG\"\nlog_file_json: true\n# 按文件大小滚动日志:单文件达到 log_file_max_bytes 后轮转,最多保留\n# log_file_backup_count 个历史备份(nahida.log.1、nahida.log.2 …)。\n# max_bytes=0 表示不滚动(日志文件会无限增长)。默认 10 MiB × 5 份。\nlog_file_max_bytes: 10485760 # 单个日志文件上限(字节),0 = 不滚动\nlog_file_backup_count: 5 # 保留的滚动备份数\ndependency_log_level: \"WARNING\" # 三方库默认日志级别;避免 DEBUG 时被 httpx/websockets 等刷屏\n# logger_levels: # 可选:按 logger 名覆盖(注意:会同时作用于控制台与文件)\n# nahida_bot.agent: \"DEBUG\"\n# plugin.rss-notifier: \"DEBUG\"\n# httpx: \"WARNING\"\n\n# ── 服务器 ────────────────────────────────────────────\nhost: \"127.0.0.1\"\nport: 6185\n\n# ── 数据库 ────────────────────────────────────────────\ndb_path: \"./data/nahida.db\"\n\n# ── Workspace ─────────────────────────────────────────\nworkspace_base_dir: \"./data/workspace\"\n\n# ── 插件 ──────────────────────────────────────────────\nplugin_paths:\n - \"./plugins\"\n\n# ── Agent / Router ────────────────────────────────────\nsystem_prompt: \"You are a helpful assistant.\"\n\n# ── LLM Providers(dict 格式,key 即 provider id)───\n# 默认配置已经是多 provider。每个 provider 有独立的 api_key、base_url 和 models。\n# models 的第一个元素是该 provider 的默认模型;每个模型可以是字符串,\n# 也可以是 {name, tags, capabilities} 对象。通过 /model 命令可在聊天中切换模型。\n#\n# 没有配置 api_key 的 provider 会在启动时被跳过;因此可以只填写实际使用的后端。\nproviders:\n deepseek-main:\n type: deepseek\n api_key: \"${DEEPSEEK_LLM_API_KEY:}\"\n base_url: \"${DEEPSEEK_LLM_BASE_URL:https://api.deepseek.com}\"\n # 内部使用 SSE 接收并聚合,可避免长推理期间普通读超时误判。\n stream_responses: true\n # thinking_enabled: false # 关闭 DeepSeek thinking mode\n models:\n - name: \"deepseek-v4-pro\"\n tags: [primary]\n - name: \"deepseek-v4-flash\"\n tags: [cheap, memory]\n\n siliconflow:\n type: \"openai-compatible\"\n api_key: \"${SILICONFLOW_LLM_API_KEY:}\"\n base_url: \"${SILICONFLOW_LLM_BASE_URL:https://api.siliconflow.cn/v1}\"\n merge_system_messages: true\n stream_responses: true\n models:\n - name: \"Qwen/Qwen3-Embedding-8B\"\n tags: [embedding]\n - name: \"Pro/zai-org/GLM-5\"\n tags: [vision]\n - name: \"Qwen/Qwen3.6-35B-A3B\"\n tags: [vision]\n capabilities:\n image_input: true\n max_image_count: 4\n max_image_bytes: 10485760\n\n minimax:\n type: minimax\n api_key: \"${MINIMAX_LLM_API_KEY:}\"\n base_url: \"https://api.minimaxi.com/anthropic\"\n max_tokens: 16000\n stream_responses: true\n models:\n - name: \"MiniMax-M2.5\"\n tags: [cheap]\n - name: \"MiniMax-M2.7\"\n\n # OpenAI Responses API(可选)\n # 使用 /responses 端点,支持内置工具(web_search、image_generation 等)\n # 和有状态对话链(previous_response_id)。Reasoning 摘要可通过\n # reasoning_effort 参数控制深度。\n # stream_responses=true 时同样在 provider 内部流式接收并聚合返回。\n openai:\n type: \"openai-responses\"\n api_key: \"${OPENAI_API_KEY:}\"\n base_url: \"${OPENAI_API_BASE_URL:https://api.openai.com/v1}\"\n store_responses: true\n use_previous_response_id: false\n stream_responses: true\n reasoning_effort: \"medium\"\n # built_in_tools: [\"web_search\", \"image_generation\"]\n models:\n - name: \"gpt-5.4\"\n capabilities:\n image_input: true\n image_generation: true\n web_search: true\n tool_calling: true\n reasoning: true\n\ndefault_provider: deepseek-main # 可选,默认使用 providers 中的第一个 key\n\n# ── 多模态 / 图片理解 ─────────────────────────────────\n# image_fallback_mode:\n# auto: 主模型不支持 image_input 时,自动调用 fallback vision 模型生成描述\n# tool: 主模型不支持 image_input 时,注入 image_understand 工具,由主模型按需调用\n# off: 不处理图片,只保留普通文本\n# media_context_policy:\n# cache_aware: 最近图片尽量保留原生内容块,旧图片降级为描述\n# native_recent: 仅最近图片保留原生内容块\n# description_only: 历史图片只使用描述\nmultimodal:\n image_fallback_mode: \"auto\"\n media_context_policy: \"cache_aware\"\n image_fallback_provider: \"\" # Legacy;建议把 provider 写进 image_fallback_model\n image_fallback_model: \"siliconflow/Qwen/Qwen3.6-35B-A3B\"\n max_images_per_turn: 4\n max_image_bytes: 10485760\n media_cache_ttl_seconds: 3600\n\n# ── 插件配置 ──────────────────────────────────────────\n# Settings 的 extra=\"allow\" 机制:顶层 key 如果不是已知字段,\n# 且值为 dict,则按 plugin id 匹配并注入到对应插件的 manifest.config 中。\n\nbuiltin-commands:\n # send_local_attachment 默认只允许发送 active workspace 内的相对路径。\n # 如确实需要发送工作区外的本地文件,可打开下面开关。\n allow_external_attachment_paths: false\n # 可选白名单目录;为空表示打开上方开关后允许任意绝对路径。\n # external_attachment_roots:\n # - \"<absolute-directory>\"\n external_attachment_roots: []\n\n# OpenAI-compatible 图片生成(可选)\n# 启用后注册 /draw、/生图 命令和 image_generate tool。\n# image_generation:\n# enabled: true\n# provider: default\n# backends:\n# default:\n# type: openai-images\n# api_key: \"${IMAGE_API_KEY}\"\n# base_url: \"${IMAGE_BASE_URL}\"\n# model: \"gpt-image-1\"\n# timeout_seconds: 600\n# download_timeout_seconds: 120\n# trust_env: false\n# force_close_connections: true\n# output_dir: \"generated/images\"\n# auto_send: true\n# max_images_per_24h: 20\n\ngithub-notifier:\n # 目标仓库;保持 OWNER/REPO 时插件会视为未配置,不会启动 webhook/polling。\n repo: \"OWNER/REPO\"\n # typed chat address 列表,例如 milky:group:123456789 或 telegram:private:123456789。\n target_chat_addresses: []\n webhook:\n enabled: true\n path: \"github\" # 最终路径: /webhooks/github\n secret: \"${GITHUB_WEBHOOK_SECRET:}\"\n polling:\n enabled: true # webhook 不可用时的 fallback;首次轮询只建立基线\n interval_seconds: 60\n api_base_url: \"https://api.github.com\"\n token: \"${GITHUB_TOKEN:}\" # 私有仓库或更高 rate limit 时填写\n registration:\n enabled: false # 开启后可在聊天中使用 /github_watch 动态订阅\n\n# RSS/Atom 订阅通知(外部插件 plugins/rss-notifier)\n# rss-notifier:\n# enabled: true\n# # 默认推送目标;feed 未设置 target_chat_addresses 时使用这里。\n# target_chat_addresses:\n# - \"milky:group:123456789\"\n# feeds:\n# - url: \"https://example.com/feed.xml\"\n# title: \"Example\"\n# polling:\n# enabled: true\n# interval_seconds: 300\n# rendering:\n# mode: \"standard\" # compact / standard / rich\n# max_text_chars: 500\n# max_paragraphs: 3\n# include_images: true\n# max_images: 1\n# send_image_attachments: true # 下载图片并作为 photo 附件发送;失败时退化为图片链接\n# max_image_bytes: 5000000\n# registration:\n# enabled: true # 开启后可在聊天中使用 /rss_sub 动态订阅\n\nconversation_joiner:\n # 主动入话题默认关闭。开启前需要对应群频道启用 group_context_capture,\n # 让未触发消息先进入 MessageObserved。\n enabled: false\n model: cheap # model spec;没有 cheap tag 时可改成 provider/model,或留空使用默认模型\n threshold: 0.75\n max_context_messages: 12\n max_context_chars: 3000\n cooldown_seconds: 300\n max_triggers_per_hour: 3\n debounce_seconds: 20\n decision_timeout_seconds: 8\n persona_context:\n enabled: true # 启用后秘书模型会读取 workspace 中的人设文件辅助判断是否自然入话题\n files:\n - SOUL.md\n max_chars: 4000 # 注入秘书模型的人设上下文总字符上限\n cache_ttl_seconds: 60 # persona 文件缓存时间,避免每条候选消息都读文件\n prefilter:\n ignore_commands: true\n ignore_mentions: true\n min_text_chars: 4\n keyword_hints: []\n sample_rate: 0.15 # 普通候选消息进入秘书模型的采样概率\n keyword_sample_rate: 1.0 # 命中 keyword_hints 后进入秘书模型的采样概率\n groups: {}\n # groups:\n # milky:group:123456789:\n # enabled: true\n # threshold: 0.78\n # cooldown_seconds: 300\n engagement:\n enabled: false # 打开后进入 observing/joining/engaged/cooling 状态机\n join_state_ttl_seconds: 600\n idle_exit_seconds: 180\n max_engaged_seconds: 1800\n response_cooldown_seconds: 45\n engagement_score_alpha: 0.2\n engagement_score_exit_threshold: 0.2\n score_decay_half_life_seconds: 600\n score_decay_floor: 0.0\n batching:\n window_seconds: 8 # 后续群消息进入 batch 的短窗口\n max_messages: 6 # 窗口内消息过多时提前 flush\n max_chars: 2000\n flush_on_mention: true\n continue_gate:\n enabled: true # 每个 flushed batch 交给秘书模型判断是否继续接话\n model: cheap\n threshold: 0.55\n min_messages: 1\n evaluate_interval_seconds: 8\n exit_gate:\n enabled: true\n low_value_threshold: 0.35\n low_value_strikes: 3\n min_messages_per_window: 1\n activity_window_seconds: 120\n\ntelegram:\n bot_token: \"${TELEGRAM_BOT_TOKEN:}\"\n # group_trigger_mode: \"always\" # none / mention / command / always\n # group_context_capture: false # mention/command 模式下,是否记录未触发群消息作为上下文\n # reply_to_inbound: null # true/false 覆盖 router.reply_to_inbound;null/省略表示跟随全局\n # proxy: \"${TELEGRAM_PROXY:}\" # SOCKS5/HTTP 代理,如 socks5://127.0.0.1:1080\n # polling_timeout: 30\n # allowed_chats: []\n\n# Milky QQ Channel(可选)\n# 启用前请先启动 Lagrange.Milky,并确保 nahida_bot/channels/milky/plugin.yaml\n# 可被内置 channel discovery 扫描到。保持注释状态不会启用 Milky。\n#\n# milky:\n# base_url: \"http://127.0.0.1:3000\"\n# access_token: \"${MILKY_ACCESS_TOKEN:}\"\n# api_prefix: \"/api\"\n# event_path: \"/event\"\n# # ws_url: \"ws://127.0.0.1:3000/event\" # 可选:覆盖由 base_url 推导出的 WS 地址\n# command_prefix: \"/\"\n# group_trigger_mode: \"mention\" # none / mention / command / always\n# group_context_capture: false # true 时,未触发群消息只记录为上下文,可供 conversation_joiner 判断\n# reply_to_inbound: null # true/false 覆盖 router.reply_to_inbound;null/省略表示跟随全局\n# allowed_friends: [] # QQ 号白名单;空列表表示不限制\n# allowed_groups: [] # 群号白名单;空列表表示不限制\n# connect_timeout: 10.0\n# heartbeat_timeout: 30.0\n# reconnect_initial_delay: 1.0\n# reconnect_max_delay: 30.0\n# send_retry_attempts: 3\n# send_retry_backoff: 1.0\n# max_text_length: 4000\n# media_download_dir: \"./data/temp/media\"\n# enable_media_download_tool: true\n# resource_url_ttl_hint: 300\n# cache_media_on_receive: true\n# max_forward_depth: 3\n# max_forward_messages: 80\n# forward_render_max_chars: 12000\n# scene_cache_size: 4096\n\n# ── Agent Loop ──────────────────────────────────────────\n# 控制 Agent 循环的行为:迭代轮数、超时、重试策略等。\n# 以下均为默认值,不写则使用默认值。\n#\n# agent:\n# max_steps: 8 # 最大工具调用迭代轮数\n# provider_timeout_seconds: 120.0 # 单次 LLM 调用超时(秒)\n# retry_attempts: 2 # LLM 调用重试次数\n# retry_backoff_seconds: 0.2 # 重试退避间隔(秒)\n# tool_timeout_seconds: 135.0 # 工具执行超时(秒)\n# tool_retry_attempts: 1 # 工具执行重试次数\n# tool_retry_backoff_seconds: 0.1 # 工具重试退避间隔(秒)\n# max_tool_log_chars: 400 # 工具日志截断长度\n# # tool_use_system_prompt: \"...\" # 注入的工具使用提示\n# # provider_error_template: \"...\" # Provider 错误消息模板\n\n# ── Agent Runtime(canonical ledger,修复 #24 地基)─────────\n# Phase 1:best-effort 把每个 run 的 canonical 事件流与执行回执落库(附加双写,\n# 不改对外行为)。reading/重放端属 Phase 5。默认代码里为 false;这里置 true 以采集数据。\nagent_runtime:\n canonical_ledger_enabled: true\n # Phase 5:把每个 run 的有序 tool transcript 落到 agent_runs.transcript_json,\n # 下一轮由 TranscriptProjector 投影成成对 tool_use/tool_result 注入历史,\n # 替代被剥离的纯文本叙述(#24 根因)。默认代码里为 false;这里置 true 采集数据。\n # 旧 run(无 transcript_json)自动回退到原文本历史路径。\n transcript_replay_enabled: true\n\n# ── Context Budget ──────────────────────────────────────\n# 控制未知模型 fallback 上下文窗口和 reasoning chain 预算。\n# 模型声明 providers.*.models[].capabilities.context_window 时优先使用模型窗口。\n# 以下均为默认值,不写则使用默认值。\n#\n# context:\n# max_tokens: 272000 # 未声明模型窗口时的 fallback context window\n# reserved_tokens: 10000 # 未声明模型窗口时为输出保留的 token\n# # max_chars: null # 字符数上限(兼容旧逻辑,优先使用 max_tokens)\n# # reserved_chars: 0 # 字符保留数\n# summary_max_chars: 2000 # 历史摘要最大字符数\n# reasoning_policy: \"budget\" # strip / append / budget\n# max_reasoning_tokens: 2000 # reasoning chain token 预算\n\n# ── Identity / delegated authorization ────────────────\n# Identity must be enabled for the privileged-tool gate and tickets to apply.\n# Admins are authenticated account keys assembled from channel + account id;\n# being linked to a Person does not make an account an admin.\n#\n# identity:\n# enabled: false\n# admins:\n# - channel: \"milky\"\n# platform_account_id: \"123456789\"\n# authorization_tickets:\n# enabled: false # explicit opt-in\n# challenge_ttl_seconds: 600 # requester waits for admin approval\n# grant_ttl_seconds: 300 # approved one-use grant lifetime\n# max_grant_ttl_seconds: 900 # hard cap for /auth approve TTL\n\n# ── Scheduler ──────────────────────────────────────────\n# 控制定时任务调度行为。\n# 以下均为默认值,不写则使用默认值。\n#\n# scheduler:\n# poll_interval_seconds: 1.0 # 调度轮询间隔(秒)\n# max_concurrent_fires: 5 # 最大并发执行数\n# job_timeout_seconds: 120.0 # 单任务超时(秒)\n# min_interval_seconds: 60 # cron 最小间隔\n# max_prompt_chars: 12000 # 定时任务 prompt 最大字符数\n# max_jobs_per_chat: 20 # 每个会话最大任务数\n# failure_retry_seconds: 300 # 失败重试等待(秒)\n# max_consecutive_failures: 3 # 连续失败上限\n# memory_dreaming_enabled: true # 是否启用内部记忆 dreaming\n# memory_dreaming_interval_seconds: 3600 # dreaming 周期(秒)\n# memory_dreaming_initial_delay_seconds: 300 # 启动后首次 dreaming 延迟\n# memory_dreaming_session_limit: 20 # 单次最多扫描会话数\n# memory_dreaming_recent_turn_limit: 40 # 单会话最多读取 turns 数\n# memory_dreaming_provider_id: \"\" # Legacy;建议改用 memory_dreaming_model\n# memory_dreaming_model: \"\" # model spec;空则默认找 memory tag,失败后走会话模型\n\n# ── Router ─────────────────────────────────────────────\n# 控制消息路由行为。system_prompt 使用顶层 system_prompt 字段。\n# 以下均为默认值,不写则使用默认值。\n#\n# router:\n# # system_prompt: \"...\" # 与顶层 system_prompt 重复,优先使用顶层字段\n# max_history_turns: 200 # 最大历史轮数\n# agent_enabled: true # 是否启用 Agent\n# command_timeout_seconds: 30.0 # 命令执行超时(秒)\n# command_timeout_message: \"Command timed out. Please try again later.\"\n# reply_to_inbound: true # 默认是否引用回复触发消息;平台插件可覆盖\n# group_context:\n# enabled: true # 是否在触发时注入 observed-only 群上下文\n# max_messages: 20 # 最多注入最近多少条未触发群消息\n# ttl_seconds: 900 # 只注入最近 N 秒内的群上下文;0 表示不按时间过滤\n# max_chars: 4000 # 群上下文注入块最大字符数\n# topic_gap_seconds: 300 # 群消息静默超过此值视为新话题;0 关闭\n# continuity_gap_seconds: 1800 # 对话连续性判定(秒):当前触发与上次对话 turn 间隔超过此值则视为新对话,丢弃旧 history;0 关闭\n\n# ── Model Tags / Specs ─────────────────────────────────\n# providers 的 models 中用 tags 字段标记模型角色:\n# primary / cheap / memory / embedding / reranker / vision\n# 需要内部模型的配置项都接受一个 model spec 字符串;这个字符串可以是 tag,\n# 也可以是 provider/model 或裸模型名。\n\n# ── Memory ─────────────────────────────────────────────\n# 长期记忆检索和 embedding 配置。默认只启用 SQLite FTS;vector/hybrid\n# 需要显式开启,并在 providers.models 中配置带 embedding tag 的模型。\n#\n# memory:\n# enabled: true\n# retrieval:\n# fts_enabled: true\n# vector_enabled: false # 开启后对长期记忆使用 hybrid 检索\n# hybrid_enabled: true\n# vector_backend: json # json / sqlite-vec / none\n# max_injected_items: 5\n# max_injected_chars: 4000\n# embedding:\n# enabled: false\n# model: \"\" # model spec;空则默认找 embedding tag\n# dimensions: 0 # 0 = auto-detect via probe embed call\n# batch_size: 16\n# embed_after_consolidation: true\n# consolidation:\n# rule_based_enabled: true # 是否启用每轮对话后的规则抽取;false 时只保留 dreaming/显式写入\n"}, "ac7d1a30843737a145a3807747cc88fec5a3cb1a": {"t": 1785761617.8992293, "n": 14881, "h": "5b346fe505e98405", "c": "# Nahida Bot 配置文件\n# 参见 nahida_bot.core.config.Settings 了解所有可用字段\n\n# ── 应用 ──────────────────────────────────────────────\napp_name: \"Nahida Bot\"\ndebug: false\nlog_level: \"INFO\" # DEBUG / INFO / WARNING / ERROR(控制台级别)\n# log_json: true # 设为 true 输出 JSON 格式日志(生产环境推荐)\n# 可复盘基线(agent-loop 修复 Phase 0):默认把应用日志落盘到 JSON Lines 文件,\n# 文件级别 DEBUG 以便保留 agent_loop.run_completed 的 terminal_state/reason、\n# provider 协议异常、context 来源等字段。控制台仍保持 INFO,不被 DEBUG 刷屏。\nlog_file: \"./data/logs/nahida.log\"\nlog_file_level: \"DEBUG\"\nlog_file_json: true\n# 按文件大小滚动日志:单文件达到 log_file_max_bytes 后轮转,最多保留\n# log_file_backup_count 个历史备份(nahida.log.1、nahida.log.2 …)。\n# max_bytes=0 表示不滚动(日志文件会无限增长)。默认 10 MiB × 5 份。\nlog_file_max_bytes: 10485760 # 单个日志文件上限(字节),0 = 不滚动\nlog_file_backup_count: 5 # 保留的滚动备份数\ndependency_log_level: \"WARNING\" # 三方库默认日志级别;避免 DEBUG 时被 httpx/websockets 等刷屏\n# logger_levels: # 可选:按 logger 名覆盖(注意:会同时作用于控制台与文件)\n# nahida_bot.agent: \"DEBUG\"\n# plugin.rss-notifier: \"DEBUG\"\n# httpx: \"WARNING\"\n\n# ── 服务器 ────────────────────────────────────────────\nhost: \"127.0.0.1\"\nport: 6185\n\n# ── 数据库 ────────────────────────────────────────────\ndb_path: \"./data/nahida.db\"\n\n# ── Workspace ─────────────────────────────────────────\nworkspace_base_dir: \"./data/workspace\"\n\n# ── 插件 ──────────────────────────────────────────────\nplugin_paths:\n - \"./plugins\"\n\n# ── Agent / Router ────────────────────────────────────\nsystem_prompt: \"You are a helpful assistant.\"\n\n# ── LLM Providers(dict 格式,key 即 provider id)───\n# 默认配置已经是多 provider。每个 provider 有独立的 api_key、base_url 和 models。\n# models 的第一个元素是该 provider 的默认模型;每个模型可以是字符串,\n# 也可以是 {name, tags, capabilities} 对象。通过 /model 命令可在聊天中切换模型。\n#\n# 没有配置 api_key 的 provider 会在启动时被跳过;因此可以只填写实际使用的后端。\nproviders:\n deepseek-main:\n type: deepseek\n api_key: \"${DEEPSEEK_LLM_API_KEY:}\"\n base_url: \"${DEEPSEEK_LLM_BASE_URL:https://api.deepseek.com}\"\n # 内部使用 SSE 接收并聚合,可避免长推理期间普通读超时误判。\n stream_responses: true\n # thinking_enabled: false # 关闭 DeepSeek thinking mode\n models:\n - name: \"deepseek-v4-pro\"\n tags: [primary]\n - name: \"deepseek-v4-flash\"\n tags: [cheap, memory]\n\n siliconflow:\n type: \"openai-compatible\"\n api_key: \"${SILICONFLOW_LLM_API_KEY:}\"\n base_url: \"${SILICONFLOW_LLM_BASE_URL:https://api.siliconflow.cn/v1}\"\n merge_system_messages: true\n stream_responses: true\n models:\n - name: \"Qwen/Qwen3-Embedding-8B\"\n tags: [embedding]\n - name: \"Pro/zai-org/GLM-5\"\n tags: [vision]\n - name: \"Qwen/Qwen3.6-35B-A3B\"\n tags: [vision]\n capabilities:\n image_input: true\n max_image_count: 4\n max_image_bytes: 10485760\n\n minimax:\n type: minimax\n api_key: \"${MINIMAX_LLM_API_KEY:}\"\n base_url: \"https://api.minimaxi.com/anthropic\"\n max_tokens: 16000\n stream_responses: true\n models:\n - name: \"MiniMax-M2.5\"\n tags: [cheap]\n - name: \"MiniMax-M2.7\"\n\n # OpenAI Responses API(可选)\n # 使用 /responses 端点,支持内置工具(web_search、image_generation 等)\n # 和有状态对话链(previous_response_id)。Reasoning 摘要可通过\n # reasoning_effort 参数控制深度。\n # stream_responses=true 时同样在 provider 内部流式接收并聚合返回。\n openai:\n type: \"openai-responses\"\n api_key: \"${OPENAI_API_KEY:}\"\n base_url: \"${OPENAI_API_BASE_URL:https://api.openai.com/v1}\"\n store_responses: true\n use_previous_response_id: false\n stream_responses: true\n reasoning_effort: \"medium\"\n # built_in_tools: [\"web_search\", \"image_generation\"]\n models:\n - name: \"gpt-5.4\"\n capabilities:\n image_input: true\n image_generation: true\n web_search: true\n tool_calling: true\n reasoning: true\n\ndefault_provider: deepseek-main # 可选,默认使用 providers 中的第一个 key\n\n# ── 多模态 / 图片理解 ─────────────────────────────────\n# image_fallback_mode:\n# auto: 主模型不支持 image_input 时,自动调用 fallback vision 模型生成描述\n# tool: 主模型不支持 image_input 时,注入 image_understand 工具,由主模型按需调用\n# off: 不处理图片,只保留普通文本\n# media_context_policy:\n# cache_aware: 最近图片尽量保留原生内容块,旧图片降级为描述\n# native_recent: 仅最近图片保留原生内容块\n# description_only: 历史图片只使用描述\nmultimodal:\n image_fallback_mode: \"auto\"\n media_context_policy: \"cache_aware\"\n image_fallback_provider: \"\" # Legacy;建议把 provider 写进 image_fallback_model\n image_fallback_model: \"siliconflow/Qwen/Qwen3.6-35B-A3B\"\n max_images_per_turn: 4\n max_image_bytes: 10485760\n media_cache_ttl_seconds: 3600\n\n# ── 插件配置 ──────────────────────────────────────────\n# Settings 的 extra=\"allow\" 机制:顶层 key 如果不是已知字段,\n# 且值为 dict,则按 plugin id 匹配并注入到对应插件的 manifest.config 中。\n\nbuiltin-commands:\n # send_local_attachment 默认只允许发送 active workspace 内的相对路径。\n # 如确实需要发送工作区外的本地文件,可打开下面开关。\n allow_external_attachment_paths: false\n # 可选白名单目录;为空表示打开上方开关后允许任意绝对路径。\n # external_attachment_roots:\n # - \"<absolute-directory>\"\n external_attachment_roots: []\n\n# OpenAI-compatible 图片生成(可选)\n# 启用后注册 /draw、/生图 命令和 image_generate tool。\n# image_generation:\n# enabled: true\n# provider: default\n# backends:\n# default:\n# type: openai-images\n# api_key: \"${IMAGE_API_KEY}\"\n# base_url: \"${IMAGE_BASE_URL}\"\n# model: \"gpt-image-1\"\n# timeout_seconds: 600\n# download_timeout_seconds: 120\n# trust_env: false\n# force_close_connections: true\n# output_dir: \"generated/images\"\n# auto_send: true\n# max_images_per_24h: 20\n\ngithub-notifier:\n # 目标仓库;保持 OWNER/REPO 时插件会视为未配置,不会启动 webhook/polling。\n repo: \"OWNER/REPO\"\n # typed chat address 列表,例如 milky:group:123456789 或 telegram:private:123456789。\n target_chat_addresses: []\n webhook:\n enabled: true\n path: \"github\" # 最终路径: /webhooks/github\n secret: \"${GITHUB_WEBHOOK_SECRET:}\"\n polling:\n enabled: true # webhook 不可用时的 fallback;首次轮询只建立基线\n interval_seconds: 60\n api_base_url: \"https://api.github.com\"\n token: \"${GITHUB_TOKEN:}\" # 私有仓库或更高 rate limit 时填写\n registration:\n enabled: false # 开启后可在聊天中使用 /github_watch 动态订阅\n\n# RSS/Atom 订阅通知(外部插件 plugins/rss-notifier)\n# rss-notifier:\n# enabled: true\n# # 默认推送目标;feed 未设置 target_chat_addresses 时使用这里。\n# target_chat_addresses:\n# - \"milky:group:123456789\"\n# feeds:\n# - url: \"https://example.com/feed.xml\"\n# title: \"Example\"\n# polling:\n# enabled: true\n# interval_seconds: 300\n# rendering:\n# mode: \"standard\" # compact / standard / rich\n# max_text_chars: 500\n# max_paragraphs: 3\n# include_images: true\n# max_images: 1\n# send_image_attachments: true # 下载图片并作为 photo 附件发送;失败时退化为图片链接\n# max_image_bytes: 5000000\n# registration:\n# enabled: true # 开启后可在聊天中使用 /rss_sub 动态订阅\n\nconversation_joiner:\n # 主动入话题默认关闭。开启前需要对应群频道启用 group_context_capture,\n # 让未触发消息先进入 MessageObserved。\n enabled: false\n model: cheap # model spec;没有 cheap tag 时可改成 provider/model,或留空使用默认模型\n threshold: 0.75\n max_context_messages: 12\n max_context_chars: 3000\n cooldown_seconds: 300\n max_triggers_per_hour: 3\n debounce_seconds: 20\n decision_timeout_seconds: 8\n persona_context:\n enabled: true # 启用后秘书模型会读取 workspace 中的人设文件辅助判断是否自然入话题\n files:\n - SOUL.md\n max_chars: 4000 # 注入秘书模型的人设上下文总字符上限\n cache_ttl_seconds: 60 # persona 文件缓存时间,避免每条候选消息都读文件\n prefilter:\n ignore_commands: true\n ignore_mentions: true\n min_text_chars: 4\n keyword_hints: []\n sample_rate: 0.15 # 普通候选消息进入秘书模型的采样概率\n keyword_sample_rate: 1.0 # 命中 keyword_hints 后进入秘书模型的采样概率\n groups: {}\n # groups:\n # milky:group:123456789:\n # enabled: true\n # threshold: 0.78\n # cooldown_seconds: 300\n engagement:\n enabled: false # 打开后进入 observing/joining/engaged/cooling 状态机\n join_state_ttl_seconds: 600\n idle_exit_seconds: 180\n max_engaged_seconds: 1800\n response_cooldown_seconds: 45\n engagement_score_alpha: 0.2\n engagement_score_exit_threshold: 0.2\n score_decay_half_life_seconds: 600\n score_decay_floor: 0.0\n batching:\n window_seconds: 8 # 后续群消息进入 batch 的短窗口\n max_messages: 6 # 窗口内消息过多时提前 flush\n max_chars: 2000\n flush_on_mention: true\n continue_gate:\n enabled: true # 每个 flushed batch 交给秘书模型判断是否继续接话\n model: cheap\n threshold: 0.55\n min_messages: 1\n evaluate_interval_seconds: 8\n exit_gate:\n enabled: true\n low_value_threshold: 0.35\n low_value_strikes: 3\n min_messages_per_window: 1\n activity_window_seconds: 120\n\ntelegram:\n bot_token: \"${TELEGRAM_BOT_TOKEN:}\"\n # group_trigger_mode: \"always\" # none / mention / command / always\n # group_context_capture: false # mention/command 模式下,是否记录未触发群消息作为上下文\n # reply_to_inbound: null # true/false 覆盖 router.reply_to_inbound;null/省略表示跟随全局\n # proxy: \"${TELEGRAM_PROXY:}\" # SOCKS5/HTTP 代理,如 socks5://127.0.0.1:1080\n # polling_timeout: 30\n # allowed_chats: []\n\n# Milky QQ Channel(可选)\n# 启用前请先启动 Lagrange.Milky,并确保 nahida_bot/channels/milky/plugin.yaml\n# 可被内置 channel discovery 扫描到。保持注释状态不会启用 Milky。\n#\n# milky:\n# base_url: \"http://127.0.0.1:3000\"\n# access_token: \"${MILKY_ACCESS_TOKEN:}\"\n# api_prefix: \"/api\"\n# event_path: \"/event\"\n# # ws_url: \"ws://127.0.0.1:3000/event\" # 可选:覆盖由 base_url 推导出的 WS 地址\n# command_prefix: \"/\"\n# group_trigger_mode: \"mention\" # none / mention / command / always\n# group_context_capture: false # true 时,未触发群消息只记录为上下文,可供 conversation_joiner 判断\n# reply_to_inbound: null # true/false 覆盖 router.reply_to_inbound;null/省略表示跟随全局\n# allowed_friends: [] # QQ 号白名单;空列表表示不限制\n# allowed_groups: [] # 群号白名单;空列表表示不限制\n# connect_timeout: 10.0\n# heartbeat_timeout: 30.0\n# reconnect_initial_delay: 1.0\n# reconnect_max_delay: 30.0\n# send_retry_attempts: 3\n# send_retry_backoff: 1.0\n# max_text_length: 4000\n# media_download_dir: \"./data/temp/media\"\n# enable_media_download_tool: true\n# resource_url_ttl_hint: 300\n# cache_media_on_receive: true\n# max_forward_depth: 3\n# max_forward_messages: 80\n# forward_render_max_chars: 12000\n# scene_cache_size: 4096\n\n# ── Agent Loop ──────────────────────────────────────────\n# 控制 Agent 循环的行为:迭代轮数、超时、重试策略等。\n# 以下均为默认值,不写则使用默认值。\n#\n# agent:\n# max_steps: 8 # 最大工具调用迭代轮数\n# provider_timeout_seconds: 120.0 # 单次 LLM 调用超时(秒)\n# retry_attempts: 2 # LLM 调用重试次数\n# retry_backoff_seconds: 0.2 # 重试退避间隔(秒)\n# tool_timeout_seconds: 135.0 # 工具执行超时(秒)\n# tool_retry_attempts: 1 # 工具执行重试次数\n# tool_retry_backoff_seconds: 0.1 # 工具重试退避间隔(秒)\n# max_tool_log_chars: 400 # 工具日志截断长度\n# # tool_use_system_prompt: \"...\" # 注入的工具使用提示\n# # provider_error_template: \"...\" # Provider 错误消息模板\n\n# ── Agent Runtime(canonical ledger,修复 #24 地基)─────────\n# Phase 1:best-effort 把每个 run 的 canonical 事件流与执行回执落库(附加双写,\n# 不改对外行为)。reading/重放端属 Phase 5。默认代码里为 false;这里置 true 以采集数据。\nagent_runtime:\n canonical_ledger_enabled: true\n # Phase 5:把每个 run 的有序 tool transcript 落到 agent_runs.transcript_json,\n # 下一轮由 TranscriptProjector 投影成成对 tool_use/tool_result 注入历史,\n # 替代被剥离的纯文本叙述(#24 根因)。默认代码里为 false;这里置 true 采集数据。\n # 旧 run(无 transcript_json)自动回退到原文本历史路径。\n transcript_replay_enabled: true\n\n# ── Context Budget ──────────────────────────────────────\n# 控制未知模型 fallback 上下文窗口和 reasoning chain 预算。\n# 模型声明 providers.*.models[].capabilities.context_window 时优先使用模型窗口。\n# 以下均为默认值,不写则使用默认值。\n#\n# context:\n# max_tokens: 272000 # 未声明模型窗口时的 fallback context window\n# reserved_tokens: 10000 # 未声明模型窗口时为输出保留的 token\n# # max_chars: null # 字符数上限(兼容旧逻辑,优先使用 max_tokens)\n# # reserved_chars: 0 # 字符保留数\n# summary_max_chars: 2000 # 历史摘要最大字符数\n# reasoning_policy: \"budget\" # strip / append / budget\n# max_reasoning_tokens: 2000 # reasoning chain token 预算\n\n# ── Scheduler ──────────────────────────────────────────\n# 控制定时任务调度行为。\n# 以下均为默认值,不写则使用默认值。\n#\n# scheduler:\n# poll_interval_seconds: 1.0 # 调度轮询间隔(秒)\n# max_concurrent_fires: 5 # 最大并发执行数\n# job_timeout_seconds: 120.0 # 单任务超时(秒)\n# min_interval_seconds: 60 # cron 最小间隔\n# max_prompt_chars: 12000 # 定时任务 prompt 最大字符数\n# max_jobs_per_chat: 20 # 每个会话最大任务数\n# failure_retry_seconds: 300 # 失败重试等待(秒)\n# max_consecutive_failures: 3 # 连续失败上限\n# memory_dreaming_enabled: true # 是否启用内部记忆 dreaming\n# memory_dreaming_interval_seconds: 3600 # dreaming 周期(秒)\n# memory_dreaming_initial_delay_seconds: 300 # 启动后首次 dreaming 延迟\n# memory_dreaming_session_limit: 20 # 单次最多扫描会话数\n# memory_dreaming_recent_turn_limit: 40 # 单会话最多读取 turns 数\n# memory_dreaming_provider_id: \"\" # Legacy;建议改用 memory_dreaming_model\n# memory_dreaming_model: \"\" # model spec;空则默认找 memory tag,失败后走会话模型\n\n# ── Router ─────────────────────────────────────────────\n# 控制消息路由行为。system_prompt 使用顶层 system_prompt 字段。\n# 以下均为默认值,不写则使用默认值。\n#\n# router:\n# # system_prompt: \"...\" # 与顶层 system_prompt 重复,优先使用顶层字段\n# max_history_turns: 200 # 最大历史轮数\n# agent_enabled: true # 是否启用 Agent\n# command_timeout_seconds: 30.0 # 命令执行超时(秒)\n# command_timeout_message: \"Command timed out. Please try again later.\"\n# reply_to_inbound: true # 默认是否引用回复触发消息;平台插件可覆盖\n# group_context:\n# enabled: true # 是否在触发时注入 observed-only 群上下文\n# max_messages: 20 # 最多注入最近多少条未触发群消息\n# ttl_seconds: 900 # 只注入最近 N 秒内的群上下文;0 表示不按时间过滤\n# max_chars: 4000 # 群上下文注入块最大字符数\n# topic_gap_seconds: 300 # 群消息静默超过此值视为新话题;0 关闭\n# continuity_gap_seconds: 1800 # 对话连续性判定(秒):当前触发与上次对话 turn 间隔超过此值则视为新对话,丢弃旧 history;0 关闭\n\n# ── Model Tags / Specs ─────────────────────────────────\n# providers 的 models 中用 tags 字段标记模型角色:\n# primary / cheap / memory / embedding / reranker / vision\n# 需要内部模型的配置项都接受一个 model spec 字符串;这个字符串可以是 tag,\n# 也可以是 provider/model 或裸模型名。\n\n# ── Memory ─────────────────────────────────────────────\n# 长期记忆检索和 embedding 配置。默认只启用 SQLite FTS;vector/hybrid\n# 需要显式开启,并在 providers.models 中配置带 embedding tag 的模型。\n#\n# memory:\n# enabled: true\n# retrieval:\n# fts_enabled: true\n# vector_enabled: false # 开启后对长期记忆使用 hybrid 检索\n# hybrid_enabled: true\n# vector_backend: json # json / sqlite-vec / none\n# max_injected_items: 5\n# max_injected_chars: 4000\n# embedding:\n# enabled: false\n# model: \"\" # model spec;空则默认找 embedding tag\n# dimensions: 0 # 0 = auto-detect via probe embed call\n# batch_size: 16\n# embed_after_consolidation: true\n# consolidation:\n# rule_based_enabled: true # 是否启用每轮对话后的规则抽取;false 时只保留 dreaming/显式写入\n"}, "448f5be9fedd118aae12c784f521a29b15163ca3": {"t": 1785761620.3676522, "n": 14819, "h": "8f62149568ed5fc4", "c": "# Nahida Bot 配置文件\n# 参见 nahida_bot.core.config.Settings 了解所有可用字段\n\n# ── 应用 ──────────────────────────────────────────────\napp_name: \"Nahida Bot\"\ndebug: false\nlog_level: \"INFO\" # DEBUG / INFO / WARNING / ERROR(控制台级别)\n# log_json: true # 设为 true 输出 JSON 格式日志(生产环境推荐)\n# 可复盘基线(agent-loop 修复 Phase 0):默认把应用日志落盘到 JSON Lines 文件,\n# 文件级别 DEBUG 以便保留 agent_loop.run_completed 的 terminal_state/reason、\n# provider 协议异常、context 来源等字段。控制台仍保持 INFO,不被 DEBUG 刷屏。\nlog_file: \"./data/logs/nahida.log\"\nlog_file_level: \"DEBUG\"\nlog_file_json: true\n# 按文件大小滚动日志:单文件达到 log_file_max_bytes 后轮转,最多保留\n# log_file_backup_count 个历史备份(nahida.log.1、nahida.log.2 …)。\n# max_bytes=0 表示不滚动(日志文件会无限增长)。默认 10 MiB × 5 份。\nlog_file_max_bytes: 10485760 # 单个日志文件上限(字节),0 = 不滚动\nlog_file_backup_count: 5 # 保留的滚动备份数\ndependency_log_level: \"WARNING\" # 三方库默认日志级别;避免 DEBUG 时被 httpx/websockets 等刷屏\n# logger_levels: # 可选:按 logger 名覆盖(注意:会同时作用于控制台与文件)\n# nahida_bot.agent: \"DEBUG\"\n# plugin.rss-notifier: \"DEBUG\"\n# httpx: \"WARNING\"\n\n# ── 服务器 ────────────────────────────────────────────\nhost: \"127.0.0.1\"\nport: 6185\n\n# ── 数据库 ────────────────────────────────────────────\ndb_path: \"./data/nahida.db\"\n\n# ── Workspace ─────────────────────────────────────────\nworkspace_base_dir: \"./data/workspace\"\n\n# ── 插件 ──────────────────────────────────────────────\nplugin_paths:\n - \"./plugins\"\n\n# ── Agent / Router ────────────────────────────────────\nsystem_prompt: \"You are a helpful assistant.\"\n\n# ── LLM Providers(dict 格式,key 即 provider id)───\n# 默认配置已经是多 provider。每个 provider 有独立的 api_key、base_url 和 models。\n# models 的第一个元素是该 provider 的默认模型;每个模型可以是字符串,\n# 也可以是 {name, tags, capabilities} 对象。通过 /model 命令可在聊天中切换模型。\n#\n# 没有配置 api_key 的 provider 会在启动时被跳过;因此可以只填写实际使用的后端。\nproviders:\n deepseek-main:\n type: deepseek\n api_key: \"${DEEPSEEK_LLM_API_KEY:}\"\n base_url: \"${DEEPSEEK_LLM_BASE_URL:https://api.deepseek.com}\"\n # 内部使用 SSE 接收并聚合,可避免长推理期间普通读超时误判。\n stream_responses: true\n # thinking_enabled: false # 关闭 DeepSeek thinking mode\n models:\n - name: \"deepseek-v4-pro\"\n tags: [primary]\n - name: \"deepseek-v4-flash\"\n tags: [cheap, memory]\n\n siliconflow:\n type: \"openai-compatible\"\n api_key: \"${SILICONFLOW_LLM_API_KEY:}\"\n base_url: \"${SILICONFLOW_LLM_BASE_URL:https://api.siliconflow.cn/v1}\"\n merge_system_messages: true\n stream_responses: true\n models:\n - name: \"Qwen/Qwen3-Embedding-8B\"\n tags: [embedding]\n - name: \"Pro/zai-org/GLM-5\"\n tags: [vision]\n - name: \"Qwen/Qwen3.6-35B-A3B\"\n tags: [vision]\n capabilities:\n image_input: true\n max_image_count: 4\n max_image_bytes: 10485760\n\n minimax:\n type: minimax\n api_key: \"${MINIMAX_LLM_API_KEY:}\"\n base_url: \"https://api.minimaxi.com/anthropic\"\n max_tokens: 16000\n stream_responses: true\n models:\n - name: \"MiniMax-M2.5\"\n tags: [cheap]\n - name: \"MiniMax-M2.7\"\n\n # OpenAI Responses API(可选)\n # 使用 /responses 端点,支持内置工具(web_search、image_generation 等)\n # 和有状态对话链(previous_response_id)。Reasoning 摘要可通过\n # reasoning_effort 参数控制深度。\n # stream_responses=true 时同样在 provider 内部流式接收并聚合返回。\n openai:\n type: \"openai-responses\"\n api_key: \"${OPENAI_API_KEY:}\"\n base_url: \"${OPENAI_API_BASE_URL:https://api.openai.com/v1}\"\n store_responses: true\n use_previous_response_id: false\n stream_responses: true\n reasoning_effort: \"medium\"\n # built_in_tools: [\"web_search\", \"image_generation\"]\n models:\n - name: \"gpt-5.4\"\n capabilities:\n image_input: true\n image_generation: true\n web_search: true\n tool_calling: true\n reasoning: true\n\ndefault_provider: deepseek-main # 可选,默认使用 providers 中的第一个 key\n\n# ── 多模态 / 图片理解 ─────────────────────────────────\n# image_fallback_mode:\n# auto: 主模型不支持 image_input 时,自动调用 fallback vision 模型生成描述\n# tool: 主模型不支持 image_input 时,注入 image_understand 工具,由主模型按需调用\n# off: 不处理图片,只保留普通文本\n# media_context_policy:\n# cache_aware: 最近图片尽量保留原生内容块,旧图片降级为描述\n# native_recent: 仅最近图片保留原生内容块\n# description_only: 历史图片只使用描述\nmultimodal:\n image_fallback_mode: \"auto\"\n media_context_policy: \"cache_aware\"\n image_fallback_provider: \"\" # Legacy;建议把 provider 写进 image_fallback_model\n image_fallback_model: \"siliconflow/Qwen/Qwen3.6-35B-A3B\"\n max_images_per_turn: 4\n max_image_bytes: 10485760\n media_cache_ttl_seconds: 3600\n\n# ── 插件配置 ──────────────────────────────────────────\n# Settings 的 extra=\"allow\" 机制:顶层 key 如果不是已知字段,\n# 且值为 dict,则按 plugin id 匹配并注入到对应插件的 manifest.config 中。\n\nbuiltin-commands:\n # send_local_attachment 默认只允许发送 active workspace 内的相对路径。\n # 如确实需要发送工作区外的本地文件,可打开下面开关。\n allow_external_attachment_paths: false\n # 可选白名单目录;为空表示打开上方开关后允许任意绝对路径。\n # external_attachment_roots:\n # - \"<absolute-directory>\"\n external_attachment_roots: []\n\n# OpenAI-compatible 图片生成(可选)\n# 启用后注册 /draw、/生图 命令和 image_generate tool。\n# image_generation:\n# enabled: true\n# provider: default\n# backends:\n# default:\n# type: openai-images\n# api_key: \"${IMAGE_API_KEY}\"\n# base_url: \"${IMAGE_BASE_URL}\"\n# model: \"gpt-image-1\"\n# timeout_seconds: 600\n# download_timeout_seconds: 120\n# trust_env: false\n# force_close_connections: true\n# output_dir: \"generated/images\"\n# auto_send: true\n# max_images_per_24h: 20\n\ngithub-notifier:\n # 目标仓库;保持 OWNER/REPO 时插件会视为未配置,不会启动 webhook/polling。\n repo: \"OWNER/REPO\"\n # typed chat address 列表,例如 milky:group:123456789 或 telegram:private:123456789。\n target_chat_addresses: []\n webhook:\n enabled: true\n path: \"github\" # 最终路径: /webhooks/github\n secret: \"${GITHUB_WEBHOOK_SECRET:}\"\n polling:\n enabled: true # webhook 不可用时的 fallback;首次轮询只建立基线\n interval_seconds: 60\n api_base_url: \"https://api.github.com\"\n token: \"${GITHUB_TOKEN:}\" # 私有仓库或更高 rate limit 时填写\n registration:\n enabled: false # 开启后可在聊天中使用 /github_watch 动态订阅\n\n# RSS/Atom 订阅通知(外部插件 plugins/rss-notifier)\n# rss-notifier:\n# enabled: true\n# # 默认推送目标;feed 未设置 target_chat_addresses 时使用这里。\n# target_chat_addresses:\n# - \"milky:group:123456789\"\n# feeds:\n# - url: \"https://example.com/feed.xml\"\n# title: \"Example\"\n# polling:\n# enabled: true\n# interval_seconds: 300\n# rendering:\n# mode: \"standard\" # compact / standard / rich\n# max_text_chars: 500\n# max_paragraphs: 3\n# include_images: true\n# max_images: 1\n# send_image_attachments: true # 下载图片并作为 photo 附件发送;失败时退化为图片链接\n# max_image_bytes: 5000000\n# registration:\n# enabled: true # 开启后可在聊天中使用 /rss_sub 动态订阅\n\nconversation_joiner:\n # 主动入话题默认关闭。开启前需要对应群频道启用 group_context_capture,\n # 让未触发消息先进入 MessageObserved。\n enabled: false\n model: cheap # model spec;没有 cheap tag 时可改成 provider/model,或留空使用默认模型\n threshold: 0.75\n max_context_messages: 12\n max_context_chars: 3000\n cooldown_seconds: 300\n max_triggers_per_hour: 3\n debounce_seconds: 20\n decision_timeout_seconds: 8\n persona_context:\n enabled: true # 启用后秘书模型会读取 workspace 中的人设文件辅助判断是否自然入话题\n files:\n - SOUL.md\n max_chars: 4000 # 注入秘书模型的人设上下文总字符上限\n cache_ttl_seconds: 60 # persona 文件缓存时间,避免每条候选消息都读文件\n prefilter:\n ignore_commands: true\n ignore_mentions: true\n min_text_chars: 4\n keyword_hints: []\n sample_rate: 0.15 # 普通候选消息进入秘书模型的采样概率\n keyword_sample_rate: 1.0 # 命中 keyword_hints 后进入秘书模型的采样概率\n groups: {}\n # groups:\n # milky:group:123456789:\n # enabled: true\n # threshold: 0.78\n # cooldown_seconds: 300\n engagement:\n enabled: false # 打开后进入 observing/joining/engaged/cooling 状态机\n join_state_ttl_seconds: 600\n idle_exit_seconds: 180\n max_engaged_seconds: 1800\n response_cooldown_seconds: 45\n engagement_score_alpha: 0.2\n engagement_score_exit_threshold: 0.2\n score_decay_half_life_seconds: 600\n score_decay_floor: 0.0\n batching:\n window_seconds: 8 # 后续群消息进入 batch 的短窗口\n max_messages: 6 # 窗口内消息过多时提前 flush\n max_chars: 2000\n flush_on_mention: true\n continue_gate:\n enabled: true # 每个 flushed batch 交给秘书模型判断是否继续接话\n model: cheap\n threshold: 0.55\n min_messages: 1\n evaluate_interval_seconds: 8\n exit_gate:\n enabled: true\n low_value_threshold: 0.35\n low_value_strikes: 3\n min_messages_per_window: 1\n activity_window_seconds: 120\n\ntelegram:\n bot_token: \"${TELEGRAM_BOT_TOKEN:}\"\n # group_trigger_mode: \"always\" # none / mention / command / always\n # group_context_capture: false # mention/command 模式下,是否记录未触发群消息作为上下文\n # reply_to_inbound: null # true/false 覆盖 router.reply_to_inbound;null/省略表示跟随全局\n # proxy: \"${TELEGRAM_PROXY:}\" # SOCKS5/HTTP 代理,如 socks5://127.0.0.1:1080\n # polling_timeout: 30\n # allowed_chats: []\n\n# Milky QQ Channel(可选)\n# 启用前请先启动 Lagrange.Milky,并确保 nahida_bot/channels/milky/plugin.yaml\n# 可被内置 channel discovery 扫描到。保持注释状态不会启用 Milky。\n#\n# milky:\n# base_url: \"http://127.0.0.1:3000\"\n# access_token: \"${MILKY_ACCESS_TOKEN:}\"\n# api_prefix: \"/api\"\n# event_path: \"/event\"\n# # ws_url: \"ws://127.0.0.1:3000/event\" # 可选:覆盖由 base_url 推导出的 WS 地址\n# command_prefix: \"/\"\n# group_trigger_mode: \"mention\" # none / mention / command / always\n# group_context_capture: false # true 时,未触发群消息只记录为上下文,可供 conversation_joiner 判断\n# reply_to_inbound: null # true/false 覆盖 router.reply_to_inbound;null/省略表示跟随全局\n# allowed_friends: [] # QQ 号白名单;空列表表示不限制\n# allowed_groups: [] # 群号白名单;空列表表示不限制\n# connect_timeout: 10.0\n# heartbeat_timeout: 30.0\n# reconnect_initial_delay: 1.0\n# reconnect_max_delay: 30.0\n# send_retry_attempts: 3\n# send_retry_backoff: 1.0\n# max_text_length: 4000\n# media_download_dir: \"./data/temp/media\"\n# enable_media_download_tool: true\n# resource_url_ttl_hint: 300\n# cache_media_on_receive: true\n# max_forward_depth: 3\n# max_forward_messages: 80\n# forward_render_max_chars: 12000\n# scene_cache_size: 4096\n\n# ── Agent Loop ──────────────────────────────────────────\n# 控制 Agent 循环的行为:迭代轮数、超时、重试策略等。\n# 以下均为默认值,不写则使用默认值。\n#\n# agent:\n# max_steps: 8 # 最大工具调用迭代轮数\n# provider_timeout_seconds: 120.0 # 单次 LLM 调用超时(秒)\n# retry_attempts: 2 # LLM 调用重试次数\n# retry_backoff_seconds: 0.2 # 重试退避间隔(秒)\n# tool_timeout_seconds: 135.0 # 工具执行超时(秒)\n# tool_retry_attempts: 1 # 工具执行重试次数\n# tool_retry_backoff_seconds: 0.1 # 工具重试退避间隔(秒)\n# max_tool_log_chars: 400 # 工具日志截断长度\n# # tool_use_system_prompt: \"...\" # 注入的工具使用提示\n# # provider_error_template: \"...\" # Provider 错误消息模板\n\n# ── Agent Runtime(canonical ledger,修复 #24 地基)─────────\n# Phase 1:best-effort 把每个 run 的 canonical 事件流与执行回执落库(附加双写,\n# 不改对外行为)。reading/重放端属 Phase 5。默认代码里为 false;这里置 true 以采集数据。\nagent_runtime:\n canonical_ledger_enabled: true\n # Phase 5:把每个 run 的有序 tool transcript 落到 agent_runs.transcript_json,\n # 下一轮由 TranscriptProjector 投影成成对 tool_use/tool_result 注入历史,\n # 替代被剥离的纯文本叙述(#24 根因)。默认代码里为 false;这里置 true 采集数据。\n # 旧 run(无 transcript_json)自动回退到原文本历史路径。\n transcript_replay_enabled: true\n\n# ── Context Budget ──────────────────────────────────────\n# 控制未知模型 fallback 上下文窗口和 reasoning chain 预算。\n# 模型声明 providers.*.models[].capabilities.context_window 时优先使用模型窗口。\n# 以下均为默认值,不写则使用默认值。\n#\n# context:\n# max_tokens: 272000 # 未声明模型窗口时的 fallback context window\n# reserved_tokens: 10000 # 未声明模型窗口时为输出保留的 token\n# # max_chars: null # 字符数上限(兼容旧逻辑,优先使用 max_tokens)\n# # reserved_chars: 0 # 字符保留数\n# summary_max_chars: 2000 # 历史摘要最大字符数\n# reasoning_policy: \"budget\" # strip / append / budget\n# max_reasoning_tokens: 2000 # reasoning chain token 预算\n\n# ── Scheduler ──────────────────────────────────────────\n# 控制定时任务调度行为。\n# 以下均为默认值,不写则使用默认值。\n#\n# scheduler:\n# poll_interval_seconds: 1.0 # 调度轮询间隔(秒)\n# max_concurrent_fires: 5 # 最大并发执行数\n# job_timeout_seconds: 120.0 # 单任务超时(秒)\n# min_interval_seconds: 60 # cron 最小间隔\n# max_prompt_chars: 12000 # 定时任务 prompt 最大字符数\n# max_jobs_per_chat: 20 # 每个会话最大任务数\n# failure_retry_seconds: 300 # 失败重试等待(秒)\n# max_consecutive_failures: 3 # 连续失败上限\n# memory_dreaming_enabled: true # 是否启用内部记忆 dreaming\n# memory_dreaming_interval_seconds: 3600 # dreaming 周期(秒)\n# memory_dreaming_initial_delay_seconds: 300 # 启动后首次 dreaming 延迟\n# memory_dreaming_session_limit: 20 # 单次最多扫描会话数\n# memory_dreaming_recent_turn_limit: 40 # 单会话最多读取 turns 数\n# memory_dreaming_provider_id: \"\" # Legacy;建议改用 memory_dreaming_model\n# memory_dreaming_model: \"\" # model spec;空则默认找 memory tag,失败后走会话模型\n\n# ── Router ─────────────────────────────────────────────\n# 控制消息路由行为。system_prompt 使用顶层 system_prompt 字段。\n# 以下均为默认值,不写则使用默认值。\n#\n# router:\n# # system_prompt: \"...\" # 与顶层 system_prompt 重复,优先使用顶层字段\n# max_history_turns: 200 # 最大历史轮数\n# agent_enabled: true # 是否启用 Agent\n# command_timeout_seconds: 30.0 # 命令执行超时(秒)\n# command_timeout_message: \"Command timed out. Please try again later.\"\n# reply_to_inbound: true # 默认是否引用回复触发消息;平台插件可覆盖\n# group_context:\n# enabled: true # 是否在触发时注入 observed-only 群上下文\n# max_messages: 20 # 最多注入最近多少条未触发群消息\n# ttl_seconds: 900 # 只注入最近 N 秒内的群上下文;0 表示不按时间过滤\n# max_chars: 4000 # 群上下文注入块最大字符数\n# continuity_gap_seconds: 1800 # 对话连续性判定(秒):当前触发与上次对话 turn 间隔超过此值则视为新对话,丢弃旧 history;0 关闭\n\n# ── Model Tags / Specs ─────────────────────────────────\n# providers 的 models 中用 tags 字段标记模型角色:\n# primary / cheap / memory / embedding / reranker / vision\n# 需要内部模型的配置项都接受一个 model spec 字符串;这个字符串可以是 tag,\n# 也可以是 provider/model 或裸模型名。\n\n# ── Memory ─────────────────────────────────────────────\n# 长期记忆检索和 embedding 配置。默认只启用 SQLite FTS;vector/hybrid\n# 需要显式开启,并在 providers.models 中配置带 embedding tag 的模型。\n#\n# memory:\n# enabled: true\n# retrieval:\n# fts_enabled: true\n# vector_enabled: false # 开启后对长期记忆使用 hybrid 检索\n# hybrid_enabled: true\n# vector_backend: json # json / sqlite-vec / none\n# max_injected_items: 5\n# max_injected_chars: 4000\n# embedding:\n# enabled: false\n# model: \"\" # model spec;空则默认找 embedding tag\n# dimensions: 0 # 0 = auto-detect via probe embed call\n# batch_size: 16\n# embed_after_consolidation: true\n# consolidation:\n# rule_based_enabled: true # 是否启用每轮对话后的规则抽取;false 时只保留 dreaming/显式写入\n"}, "d30e8f3ca4432e91a12d4cbfc14a78aade415793": {"t": 1785761621.9239948, "n": 14721, "h": "dd3d4728e8df04cd", "c": "# Nahida Bot 配置文件\n# 参见 nahida_bot.core.config.Settings 了解所有可用字段\n\n# ── 应用 ──────────────────────────────────────────────\napp_name: \"Nahida Bot\"\ndebug: false\nlog_level: \"INFO\" # DEBUG / INFO / WARNING / ERROR(控制台级别)\n# log_json: true # 设为 true 输出 JSON 格式日志(生产环境推荐)\n# 可复盘基线(agent-loop 修复 Phase 0):默认把应用日志落盘到 JSON Lines 文件,\n# 文件级别 DEBUG 以便保留 agent_loop.run_completed 的 terminal_state/reason、\n# provider 协议异常、context 来源等字段。控制台仍保持 INFO,不被 DEBUG 刷屏。\nlog_file: \"./data/logs/nahida.log\"\nlog_file_level: \"DEBUG\"\nlog_file_json: true\n# 按文件大小滚动日志:单文件达到 log_file_max_bytes 后轮转,最多保留\n# log_file_backup_count 个历史备份(nahida.log.1、nahida.log.2 …)。\n# max_bytes=0 表示不滚动(日志文件会无限增长)。默认 10 MiB × 5 份。\nlog_file_max_bytes: 10485760 # 单个日志文件上限(字节),0 = 不滚动\nlog_file_backup_count: 5 # 保留的滚动备份数\ndependency_log_level: \"WARNING\" # 三方库默认日志级别;避免 DEBUG 时被 httpx/websockets 等刷屏\n# logger_levels: # 可选:按 logger 名覆盖(注意:会同时作用于控制台与文件)\n# nahida_bot.agent: \"DEBUG\"\n# plugin.rss-notifier: \"DEBUG\"\n# httpx: \"WARNING\"\n\n# ── 服务器 ────────────────────────────────────────────\nhost: \"127.0.0.1\"\nport: 6185\n\n# ── 数据库 ────────────────────────────────────────────\ndb_path: \"./data/nahida.db\"\n\n# ── Workspace ─────────────────────────────────────────\nworkspace_base_dir: \"./data/workspace\"\n\n# ── 插件 ──────────────────────────────────────────────\nplugin_paths:\n - \"./plugins\"\n\n# ── Agent / Router ────────────────────────────────────\nsystem_prompt: \"You are a helpful assistant.\"\n\n# ── LLM Providers(dict 格式,key 即 provider id)───\n# 默认配置已经是多 provider。每个 provider 有独立的 api_key、base_url 和 models。\n# models 的第一个元素是该 provider 的默认模型;每个模型可以是字符串,\n# 也可以是 {name, tags, capabilities} 对象。通过 /model 命令可在聊天中切换模型。\n#\n# 没有配置 api_key 的 provider 会在启动时被跳过;因此可以只填写实际使用的后端。\nproviders:\n deepseek-main:\n type: deepseek\n api_key: \"${DEEPSEEK_LLM_API_KEY:}\"\n base_url: \"${DEEPSEEK_LLM_BASE_URL:https://api.deepseek.com}\"\n # 内部使用 SSE 接收并聚合,可避免长推理期间普通读超时误判。\n stream_responses: true\n # thinking_enabled: false # 关闭 DeepSeek thinking mode\n models:\n - name: \"deepseek-v4-pro\"\n tags: [primary]\n - name: \"deepseek-v4-flash\"\n tags: [cheap, memory]\n\n siliconflow:\n type: \"openai-compatible\"\n api_key: \"${SILICONFLOW_LLM_API_KEY:}\"\n base_url: \"${SILICONFLOW_LLM_BASE_URL:https://api.siliconflow.cn/v1}\"\n merge_system_messages: true\n stream_responses: true\n models:\n - name: \"Qwen/Qwen3-Embedding-8B\"\n tags: [embedding]\n - name: \"Pro/zai-org/GLM-5\"\n tags: [vision]\n - name: \"Qwen/Qwen3.6-35B-A3B\"\n tags: [vision]\n capabilities:\n image_input: true\n max_image_count: 4\n max_image_bytes: 10485760\n\n minimax:\n type: minimax\n api_key: \"${MINIMAX_LLM_API_KEY:}\"\n base_url: \"https://api.minimaxi.com/anthropic\"\n max_tokens: 16000\n stream_responses: true\n models:\n - name: \"MiniMax-M2.5\"\n tags: [cheap]\n - name: \"MiniMax-M2.7\"\n\n # OpenAI Responses API(可选)\n # 使用 /responses 端点,支持内置工具(web_search、image_generation 等)\n # 和有状态对话链(previous_response_id)。Reasoning 摘要可通过\n # reasoning_effort 参数控制深度。\n # stream_responses=true 时同样在 provider 内部流式接收并聚合返回。\n openai:\n type: \"openai-responses\"\n api_key: \"${OPENAI_API_KEY:}\"\n base_url: \"${OPENAI_API_BASE_URL:https://api.openai.com/v1}\"\n store_responses: true\n use_previous_response_id: false\n stream_responses: true\n reasoning_effort: \"medium\"\n # built_in_tools: [\"web_search\", \"image_generation\"]\n models:\n - name: \"gpt-5.4\"\n capabilities:\n image_input: true\n image_generation: true\n web_search: true\n tool_calling: true\n reasoning: true\n\ndefault_provider: deepseek-main # 可选,默认使用 providers 中的第一个 key\n\n# ── 多模态 / 图片理解 ─────────────────────────────────\n# image_fallback_mode:\n# auto: 主模型不支持 image_input 时,自动调用 fallback vision 模型生成描述\n# tool: 主模型不支持 image_input 时,注入 image_understand 工具,由主模型按需调用\n# off: 不处理图片,只保留普通文本\n# media_context_policy:\n# cache_aware: 最近图片尽量保留原生内容块,旧图片降级为描述\n# native_recent: 仅最近图片保留原生内容块\n# description_only: 历史图片只使用描述\nmultimodal:\n image_fallback_mode: \"auto\"\n media_context_policy: \"cache_aware\"\n image_fallback_provider: \"\" # Legacy;建议把 provider 写进 image_fallback_model\n image_fallback_model: \"siliconflow/Qwen/Qwen3.6-35B-A3B\"\n max_images_per_turn: 4\n max_image_bytes: 10485760\n media_cache_ttl_seconds: 3600\n\n# ── 插件配置 ──────────────────────────────────────────\n# Settings 的 extra=\"allow\" 机制:顶层 key 如果不是已知字段,\n# 且值为 dict,则按 plugin id 匹配并注入到对应插件的 manifest.config 中。\n\nbuiltin-commands:\n # send_local_attachment 默认只允许发送 active workspace 内的相对路径。\n # 如确实需要发送工作区外的本地文件,可打开下面开关。\n allow_external_attachment_paths: false\n # 可选白名单目录;为空表示打开上方开关后允许任意绝对路径。\n # external_attachment_roots:\n # - \"<absolute-directory>\"\n external_attachment_roots: []\n\n# OpenAI-compatible 图片生成(可选)\n# 启用后注册 /draw、/生图 命令和 image_generate tool。\n# image_generation:\n# enabled: true\n# provider: default\n# backends:\n# default:\n# type: openai-images\n# api_key: \"${IMAGE_API_KEY}\"\n# base_url: \"${IMAGE_BASE_URL}\"\n# model: \"gpt-image-1\"\n# timeout_seconds: 600\n# download_timeout_seconds: 120\n# trust_env: false\n# force_close_connections: true\n# output_dir: \"generated/images\"\n# auto_send: true\n# max_images_per_24h: 20\n\ngithub-notifier:\n # 目标仓库;保持 OWNER/REPO 时插件会视为未配置,不会启动 webhook/polling。\n repo: \"OWNER/REPO\"\n # typed chat address 列表,例如 milky:group:123456789 或 telegram:private:123456789。\n target_chat_addresses: []\n webhook:\n enabled: true\n path: \"github\" # 最终路径: /webhooks/github\n secret: \"${GITHUB_WEBHOOK_SECRET:}\"\n polling:\n enabled: true # webhook 不可用时的 fallback;首次轮询只建立基线\n interval_seconds: 60\n api_base_url: \"https://api.github.com\"\n token: \"${GITHUB_TOKEN:}\" # 私有仓库或更高 rate limit 时填写\n registration:\n enabled: false # 开启后可在聊天中使用 /github_watch 动态订阅\n\n# RSS/Atom 订阅通知(外部插件 plugins/rss-notifier)\n# rss-notifier:\n# enabled: true\n# # 默认推送目标;feed 未设置 target_chat_addresses 时使用这里。\n# target_chat_addresses:\n# - \"milky:group:123456789\"\n# feeds:\n# - url: \"https://example.com/feed.xml\"\n# title: \"Example\"\n# polling:\n# enabled: true\n# interval_seconds: 300\n# rendering:\n# mode: \"standard\" # compact / standard / rich\n# max_text_chars: 500\n# max_paragraphs: 3\n# include_images: true\n# max_images: 1\n# send_image_attachments: true # 下载图片并作为 photo 附件发送;失败时退化为图片链接\n# max_image_bytes: 5000000\n# registration:\n# enabled: true # 开启后可在聊天中使用 /rss_sub 动态订阅\n\nconversation_joiner:\n # 主动入话题默认关闭。开启前需要对应群频道启用 group_context_capture,\n # 让未触发消息先进入 MessageObserved。\n enabled: false\n model: cheap # model spec;没有 cheap tag 时可改成 provider/model,或留空使用默认模型\n threshold: 0.75\n max_context_messages: 12\n max_context_chars: 3000\n cooldown_seconds: 300\n max_triggers_per_hour: 3\n debounce_seconds: 20\n decision_timeout_seconds: 8\n persona_context:\n enabled: true # 启用后秘书模型会读取 workspace 中的人设文件辅助判断是否自然入话题\n files:\n - SOUL.md\n max_chars: 4000 # 注入秘书模型的人设上下文总字符上限\n cache_ttl_seconds: 60 # persona 文件缓存时间,避免每条候选消息都读文件\n prefilter:\n ignore_commands: true\n ignore_mentions: true\n min_text_chars: 4\n keyword_hints: []\n sample_rate: 0.15 # 普通候选消息进入秘书模型的采样概率\n keyword_sample_rate: 1.0 # 命中 keyword_hints 后进入秘书模型的采样概率\n groups: {}\n # groups:\n # milky:group:123456789:\n # enabled: true\n # threshold: 0.78\n # cooldown_seconds: 300\n engagement:\n enabled: false # 打开后进入 observing/joining/engaged/cooling 状态机\n join_state_ttl_seconds: 600\n idle_exit_seconds: 180\n max_engaged_seconds: 1800\n response_cooldown_seconds: 45\n engagement_score_alpha: 0.2\n engagement_score_exit_threshold: 0.2\n score_decay_half_life_seconds: 600\n score_decay_floor: 0.0\n batching:\n window_seconds: 8 # 后续群消息进入 batch 的短窗口\n max_messages: 6 # 窗口内消息过多时提前 flush\n max_chars: 2000\n flush_on_mention: true\n continue_gate:\n enabled: true # 每个 flushed batch 交给秘书模型判断是否继续接话\n model: cheap\n threshold: 0.55\n min_messages: 1\n evaluate_interval_seconds: 8\n exit_gate:\n enabled: true\n low_value_threshold: 0.35\n low_value_strikes: 3\n min_messages_per_window: 1\n activity_window_seconds: 120\n\ntelegram:\n bot_token: \"${TELEGRAM_BOT_TOKEN:}\"\n # group_trigger_mode: \"always\" # none / mention / command / always\n # group_context_capture: false # mention/command 模式下,是否记录未触发群消息作为上下文\n # reply_to_inbound: null # true/false 覆盖 router.reply_to_inbound;null/省略表示跟随全局\n # proxy: \"${TELEGRAM_PROXY:}\" # SOCKS5/HTTP 代理,如 socks5://127.0.0.1:1080\n # polling_timeout: 30\n # allowed_chats: []\n\n# Milky QQ Channel(可选)\n# 启用前请先启动 Lagrange.Milky,并确保 nahida_bot/channels/milky/plugin.yaml\n# 可被内置 channel discovery 扫描到。保持注释状态不会启用 Milky。\n#\n# milky:\n# base_url: \"http://127.0.0.1:3000\"\n# access_token: \"${MILKY_ACCESS_TOKEN:}\"\n# api_prefix: \"/api\"\n# event_path: \"/event\"\n# # ws_url: \"ws://127.0.0.1:3000/event\" # 可选:覆盖由 base_url 推导出的 WS 地址\n# command_prefix: \"/\"\n# group_trigger_mode: \"mention\" # none / mention / command / always\n# group_context_capture: false # true 时,未触发群消息只记录为上下文,可供 conversation_joiner 判断\n# reply_to_inbound: null # true/false 覆盖 router.reply_to_inbound;null/省略表示跟随全局\n# allowed_friends: [] # QQ 号白名单;空列表表示不限制\n# allowed_groups: [] # 群号白名单;空列表表示不限制\n# connect_timeout: 10.0\n# heartbeat_timeout: 30.0\n# reconnect_initial_delay: 1.0\n# reconnect_max_delay: 30.0\n# send_retry_attempts: 3\n# send_retry_backoff: 1.0\n# max_text_length: 4000\n# media_download_dir: \"./data/temp/media\"\n# enable_media_download_tool: true\n# resource_url_ttl_hint: 300\n# cache_media_on_receive: true\n# max_forward_depth: 3\n# max_forward_messages: 80\n# forward_render_max_chars: 12000\n# scene_cache_size: 4096\n\n# ── Agent Loop ──────────────────────────────────────────\n# 控制 Agent 循环的行为:迭代轮数、超时、重试策略等。\n# 以下均为默认值,不写则使用默认值。\n#\n# agent:\n# max_steps: 8 # 最大工具调用迭代轮数\n# provider_timeout_seconds: 120.0 # 单次 LLM 调用超时(秒)\n# retry_attempts: 2 # LLM 调用重试次数\n# retry_backoff_seconds: 0.2 # 重试退避间隔(秒)\n# tool_timeout_seconds: 135.0 # 工具执行超时(秒)\n# tool_retry_attempts: 1 # 工具执行重试次数\n# tool_retry_backoff_seconds: 0.1 # 工具重试退避间隔(秒)\n# max_tool_log_chars: 400 # 工具日志截断长度\n# # tool_use_system_prompt: \"...\" # 注入的工具使用提示\n# # provider_error_template: \"...\" # Provider 错误消息模板\n\n# ── Agent Runtime(canonical ledger,修复 #24 地基)─────────\n# Phase 1:best-effort 把每个 run 的 canonical 事件流与执行回执落库(附加双写,\n# 不改对外行为)。reading/重放端属 Phase 5。默认代码里为 false;这里置 true 以采集数据。\nagent_runtime:\n canonical_ledger_enabled: true\n # Phase 5:把每个 run 的有序 tool transcript 落到 agent_runs.transcript_json,\n # 下一轮由 TranscriptProjector 投影成成对 tool_use/tool_result 注入历史,\n # 替代被剥离的纯文本叙述(#24 根因)。默认代码里为 false;这里置 true 采集数据。\n # 旧 run(无 transcript_json)自动回退到原文本历史路径。\n transcript_replay_enabled: true\n\n# ── Context Budget ──────────────────────────────────────\n# 控制未知模型 fallback 上下文窗口和 reasoning chain 预算。\n# 模型声明 providers.*.models[].capabilities.context_window 时优先使用模型窗口。\n# 以下均为默认值,不写则使用默认值。\n#\n# context:\n# max_tokens: 272000 # 未声明模型窗口时的 fallback context window\n# reserved_tokens: 10000 # 未声明模型窗口时为输出保留的 token\n# # max_chars: null # 字符数上限(兼容旧逻辑,优先使用 max_tokens)\n# # reserved_chars: 0 # 字符保留数\n# summary_max_chars: 2000 # 历史摘要最大字符数\n# reasoning_policy: \"budget\" # strip / append / budget\n# max_reasoning_tokens: 2000 # reasoning chain token 预算\n\n# ── Scheduler ──────────────────────────────────────────\n# 控制定时任务调度行为。\n# 以下均为默认值,不写则使用默认值。\n#\n# scheduler:\n# poll_interval_seconds: 1.0 # 调度轮询间隔(秒)\n# max_concurrent_fires: 5 # 最大并发执行数\n# job_timeout_seconds: 120.0 # 单任务超时(秒)\n# min_interval_seconds: 60 # cron 最小间隔\n# max_prompt_chars: 12000 # 定时任务 prompt 最大字符数\n# max_jobs_per_chat: 20 # 每个会话最大任务数\n# failure_retry_seconds: 300 # 失败重试等待(秒)\n# max_consecutive_failures: 3 # 连续失败上限\n# memory_dreaming_enabled: true # 是否启用内部记忆 dreaming\n# memory_dreaming_interval_seconds: 3600 # dreaming 周期(秒)\n# memory_dreaming_initial_delay_seconds: 300 # 启动后首次 dreaming 延迟\n# memory_dreaming_session_limit: 20 # 单次最多扫描会话数\n# memory_dreaming_recent_turn_limit: 40 # 单会话最多读取 turns 数\n# memory_dreaming_provider_id: \"\" # Legacy;建议改用 memory_dreaming_model\n# memory_dreaming_model: \"\" # model spec;空则默认找 memory tag,失败后走会话模型\n\n# ── Router ─────────────────────────────────────────────\n# 控制消息路由行为。system_prompt 使用顶层 system_prompt 字段。\n# 以下均为默认值,不写则使用默认值。\n#\n# router:\n# # system_prompt: \"...\" # 与顶层 system_prompt 重复,优先使用顶层字段\n# max_history_turns: 200 # 最大历史轮数\n# agent_enabled: true # 是否启用 Agent\n# command_timeout_seconds: 30.0 # 命令执行超时(秒)\n# command_timeout_message: \"Command timed out. Please try again later.\"\n# reply_to_inbound: true # 默认是否引用回复触发消息;平台插件可覆盖\n# group_context:\n# enabled: true # 是否在触发时注入 observed-only 群上下文\n# max_messages: 20 # 最多注入最近多少条未触发群消息\n# ttl_seconds: 900 # 只注入最近 N 秒内的群上下文;0 表示不按时间过滤\n# max_chars: 4000 # 群上下文注入块最大字符数\n\n# ── Model Tags / Specs ─────────────────────────────────\n# providers 的 models 中用 tags 字段标记模型角色:\n# primary / cheap / memory / embedding / reranker / vision\n# 需要内部模型的配置项都接受一个 model spec 字符串;这个字符串可以是 tag,\n# 也可以是 provider/model 或裸模型名。\n\n# ── Memory ─────────────────────────────────────────────\n# 长期记忆检索和 embedding 配置。默认只启用 SQLite FTS;vector/hybrid\n# 需要显式开启,并在 providers.models 中配置带 embedding tag 的模型。\n#\n# memory:\n# enabled: true\n# retrieval:\n# fts_enabled: true\n# vector_enabled: false # 开启后对长期记忆使用 hybrid 检索\n# hybrid_enabled: true\n# vector_backend: json # json / sqlite-vec / none\n# max_injected_items: 5\n# max_injected_chars: 4000\n# embedding:\n# enabled: false\n# model: \"\" # model spec;空则默认找 embedding tag\n# dimensions: 0 # 0 = auto-detect via probe embed call\n# batch_size: 16\n# embed_after_consolidation: true\n# consolidation:\n# rule_based_enabled: true # 是否启用每轮对话后的规则抽取;false 时只保留 dreaming/显式写入\n"}, "fd5a70c4ec31cc722ae5dabd70083c3e762b3663": {"t": 1785761626.4035087, "n": 14458, "h": "ab5a9482344b016c", "c": "# Nahida Bot 配置文件\n# 参见 nahida_bot.core.config.Settings 了解所有可用字段\n\n# ── 应用 ──────────────────────────────────────────────\napp_name: \"Nahida Bot\"\ndebug: false\nlog_level: \"INFO\" # DEBUG / INFO / WARNING / ERROR(控制台级别)\n# log_json: true # 设为 true 输出 JSON 格式日志(生产环境推荐)\n# 可复盘基线(agent-loop 修复 Phase 0):默认把应用日志落盘到 JSON Lines 文件,\n# 文件级别 DEBUG 以便保留 agent_loop.run_completed 的 terminal_state/reason、\n# provider 协议异常、context 来源等字段。控制台仍保持 INFO,不被 DEBUG 刷屏。\nlog_file: \"./data/logs/nahida.log\"\nlog_file_level: \"DEBUG\"\nlog_file_json: true\ndependency_log_level: \"WARNING\" # 三方库默认日志级别;避免 DEBUG 时被 httpx/websockets 等刷屏\n# logger_levels: # 可选:按 logger 名覆盖(注意:会同时作用于控制台与文件)\n# nahida_bot.agent: \"DEBUG\"\n# plugin.rss-notifier: \"DEBUG\"\n# httpx: \"WARNING\"\n\n# ── 服务器 ────────────────────────────────────────────\nhost: \"127.0.0.1\"\nport: 6185\n\n# ── 数据库 ────────────────────────────────────────────\ndb_path: \"./data/nahida.db\"\n\n# ── Workspace ─────────────────────────────────────────\nworkspace_base_dir: \"./data/workspace\"\n\n# ── 插件 ──────────────────────────────────────────────\nplugin_paths:\n - \"./plugins\"\n\n# ── Agent / Router ────────────────────────────────────\nsystem_prompt: \"You are a helpful assistant.\"\n\n# ── LLM Providers(dict 格式,key 即 provider id)───\n# 默认配置已经是多 provider。每个 provider 有独立的 api_key、base_url 和 models。\n# models 的第一个元素是该 provider 的默认模型;每个模型可以是字符串,\n# 也可以是 {name, tags, capabilities} 对象。通过 /model 命令可在聊天中切换模型。\n#\n# 没有配置 api_key 的 provider 会在启动时被跳过;因此可以只填写实际使用的后端。\nproviders:\n deepseek-main:\n type: deepseek\n api_key: \"${DEEPSEEK_LLM_API_KEY:}\"\n base_url: \"${DEEPSEEK_LLM_BASE_URL:https://api.deepseek.com}\"\n # 内部使用 SSE 接收并聚合,可避免长推理期间普通读超时误判。\n stream_responses: true\n # thinking_enabled: false # 关闭 DeepSeek thinking mode\n models:\n - name: \"deepseek-v4-pro\"\n tags: [primary]\n - name: \"deepseek-v4-flash\"\n tags: [cheap, memory]\n\n siliconflow:\n type: \"openai-compatible\"\n api_key: \"${SILICONFLOW_LLM_API_KEY:}\"\n base_url: \"${SILICONFLOW_LLM_BASE_URL:https://api.siliconflow.cn/v1}\"\n merge_system_messages: true\n stream_responses: true\n models:\n - name: \"Qwen/Qwen3-Embedding-8B\"\n tags: [embedding]\n - name: \"Pro/zai-org/GLM-5\"\n tags: [vision]\n - name: \"Qwen/Qwen3.6-35B-A3B\"\n tags: [vision]\n capabilities:\n image_input: true\n max_image_count: 4\n max_image_bytes: 10485760\n\n minimax:\n type: minimax\n api_key: \"${MINIMAX_LLM_API_KEY:}\"\n base_url: \"https://api.minimaxi.com/anthropic\"\n max_tokens: 16000\n stream_responses: true\n models:\n - name: \"MiniMax-M2.5\"\n tags: [cheap]\n - name: \"MiniMax-M2.7\"\n\n # OpenAI Responses API(可选)\n # 使用 /responses 端点,支持内置工具(web_search、image_generation 等)\n # 和有状态对话链(previous_response_id)。Reasoning 摘要可通过\n # reasoning_effort 参数控制深度。\n # stream_responses=true 时同样在 provider 内部流式接收并聚合返回。\n openai:\n type: \"openai-responses\"\n api_key: \"${OPENAI_API_KEY:}\"\n base_url: \"${OPENAI_API_BASE_URL:https://api.openai.com/v1}\"\n store_responses: true\n use_previous_response_id: false\n stream_responses: true\n reasoning_effort: \"medium\"\n # built_in_tools: [\"web_search\", \"image_generation\"]\n models:\n - name: \"gpt-5.4\"\n capabilities:\n image_input: true\n image_generation: true\n web_search: true\n tool_calling: true\n reasoning: true\n\ndefault_provider: deepseek-main # 可选,默认使用 providers 中的第一个 key\n\n# ── 多模态 / 图片理解 ─────────────────────────────────\n# image_fallback_mode:\n# auto: 主模型不支持 image_input 时,自动调用 fallback vision 模型生成描述\n# tool: 主模型不支持 image_input 时,注入 image_understand 工具,由主模型按需调用\n# off: 不处理图片,只保留普通文本\n# media_context_policy:\n# cache_aware: 最近图片尽量保留原生内容块,旧图片降级为描述\n# native_recent: 仅最近图片保留原生内容块\n# description_only: 历史图片只使用描述\nmultimodal:\n image_fallback_mode: \"auto\"\n media_context_policy: \"cache_aware\"\n image_fallback_provider: \"\" # Legacy;建议把 provider 写进 image_fallback_model\n image_fallback_model: \"siliconflow/Qwen/Qwen3.6-35B-A3B\"\n max_images_per_turn: 4\n max_image_bytes: 10485760\n media_cache_ttl_seconds: 3600\n\n# ── 插件配置 ──────────────────────────────────────────\n# Settings 的 extra=\"allow\" 机制:顶层 key 如果不是已知字段,\n# 且值为 dict,则按 plugin id 匹配并注入到对应插件的 manifest.config 中。\n\nbuiltin-commands:\n # send_local_attachment 默认只允许发送 active workspace 内的相对路径。\n # 如确实需要发送工作区外的本地文件,可打开下面开关。\n allow_external_attachment_paths: false\n # 可选白名单目录;为空表示打开上方开关后允许任意绝对路径。\n # external_attachment_roots:\n # - \"<absolute-directory>\"\n external_attachment_roots: []\n\n# OpenAI-compatible 图片生成(可选)\n# 启用后注册 /draw、/生图 命令和 image_generate tool。\n# image_generation:\n# enabled: true\n# provider: default\n# backends:\n# default:\n# type: openai-images\n# api_key: \"${IMAGE_API_KEY}\"\n# base_url: \"${IMAGE_BASE_URL}\"\n# model: \"gpt-image-1\"\n# timeout_seconds: 600\n# download_timeout_seconds: 120\n# trust_env: false\n# force_close_connections: true\n# output_dir: \"generated/images\"\n# auto_send: true\n# max_images_per_24h: 20\n\ngithub-notifier:\n # 目标仓库;保持 OWNER/REPO 时插件会视为未配置,不会启动 webhook/polling。\n repo: \"OWNER/REPO\"\n # typed chat address 列表,例如 milky:group:123456789 或 telegram:private:123456789。\n target_chat_addresses: []\n webhook:\n enabled: true\n path: \"github\" # 最终路径: /webhooks/github\n secret: \"${GITHUB_WEBHOOK_SECRET:}\"\n polling:\n enabled: true # webhook 不可用时的 fallback;首次轮询只建立基线\n interval_seconds: 60\n api_base_url: \"https://api.github.com\"\n token: \"${GITHUB_TOKEN:}\" # 私有仓库或更高 rate limit 时填写\n registration:\n enabled: false # 开启后可在聊天中使用 /github_watch 动态订阅\n\n# RSS/Atom 订阅通知(外部插件 plugins/rss-notifier)\n# rss-notifier:\n# enabled: true\n# # 默认推送目标;feed 未设置 target_chat_addresses 时使用这里。\n# target_chat_addresses:\n# - \"milky:group:123456789\"\n# feeds:\n# - url: \"https://example.com/feed.xml\"\n# title: \"Example\"\n# polling:\n# enabled: true\n# interval_seconds: 300\n# rendering:\n# mode: \"standard\" # compact / standard / rich\n# max_text_chars: 500\n# max_paragraphs: 3\n# include_images: true\n# max_images: 1\n# send_image_attachments: true # 下载图片并作为 photo 附件发送;失败时退化为图片链接\n# max_image_bytes: 5000000\n# registration:\n# enabled: true # 开启后可在聊天中使用 /rss_sub 动态订阅\n\nconversation_joiner:\n # 主动入话题默认关闭。开启前需要对应群频道启用 group_context_capture,\n # 让未触发消息先进入 MessageObserved。\n enabled: false\n model: cheap # model spec;没有 cheap tag 时可改成 provider/model,或留空使用默认模型\n threshold: 0.75\n max_context_messages: 12\n max_context_chars: 3000\n cooldown_seconds: 300\n max_triggers_per_hour: 3\n debounce_seconds: 20\n decision_timeout_seconds: 8\n persona_context:\n enabled: true # 启用后秘书模型会读取 workspace 中的人设文件辅助判断是否自然入话题\n files:\n - SOUL.md\n max_chars: 4000 # 注入秘书模型的人设上下文总字符上限\n cache_ttl_seconds: 60 # persona 文件缓存时间,避免每条候选消息都读文件\n prefilter:\n ignore_commands: true\n ignore_mentions: true\n min_text_chars: 4\n keyword_hints: []\n sample_rate: 0.15 # 普通候选消息进入秘书模型的采样概率\n keyword_sample_rate: 1.0 # 命中 keyword_hints 后进入秘书模型的采样概率\n groups: {}\n # groups:\n # milky:group:123456789:\n # enabled: true\n # threshold: 0.78\n # cooldown_seconds: 300\n engagement:\n enabled: false # 打开后进入 observing/joining/engaged/cooling 状态机\n join_state_ttl_seconds: 600\n idle_exit_seconds: 180\n max_engaged_seconds: 1800\n response_cooldown_seconds: 45\n engagement_score_alpha: 0.2\n engagement_score_exit_threshold: 0.2\n score_decay_half_life_seconds: 600\n score_decay_floor: 0.0\n batching:\n window_seconds: 8 # 后续群消息进入 batch 的短窗口\n max_messages: 6 # 窗口内消息过多时提前 flush\n max_chars: 2000\n flush_on_mention: true\n continue_gate:\n enabled: true # 每个 flushed batch 交给秘书模型判断是否继续接话\n model: cheap\n threshold: 0.55\n min_messages: 1\n evaluate_interval_seconds: 8\n exit_gate:\n enabled: true\n low_value_threshold: 0.35\n low_value_strikes: 3\n min_messages_per_window: 1\n activity_window_seconds: 120\n\ntelegram:\n bot_token: \"${TELEGRAM_BOT_TOKEN:}\"\n # group_trigger_mode: \"always\" # none / mention / command / always\n # group_context_capture: false # mention/command 模式下,是否记录未触发群消息作为上下文\n # reply_to_inbound: null # true/false 覆盖 router.reply_to_inbound;null/省略表示跟随全局\n # proxy: \"${TELEGRAM_PROXY:}\" # SOCKS5/HTTP 代理,如 socks5://127.0.0.1:1080\n # polling_timeout: 30\n # allowed_chats: []\n\n# Milky QQ Channel(可选)\n# 启用前请先启动 Lagrange.Milky,并确保 nahida_bot/channels/milky/plugin.yaml\n# 可被内置 channel discovery 扫描到。保持注释状态不会启用 Milky。\n#\n# milky:\n# base_url: \"http://127.0.0.1:3000\"\n# access_token: \"${MILKY_ACCESS_TOKEN:}\"\n# api_prefix: \"/api\"\n# event_path: \"/event\"\n# # ws_url: \"ws://127.0.0.1:3000/event\" # 可选:覆盖由 base_url 推导出的 WS 地址\n# command_prefix: \"/\"\n# group_trigger_mode: \"mention\" # none / mention / command / always\n# group_context_capture: false # true 时,未触发群消息只记录为上下文,可供 conversation_joiner 判断\n# reply_to_inbound: null # true/false 覆盖 router.reply_to_inbound;null/省略表示跟随全局\n# allowed_friends: [] # QQ 号白名单;空列表表示不限制\n# allowed_groups: [] # 群号白名单;空列表表示不限制\n# connect_timeout: 10.0\n# heartbeat_timeout: 30.0\n# reconnect_initial_delay: 1.0\n# reconnect_max_delay: 30.0\n# send_retry_attempts: 3\n# send_retry_backoff: 1.0\n# max_text_length: 4000\n# media_download_dir: \"./data/temp/media\"\n# enable_media_download_tool: true\n# resource_url_ttl_hint: 300\n# cache_media_on_receive: true\n# max_forward_depth: 3\n# max_forward_messages: 80\n# forward_render_max_chars: 12000\n# scene_cache_size: 4096\n\n# ── Agent Loop ──────────────────────────────────────────\n# 控制 Agent 循环的行为:迭代轮数、超时、重试策略等。\n# 以下均为默认值,不写则使用默认值。\n#\n# agent:\n# max_steps: 8 # 最大工具调用迭代轮数\n# provider_timeout_seconds: 120.0 # 单次 LLM 调用超时(秒)\n# retry_attempts: 2 # LLM 调用重试次数\n# retry_backoff_seconds: 0.2 # 重试退避间隔(秒)\n# tool_timeout_seconds: 135.0 # 工具执行超时(秒)\n# tool_retry_attempts: 1 # 工具执行重试次数\n# tool_retry_backoff_seconds: 0.1 # 工具重试退避间隔(秒)\n# max_tool_log_chars: 400 # 工具日志截断长度\n# # tool_use_system_prompt: \"...\" # 注入的工具使用提示\n# # provider_error_template: \"...\" # Provider 错误消息模板\n\n# ── Agent Runtime(canonical ledger,修复 #24 地基)─────────\n# Phase 1:best-effort 把每个 run 的 canonical 事件流与执行回执落库(附加双写,\n# 不改对外行为)。reading/重放端属 Phase 5。默认代码里为 false;这里置 true 以采集数据。\nagent_runtime:\n canonical_ledger_enabled: true\n # Phase 5:把每个 run 的有序 tool transcript 落到 agent_runs.transcript_json,\n # 下一轮由 TranscriptProjector 投影成成对 tool_use/tool_result 注入历史,\n # 替代被剥离的纯文本叙述(#24 根因)。默认代码里为 false;这里置 true 采集数据。\n # 旧 run(无 transcript_json)自动回退到原文本历史路径。\n transcript_replay_enabled: true\n\n# ── Context Budget ──────────────────────────────────────\n# 控制未知模型 fallback 上下文窗口和 reasoning chain 预算。\n# 模型声明 providers.*.models[].capabilities.context_window 时优先使用模型窗口。\n# 以下均为默认值,不写则使用默认值。\n#\n# context:\n# max_tokens: 272000 # 未声明模型窗口时的 fallback context window\n# reserved_tokens: 10000 # 未声明模型窗口时为输出保留的 token\n# # max_chars: null # 字符数上限(兼容旧逻辑,优先使用 max_tokens)\n# # reserved_chars: 0 # 字符保留数\n# summary_max_chars: 2000 # 历史摘要最大字符数\n# reasoning_policy: \"budget\" # strip / append / budget\n# max_reasoning_tokens: 2000 # reasoning chain token 预算\n\n# ── Scheduler ──────────────────────────────────────────\n# 控制定时任务调度行为。\n# 以下均为默认值,不写则使用默认值。\n#\n# scheduler:\n# poll_interval_seconds: 1.0 # 调度轮询间隔(秒)\n# max_concurrent_fires: 5 # 最大并发执行数\n# job_timeout_seconds: 120.0 # 单任务超时(秒)\n# min_interval_seconds: 60 # cron 最小间隔\n# max_prompt_chars: 12000 # 定时任务 prompt 最大字符数\n# max_jobs_per_chat: 20 # 每个会话最大任务数\n# failure_retry_seconds: 300 # 失败重试等待(秒)\n# max_consecutive_failures: 3 # 连续失败上限\n# memory_dreaming_enabled: true # 是否启用内部记忆 dreaming\n# memory_dreaming_interval_seconds: 3600 # dreaming 周期(秒)\n# memory_dreaming_initial_delay_seconds: 300 # 启动后首次 dreaming 延迟\n# memory_dreaming_session_limit: 20 # 单次最多扫描会话数\n# memory_dreaming_recent_turn_limit: 40 # 单会话最多读取 turns 数\n# memory_dreaming_provider_id: \"\" # Legacy;建议改用 memory_dreaming_model\n# memory_dreaming_model: \"\" # model spec;空则默认找 memory tag,失败后走会话模型\n\n# ── Router ─────────────────────────────────────────────\n# 控制消息路由行为。system_prompt 使用顶层 system_prompt 字段。\n# 以下均为默认值,不写则使用默认值。\n#\n# router:\n# # system_prompt: \"...\" # 与顶层 system_prompt 重复,优先使用顶层字段\n# max_history_turns: 200 # 最大历史轮数\n# agent_enabled: true # 是否启用 Agent\n# command_timeout_seconds: 30.0 # 命令执行超时(秒)\n# command_timeout_message: \"Command timed out. Please try again later.\"\n# reply_to_inbound: true # 默认是否引用回复触发消息;平台插件可覆盖\n# group_context:\n# enabled: true # 是否在触发时注入 observed-only 群上下文\n# max_messages: 20 # 最多注入最近多少条未触发群消息\n# ttl_seconds: 900 # 只注入最近 N 秒内的群上下文;0 表示不按时间过滤\n# max_chars: 4000 # 群上下文注入块最大字符数\n\n# ── Model Tags / Specs ─────────────────────────────────\n# providers 的 models 中用 tags 字段标记模型角色:\n# primary / cheap / memory / embedding / reranker / vision\n# 需要内部模型的配置项都接受一个 model spec 字符串;这个字符串可以是 tag,\n# 也可以是 provider/model 或裸模型名。\n\n# ── Memory ─────────────────────────────────────────────\n# 长期记忆检索和 embedding 配置。默认只启用 SQLite FTS;vector/hybrid\n# 需要显式开启,并在 providers.models 中配置带 embedding tag 的模型。\n#\n# memory:\n# enabled: true\n# retrieval:\n# fts_enabled: true\n# vector_enabled: false # 开启后对长期记忆使用 hybrid 检索\n# hybrid_enabled: true\n# vector_backend: json # json / sqlite-vec / none\n# max_injected_items: 5\n# max_injected_chars: 4000\n# embedding:\n# enabled: false\n# model: \"\" # model spec;空则默认找 embedding tag\n# dimensions: 0 # 0 = auto-detect via probe embed call\n# batch_size: 16\n# embed_after_consolidation: true\n# consolidation:\n# rule_based_enabled: true # 是否启用每轮对话后的规则抽取;false 时只保留 dreaming/显式写入\n"}, "b3a21ef63cddb90c9960a5d6c61e38591617f26b": {"t": 1785761636.9694088, "n": 14188, "h": "32389b1a6a03920d", "c": "# Nahida Bot 配置文件\n# 参见 nahida_bot.core.config.Settings 了解所有可用字段\n\n# ── 应用 ──────────────────────────────────────────────\napp_name: \"Nahida Bot\"\ndebug: false\nlog_level: \"INFO\" # DEBUG / INFO / WARNING / ERROR(控制台级别)\n# log_json: true # 设为 true 输出 JSON 格式日志(生产环境推荐)\n# 可复盘基线(agent-loop 修复 Phase 0):默认把应用日志落盘到 JSON Lines 文件,\n# 文件级别 DEBUG 以便保留 agent_loop.run_completed 的 terminal_state/reason、\n# provider 协议异常、context 来源等字段。控制台仍保持 INFO,不被 DEBUG 刷屏。\nlog_file: \"./data/logs/nahida.log\"\nlog_file_level: \"DEBUG\"\nlog_file_json: true\ndependency_log_level: \"WARNING\" # 三方库默认日志级别;避免 DEBUG 时被 httpx/websockets 等刷屏\n# logger_levels: # 可选:按 logger 名覆盖(注意:会同时作用于控制台与文件)\n# nahida_bot.agent: \"DEBUG\"\n# plugin.rss-notifier: \"DEBUG\"\n# httpx: \"WARNING\"\n\n# ── 服务器 ────────────────────────────────────────────\nhost: \"127.0.0.1\"\nport: 6185\n\n# ── 数据库 ────────────────────────────────────────────\ndb_path: \"./data/nahida.db\"\n\n# ── Workspace ─────────────────────────────────────────\nworkspace_base_dir: \"./data/workspace\"\n\n# ── 插件 ──────────────────────────────────────────────\nplugin_paths:\n - \"./plugins\"\n\n# ── Agent / Router ────────────────────────────────────\nsystem_prompt: \"You are a helpful assistant.\"\n\n# ── LLM Providers(dict 格式,key 即 provider id)───\n# 默认配置已经是多 provider。每个 provider 有独立的 api_key、base_url 和 models。\n# models 的第一个元素是该 provider 的默认模型;每个模型可以是字符串,\n# 也可以是 {name, tags, capabilities} 对象。通过 /model 命令可在聊天中切换模型。\n#\n# 没有配置 api_key 的 provider 会在启动时被跳过;因此可以只填写实际使用的后端。\nproviders:\n deepseek-main:\n type: deepseek\n api_key: \"${DEEPSEEK_LLM_API_KEY:}\"\n base_url: \"${DEEPSEEK_LLM_BASE_URL:https://api.deepseek.com}\"\n # 内部使用 SSE 接收并聚合,可避免长推理期间普通读超时误判。\n stream_responses: true\n # thinking_enabled: false # 关闭 DeepSeek thinking mode\n models:\n - name: \"deepseek-v4-pro\"\n tags: [primary]\n - name: \"deepseek-v4-flash\"\n tags: [cheap, memory]\n\n siliconflow:\n type: \"openai-compatible\"\n api_key: \"${SILICONFLOW_LLM_API_KEY:}\"\n base_url: \"${SILICONFLOW_LLM_BASE_URL:https://api.siliconflow.cn/v1}\"\n merge_system_messages: true\n stream_responses: true\n models:\n - name: \"Qwen/Qwen3-Embedding-8B\"\n tags: [embedding]\n - name: \"Pro/zai-org/GLM-5\"\n tags: [vision]\n - name: \"Qwen/Qwen3.6-35B-A3B\"\n tags: [vision]\n capabilities:\n image_input: true\n max_image_count: 4\n max_image_bytes: 10485760\n\n minimax:\n type: minimax\n api_key: \"${MINIMAX_LLM_API_KEY:}\"\n base_url: \"https://api.minimaxi.com/anthropic\"\n max_tokens: 16000\n stream_responses: true\n models:\n - name: \"MiniMax-M2.5\"\n tags: [cheap]\n - name: \"MiniMax-M2.7\"\n\n # OpenAI Responses API(可选)\n # 使用 /responses 端点,支持内置工具(web_search、image_generation 等)\n # 和有状态对话链(previous_response_id)。Reasoning 摘要可通过\n # reasoning_effort 参数控制深度。\n # stream_responses=true 时同样在 provider 内部流式接收并聚合返回。\n openai:\n type: \"openai-responses\"\n api_key: \"${OPENAI_API_KEY:}\"\n base_url: \"${OPENAI_API_BASE_URL:https://api.openai.com/v1}\"\n store_responses: true\n use_previous_response_id: false\n stream_responses: true\n reasoning_effort: \"medium\"\n # built_in_tools: [\"web_search\", \"image_generation\"]\n models:\n - name: \"gpt-5.4\"\n capabilities:\n image_input: true\n image_generation: true\n web_search: true\n tool_calling: true\n reasoning: true\n\ndefault_provider: deepseek-main # 可选,默认使用 providers 中的第一个 key\n\n# ── 多模态 / 图片理解 ─────────────────────────────────\n# image_fallback_mode:\n# auto: 主模型不支持 image_input 时,自动调用 fallback vision 模型生成描述\n# tool: 主模型不支持 image_input 时,注入 image_understand 工具,由主模型按需调用\n# off: 不处理图片,只保留普通文本\n# media_context_policy:\n# cache_aware: 最近图片尽量保留原生内容块,旧图片降级为描述\n# native_recent: 仅最近图片保留原生内容块\n# description_only: 历史图片只使用描述\nmultimodal:\n image_fallback_mode: \"auto\"\n media_context_policy: \"cache_aware\"\n image_fallback_provider: \"\" # Legacy;建议把 provider 写进 image_fallback_model\n image_fallback_model: \"siliconflow/Qwen/Qwen3.6-35B-A3B\"\n max_images_per_turn: 4\n max_image_bytes: 10485760\n media_cache_ttl_seconds: 3600\n\n# ── 插件配置 ──────────────────────────────────────────\n# Settings 的 extra=\"allow\" 机制:顶层 key 如果不是已知字段,\n# 且值为 dict,则按 plugin id 匹配并注入到对应插件的 manifest.config 中。\n\nbuiltin-commands:\n # send_local_attachment 默认只允许发送 active workspace 内的相对路径。\n # 如确实需要发送工作区外的本地文件,可打开下面开关。\n allow_external_attachment_paths: false\n # 可选白名单目录;为空表示打开上方开关后允许任意绝对路径。\n # external_attachment_roots:\n # - \"D:/Pictures\"\n external_attachment_roots: []\n\n# OpenAI-compatible 图片生成(可选)\n# 启用后注册 /draw、/生图 命令和 image_generate tool。\n# image_generation:\n# enabled: true\n# provider: default\n# backends:\n# default:\n# type: openai-images\n# api_key: \"${IMAGE_API_KEY}\"\n# base_url: \"${IMAGE_BASE_URL}\"\n# model: \"gpt-image-1\"\n# timeout_seconds: 600\n# download_timeout_seconds: 120\n# trust_env: false\n# force_close_connections: true\n# output_dir: \"generated/images\"\n# auto_send: true\n# max_images_per_24h: 20\n\ngithub-notifier:\n # 目标仓库;保持 OWNER/REPO 时插件会视为未配置,不会启动 webhook/polling。\n repo: \"OWNER/REPO\"\n # typed chat address 列表,例如 milky:group:123456789 或 telegram:private:123456789。\n target_chat_addresses: []\n webhook:\n enabled: true\n path: \"github\" # 最终路径: /webhooks/github\n secret: \"${GITHUB_WEBHOOK_SECRET:}\"\n polling:\n enabled: true # webhook 不可用时的 fallback;首次轮询只建立基线\n interval_seconds: 60\n api_base_url: \"https://api.github.com\"\n token: \"${GITHUB_TOKEN:}\" # 私有仓库或更高 rate limit 时填写\n registration:\n enabled: false # 开启后可在聊天中使用 /github_watch 动态订阅\n\n# RSS/Atom 订阅通知(外部插件 plugins/rss-notifier)\n# rss-notifier:\n# enabled: true\n# # 默认推送目标;feed 未设置 target_chat_addresses 时使用这里。\n# target_chat_addresses:\n# - \"milky:group:123456789\"\n# feeds:\n# - url: \"https://example.com/feed.xml\"\n# title: \"Example\"\n# polling:\n# enabled: true\n# interval_seconds: 300\n# rendering:\n# mode: \"standard\" # compact / standard / rich\n# max_text_chars: 500\n# max_paragraphs: 3\n# include_images: true\n# max_images: 1\n# send_image_attachments: true # 下载图片并作为 photo 附件发送;失败时退化为图片链接\n# max_image_bytes: 5000000\n# registration:\n# enabled: true # 开启后可在聊天中使用 /rss_sub 动态订阅\n\nconversation_joiner:\n # 主动入话题默认关闭。开启前需要对应群频道启用 group_context_capture,\n # 让未触发消息先进入 MessageObserved。\n enabled: false\n model: cheap # model spec;没有 cheap tag 时可改成 provider/model,或留空使用默认模型\n threshold: 0.75\n max_context_messages: 12\n max_context_chars: 3000\n cooldown_seconds: 300\n max_triggers_per_hour: 3\n debounce_seconds: 20\n decision_timeout_seconds: 8\n persona_context:\n enabled: true # 启用后秘书模型会读取 workspace 中的人设文件辅助判断是否自然入话题\n files:\n - SOUL.md\n max_chars: 4000 # 注入秘书模型的人设上下文总字符上限\n cache_ttl_seconds: 60 # persona 文件缓存时间,避免每条候选消息都读文件\n prefilter:\n ignore_commands: true\n ignore_mentions: true\n min_text_chars: 4\n keyword_hints: []\n sample_rate: 0.15 # 普通候选消息进入秘书模型的采样概率\n keyword_sample_rate: 1.0 # 命中 keyword_hints 后进入秘书模型的采样概率\n groups: {}\n # groups:\n # milky:group:123456789:\n # enabled: true\n # threshold: 0.78\n # cooldown_seconds: 300\n engagement:\n enabled: false # 打开后进入 observing/joining/engaged/cooling 状态机\n join_state_ttl_seconds: 600\n idle_exit_seconds: 180\n max_engaged_seconds: 1800\n response_cooldown_seconds: 45\n engagement_score_alpha: 0.2\n engagement_score_exit_threshold: 0.2\n score_decay_half_life_seconds: 600\n score_decay_floor: 0.0\n batching:\n window_seconds: 8 # 后续群消息进入 batch 的短窗口\n max_messages: 6 # 窗口内消息过多时提前 flush\n max_chars: 2000\n flush_on_mention: true\n continue_gate:\n enabled: true # 每个 flushed batch 交给秘书模型判断是否继续接话\n model: cheap\n threshold: 0.55\n min_messages: 1\n evaluate_interval_seconds: 8\n exit_gate:\n enabled: true\n low_value_threshold: 0.35\n low_value_strikes: 3\n min_messages_per_window: 1\n activity_window_seconds: 120\n\ntelegram:\n bot_token: \"${TELEGRAM_BOT_TOKEN:}\"\n # group_trigger_mode: \"always\" # none / mention / command / always\n # group_context_capture: false # mention/command 模式下,是否记录未触发群消息作为上下文\n # reply_to_inbound: null # true/false 覆盖 router.reply_to_inbound;null/省略表示跟随全局\n # proxy: \"${TELEGRAM_PROXY:}\" # SOCKS5/HTTP 代理,如 socks5://127.0.0.1:1080\n # polling_timeout: 30\n # allowed_chats: []\n\n# Milky QQ Channel(可选)\n# 启用前请先启动 Lagrange.Milky,并确保 nahida_bot/channels/milky/plugin.yaml\n# 可被内置 channel discovery 扫描到。保持注释状态不会启用 Milky。\n#\n# milky:\n# base_url: \"http://127.0.0.1:3000\"\n# access_token: \"${MILKY_ACCESS_TOKEN:}\"\n# api_prefix: \"/api\"\n# event_path: \"/event\"\n# # ws_url: \"ws://127.0.0.1:3000/event\" # 可选:覆盖由 base_url 推导出的 WS 地址\n# command_prefix: \"/\"\n# group_trigger_mode: \"mention\" # none / mention / command / always\n# group_context_capture: false # true 时,未触发群消息只记录为上下文,可供 conversation_joiner 判断\n# reply_to_inbound: null # true/false 覆盖 router.reply_to_inbound;null/省略表示跟随全局\n# allowed_friends: [] # QQ 号白名单;空列表表示不限制\n# allowed_groups: [] # 群号白名单;空列表表示不限制\n# connect_timeout: 10.0\n# heartbeat_timeout: 30.0\n# reconnect_initial_delay: 1.0\n# reconnect_max_delay: 30.0\n# send_retry_attempts: 3\n# send_retry_backoff: 1.0\n# max_text_length: 4000\n# media_download_dir: \"./data/temp/media\"\n# enable_media_download_tool: true\n# resource_url_ttl_hint: 300\n# cache_media_on_receive: true\n# max_forward_depth: 3\n# max_forward_messages: 80\n# forward_render_max_chars: 12000\n# scene_cache_size: 4096\n\n# ── Agent Loop ──────────────────────────────────────────\n# 控制 Agent 循环的行为:迭代轮数、超时、重试策略等。\n# 以下均为默认值,不写则使用默认值。\n#\n# agent:\n# max_steps: 8 # 最大工具调用迭代轮数\n# provider_timeout_seconds: 120.0 # 单次 LLM 调用超时(秒)\n# retry_attempts: 2 # LLM 调用重试次数\n# retry_backoff_seconds: 0.2 # 重试退避间隔(秒)\n# tool_timeout_seconds: 135.0 # 工具执行超时(秒)\n# tool_retry_attempts: 1 # 工具执行重试次数\n# tool_retry_backoff_seconds: 0.1 # 工具重试退避间隔(秒)\n# max_tool_log_chars: 400 # 工具日志截断长度\n# # tool_use_system_prompt: \"...\" # 注入的工具使用提示\n# # provider_error_template: \"...\" # Provider 错误消息模板\n\n# ── Agent Runtime(canonical ledger,修复 #24 地基)─────────\n# Phase 1:best-effort 把每个 run 的 canonical 事件流与执行回执落库(附加双写,\n# 不改对外行为)。reading/重放端属 Phase 5。默认代码里为 false;这里置 true 以采集数据。\nagent_runtime:\n canonical_ledger_enabled: true\n\n# ── Context Budget ──────────────────────────────────────\n# 控制未知模型 fallback 上下文窗口和 reasoning chain 预算。\n# 模型声明 providers.*.models[].capabilities.context_window 时优先使用模型窗口。\n# 以下均为默认值,不写则使用默认值。\n#\n# context:\n# max_tokens: 272000 # 未声明模型窗口时的 fallback context window\n# reserved_tokens: 10000 # 未声明模型窗口时为输出保留的 token\n# # max_chars: null # 字符数上限(兼容旧逻辑,优先使用 max_tokens)\n# # reserved_chars: 0 # 字符保留数\n# summary_max_chars: 2000 # 历史摘要最大字符数\n# reasoning_policy: \"budget\" # strip / append / budget\n# max_reasoning_tokens: 2000 # reasoning chain token 预算\n\n# ── Scheduler ──────────────────────────────────────────\n# 控制定时任务调度行为。\n# 以下均为默认值,不写则使用默认值。\n#\n# scheduler:\n# poll_interval_seconds: 1.0 # 调度轮询间隔(秒)\n# max_concurrent_fires: 5 # 最大并发执行数\n# job_timeout_seconds: 120.0 # 单任务超时(秒)\n# min_interval_seconds: 60 # cron 最小间隔\n# max_prompt_chars: 12000 # 定时任务 prompt 最大字符数\n# max_jobs_per_chat: 20 # 每个会话最大任务数\n# failure_retry_seconds: 300 # 失败重试等待(秒)\n# max_consecutive_failures: 3 # 连续失败上限\n# memory_dreaming_enabled: true # 是否启用内部记忆 dreaming\n# memory_dreaming_interval_seconds: 3600 # dreaming 周期(秒)\n# memory_dreaming_initial_delay_seconds: 300 # 启动后首次 dreaming 延迟\n# memory_dreaming_session_limit: 20 # 单次最多扫描会话数\n# memory_dreaming_recent_turn_limit: 40 # 单会话最多读取 turns 数\n# memory_dreaming_provider_id: \"\" # Legacy;建议改用 memory_dreaming_model\n# memory_dreaming_model: \"\" # model spec;空则默认找 memory tag,失败后走会话模型\n\n# ── Router ─────────────────────────────────────────────\n# 控制消息路由行为。system_prompt 使用顶层 system_prompt 字段。\n# 以下均为默认值,不写则使用默认值。\n#\n# router:\n# # system_prompt: \"...\" # 与顶层 system_prompt 重复,优先使用顶层字段\n# max_history_turns: 200 # 最大历史轮数\n# agent_enabled: true # 是否启用 Agent\n# command_timeout_seconds: 30.0 # 命令执行超时(秒)\n# command_timeout_message: \"Command timed out. Please try again later.\"\n# reply_to_inbound: true # 默认是否引用回复触发消息;平台插件可覆盖\n# group_context:\n# enabled: true # 是否在触发时注入 observed-only 群上下文\n# max_messages: 20 # 最多注入最近多少条未触发群消息\n# ttl_seconds: 900 # 只注入最近 N 秒内的群上下文;0 表示不按时间过滤\n# max_chars: 4000 # 群上下文注入块最大字符数\n\n# ── Model Tags / Specs ─────────────────────────────────\n# providers 的 models 中用 tags 字段标记模型角色:\n# primary / cheap / memory / embedding / reranker / vision\n# 需要内部模型的配置项都接受一个 model spec 字符串;这个字符串可以是 tag,\n# 也可以是 provider/model 或裸模型名。\n\n# ── Memory ─────────────────────────────────────────────\n# 长期记忆检索和 embedding 配置。默认只启用 SQLite FTS;vector/hybrid\n# 需要显式开启,并在 providers.models 中配置带 embedding tag 的模型。\n#\n# memory:\n# enabled: true\n# retrieval:\n# fts_enabled: true\n# vector_enabled: false # 开启后对长期记忆使用 hybrid 检索\n# hybrid_enabled: true\n# vector_backend: json # json / sqlite-vec / none\n# max_injected_items: 5\n# max_injected_chars: 4000\n# embedding:\n# enabled: false\n# model: \"\" # model spec;空则默认找 embedding tag\n# dimensions: 0 # 0 = auto-detect via probe embed call\n# batch_size: 16\n# embed_after_consolidation: true\n# consolidation:\n# rule_based_enabled: true # 是否启用每轮对话后的规则抽取;false 时只保留 dreaming/显式写入\n"}, "c86c79a52158e9611f2b8009a6a53f3adde90694": {"t": 1785761638.6266844, "n": 13964, "h": "7b08daa99def6e51", "c": "# Nahida Bot 配置文件\n# 参见 nahida_bot.core.config.Settings 了解所有可用字段\n\n# ── 应用 ──────────────────────────────────────────────\napp_name: \"Nahida Bot\"\ndebug: false\nlog_level: \"INFO\" # DEBUG / INFO / WARNING / ERROR(控制台级别)\n# log_json: true # 设为 true 输出 JSON 格式日志(生产环境推荐)\n# 可复盘基线(agent-loop 修复 Phase 0):默认把应用日志落盘到 JSON Lines 文件,\n# 文件级别 DEBUG 以便保留 agent_loop.run_completed 的 terminal_state/reason、\n# provider 协议异常、context 来源等字段。控制台仍保持 INFO,不被 DEBUG 刷屏。\nlog_file: \"./data/logs/nahida.log\"\nlog_file_level: \"DEBUG\"\nlog_file_json: true\ndependency_log_level: \"WARNING\" # 三方库默认日志级别;避免 DEBUG 时被 httpx/websockets 等刷屏\n# logger_levels: # 可选:按 logger 名覆盖(注意:会同时作用于控制台与文件)\n# nahida_bot.agent: \"DEBUG\"\n# plugin.rss-notifier: \"DEBUG\"\n# httpx: \"WARNING\"\n\n# ── 服务器 ────────────────────────────────────────────\nhost: \"127.0.0.1\"\nport: 6185\n\n# ── 数据库 ────────────────────────────────────────────\ndb_path: \"./data/nahida.db\"\n\n# ── Workspace ─────────────────────────────────────────\nworkspace_base_dir: \"./data/workspace\"\n\n# ── 插件 ──────────────────────────────────────────────\nplugin_paths:\n - \"./plugins\"\n\n# ── Agent / Router ────────────────────────────────────\nsystem_prompt: \"You are a helpful assistant.\"\n\n# ── LLM Providers(dict 格式,key 即 provider id)───\n# 默认配置已经是多 provider。每个 provider 有独立的 api_key、base_url 和 models。\n# models 的第一个元素是该 provider 的默认模型;每个模型可以是字符串,\n# 也可以是 {name, tags, capabilities} 对象。通过 /model 命令可在聊天中切换模型。\n#\n# 没有配置 api_key 的 provider 会在启动时被跳过;因此可以只填写实际使用的后端。\nproviders:\n deepseek-main:\n type: deepseek\n api_key: \"${DEEPSEEK_LLM_API_KEY:}\"\n base_url: \"${DEEPSEEK_LLM_BASE_URL:https://api.deepseek.com}\"\n # 内部使用 SSE 接收并聚合,可避免长推理期间普通读超时误判。\n stream_responses: true\n # thinking_enabled: false # 关闭 DeepSeek thinking mode\n models:\n - name: \"deepseek-v4-pro\"\n tags: [primary]\n - name: \"deepseek-v4-flash\"\n tags: [cheap, memory]\n\n siliconflow:\n type: \"openai-compatible\"\n api_key: \"${SILICONFLOW_LLM_API_KEY:}\"\n base_url: \"${SILICONFLOW_LLM_BASE_URL:https://api.siliconflow.cn/v1}\"\n merge_system_messages: true\n stream_responses: true\n models:\n - name: \"Qwen/Qwen3-Embedding-8B\"\n tags: [embedding]\n - name: \"Pro/zai-org/GLM-5\"\n tags: [vision]\n - name: \"Qwen/Qwen3.6-35B-A3B\"\n tags: [vision]\n capabilities:\n image_input: true\n max_image_count: 4\n max_image_bytes: 10485760\n\n minimax:\n type: minimax\n api_key: \"${MINIMAX_LLM_API_KEY:}\"\n base_url: \"https://api.minimaxi.com/anthropic\"\n max_tokens: 16000\n stream_responses: true\n models:\n - name: \"MiniMax-M2.5\"\n tags: [cheap]\n - name: \"MiniMax-M2.7\"\n\n # OpenAI Responses API(可选)\n # 使用 /responses 端点,支持内置工具(web_search、image_generation 等)\n # 和有状态对话链(previous_response_id)。Reasoning 摘要可通过\n # reasoning_effort 参数控制深度。\n # stream_responses=true 时同样在 provider 内部流式接收并聚合返回。\n openai:\n type: \"openai-responses\"\n api_key: \"${OPENAI_API_KEY:}\"\n base_url: \"${OPENAI_API_BASE_URL:https://api.openai.com/v1}\"\n store_responses: true\n use_previous_response_id: false\n stream_responses: true\n reasoning_effort: \"medium\"\n # built_in_tools: [\"web_search\", \"image_generation\"]\n models:\n - name: \"gpt-5.4\"\n capabilities:\n image_input: true\n image_generation: true\n web_search: true\n tool_calling: true\n reasoning: true\n\ndefault_provider: deepseek-main # 可选,默认使用 providers 中的第一个 key\n\n# ── 多模态 / 图片理解 ─────────────────────────────────\n# image_fallback_mode:\n# auto: 主模型不支持 image_input 时,自动调用 fallback vision 模型生成描述\n# tool: 主模型不支持 image_input 时,注入 image_understand 工具,由主模型按需调用\n# off: 不处理图片,只保留普通文本\n# media_context_policy:\n# cache_aware: 最近图片尽量保留原生内容块,旧图片降级为描述\n# native_recent: 仅最近图片保留原生内容块\n# description_only: 历史图片只使用描述\nmultimodal:\n image_fallback_mode: \"auto\"\n media_context_policy: \"cache_aware\"\n image_fallback_provider: \"\" # Legacy;建议把 provider 写进 image_fallback_model\n image_fallback_model: \"siliconflow/Qwen/Qwen3.6-35B-A3B\"\n max_images_per_turn: 4\n max_image_bytes: 10485760\n media_cache_ttl_seconds: 3600\n\n# ── 插件配置 ──────────────────────────────────────────\n# Settings 的 extra=\"allow\" 机制:顶层 key 如果不是已知字段,\n# 且值为 dict,则按 plugin id 匹配并注入到对应插件的 manifest.config 中。\n\nbuiltin-commands:\n # send_local_attachment 默认只允许发送 active workspace 内的相对路径。\n # 如确实需要发送工作区外的本地文件,可打开下面开关。\n allow_external_attachment_paths: false\n # 可选白名单目录;为空表示打开上方开关后允许任意绝对路径。\n # external_attachment_roots:\n # - \"D:/Pictures\"\n external_attachment_roots: []\n\n# OpenAI-compatible 图片生成(可选)\n# 启用后注册 /draw、/生图 命令和 image_generate tool。\n# image_generation:\n# enabled: true\n# provider: default\n# backends:\n# default:\n# type: openai-images\n# api_key: \"${IMAGE_API_KEY}\"\n# base_url: \"${IMAGE_BASE_URL}\"\n# model: \"gpt-image-1\"\n# timeout_seconds: 600\n# download_timeout_seconds: 120\n# trust_env: false\n# force_close_connections: true\n# output_dir: \"generated/images\"\n# auto_send: true\n# max_images_per_24h: 20\n\ngithub-notifier:\n # 目标仓库;保持 OWNER/REPO 时插件会视为未配置,不会启动 webhook/polling。\n repo: \"OWNER/REPO\"\n # typed chat address 列表,例如 milky:group:123456789 或 telegram:private:123456789。\n target_chat_addresses: []\n webhook:\n enabled: true\n path: \"github\" # 最终路径: /webhooks/github\n secret: \"${GITHUB_WEBHOOK_SECRET:}\"\n polling:\n enabled: true # webhook 不可用时的 fallback;首次轮询只建立基线\n interval_seconds: 60\n api_base_url: \"https://api.github.com\"\n token: \"${GITHUB_TOKEN:}\" # 私有仓库或更高 rate limit 时填写\n registration:\n enabled: false # 开启后可在聊天中使用 /github_watch 动态订阅\n\n# RSS/Atom 订阅通知(外部插件 plugins/rss-notifier)\n# rss-notifier:\n# enabled: true\n# # 默认推送目标;feed 未设置 target_chat_addresses 时使用这里。\n# target_chat_addresses:\n# - \"milky:group:123456789\"\n# feeds:\n# - url: \"https://example.com/feed.xml\"\n# title: \"Example\"\n# polling:\n# enabled: true\n# interval_seconds: 300\n# rendering:\n# mode: \"standard\" # compact / standard / rich\n# max_text_chars: 500\n# max_paragraphs: 3\n# include_images: true\n# max_images: 1\n# send_image_attachments: true # 下载图片并作为 photo 附件发送;失败时退化为图片链接\n# max_image_bytes: 5000000\n# registration:\n# enabled: true # 开启后可在聊天中使用 /rss_sub 动态订阅\n\nconversation_joiner:\n # 主动入话题默认关闭。开启前需要对应群频道启用 group_context_capture,\n # 让未触发消息先进入 MessageObserved。\n enabled: false\n model: cheap # model spec;没有 cheap tag 时可改成 provider/model,或留空使用默认模型\n threshold: 0.75\n max_context_messages: 12\n max_context_chars: 3000\n cooldown_seconds: 300\n max_triggers_per_hour: 3\n debounce_seconds: 20\n decision_timeout_seconds: 8\n persona_context:\n enabled: true # 启用后秘书模型会读取 workspace 中的人设文件辅助判断是否自然入话题\n files:\n - SOUL.md\n max_chars: 4000 # 注入秘书模型的人设上下文总字符上限\n cache_ttl_seconds: 60 # persona 文件缓存时间,避免每条候选消息都读文件\n prefilter:\n ignore_commands: true\n ignore_mentions: true\n min_text_chars: 4\n keyword_hints: []\n sample_rate: 0.15 # 普通候选消息进入秘书模型的采样概率\n keyword_sample_rate: 1.0 # 命中 keyword_hints 后进入秘书模型的采样概率\n groups: {}\n # groups:\n # milky:group:123456789:\n # enabled: true\n # threshold: 0.78\n # cooldown_seconds: 300\n engagement:\n enabled: false # 打开后进入 observing/joining/engaged/cooling 状态机\n join_state_ttl_seconds: 600\n idle_exit_seconds: 180\n max_engaged_seconds: 1800\n response_cooldown_seconds: 45\n engagement_score_alpha: 0.2\n engagement_score_exit_threshold: 0.2\n score_decay_half_life_seconds: 600\n score_decay_floor: 0.0\n batching:\n window_seconds: 8 # 后续群消息进入 batch 的短窗口\n max_messages: 6 # 窗口内消息过多时提前 flush\n max_chars: 2000\n flush_on_mention: true\n continue_gate:\n enabled: true # 每个 flushed batch 交给秘书模型判断是否继续接话\n model: cheap\n threshold: 0.55\n min_messages: 1\n evaluate_interval_seconds: 8\n exit_gate:\n enabled: true\n low_value_threshold: 0.35\n low_value_strikes: 3\n min_messages_per_window: 1\n activity_window_seconds: 120\n\ntelegram:\n bot_token: \"${TELEGRAM_BOT_TOKEN:}\"\n # group_trigger_mode: \"always\" # none / mention / command / always\n # group_context_capture: false # mention/command 模式下,是否记录未触发群消息作为上下文\n # reply_to_inbound: null # true/false 覆盖 router.reply_to_inbound;null/省略表示跟随全局\n # proxy: \"${TELEGRAM_PROXY:}\" # SOCKS5/HTTP 代理,如 socks5://127.0.0.1:1080\n # polling_timeout: 30\n # allowed_chats: []\n\n# Milky QQ Channel(可选)\n# 启用前请先启动 Lagrange.Milky,并确保 nahida_bot/channels/milky/plugin.yaml\n# 可被内置 channel discovery 扫描到。保持注释状态不会启用 Milky。\n#\n# milky:\n# base_url: \"http://127.0.0.1:3000\"\n# access_token: \"${MILKY_ACCESS_TOKEN:}\"\n# api_prefix: \"/api\"\n# event_path: \"/event\"\n# # ws_url: \"ws://127.0.0.1:3000/event\" # 可选:覆盖由 base_url 推导出的 WS 地址\n# command_prefix: \"/\"\n# group_trigger_mode: \"mention\" # none / mention / command / always\n# group_context_capture: false # true 时,未触发群消息只记录为上下文,可供 conversation_joiner 判断\n# reply_to_inbound: null # true/false 覆盖 router.reply_to_inbound;null/省略表示跟随全局\n# allowed_friends: [] # QQ 号白名单;空列表表示不限制\n# allowed_groups: [] # 群号白名单;空列表表示不限制\n# connect_timeout: 10.0\n# heartbeat_timeout: 30.0\n# reconnect_initial_delay: 1.0\n# reconnect_max_delay: 30.0\n# send_retry_attempts: 3\n# send_retry_backoff: 1.0\n# max_text_length: 4000\n# media_download_dir: \"./data/temp/media\"\n# enable_media_download_tool: true\n# resource_url_ttl_hint: 300\n# cache_media_on_receive: true\n# max_forward_depth: 3\n# max_forward_messages: 80\n# forward_render_max_chars: 12000\n# scene_cache_size: 4096\n\n# ── Agent Loop ──────────────────────────────────────────\n# 控制 Agent 循环的行为:迭代轮数、超时、重试策略等。\n# 以下均为默认值,不写则使用默认值。\n#\n# agent:\n# max_steps: 8 # 最大工具调用迭代轮数\n# provider_timeout_seconds: 120.0 # 单次 LLM 调用超时(秒)\n# retry_attempts: 2 # LLM 调用重试次数\n# retry_backoff_seconds: 0.2 # 重试退避间隔(秒)\n# tool_timeout_seconds: 135.0 # 工具执行超时(秒)\n# tool_retry_attempts: 1 # 工具执行重试次数\n# tool_retry_backoff_seconds: 0.1 # 工具重试退避间隔(秒)\n# max_tool_log_chars: 400 # 工具日志截断长度\n# # tool_use_system_prompt: \"...\" # 注入的工具使用提示\n# # provider_error_template: \"...\" # Provider 错误消息模板\n\n# ── Context Budget ──────────────────────────────────────\n# 控制未知模型 fallback 上下文窗口和 reasoning chain 预算。\n# 模型声明 providers.*.models[].capabilities.context_window 时优先使用模型窗口。\n# 以下均为默认值,不写则使用默认值。\n#\n# context:\n# max_tokens: 272000 # 未声明模型窗口时的 fallback context window\n# reserved_tokens: 10000 # 未声明模型窗口时为输出保留的 token\n# # max_chars: null # 字符数上限(兼容旧逻辑,优先使用 max_tokens)\n# # reserved_chars: 0 # 字符保留数\n# summary_max_chars: 2000 # 历史摘要最大字符数\n# reasoning_policy: \"budget\" # strip / append / budget\n# max_reasoning_tokens: 2000 # reasoning chain token 预算\n\n# ── Scheduler ──────────────────────────────────────────\n# 控制定时任务调度行为。\n# 以下均为默认值,不写则使用默认值。\n#\n# scheduler:\n# poll_interval_seconds: 1.0 # 调度轮询间隔(秒)\n# max_concurrent_fires: 5 # 最大并发执行数\n# job_timeout_seconds: 120.0 # 单任务超时(秒)\n# min_interval_seconds: 60 # cron 最小间隔\n# max_prompt_chars: 12000 # 定时任务 prompt 最大字符数\n# max_jobs_per_chat: 20 # 每个会话最大任务数\n# failure_retry_seconds: 300 # 失败重试等待(秒)\n# max_consecutive_failures: 3 # 连续失败上限\n# memory_dreaming_enabled: true # 是否启用内部记忆 dreaming\n# memory_dreaming_interval_seconds: 3600 # dreaming 周期(秒)\n# memory_dreaming_initial_delay_seconds: 300 # 启动后首次 dreaming 延迟\n# memory_dreaming_session_limit: 20 # 单次最多扫描会话数\n# memory_dreaming_recent_turn_limit: 40 # 单会话最多读取 turns 数\n# memory_dreaming_provider_id: \"\" # Legacy;建议改用 memory_dreaming_model\n# memory_dreaming_model: \"\" # model spec;空则默认找 memory tag,失败后走会话模型\n\n# ── Router ─────────────────────────────────────────────\n# 控制消息路由行为。system_prompt 使用顶层 system_prompt 字段。\n# 以下均为默认值,不写则使用默认值。\n#\n# router:\n# # system_prompt: \"...\" # 与顶层 system_prompt 重复,优先使用顶层字段\n# max_history_turns: 200 # 最大历史轮数\n# agent_enabled: true # 是否启用 Agent\n# command_timeout_seconds: 30.0 # 命令执行超时(秒)\n# command_timeout_message: \"Command timed out. Please try again later.\"\n# reply_to_inbound: true # 默认是否引用回复触发消息;平台插件可覆盖\n# group_context:\n# enabled: true # 是否在触发时注入 observed-only 群上下文\n# max_messages: 20 # 最多注入最近多少条未触发群消息\n# ttl_seconds: 900 # 只注入最近 N 秒内的群上下文;0 表示不按时间过滤\n# max_chars: 4000 # 群上下文注入块最大字符数\n\n# ── Model Tags / Specs ─────────────────────────────────\n# providers 的 models 中用 tags 字段标记模型角色:\n# primary / cheap / memory / embedding / reranker / vision\n# 需要内部模型的配置项都接受一个 model spec 字符串;这个字符串可以是 tag,\n# 也可以是 provider/model 或裸模型名。\n\n# ── Memory ─────────────────────────────────────────────\n# 长期记忆检索和 embedding 配置。默认只启用 SQLite FTS;vector/hybrid\n# 需要显式开启,并在 providers.models 中配置带 embedding tag 的模型。\n#\n# memory:\n# enabled: true\n# retrieval:\n# fts_enabled: true\n# vector_enabled: false # 开启后对长期记忆使用 hybrid 检索\n# hybrid_enabled: true\n# vector_backend: json # json / sqlite-vec / none\n# max_injected_items: 5\n# max_injected_chars: 4000\n# embedding:\n# enabled: false\n# model: \"\" # model spec;空则默认找 embedding tag\n# dimensions: 0 # 0 = auto-detect via probe embed call\n# batch_size: 16\n# embed_after_consolidation: true\n# consolidation:\n# rule_based_enabled: true # 是否启用每轮对话后的规则抽取;false 时只保留 dreaming/显式写入\n"}, "f01b75ea55b6decb112b64b28a659bb35ffc12e6": {"t": 1785761641.930549, "n": 13878, "h": "c262732c958a805d", "c": "# Nahida Bot 配置文件\n# 参见 nahida_bot.core.config.Settings 了解所有可用字段\n\n# ── 应用 ──────────────────────────────────────────────\napp_name: \"Nahida Bot\"\ndebug: false\nlog_level: \"INFO\" # DEBUG / INFO / WARNING / ERROR\n# log_json: true # 设为 true 输出 JSON 格式日志(生产环境推荐)\n# log_file: \"./data/logs/nahida.log\" # 可选:把应用日志写入文件,不需要 tee\n# log_file_level: \"DEBUG\" # 可选:文件日志级别;默认跟随 log_level\n# log_file_json: true # 文件日志默认使用 JSON Lines\ndependency_log_level: \"WARNING\" # 三方库默认日志级别;避免 DEBUG 时被 httpx/websockets 等刷屏\n# logger_levels: # 可选:按 logger 名覆盖,适合只打开某个子系统\n# nahida_bot.agent: \"DEBUG\"\n# plugin.rss-notifier: \"DEBUG\"\n# httpx: \"WARNING\"\n\n# ── 服务器 ────────────────────────────────────────────\nhost: \"127.0.0.1\"\nport: 6185\n\n# ── 数据库 ────────────────────────────────────────────\ndb_path: \"./data/nahida.db\"\n\n# ── Workspace ─────────────────────────────────────────\nworkspace_base_dir: \"./data/workspace\"\n\n# ── 插件 ──────────────────────────────────────────────\nplugin_paths:\n - \"./plugins\"\n\n# ── Agent / Router ────────────────────────────────────\nsystem_prompt: \"You are a helpful assistant.\"\n\n# ── LLM Providers(dict 格式,key 即 provider id)───\n# 默认配置已经是多 provider。每个 provider 有独立的 api_key、base_url 和 models。\n# models 的第一个元素是该 provider 的默认模型;每个模型可以是字符串,\n# 也可以是 {name, tags, capabilities} 对象。通过 /model 命令可在聊天中切换模型。\n#\n# 没有配置 api_key 的 provider 会在启动时被跳过;因此可以只填写实际使用的后端。\nproviders:\n deepseek-main:\n type: deepseek\n api_key: \"${DEEPSEEK_LLM_API_KEY:}\"\n base_url: \"${DEEPSEEK_LLM_BASE_URL:https://api.deepseek.com}\"\n # 内部使用 SSE 接收并聚合,可避免长推理期间普通读超时误判。\n stream_responses: true\n # thinking_enabled: false # 关闭 DeepSeek thinking mode\n models:\n - name: \"deepseek-v4-pro\"\n tags: [primary]\n - name: \"deepseek-v4-flash\"\n tags: [cheap, memory]\n\n siliconflow:\n type: \"openai-compatible\"\n api_key: \"${SILICONFLOW_LLM_API_KEY:}\"\n base_url: \"${SILICONFLOW_LLM_BASE_URL:https://api.siliconflow.cn/v1}\"\n merge_system_messages: true\n stream_responses: true\n models:\n - name: \"Qwen/Qwen3-Embedding-8B\"\n tags: [embedding]\n - name: \"Pro/zai-org/GLM-5\"\n tags: [vision]\n - name: \"Qwen/Qwen3.6-35B-A3B\"\n tags: [vision]\n capabilities:\n image_input: true\n max_image_count: 4\n max_image_bytes: 10485760\n\n minimax:\n type: minimax\n api_key: \"${MINIMAX_LLM_API_KEY:}\"\n base_url: \"https://api.minimaxi.com/anthropic\"\n max_tokens: 16000\n stream_responses: true\n models:\n - name: \"MiniMax-M2.5\"\n tags: [cheap]\n - name: \"MiniMax-M2.7\"\n\n # OpenAI Responses API(可选)\n # 使用 /responses 端点,支持内置工具(web_search、image_generation 等)\n # 和有状态对话链(previous_response_id)。Reasoning 摘要可通过\n # reasoning_effort 参数控制深度。\n # stream_responses=true 时同样在 provider 内部流式接收并聚合返回。\n openai:\n type: \"openai-responses\"\n api_key: \"${OPENAI_API_KEY:}\"\n base_url: \"${OPENAI_API_BASE_URL:https://api.openai.com/v1}\"\n store_responses: true\n use_previous_response_id: false\n stream_responses: true\n reasoning_effort: \"medium\"\n # built_in_tools: [\"web_search\", \"image_generation\"]\n models:\n - name: \"gpt-5.4\"\n capabilities:\n image_input: true\n image_generation: true\n web_search: true\n tool_calling: true\n reasoning: true\n\ndefault_provider: deepseek-main # 可选,默认使用 providers 中的第一个 key\n\n# ── 多模态 / 图片理解 ─────────────────────────────────\n# image_fallback_mode:\n# auto: 主模型不支持 image_input 时,自动调用 fallback vision 模型生成描述\n# tool: 主模型不支持 image_input 时,注入 image_understand 工具,由主模型按需调用\n# off: 不处理图片,只保留普通文本\n# media_context_policy:\n# cache_aware: 最近图片尽量保留原生内容块,旧图片降级为描述\n# native_recent: 仅最近图片保留原生内容块\n# description_only: 历史图片只使用描述\nmultimodal:\n image_fallback_mode: \"auto\"\n media_context_policy: \"cache_aware\"\n image_fallback_provider: \"\" # Legacy;建议把 provider 写进 image_fallback_model\n image_fallback_model: \"siliconflow/Qwen/Qwen3.6-35B-A3B\"\n max_images_per_turn: 4\n max_image_bytes: 10485760\n media_cache_ttl_seconds: 3600\n\n# ── 插件配置 ──────────────────────────────────────────\n# Settings 的 extra=\"allow\" 机制:顶层 key 如果不是已知字段,\n# 且值为 dict,则按 plugin id 匹配并注入到对应插件的 manifest.config 中。\n\nbuiltin-commands:\n # send_local_attachment 默认只允许发送 active workspace 内的相对路径。\n # 如确实需要发送工作区外的本地文件,可打开下面开关。\n allow_external_attachment_paths: false\n # 可选白名单目录;为空表示打开上方开关后允许任意绝对路径。\n # external_attachment_roots:\n # - \"D:/Pictures\"\n external_attachment_roots: []\n\n# OpenAI-compatible 图片生成(可选)\n# 启用后注册 /draw、/生图 命令和 image_generate tool。\n# image_generation:\n# enabled: true\n# provider: default\n# backends:\n# default:\n# type: openai-images\n# api_key: \"${IMAGE_API_KEY}\"\n# base_url: \"${IMAGE_BASE_URL}\"\n# model: \"gpt-image-1\"\n# timeout_seconds: 600\n# download_timeout_seconds: 120\n# trust_env: false\n# force_close_connections: true\n# output_dir: \"generated/images\"\n# auto_send: true\n# max_images_per_24h: 20\n\ngithub-notifier:\n # 目标仓库;保持 OWNER/REPO 时插件会视为未配置,不会启动 webhook/polling。\n repo: \"OWNER/REPO\"\n # typed chat address 列表,例如 milky:group:123456789 或 telegram:private:123456789。\n target_chat_addresses: []\n webhook:\n enabled: true\n path: \"github\" # 最终路径: /webhooks/github\n secret: \"${GITHUB_WEBHOOK_SECRET:}\"\n polling:\n enabled: true # webhook 不可用时的 fallback;首次轮询只建立基线\n interval_seconds: 60\n api_base_url: \"https://api.github.com\"\n token: \"${GITHUB_TOKEN:}\" # 私有仓库或更高 rate limit 时填写\n registration:\n enabled: false # 开启后可在聊天中使用 /github_watch 动态订阅\n\n# RSS/Atom 订阅通知(外部插件 plugins/rss-notifier)\n# rss-notifier:\n# enabled: true\n# # 默认推送目标;feed 未设置 target_chat_addresses 时使用这里。\n# target_chat_addresses:\n# - \"milky:group:123456789\"\n# feeds:\n# - url: \"https://example.com/feed.xml\"\n# title: \"Example\"\n# polling:\n# enabled: true\n# interval_seconds: 300\n# rendering:\n# mode: \"standard\" # compact / standard / rich\n# max_text_chars: 500\n# max_paragraphs: 3\n# include_images: true\n# max_images: 1\n# send_image_attachments: true # 下载图片并作为 photo 附件发送;失败时退化为图片链接\n# max_image_bytes: 5000000\n# registration:\n# enabled: true # 开启后可在聊天中使用 /rss_sub 动态订阅\n\nconversation_joiner:\n # 主动入话题默认关闭。开启前需要对应群频道启用 group_context_capture,\n # 让未触发消息先进入 MessageObserved。\n enabled: false\n model: cheap # model spec;没有 cheap tag 时可改成 provider/model,或留空使用默认模型\n threshold: 0.75\n max_context_messages: 12\n max_context_chars: 3000\n cooldown_seconds: 300\n max_triggers_per_hour: 3\n debounce_seconds: 20\n decision_timeout_seconds: 8\n persona_context:\n enabled: true # 启用后秘书模型会读取 workspace 中的人设文件辅助判断是否自然入话题\n files:\n - SOUL.md\n max_chars: 4000 # 注入秘书模型的人设上下文总字符上限\n cache_ttl_seconds: 60 # persona 文件缓存时间,避免每条候选消息都读文件\n prefilter:\n ignore_commands: true\n ignore_mentions: true\n min_text_chars: 4\n keyword_hints: []\n sample_rate: 0.15 # 普通候选消息进入秘书模型的采样概率\n keyword_sample_rate: 1.0 # 命中 keyword_hints 后进入秘书模型的采样概率\n groups: {}\n # groups:\n # milky:group:123456789:\n # enabled: true\n # threshold: 0.78\n # cooldown_seconds: 300\n engagement:\n enabled: false # 打开后进入 observing/joining/engaged/cooling 状态机\n join_state_ttl_seconds: 600\n idle_exit_seconds: 180\n max_engaged_seconds: 1800\n response_cooldown_seconds: 45\n engagement_score_alpha: 0.2\n engagement_score_exit_threshold: 0.2\n score_decay_half_life_seconds: 600\n score_decay_floor: 0.0\n batching:\n window_seconds: 8 # 后续群消息进入 batch 的短窗口\n max_messages: 6 # 窗口内消息过多时提前 flush\n max_chars: 2000\n flush_on_mention: true\n continue_gate:\n enabled: true # 每个 flushed batch 交给秘书模型判断是否继续接话\n model: cheap\n threshold: 0.55\n min_messages: 1\n evaluate_interval_seconds: 8\n exit_gate:\n enabled: true\n low_value_threshold: 0.35\n low_value_strikes: 3\n min_messages_per_window: 1\n activity_window_seconds: 120\n\ntelegram:\n bot_token: \"${TELEGRAM_BOT_TOKEN:}\"\n # group_trigger_mode: \"always\" # none / mention / command / always\n # group_context_capture: false # mention/command 模式下,是否记录未触发群消息作为上下文\n # reply_to_inbound: null # true/false 覆盖 router.reply_to_inbound;null/省略表示跟随全局\n # proxy: \"${TELEGRAM_PROXY:}\" # SOCKS5/HTTP 代理,如 socks5://127.0.0.1:1080\n # polling_timeout: 30\n # allowed_chats: []\n\n# Milky QQ Channel(可选)\n# 启用前请先启动 Lagrange.Milky,并确保 nahida_bot/channels/milky/plugin.yaml\n# 可被内置 channel discovery 扫描到。保持注释状态不会启用 Milky。\n#\n# milky:\n# base_url: \"http://127.0.0.1:3000\"\n# access_token: \"${MILKY_ACCESS_TOKEN:}\"\n# api_prefix: \"/api\"\n# event_path: \"/event\"\n# # ws_url: \"ws://127.0.0.1:3000/event\" # 可选:覆盖由 base_url 推导出的 WS 地址\n# command_prefix: \"/\"\n# group_trigger_mode: \"mention\" # none / mention / command / always\n# group_context_capture: false # true 时,未触发群消息只记录为上下文,可供 conversation_joiner 判断\n# reply_to_inbound: null # true/false 覆盖 router.reply_to_inbound;null/省略表示跟随全局\n# allowed_friends: [] # QQ 号白名单;空列表表示不限制\n# allowed_groups: [] # 群号白名单;空列表表示不限制\n# connect_timeout: 10.0\n# heartbeat_timeout: 30.0\n# reconnect_initial_delay: 1.0\n# reconnect_max_delay: 30.0\n# send_retry_attempts: 3\n# send_retry_backoff: 1.0\n# max_text_length: 4000\n# media_download_dir: \"./data/temp/media\"\n# enable_media_download_tool: true\n# resource_url_ttl_hint: 300\n# cache_media_on_receive: true\n# max_forward_depth: 3\n# max_forward_messages: 80\n# forward_render_max_chars: 12000\n# scene_cache_size: 4096\n\n# ── Agent Loop ──────────────────────────────────────────\n# 控制 Agent 循环的行为:迭代轮数、超时、重试策略等。\n# 以下均为默认值,不写则使用默认值。\n#\n# agent:\n# max_steps: 8 # 最大工具调用迭代轮数\n# provider_timeout_seconds: 120.0 # 单次 LLM 调用超时(秒)\n# retry_attempts: 2 # LLM 调用重试次数\n# retry_backoff_seconds: 0.2 # 重试退避间隔(秒)\n# tool_timeout_seconds: 135.0 # 工具执行超时(秒)\n# tool_retry_attempts: 1 # 工具执行重试次数\n# tool_retry_backoff_seconds: 0.1 # 工具重试退避间隔(秒)\n# max_tool_log_chars: 400 # 工具日志截断长度\n# # tool_use_system_prompt: \"...\" # 注入的工具使用提示\n# # provider_error_template: \"...\" # Provider 错误消息模板\n\n# ── Context Budget ──────────────────────────────────────\n# 控制未知模型 fallback 上下文窗口和 reasoning chain 预算。\n# 模型声明 providers.*.models[].capabilities.context_window 时优先使用模型窗口。\n# 以下均为默认值,不写则使用默认值。\n#\n# context:\n# max_tokens: 272000 # 未声明模型窗口时的 fallback context window\n# reserved_tokens: 10000 # 未声明模型窗口时为输出保留的 token\n# # max_chars: null # 字符数上限(兼容旧逻辑,优先使用 max_tokens)\n# # reserved_chars: 0 # 字符保留数\n# summary_max_chars: 2000 # 历史摘要最大字符数\n# reasoning_policy: \"budget\" # strip / append / budget\n# max_reasoning_tokens: 2000 # reasoning chain token 预算\n\n# ── Scheduler ──────────────────────────────────────────\n# 控制定时任务调度行为。\n# 以下均为默认值,不写则使用默认值。\n#\n# scheduler:\n# poll_interval_seconds: 1.0 # 调度轮询间隔(秒)\n# max_concurrent_fires: 5 # 最大并发执行数\n# job_timeout_seconds: 120.0 # 单任务超时(秒)\n# min_interval_seconds: 60 # cron 最小间隔\n# max_prompt_chars: 12000 # 定时任务 prompt 最大字符数\n# max_jobs_per_chat: 20 # 每个会话最大任务数\n# failure_retry_seconds: 300 # 失败重试等待(秒)\n# max_consecutive_failures: 3 # 连续失败上限\n# memory_dreaming_enabled: true # 是否启用内部记忆 dreaming\n# memory_dreaming_interval_seconds: 3600 # dreaming 周期(秒)\n# memory_dreaming_initial_delay_seconds: 300 # 启动后首次 dreaming 延迟\n# memory_dreaming_session_limit: 20 # 单次最多扫描会话数\n# memory_dreaming_recent_turn_limit: 40 # 单会话最多读取 turns 数\n# memory_dreaming_provider_id: \"\" # Legacy;建议改用 memory_dreaming_model\n# memory_dreaming_model: \"\" # model spec;空则默认找 memory tag,失败后走会话模型\n\n# ── Router ─────────────────────────────────────────────\n# 控制消息路由行为。system_prompt 使用顶层 system_prompt 字段。\n# 以下均为默认值,不写则使用默认值。\n#\n# router:\n# # system_prompt: \"...\" # 与顶层 system_prompt 重复,优先使用顶层字段\n# max_history_turns: 200 # 最大历史轮数\n# agent_enabled: true # 是否启用 Agent\n# command_timeout_seconds: 30.0 # 命令执行超时(秒)\n# command_timeout_message: \"Command timed out. Please try again later.\"\n# reply_to_inbound: true # 默认是否引用回复触发消息;平台插件可覆盖\n# group_context:\n# enabled: true # 是否在触发时注入 observed-only 群上下文\n# max_messages: 20 # 最多注入最近多少条未触发群消息\n# ttl_seconds: 900 # 只注入最近 N 秒内的群上下文;0 表示不按时间过滤\n# max_chars: 4000 # 群上下文注入块最大字符数\n\n# ── Model Tags / Specs ─────────────────────────────────\n# providers 的 models 中用 tags 字段标记模型角色:\n# primary / cheap / memory / embedding / reranker / vision\n# 需要内部模型的配置项都接受一个 model spec 字符串;这个字符串可以是 tag,\n# 也可以是 provider/model 或裸模型名。\n\n# ── Memory ─────────────────────────────────────────────\n# 长期记忆检索和 embedding 配置。默认只启用 SQLite FTS;vector/hybrid\n# 需要显式开启,并在 providers.models 中配置带 embedding tag 的模型。\n#\n# memory:\n# enabled: true\n# retrieval:\n# fts_enabled: true\n# vector_enabled: false # 开启后对长期记忆使用 hybrid 检索\n# hybrid_enabled: true\n# vector_backend: json # json / sqlite-vec / none\n# max_injected_items: 5\n# max_injected_chars: 4000\n# embedding:\n# enabled: false\n# model: \"\" # model spec;空则默认找 embedding tag\n# dimensions: 0 # 0 = auto-detect via probe embed call\n# batch_size: 16\n# embed_after_consolidation: true\n# consolidation:\n# rule_based_enabled: true # 是否启用每轮对话后的规则抽取;false 时只保留 dreaming/显式写入\n"}, "ffe6754085334fd4be5f9d3f8fa5253c64692056": {"t": 1785761646.1718147, "n": 13603, "h": "3ca30ca3c162970f", "c": "# Nahida Bot 配置文件\n# 参见 nahida_bot.core.config.Settings 了解所有可用字段\n\n# ── 应用 ──────────────────────────────────────────────\napp_name: \"Nahida Bot\"\ndebug: false\nlog_level: \"INFO\" # DEBUG / INFO / WARNING / ERROR\n# log_json: true # 设为 true 输出 JSON 格式日志(生产环境推荐)\n# log_file: \"./data/logs/nahida.log\" # 可选:把应用日志写入文件,不需要 tee\n# log_file_level: \"DEBUG\" # 可选:文件日志级别;默认跟随 log_level\n# log_file_json: true # 文件日志默认使用 JSON Lines\ndependency_log_level: \"WARNING\" # 三方库默认日志级别;避免 DEBUG 时被 httpx/websockets 等刷屏\n# logger_levels: # 可选:按 logger 名覆盖,适合只打开某个子系统\n# nahida_bot.agent: \"DEBUG\"\n# plugin.rss-notifier: \"DEBUG\"\n# httpx: \"WARNING\"\n\n# ── 服务器 ────────────────────────────────────────────\nhost: \"127.0.0.1\"\nport: 6185\n\n# ── 数据库 ────────────────────────────────────────────\ndb_path: \"./data/nahida.db\"\n\n# ── Workspace ─────────────────────────────────────────\nworkspace_base_dir: \"./data/workspace\"\n\n# ── 插件 ──────────────────────────────────────────────\nplugin_paths:\n - \"./plugins\"\n\n# ── Agent / Router ────────────────────────────────────\nsystem_prompt: \"You are a helpful assistant.\"\n\n# ── LLM Providers(dict 格式,key 即 provider id)───\n# 默认配置已经是多 provider。每个 provider 有独立的 api_key、base_url 和 models。\n# models 的第一个元素是该 provider 的默认模型;每个模型可以是字符串,\n# 也可以是 {name, tags, capabilities} 对象。通过 /model 命令可在聊天中切换模型。\n#\n# 没有配置 api_key 的 provider 会在启动时被跳过;因此可以只填写实际使用的后端。\nproviders:\n deepseek-main:\n type: deepseek\n api_key: \"${DEEPSEEK_LLM_API_KEY:}\"\n base_url: \"${DEEPSEEK_LLM_BASE_URL:https://api.deepseek.com}\"\n # 内部使用 SSE 接收并聚合,可避免长推理期间普通读超时误判。\n stream_responses: true\n # thinking_enabled: false # 关闭 DeepSeek thinking mode\n models:\n - name: \"deepseek-v4-pro\"\n tags: [primary]\n - name: \"deepseek-v4-flash\"\n tags: [cheap, memory]\n\n siliconflow:\n type: \"openai-compatible\"\n api_key: \"${SILICONFLOW_LLM_API_KEY:}\"\n base_url: \"${SILICONFLOW_LLM_BASE_URL:https://api.siliconflow.cn/v1}\"\n merge_system_messages: true\n stream_responses: true\n models:\n - name: \"Qwen/Qwen3-Embedding-8B\"\n tags: [embedding]\n - name: \"Pro/zai-org/GLM-5\"\n tags: [vision]\n - name: \"Qwen/Qwen3.6-35B-A3B\"\n tags: [vision]\n capabilities:\n image_input: true\n max_image_count: 4\n max_image_bytes: 10485760\n\n minimax:\n type: minimax\n api_key: \"${MINIMAX_LLM_API_KEY:}\"\n base_url: \"https://api.minimaxi.com/anthropic\"\n max_tokens: 16000\n stream_responses: true\n models:\n - name: \"MiniMax-M2.5\"\n tags: [cheap]\n - name: \"MiniMax-M2.7\"\n\n # OpenAI Responses API(可选)\n # 使用 /responses 端点,支持内置工具(web_search、image_generation 等)\n # 和有状态对话链(previous_response_id)。Reasoning 摘要可通过\n # reasoning_effort 参数控制深度。\n # stream_responses=true 时同样在 provider 内部流式接收并聚合返回。\n openai:\n type: \"openai-responses\"\n api_key: \"${OPENAI_API_KEY:}\"\n base_url: \"${OPENAI_API_BASE_URL:https://api.openai.com/v1}\"\n store_responses: true\n use_previous_response_id: false\n stream_responses: true\n reasoning_effort: \"medium\"\n # built_in_tools: [\"web_search\", \"image_generation\"]\n models:\n - name: \"gpt-5.4\"\n capabilities:\n image_input: true\n image_generation: true\n web_search: true\n tool_calling: true\n reasoning: true\n\ndefault_provider: deepseek-main # 可选,默认使用 providers 中的第一个 key\n\n# ── 多模态 / 图片理解 ─────────────────────────────────\n# image_fallback_mode:\n# auto: 主模型不支持 image_input 时,自动调用 fallback vision 模型生成描述\n# tool: 主模型不支持 image_input 时,注入 image_understand 工具,由主模型按需调用\n# off: 不处理图片,只保留普通文本\n# media_context_policy:\n# cache_aware: 最近图片尽量保留原生内容块,旧图片降级为描述\n# native_recent: 仅最近图片保留原生内容块\n# description_only: 历史图片只使用描述\nmultimodal:\n image_fallback_mode: \"auto\"\n media_context_policy: \"cache_aware\"\n image_fallback_provider: \"\" # Legacy;建议把 provider 写进 image_fallback_model\n image_fallback_model: \"siliconflow/Qwen/Qwen3.6-35B-A3B\"\n max_images_per_turn: 4\n max_image_bytes: 10485760\n media_cache_ttl_seconds: 3600\n\n# ── 插件配置 ──────────────────────────────────────────\n# Settings 的 extra=\"allow\" 机制:顶层 key 如果不是已知字段,\n# 且值为 dict,则按 plugin id 匹配并注入到对应插件的 manifest.config 中。\n\nbuiltin-commands:\n # send_local_attachment 默认只允许发送 active workspace 内的相对路径。\n # 如确实需要发送工作区外的本地文件,可打开下面开关。\n allow_external_attachment_paths: false\n # 可选白名单目录;为空表示打开上方开关后允许任意绝对路径。\n # external_attachment_roots:\n # - \"D:/Pictures\"\n external_attachment_roots: []\n\n# OpenAI-compatible 图片生成(可选)\n# 启用后注册 /draw、/生图 命令和 image_generate tool。\n# image_generation:\n# enabled: true\n# provider: default\n# backends:\n# default:\n# type: openai-images\n# api_key: \"${IMAGE_API_KEY}\"\n# base_url: \"${IMAGE_BASE_URL}\"\n# model: \"gpt-image-1\"\n# timeout_seconds: 600\n# download_timeout_seconds: 120\n# trust_env: false\n# force_close_connections: true\n# output_dir: \"generated/images\"\n# auto_send: true\n# max_images_per_24h: 20\n\ngithub-notifier:\n # 目标仓库;保持 OWNER/REPO 时插件会视为未配置,不会启动 webhook/polling。\n repo: \"OWNER/REPO\"\n # typed chat address 列表,例如 milky:group:123456789 或 telegram:private:123456789。\n target_chat_addresses: []\n webhook:\n enabled: true\n path: \"github\" # 最终路径: /webhooks/github\n secret: \"${GITHUB_WEBHOOK_SECRET:}\"\n polling:\n enabled: true # webhook 不可用时的 fallback;首次轮询只建立基线\n interval_seconds: 60\n api_base_url: \"https://api.github.com\"\n token: \"${GITHUB_TOKEN:}\" # 私有仓库或更高 rate limit 时填写\n registration:\n enabled: false # 开启后可在聊天中使用 /github_watch 动态订阅\n\n# RSS/Atom 订阅通知(外部插件 plugins/rss-notifier)\n# rss-notifier:\n# enabled: true\n# # 默认推送目标;feed 未设置 target_chat_addresses 时使用这里。\n# target_chat_addresses:\n# - \"milky:group:123456789\"\n# feeds:\n# - url: \"https://example.com/feed.xml\"\n# title: \"Example\"\n# polling:\n# enabled: true\n# interval_seconds: 300\n# registration:\n# enabled: true # 开启后可在聊天中使用 /rss_sub 动态订阅\n\nconversation_joiner:\n # 主动入话题默认关闭。开启前需要对应群频道启用 group_context_capture,\n # 让未触发消息先进入 MessageObserved。\n enabled: false\n model: cheap # model spec;没有 cheap tag 时可改成 provider/model,或留空使用默认模型\n threshold: 0.75\n max_context_messages: 12\n max_context_chars: 3000\n cooldown_seconds: 300\n max_triggers_per_hour: 3\n debounce_seconds: 20\n decision_timeout_seconds: 8\n persona_context:\n enabled: true # 启用后秘书模型会读取 workspace 中的人设文件辅助判断是否自然入话题\n files:\n - SOUL.md\n max_chars: 4000 # 注入秘书模型的人设上下文总字符上限\n cache_ttl_seconds: 60 # persona 文件缓存时间,避免每条候选消息都读文件\n prefilter:\n ignore_commands: true\n ignore_mentions: true\n min_text_chars: 4\n keyword_hints: []\n sample_rate: 0.15 # 普通候选消息进入秘书模型的采样概率\n keyword_sample_rate: 1.0 # 命中 keyword_hints 后进入秘书模型的采样概率\n groups: {}\n # groups:\n # milky:group:123456789:\n # enabled: true\n # threshold: 0.78\n # cooldown_seconds: 300\n engagement:\n enabled: false # 打开后进入 observing/joining/engaged/cooling 状态机\n join_state_ttl_seconds: 600\n idle_exit_seconds: 180\n max_engaged_seconds: 1800\n response_cooldown_seconds: 45\n engagement_score_alpha: 0.2\n engagement_score_exit_threshold: 0.2\n score_decay_half_life_seconds: 600\n score_decay_floor: 0.0\n batching:\n window_seconds: 8 # 后续群消息进入 batch 的短窗口\n max_messages: 6 # 窗口内消息过多时提前 flush\n max_chars: 2000\n flush_on_mention: true\n continue_gate:\n enabled: true # 每个 flushed batch 交给秘书模型判断是否继续接话\n model: cheap\n threshold: 0.55\n min_messages: 1\n evaluate_interval_seconds: 8\n exit_gate:\n enabled: true\n low_value_threshold: 0.35\n low_value_strikes: 3\n min_messages_per_window: 1\n activity_window_seconds: 120\n\ntelegram:\n bot_token: \"${TELEGRAM_BOT_TOKEN:}\"\n # group_trigger_mode: \"always\" # none / mention / command / always\n # group_context_capture: false # mention/command 模式下,是否记录未触发群消息作为上下文\n # reply_to_inbound: null # true/false 覆盖 router.reply_to_inbound;null/省略表示跟随全局\n # proxy: \"${TELEGRAM_PROXY:}\" # SOCKS5/HTTP 代理,如 socks5://127.0.0.1:1080\n # polling_timeout: 30\n # allowed_chats: []\n\n# Milky QQ Channel(可选)\n# 启用前请先启动 Lagrange.Milky,并确保 nahida_bot/channels/milky/plugin.yaml\n# 可被内置 channel discovery 扫描到。保持注释状态不会启用 Milky。\n#\n# milky:\n# base_url: \"http://127.0.0.1:3000\"\n# access_token: \"${MILKY_ACCESS_TOKEN:}\"\n# api_prefix: \"/api\"\n# event_path: \"/event\"\n# # ws_url: \"ws://127.0.0.1:3000/event\" # 可选:覆盖由 base_url 推导出的 WS 地址\n# command_prefix: \"/\"\n# group_trigger_mode: \"mention\" # none / mention / command / always\n# group_context_capture: false # true 时,未触发群消息只记录为上下文,可供 conversation_joiner 判断\n# reply_to_inbound: null # true/false 覆盖 router.reply_to_inbound;null/省略表示跟随全局\n# allowed_friends: [] # QQ 号白名单;空列表表示不限制\n# allowed_groups: [] # 群号白名单;空列表表示不限制\n# connect_timeout: 10.0\n# heartbeat_timeout: 30.0\n# reconnect_initial_delay: 1.0\n# reconnect_max_delay: 30.0\n# send_retry_attempts: 3\n# send_retry_backoff: 1.0\n# max_text_length: 4000\n# media_download_dir: \"./data/temp/media\"\n# enable_media_download_tool: true\n# resource_url_ttl_hint: 300\n# cache_media_on_receive: true\n# max_forward_depth: 3\n# max_forward_messages: 80\n# forward_render_max_chars: 12000\n# scene_cache_size: 4096\n\n# ── Agent Loop ──────────────────────────────────────────\n# 控制 Agent 循环的行为:迭代轮数、超时、重试策略等。\n# 以下均为默认值,不写则使用默认值。\n#\n# agent:\n# max_steps: 8 # 最大工具调用迭代轮数\n# provider_timeout_seconds: 120.0 # 单次 LLM 调用超时(秒)\n# retry_attempts: 2 # LLM 调用重试次数\n# retry_backoff_seconds: 0.2 # 重试退避间隔(秒)\n# tool_timeout_seconds: 135.0 # 工具执行超时(秒)\n# tool_retry_attempts: 1 # 工具执行重试次数\n# tool_retry_backoff_seconds: 0.1 # 工具重试退避间隔(秒)\n# max_tool_log_chars: 400 # 工具日志截断长度\n# # tool_use_system_prompt: \"...\" # 注入的工具使用提示\n# # provider_error_template: \"...\" # Provider 错误消息模板\n\n# ── Context Budget ──────────────────────────────────────\n# 控制未知模型 fallback 上下文窗口和 reasoning chain 预算。\n# 模型声明 providers.*.models[].capabilities.context_window 时优先使用模型窗口。\n# 以下均为默认值,不写则使用默认值。\n#\n# context:\n# max_tokens: 272000 # 未声明模型窗口时的 fallback context window\n# reserved_tokens: 10000 # 未声明模型窗口时为输出保留的 token\n# # max_chars: null # 字符数上限(兼容旧逻辑,优先使用 max_tokens)\n# # reserved_chars: 0 # 字符保留数\n# summary_max_chars: 2000 # 历史摘要最大字符数\n# reasoning_policy: \"budget\" # strip / append / budget\n# max_reasoning_tokens: 2000 # reasoning chain token 预算\n\n# ── Scheduler ──────────────────────────────────────────\n# 控制定时任务调度行为。\n# 以下均为默认值,不写则使用默认值。\n#\n# scheduler:\n# poll_interval_seconds: 1.0 # 调度轮询间隔(秒)\n# max_concurrent_fires: 5 # 最大并发执行数\n# job_timeout_seconds: 120.0 # 单任务超时(秒)\n# min_interval_seconds: 60 # cron 最小间隔\n# max_prompt_chars: 12000 # 定时任务 prompt 最大字符数\n# max_jobs_per_chat: 20 # 每个会话最大任务数\n# failure_retry_seconds: 300 # 失败重试等待(秒)\n# max_consecutive_failures: 3 # 连续失败上限\n# memory_dreaming_enabled: true # 是否启用内部记忆 dreaming\n# memory_dreaming_interval_seconds: 3600 # dreaming 周期(秒)\n# memory_dreaming_initial_delay_seconds: 300 # 启动后首次 dreaming 延迟\n# memory_dreaming_session_limit: 20 # 单次最多扫描会话数\n# memory_dreaming_recent_turn_limit: 40 # 单会话最多读取 turns 数\n# memory_dreaming_provider_id: \"\" # Legacy;建议改用 memory_dreaming_model\n# memory_dreaming_model: \"\" # model spec;空则默认找 memory tag,失败后走会话模型\n\n# ── Router ─────────────────────────────────────────────\n# 控制消息路由行为。system_prompt 使用顶层 system_prompt 字段。\n# 以下均为默认值,不写则使用默认值。\n#\n# router:\n# # system_prompt: \"...\" # 与顶层 system_prompt 重复,优先使用顶层字段\n# max_history_turns: 200 # 最大历史轮数\n# agent_enabled: true # 是否启用 Agent\n# command_timeout_seconds: 30.0 # 命令执行超时(秒)\n# command_timeout_message: \"Command timed out. Please try again later.\"\n# reply_to_inbound: true # 默认是否引用回复触发消息;平台插件可覆盖\n# group_context:\n# enabled: true # 是否在触发时注入 observed-only 群上下文\n# max_messages: 20 # 最多注入最近多少条未触发群消息\n# ttl_seconds: 900 # 只注入最近 N 秒内的群上下文;0 表示不按时间过滤\n# max_chars: 4000 # 群上下文注入块最大字符数\n\n# ── Model Tags / Specs ─────────────────────────────────\n# providers 的 models 中用 tags 字段标记模型角色:\n# primary / cheap / memory / embedding / reranker / vision\n# 需要内部模型的配置项都接受一个 model spec 字符串;这个字符串可以是 tag,\n# 也可以是 provider/model 或裸模型名。\n\n# ── Memory ─────────────────────────────────────────────\n# 长期记忆检索和 embedding 配置。默认只启用 SQLite FTS;vector/hybrid\n# 需要显式开启,并在 providers.models 中配置带 embedding tag 的模型。\n#\n# memory:\n# enabled: true\n# retrieval:\n# fts_enabled: true\n# vector_enabled: false # 开启后对长期记忆使用 hybrid 检索\n# hybrid_enabled: true\n# vector_backend: json # json / sqlite-vec / none\n# max_injected_items: 5\n# max_injected_chars: 4000\n# embedding:\n# enabled: false\n# model: \"\" # model spec;空则默认找 embedding tag\n# dimensions: 0 # 0 = auto-detect via probe embed call\n# batch_size: 16\n# embed_after_consolidation: true\n# consolidation:\n# rule_based_enabled: true # 是否启用每轮对话后的规则抽取;false 时只保留 dreaming/显式写入\n"}, "160a15c9753c2636e94c65685bcfd705f12d5f68": {"t": 1785761648.6930013, "n": 13369, "h": "1f8b3b79f7b1c5a7", "c": "# Nahida Bot 配置文件\n# 参见 nahida_bot.core.config.Settings 了解所有可用字段\n\n# ── 应用 ──────────────────────────────────────────────\napp_name: \"Nahida Bot\"\ndebug: false\nlog_level: \"INFO\" # DEBUG / INFO / WARNING / ERROR\n# log_json: true # 设为 true 输出 JSON 格式日志(生产环境推荐)\n# log_file: \"./data/logs/nahida.log\" # 可选:把应用日志写入文件,不需要 tee\n# log_file_level: \"DEBUG\" # 可选:文件日志级别;默认跟随 log_level\n# log_file_json: true # 文件日志默认使用 JSON Lines\n\n# ── 服务器 ────────────────────────────────────────────\nhost: \"127.0.0.1\"\nport: 6185\n\n# ── 数据库 ────────────────────────────────────────────\ndb_path: \"./data/nahida.db\"\n\n# ── Workspace ─────────────────────────────────────────\nworkspace_base_dir: \"./data/workspace\"\n\n# ── 插件 ──────────────────────────────────────────────\nplugin_paths:\n - \"./plugins\"\n\n# ── Agent / Router ────────────────────────────────────\nsystem_prompt: \"You are a helpful assistant.\"\n\n# ── LLM Providers(dict 格式,key 即 provider id)───\n# 默认配置已经是多 provider。每个 provider 有独立的 api_key、base_url 和 models。\n# models 的第一个元素是该 provider 的默认模型;每个模型可以是字符串,\n# 也可以是 {name, tags, capabilities} 对象。通过 /model 命令可在聊天中切换模型。\n#\n# 没有配置 api_key 的 provider 会在启动时被跳过;因此可以只填写实际使用的后端。\nproviders:\n deepseek-main:\n type: deepseek\n api_key: \"${DEEPSEEK_LLM_API_KEY:}\"\n base_url: \"${DEEPSEEK_LLM_BASE_URL:https://api.deepseek.com}\"\n # 内部使用 SSE 接收并聚合,可避免长推理期间普通读超时误判。\n stream_responses: true\n # thinking_enabled: false # 关闭 DeepSeek thinking mode\n models:\n - name: \"deepseek-v4-pro\"\n tags: [primary]\n - name: \"deepseek-v4-flash\"\n tags: [cheap, memory]\n\n siliconflow:\n type: \"openai-compatible\"\n api_key: \"${SILICONFLOW_LLM_API_KEY:}\"\n base_url: \"${SILICONFLOW_LLM_BASE_URL:https://api.siliconflow.cn/v1}\"\n merge_system_messages: true\n stream_responses: true\n models:\n - name: \"Qwen/Qwen3-Embedding-8B\"\n tags: [embedding]\n - name: \"Pro/zai-org/GLM-5\"\n tags: [vision]\n - name: \"Qwen/Qwen3.6-35B-A3B\"\n tags: [vision]\n capabilities:\n image_input: true\n max_image_count: 4\n max_image_bytes: 10485760\n\n minimax:\n type: minimax\n api_key: \"${MINIMAX_LLM_API_KEY:}\"\n base_url: \"https://api.minimaxi.com/anthropic\"\n max_tokens: 16000\n stream_responses: true\n models:\n - name: \"MiniMax-M2.5\"\n tags: [cheap]\n - name: \"MiniMax-M2.7\"\n\n # OpenAI Responses API(可选)\n # 使用 /responses 端点,支持内置工具(web_search、image_generation 等)\n # 和有状态对话链(previous_response_id)。Reasoning 摘要可通过\n # reasoning_effort 参数控制深度。\n # stream_responses=true 时同样在 provider 内部流式接收并聚合返回。\n openai:\n type: \"openai-responses\"\n api_key: \"${OPENAI_API_KEY:}\"\n base_url: \"${OPENAI_API_BASE_URL:https://api.openai.com/v1}\"\n store_responses: true\n use_previous_response_id: false\n stream_responses: true\n reasoning_effort: \"medium\"\n # built_in_tools: [\"web_search\", \"image_generation\"]\n models:\n - name: \"gpt-5.4\"\n capabilities:\n image_input: true\n image_generation: true\n web_search: true\n tool_calling: true\n reasoning: true\n\ndefault_provider: deepseek-main # 可选,默认使用 providers 中的第一个 key\n\n# ── 多模态 / 图片理解 ─────────────────────────────────\n# image_fallback_mode:\n# auto: 主模型不支持 image_input 时,自动调用 fallback vision 模型生成描述\n# tool: 主模型不支持 image_input 时,注入 image_understand 工具,由主模型按需调用\n# off: 不处理图片,只保留普通文本\n# media_context_policy:\n# cache_aware: 最近图片尽量保留原生内容块,旧图片降级为描述\n# native_recent: 仅最近图片保留原生内容块\n# description_only: 历史图片只使用描述\nmultimodal:\n image_fallback_mode: \"auto\"\n media_context_policy: \"cache_aware\"\n image_fallback_provider: \"\" # Legacy;建议把 provider 写进 image_fallback_model\n image_fallback_model: \"siliconflow/Qwen/Qwen3.6-35B-A3B\"\n max_images_per_turn: 4\n max_image_bytes: 10485760\n media_cache_ttl_seconds: 3600\n\n# ── 插件配置 ──────────────────────────────────────────\n# Settings 的 extra=\"allow\" 机制:顶层 key 如果不是已知字段,\n# 且值为 dict,则按 plugin id 匹配并注入到对应插件的 manifest.config 中。\n\nbuiltin-commands:\n # send_local_attachment 默认只允许发送 active workspace 内的相对路径。\n # 如确实需要发送工作区外的本地文件,可打开下面开关。\n allow_external_attachment_paths: false\n # 可选白名单目录;为空表示打开上方开关后允许任意绝对路径。\n # external_attachment_roots:\n # - \"D:/Pictures\"\n external_attachment_roots: []\n\n# OpenAI-compatible 图片生成(可选)\n# 启用后注册 /draw、/生图 命令和 image_generate tool。\n# image_generation:\n# enabled: true\n# provider: default\n# backends:\n# default:\n# type: openai-images\n# api_key: \"${IMAGE_API_KEY}\"\n# base_url: \"${IMAGE_BASE_URL}\"\n# model: \"gpt-image-1\"\n# timeout_seconds: 600\n# download_timeout_seconds: 120\n# trust_env: false\n# force_close_connections: true\n# output_dir: \"generated/images\"\n# auto_send: true\n# max_images_per_24h: 20\n\ngithub-notifier:\n # 目标仓库;保持 OWNER/REPO 时插件会视为未配置,不会启动 webhook/polling。\n repo: \"OWNER/REPO\"\n # typed chat address 列表,例如 milky:group:123456789 或 telegram:private:123456789。\n target_chat_addresses: []\n webhook:\n enabled: true\n path: \"github\" # 最终路径: /webhooks/github\n secret: \"${GITHUB_WEBHOOK_SECRET:}\"\n polling:\n enabled: true # webhook 不可用时的 fallback;首次轮询只建立基线\n interval_seconds: 60\n api_base_url: \"https://api.github.com\"\n token: \"${GITHUB_TOKEN:}\" # 私有仓库或更高 rate limit 时填写\n registration:\n enabled: false # 开启后可在聊天中使用 /github_watch 动态订阅\n\n# RSS/Atom 订阅通知(外部插件 plugins/rss-notifier)\n# rss-notifier:\n# enabled: true\n# # 默认推送目标;feed 未设置 target_chat_addresses 时使用这里。\n# target_chat_addresses:\n# - \"milky:group:123456789\"\n# feeds:\n# - url: \"https://example.com/feed.xml\"\n# title: \"Example\"\n# polling:\n# enabled: true\n# interval_seconds: 300\n# registration:\n# enabled: true # 开启后可在聊天中使用 /rss_sub 动态订阅\n\nconversation_joiner:\n # 主动入话题默认关闭。开启前需要对应群频道启用 group_context_capture,\n # 让未触发消息先进入 MessageObserved。\n enabled: false\n model: cheap # model spec;没有 cheap tag 时可改成 provider/model,或留空使用默认模型\n threshold: 0.75\n max_context_messages: 12\n max_context_chars: 3000\n cooldown_seconds: 300\n max_triggers_per_hour: 3\n debounce_seconds: 20\n decision_timeout_seconds: 8\n persona_context:\n enabled: true # 启用后秘书模型会读取 workspace 中的人设文件辅助判断是否自然入话题\n files:\n - SOUL.md\n max_chars: 4000 # 注入秘书模型的人设上下文总字符上限\n cache_ttl_seconds: 60 # persona 文件缓存时间,避免每条候选消息都读文件\n prefilter:\n ignore_commands: true\n ignore_mentions: true\n min_text_chars: 4\n keyword_hints: []\n sample_rate: 0.15 # 普通候选消息进入秘书模型的采样概率\n keyword_sample_rate: 1.0 # 命中 keyword_hints 后进入秘书模型的采样概率\n groups: {}\n # groups:\n # milky:group:123456789:\n # enabled: true\n # threshold: 0.78\n # cooldown_seconds: 300\n engagement:\n enabled: false # 打开后进入 observing/joining/engaged/cooling 状态机\n join_state_ttl_seconds: 600\n idle_exit_seconds: 180\n max_engaged_seconds: 1800\n response_cooldown_seconds: 45\n engagement_score_alpha: 0.2\n engagement_score_exit_threshold: 0.2\n score_decay_half_life_seconds: 600\n score_decay_floor: 0.0\n batching:\n window_seconds: 8 # 后续群消息进入 batch 的短窗口\n max_messages: 6 # 窗口内消息过多时提前 flush\n max_chars: 2000\n flush_on_mention: true\n continue_gate:\n enabled: true # 每个 flushed batch 交给秘书模型判断是否继续接话\n model: cheap\n threshold: 0.55\n min_messages: 1\n evaluate_interval_seconds: 8\n exit_gate:\n enabled: true\n low_value_threshold: 0.35\n low_value_strikes: 3\n min_messages_per_window: 1\n activity_window_seconds: 120\n\ntelegram:\n bot_token: \"${TELEGRAM_BOT_TOKEN:}\"\n # group_trigger_mode: \"always\" # none / mention / command / always\n # group_context_capture: false # mention/command 模式下,是否记录未触发群消息作为上下文\n # reply_to_inbound: null # true/false 覆盖 router.reply_to_inbound;null/省略表示跟随全局\n # proxy: \"${TELEGRAM_PROXY:}\" # SOCKS5/HTTP 代理,如 socks5://127.0.0.1:1080\n # polling_timeout: 30\n # allowed_chats: []\n\n# Milky QQ Channel(可选)\n# 启用前请先启动 Lagrange.Milky,并确保 nahida_bot/channels/milky/plugin.yaml\n# 可被内置 channel discovery 扫描到。保持注释状态不会启用 Milky。\n#\n# milky:\n# base_url: \"http://127.0.0.1:3000\"\n# access_token: \"${MILKY_ACCESS_TOKEN:}\"\n# api_prefix: \"/api\"\n# event_path: \"/event\"\n# # ws_url: \"ws://127.0.0.1:3000/event\" # 可选:覆盖由 base_url 推导出的 WS 地址\n# command_prefix: \"/\"\n# group_trigger_mode: \"mention\" # none / mention / command / always\n# group_context_capture: false # true 时,未触发群消息只记录为上下文,可供 conversation_joiner 判断\n# reply_to_inbound: null # true/false 覆盖 router.reply_to_inbound;null/省略表示跟随全局\n# allowed_friends: [] # QQ 号白名单;空列表表示不限制\n# allowed_groups: [] # 群号白名单;空列表表示不限制\n# connect_timeout: 10.0\n# heartbeat_timeout: 30.0\n# reconnect_initial_delay: 1.0\n# reconnect_max_delay: 30.0\n# send_retry_attempts: 3\n# send_retry_backoff: 1.0\n# max_text_length: 4000\n# media_download_dir: \"./data/temp/media\"\n# enable_media_download_tool: true\n# resource_url_ttl_hint: 300\n# cache_media_on_receive: true\n# max_forward_depth: 3\n# max_forward_messages: 80\n# forward_render_max_chars: 12000\n# scene_cache_size: 4096\n\n# ── Agent Loop ──────────────────────────────────────────\n# 控制 Agent 循环的行为:迭代轮数、超时、重试策略等。\n# 以下均为默认值,不写则使用默认值。\n#\n# agent:\n# max_steps: 8 # 最大工具调用迭代轮数\n# provider_timeout_seconds: 120.0 # 单次 LLM 调用超时(秒)\n# retry_attempts: 2 # LLM 调用重试次数\n# retry_backoff_seconds: 0.2 # 重试退避间隔(秒)\n# tool_timeout_seconds: 135.0 # 工具执行超时(秒)\n# tool_retry_attempts: 1 # 工具执行重试次数\n# tool_retry_backoff_seconds: 0.1 # 工具重试退避间隔(秒)\n# max_tool_log_chars: 400 # 工具日志截断长度\n# # tool_use_system_prompt: \"...\" # 注入的工具使用提示\n# # provider_error_template: \"...\" # Provider 错误消息模板\n\n# ── Context Budget ──────────────────────────────────────\n# 控制未知模型 fallback 上下文窗口和 reasoning chain 预算。\n# 模型声明 providers.*.models[].capabilities.context_window 时优先使用模型窗口。\n# 以下均为默认值,不写则使用默认值。\n#\n# context:\n# max_tokens: 272000 # 未声明模型窗口时的 fallback context window\n# reserved_tokens: 10000 # 未声明模型窗口时为输出保留的 token\n# # max_chars: null # 字符数上限(兼容旧逻辑,优先使用 max_tokens)\n# # reserved_chars: 0 # 字符保留数\n# summary_max_chars: 2000 # 历史摘要最大字符数\n# reasoning_policy: \"budget\" # strip / append / budget\n# max_reasoning_tokens: 2000 # reasoning chain token 预算\n\n# ── Scheduler ──────────────────────────────────────────\n# 控制定时任务调度行为。\n# 以下均为默认值,不写则使用默认值。\n#\n# scheduler:\n# poll_interval_seconds: 1.0 # 调度轮询间隔(秒)\n# max_concurrent_fires: 5 # 最大并发执行数\n# job_timeout_seconds: 120.0 # 单任务超时(秒)\n# min_interval_seconds: 60 # cron 最小间隔\n# max_prompt_chars: 12000 # 定时任务 prompt 最大字符数\n# max_jobs_per_chat: 20 # 每个会话最大任务数\n# failure_retry_seconds: 300 # 失败重试等待(秒)\n# max_consecutive_failures: 3 # 连续失败上限\n# memory_dreaming_enabled: true # 是否启用内部记忆 dreaming\n# memory_dreaming_interval_seconds: 3600 # dreaming 周期(秒)\n# memory_dreaming_initial_delay_seconds: 300 # 启动后首次 dreaming 延迟\n# memory_dreaming_session_limit: 20 # 单次最多扫描会话数\n# memory_dreaming_recent_turn_limit: 40 # 单会话最多读取 turns 数\n# memory_dreaming_provider_id: \"\" # Legacy;建议改用 memory_dreaming_model\n# memory_dreaming_model: \"\" # model spec;空则默认找 memory tag,失败后走会话模型\n\n# ── Router ─────────────────────────────────────────────\n# 控制消息路由行为。system_prompt 使用顶层 system_prompt 字段。\n# 以下均为默认值,不写则使用默认值。\n#\n# router:\n# # system_prompt: \"...\" # 与顶层 system_prompt 重复,优先使用顶层字段\n# max_history_turns: 200 # 最大历史轮数\n# agent_enabled: true # 是否启用 Agent\n# command_timeout_seconds: 30.0 # 命令执行超时(秒)\n# command_timeout_message: \"Command timed out. Please try again later.\"\n# reply_to_inbound: true # 默认是否引用回复触发消息;平台插件可覆盖\n# group_context:\n# enabled: true # 是否在触发时注入 observed-only 群上下文\n# max_messages: 20 # 最多注入最近多少条未触发群消息\n# ttl_seconds: 900 # 只注入最近 N 秒内的群上下文;0 表示不按时间过滤\n# max_chars: 4000 # 群上下文注入块最大字符数\n\n# ── Model Tags / Specs ─────────────────────────────────\n# providers 的 models 中用 tags 字段标记模型角色:\n# primary / cheap / memory / embedding / reranker / vision\n# 需要内部模型的配置项都接受一个 model spec 字符串;这个字符串可以是 tag,\n# 也可以是 provider/model 或裸模型名。\n\n# ── Memory ─────────────────────────────────────────────\n# 长期记忆检索和 embedding 配置。默认只启用 SQLite FTS;vector/hybrid\n# 需要显式开启,并在 providers.models 中配置带 embedding tag 的模型。\n#\n# memory:\n# enabled: true\n# retrieval:\n# fts_enabled: true\n# vector_enabled: false # 开启后对长期记忆使用 hybrid 检索\n# hybrid_enabled: true\n# vector_backend: json # json / sqlite-vec / none\n# max_injected_items: 5\n# max_injected_chars: 4000\n# embedding:\n# enabled: false\n# model: \"\" # model spec;空则默认找 embedding tag\n# dimensions: 0 # 0 = auto-detect via probe embed call\n# batch_size: 16\n# embed_after_consolidation: true\n# consolidation:\n# rule_based_enabled: true # 是否启用每轮对话后的规则抽取;false 时只保留 dreaming/显式写入\n"}, "d67bffaaaa789c65fd67ac1b2487b463ade17cfd": {"t": 1785761650.7299156, "n": 12959, "h": "a801c1a7c463f249", "c": "# Nahida Bot 配置文件\n# 参见 nahida_bot.core.config.Settings 了解所有可用字段\n\n# ── 应用 ──────────────────────────────────────────────\napp_name: \"Nahida Bot\"\ndebug: false\nlog_level: \"INFO\" # DEBUG / INFO / WARNING / ERROR\n# log_json: true # 设为 true 输出 JSON 格式日志(生产环境推荐)\n# log_file: \"./data/logs/nahida.log\" # 可选:把应用日志写入文件,不需要 tee\n# log_file_level: \"DEBUG\" # 可选:文件日志级别;默认跟随 log_level\n# log_file_json: true # 文件日志默认使用 JSON Lines\n\n# ── 服务器 ────────────────────────────────────────────\nhost: \"127.0.0.1\"\nport: 6185\n\n# ── 数据库 ────────────────────────────────────────────\ndb_path: \"./data/nahida.db\"\n\n# ── Workspace ─────────────────────────────────────────\nworkspace_base_dir: \"./data/workspace\"\n\n# ── 插件 ──────────────────────────────────────────────\nplugin_paths:\n - \"./plugins\"\n\n# ── Agent / Router ────────────────────────────────────\nsystem_prompt: \"You are a helpful assistant.\"\n\n# ── LLM Providers(dict 格式,key 即 provider id)───\n# 默认配置已经是多 provider。每个 provider 有独立的 api_key、base_url 和 models。\n# models 的第一个元素是该 provider 的默认模型;每个模型可以是字符串,\n# 也可以是 {name, tags, capabilities} 对象。通过 /model 命令可在聊天中切换模型。\n#\n# 没有配置 api_key 的 provider 会在启动时被跳过;因此可以只填写实际使用的后端。\nproviders:\n deepseek-main:\n type: deepseek\n api_key: \"${DEEPSEEK_LLM_API_KEY:}\"\n base_url: \"${DEEPSEEK_LLM_BASE_URL:https://api.deepseek.com}\"\n # 内部使用 SSE 接收并聚合,可避免长推理期间普通读超时误判。\n stream_responses: true\n # thinking_enabled: false # 关闭 DeepSeek thinking mode\n models:\n - name: \"deepseek-v4-pro\"\n tags: [primary]\n - name: \"deepseek-v4-flash\"\n tags: [cheap, memory]\n\n siliconflow:\n type: \"openai-compatible\"\n api_key: \"${SILICONFLOW_LLM_API_KEY:}\"\n base_url: \"${SILICONFLOW_LLM_BASE_URL:https://api.siliconflow.cn/v1}\"\n merge_system_messages: true\n stream_responses: true\n models:\n - name: \"Qwen/Qwen3-Embedding-8B\"\n tags: [embedding]\n - name: \"Pro/zai-org/GLM-5\"\n tags: [vision]\n - name: \"Qwen/Qwen3.6-35B-A3B\"\n tags: [vision]\n capabilities:\n image_input: true\n max_image_count: 4\n max_image_bytes: 10485760\n\n minimax:\n type: minimax\n api_key: \"${MINIMAX_LLM_API_KEY:}\"\n base_url: \"https://api.minimaxi.com/anthropic\"\n max_tokens: 16000\n stream_responses: true\n models:\n - name: \"MiniMax-M2.5\"\n tags: [cheap]\n - name: \"MiniMax-M2.7\"\n\n # OpenAI Responses API(可选)\n # 使用 /responses 端点,支持内置工具(web_search、image_generation 等)\n # 和有状态对话链(previous_response_id)。Reasoning 摘要可通过\n # reasoning_effort 参数控制深度。\n # stream_responses=true 时同样在 provider 内部流式接收并聚合返回。\n openai:\n type: \"openai-responses\"\n api_key: \"${OPENAI_API_KEY:}\"\n base_url: \"${OPENAI_API_BASE_URL:https://api.openai.com/v1}\"\n store_responses: true\n use_previous_response_id: false\n stream_responses: true\n reasoning_effort: \"medium\"\n # built_in_tools: [\"web_search\", \"image_generation\"]\n models:\n - name: \"gpt-5.4\"\n capabilities:\n image_input: true\n image_generation: true\n web_search: true\n tool_calling: true\n reasoning: true\n\ndefault_provider: deepseek-main # 可选,默认使用 providers 中的第一个 key\n\n# ── 多模态 / 图片理解 ─────────────────────────────────\n# image_fallback_mode:\n# auto: 主模型不支持 image_input 时,自动调用 fallback vision 模型生成描述\n# tool: 主模型不支持 image_input 时,注入 image_understand 工具,由主模型按需调用\n# off: 不处理图片,只保留普通文本\n# media_context_policy:\n# cache_aware: 最近图片尽量保留原生内容块,旧图片降级为描述\n# native_recent: 仅最近图片保留原生内容块\n# description_only: 历史图片只使用描述\nmultimodal:\n image_fallback_mode: \"auto\"\n media_context_policy: \"cache_aware\"\n image_fallback_provider: \"\" # Legacy;建议把 provider 写进 image_fallback_model\n image_fallback_model: \"siliconflow/Qwen/Qwen3.6-35B-A3B\"\n max_images_per_turn: 4\n max_image_bytes: 10485760\n media_cache_ttl_seconds: 3600\n\n# ── 插件配置 ──────────────────────────────────────────\n# Settings 的 extra=\"allow\" 机制:顶层 key 如果不是已知字段,\n# 且值为 dict,则按 plugin id 匹配并注入到对应插件的 manifest.config 中。\n\nbuiltin-commands:\n # send_local_attachment 默认只允许发送 active workspace 内的相对路径。\n # 如确实需要发送工作区外的本地文件,可打开下面开关。\n allow_external_attachment_paths: false\n # 可选白名单目录;为空表示打开上方开关后允许任意绝对路径。\n # external_attachment_roots:\n # - \"D:/Pictures\"\n external_attachment_roots: []\n\n# OpenAI-compatible 图片生成(可选)\n# 启用后注册 /draw、/生图 命令和 image_generate tool。\n# image_generation:\n# enabled: true\n# provider: default\n# backends:\n# default:\n# type: openai-images\n# api_key: \"${IMAGE_API_KEY}\"\n# base_url: \"${IMAGE_BASE_URL}\"\n# model: \"gpt-image-1\"\n# timeout_seconds: 600\n# download_timeout_seconds: 120\n# trust_env: false\n# force_close_connections: true\n# output_dir: \"generated/images\"\n# auto_send: true\n# max_images_per_24h: 20\n\ngithub-notifier:\n # 目标仓库;保持 OWNER/REPO 时插件会视为未配置,不会启动 webhook/polling。\n repo: \"OWNER/REPO\"\n # typed chat address 列表,例如 milky:group:123456789 或 telegram:private:123456789。\n target_chat_addresses: []\n webhook:\n enabled: true\n path: \"github\" # 最终路径: /webhooks/github\n secret: \"${GITHUB_WEBHOOK_SECRET:}\"\n polling:\n enabled: true # webhook 不可用时的 fallback;首次轮询只建立基线\n interval_seconds: 60\n api_base_url: \"https://api.github.com\"\n token: \"${GITHUB_TOKEN:}\" # 私有仓库或更高 rate limit 时填写\n registration:\n enabled: false # 开启后可在聊天中使用 /github_watch 动态订阅\n\nconversation_joiner:\n # 主动入话题默认关闭。开启前需要对应群频道启用 group_context_capture,\n # 让未触发消息先进入 MessageObserved。\n enabled: false\n model: cheap # model spec;没有 cheap tag 时可改成 provider/model,或留空使用默认模型\n threshold: 0.75\n max_context_messages: 12\n max_context_chars: 3000\n cooldown_seconds: 300\n max_triggers_per_hour: 3\n debounce_seconds: 20\n decision_timeout_seconds: 8\n persona_context:\n enabled: true # 启用后秘书模型会读取 workspace 中的人设文件辅助判断是否自然入话题\n files:\n - SOUL.md\n max_chars: 4000 # 注入秘书模型的人设上下文总字符上限\n cache_ttl_seconds: 60 # persona 文件缓存时间,避免每条候选消息都读文件\n prefilter:\n ignore_commands: true\n ignore_mentions: true\n min_text_chars: 4\n keyword_hints: []\n sample_rate: 0.15 # 普通候选消息进入秘书模型的采样概率\n keyword_sample_rate: 1.0 # 命中 keyword_hints 后进入秘书模型的采样概率\n groups: {}\n # groups:\n # milky:group:123456789:\n # enabled: true\n # threshold: 0.78\n # cooldown_seconds: 300\n engagement:\n enabled: false # 打开后进入 observing/joining/engaged/cooling 状态机\n join_state_ttl_seconds: 600\n idle_exit_seconds: 180\n max_engaged_seconds: 1800\n response_cooldown_seconds: 45\n engagement_score_alpha: 0.2\n engagement_score_exit_threshold: 0.2\n score_decay_half_life_seconds: 600\n score_decay_floor: 0.0\n batching:\n window_seconds: 8 # 后续群消息进入 batch 的短窗口\n max_messages: 6 # 窗口内消息过多时提前 flush\n max_chars: 2000\n flush_on_mention: true\n continue_gate:\n enabled: true # 每个 flushed batch 交给秘书模型判断是否继续接话\n model: cheap\n threshold: 0.55\n min_messages: 1\n evaluate_interval_seconds: 8\n exit_gate:\n enabled: true\n low_value_threshold: 0.35\n low_value_strikes: 3\n min_messages_per_window: 1\n activity_window_seconds: 120\n\ntelegram:\n bot_token: \"${TELEGRAM_BOT_TOKEN:}\"\n # group_trigger_mode: \"always\" # none / mention / command / always\n # group_context_capture: false # mention/command 模式下,是否记录未触发群消息作为上下文\n # reply_to_inbound: null # true/false 覆盖 router.reply_to_inbound;null/省略表示跟随全局\n # proxy: \"${TELEGRAM_PROXY:}\" # SOCKS5/HTTP 代理,如 socks5://127.0.0.1:1080\n # polling_timeout: 30\n # allowed_chats: []\n\n# Milky QQ Channel(可选)\n# 启用前请先启动 Lagrange.Milky,并确保 nahida_bot/channels/milky/plugin.yaml\n# 可被内置 channel discovery 扫描到。保持注释状态不会启用 Milky。\n#\n# milky:\n# base_url: \"http://127.0.0.1:3000\"\n# access_token: \"${MILKY_ACCESS_TOKEN:}\"\n# api_prefix: \"/api\"\n# event_path: \"/event\"\n# # ws_url: \"ws://127.0.0.1:3000/event\" # 可选:覆盖由 base_url 推导出的 WS 地址\n# command_prefix: \"/\"\n# group_trigger_mode: \"mention\" # none / mention / command / always\n# group_context_capture: false # true 时,未触发群消息只记录为上下文,可供 conversation_joiner 判断\n# reply_to_inbound: null # true/false 覆盖 router.reply_to_inbound;null/省略表示跟随全局\n# allowed_friends: [] # QQ 号白名单;空列表表示不限制\n# allowed_groups: [] # 群号白名单;空列表表示不限制\n# connect_timeout: 10.0\n# heartbeat_timeout: 30.0\n# reconnect_initial_delay: 1.0\n# reconnect_max_delay: 30.0\n# send_retry_attempts: 3\n# send_retry_backoff: 1.0\n# max_text_length: 4000\n# media_download_dir: \"./data/temp/media\"\n# enable_media_download_tool: true\n# resource_url_ttl_hint: 300\n# cache_media_on_receive: true\n# max_forward_depth: 3\n# max_forward_messages: 80\n# forward_render_max_chars: 12000\n# scene_cache_size: 4096\n\n# ── Agent Loop ──────────────────────────────────────────\n# 控制 Agent 循环的行为:迭代轮数、超时、重试策略等。\n# 以下均为默认值,不写则使用默认值。\n#\n# agent:\n# max_steps: 8 # 最大工具调用迭代轮数\n# provider_timeout_seconds: 120.0 # 单次 LLM 调用超时(秒)\n# retry_attempts: 2 # LLM 调用重试次数\n# retry_backoff_seconds: 0.2 # 重试退避间隔(秒)\n# tool_timeout_seconds: 135.0 # 工具执行超时(秒)\n# tool_retry_attempts: 1 # 工具执行重试次数\n# tool_retry_backoff_seconds: 0.1 # 工具重试退避间隔(秒)\n# max_tool_log_chars: 400 # 工具日志截断长度\n# # tool_use_system_prompt: \"...\" # 注入的工具使用提示\n# # provider_error_template: \"...\" # Provider 错误消息模板\n\n# ── Context Budget ──────────────────────────────────────\n# 控制未知模型 fallback 上下文窗口和 reasoning chain 预算。\n# 模型声明 providers.*.models[].capabilities.context_window 时优先使用模型窗口。\n# 以下均为默认值,不写则使用默认值。\n#\n# context:\n# max_tokens: 272000 # 未声明模型窗口时的 fallback context window\n# reserved_tokens: 10000 # 未声明模型窗口时为输出保留的 token\n# # max_chars: null # 字符数上限(兼容旧逻辑,优先使用 max_tokens)\n# # reserved_chars: 0 # 字符保留数\n# summary_max_chars: 2000 # 历史摘要最大字符数\n# reasoning_policy: \"budget\" # strip / append / budget\n# max_reasoning_tokens: 2000 # reasoning chain token 预算\n\n# ── Scheduler ──────────────────────────────────────────\n# 控制定时任务调度行为。\n# 以下均为默认值,不写则使用默认值。\n#\n# scheduler:\n# poll_interval_seconds: 1.0 # 调度轮询间隔(秒)\n# max_concurrent_fires: 5 # 最大并发执行数\n# job_timeout_seconds: 120.0 # 单任务超时(秒)\n# min_interval_seconds: 60 # cron 最小间隔\n# max_prompt_chars: 12000 # 定时任务 prompt 最大字符数\n# max_jobs_per_chat: 20 # 每个会话最大任务数\n# failure_retry_seconds: 300 # 失败重试等待(秒)\n# max_consecutive_failures: 3 # 连续失败上限\n# memory_dreaming_enabled: true # 是否启用内部记忆 dreaming\n# memory_dreaming_interval_seconds: 3600 # dreaming 周期(秒)\n# memory_dreaming_initial_delay_seconds: 300 # 启动后首次 dreaming 延迟\n# memory_dreaming_session_limit: 20 # 单次最多扫描会话数\n# memory_dreaming_recent_turn_limit: 40 # 单会话最多读取 turns 数\n# memory_dreaming_provider_id: \"\" # Legacy;建议改用 memory_dreaming_model\n# memory_dreaming_model: \"\" # model spec;空则默认找 memory tag,失败后走会话模型\n\n# ── Router ─────────────────────────────────────────────\n# 控制消息路由行为。system_prompt 使用顶层 system_prompt 字段。\n# 以下均为默认值,不写则使用默认值。\n#\n# router:\n# # system_prompt: \"...\" # 与顶层 system_prompt 重复,优先使用顶层字段\n# max_history_turns: 200 # 最大历史轮数\n# agent_enabled: true # 是否启用 Agent\n# command_timeout_seconds: 30.0 # 命令执行超时(秒)\n# command_timeout_message: \"Command timed out. Please try again later.\"\n# reply_to_inbound: true # 默认是否引用回复触发消息;平台插件可覆盖\n# group_context:\n# enabled: true # 是否在触发时注入 observed-only 群上下文\n# max_messages: 20 # 最多注入最近多少条未触发群消息\n# ttl_seconds: 900 # 只注入最近 N 秒内的群上下文;0 表示不按时间过滤\n# max_chars: 4000 # 群上下文注入块最大字符数\n\n# ── Model Tags / Specs ─────────────────────────────────\n# providers 的 models 中用 tags 字段标记模型角色:\n# primary / cheap / memory / embedding / reranker / vision\n# 需要内部模型的配置项都接受一个 model spec 字符串;这个字符串可以是 tag,\n# 也可以是 provider/model 或裸模型名。\n\n# ── Memory ─────────────────────────────────────────────\n# 长期记忆检索和 embedding 配置。默认只启用 SQLite FTS;vector/hybrid\n# 需要显式开启,并在 providers.models 中配置带 embedding tag 的模型。\n#\n# memory:\n# enabled: true\n# retrieval:\n# fts_enabled: true\n# vector_enabled: false # 开启后对长期记忆使用 hybrid 检索\n# hybrid_enabled: true\n# vector_backend: json # json / sqlite-vec / none\n# max_injected_items: 5\n# max_injected_chars: 4000\n# embedding:\n# enabled: false\n# model: \"\" # model spec;空则默认找 embedding tag\n# dimensions: 0 # 0 = auto-detect via probe embed call\n# batch_size: 16\n# embed_after_consolidation: true\n# consolidation:\n# rule_based_enabled: true # 是否启用每轮对话后的规则抽取;false 时只保留 dreaming/显式写入\n"}, "9e64b7dfaaa25bf0280b8884848840124587f64f": {"t": 1785761653.5287285, "n": 12802, "h": "4b4ea43fd04e8c76", "c": "# Nahida Bot 配置文件\n# 参见 nahida_bot.core.config.Settings 了解所有可用字段\n\n# ── 应用 ──────────────────────────────────────────────\napp_name: \"Nahida Bot\"\ndebug: false\nlog_level: \"INFO\" # DEBUG / INFO / WARNING / ERROR\n# log_json: true # 设为 true 输出 JSON 格式日志(生产环境推荐)\n# log_file: \"./data/logs/nahida.log\" # 可选:把应用日志写入文件,不需要 tee\n# log_file_level: \"DEBUG\" # 可选:文件日志级别;默认跟随 log_level\n# log_file_json: true # 文件日志默认使用 JSON Lines\n\n# ── 服务器 ────────────────────────────────────────────\nhost: \"127.0.0.1\"\nport: 6185\n\n# ── 数据库 ────────────────────────────────────────────\ndb_path: \"./data/nahida.db\"\n\n# ── Workspace ─────────────────────────────────────────\nworkspace_base_dir: \"./data/workspace\"\n\n# ── 插件 ──────────────────────────────────────────────\nplugin_paths:\n - \"./plugins\"\n\n# ── Agent / Router ────────────────────────────────────\nsystem_prompt: \"You are a helpful assistant.\"\n\n# ── LLM Providers(dict 格式,key 即 provider id)───\n# 默认配置已经是多 provider。每个 provider 有独立的 api_key、base_url 和 models。\n# models 的第一个元素是该 provider 的默认模型;每个模型可以是字符串,\n# 也可以是 {name, tags, capabilities} 对象。通过 /model 命令可在聊天中切换模型。\n#\n# 没有配置 api_key 的 provider 会在启动时被跳过;因此可以只填写实际使用的后端。\nproviders:\n deepseek-main:\n type: deepseek\n api_key: \"${DEEPSEEK_LLM_API_KEY:}\"\n base_url: \"${DEEPSEEK_LLM_BASE_URL:https://api.deepseek.com}\"\n # 内部使用 SSE 接收并聚合,可避免长推理期间普通读超时误判。\n stream_responses: true\n # thinking_enabled: false # 关闭 DeepSeek thinking mode\n models:\n - name: \"deepseek-v4-pro\"\n tags: [primary]\n - name: \"deepseek-v4-flash\"\n tags: [cheap, memory]\n\n siliconflow:\n type: \"openai-compatible\"\n api_key: \"${SILICONFLOW_LLM_API_KEY:}\"\n base_url: \"${SILICONFLOW_LLM_BASE_URL:https://api.siliconflow.cn/v1}\"\n merge_system_messages: true\n stream_responses: true\n models:\n - name: \"Qwen/Qwen3-Embedding-8B\"\n tags: [embedding]\n - name: \"Pro/zai-org/GLM-5\"\n tags: [vision]\n - name: \"Qwen/Qwen3.6-35B-A3B\"\n tags: [vision]\n capabilities:\n image_input: true\n max_image_count: 4\n max_image_bytes: 10485760\n\n minimax:\n type: minimax\n api_key: \"${MINIMAX_LLM_API_KEY:}\"\n base_url: \"https://api.minimaxi.com/anthropic\"\n max_tokens: 16000\n stream_responses: true\n models:\n - name: \"MiniMax-M2.5\"\n tags: [cheap]\n - name: \"MiniMax-M2.7\"\n\n # OpenAI Responses API(可选)\n # 使用 /responses 端点,支持内置工具(web_search、image_generation 等)\n # 和有状态对话链(previous_response_id)。Reasoning 摘要可通过\n # reasoning_effort 参数控制深度。\n # stream_responses=true 时同样在 provider 内部流式接收并聚合返回。\n openai:\n type: \"openai-responses\"\n api_key: \"${OPENAI_API_KEY:}\"\n base_url: \"${OPENAI_API_BASE_URL:https://api.openai.com/v1}\"\n store_responses: true\n use_previous_response_id: false\n stream_responses: true\n reasoning_effort: \"medium\"\n # built_in_tools: [\"web_search\", \"image_generation\"]\n models:\n - name: \"gpt-5.4\"\n capabilities:\n image_input: true\n image_generation: true\n web_search: true\n tool_calling: true\n reasoning: true\n\ndefault_provider: deepseek-main # 可选,默认使用 providers 中的第一个 key\n\n# ── 多模态 / 图片理解 ─────────────────────────────────\n# image_fallback_mode:\n# auto: 主模型不支持 image_input 时,自动调用 fallback vision 模型生成描述\n# tool: 主模型不支持 image_input 时,注入 image_understand 工具,由主模型按需调用\n# off: 不处理图片,只保留普通文本\n# media_context_policy:\n# cache_aware: 最近图片尽量保留原生内容块,旧图片降级为描述\n# native_recent: 仅最近图片保留原生内容块\n# description_only: 历史图片只使用描述\nmultimodal:\n image_fallback_mode: \"auto\"\n media_context_policy: \"cache_aware\"\n image_fallback_provider: \"\" # Legacy;建议把 provider 写进 image_fallback_model\n image_fallback_model: \"siliconflow/Qwen/Qwen3.6-35B-A3B\"\n max_images_per_turn: 4\n max_image_bytes: 10485760\n media_cache_ttl_seconds: 3600\n\n# ── 插件配置 ──────────────────────────────────────────\n# Settings 的 extra=\"allow\" 机制:顶层 key 如果不是已知字段,\n# 且值为 dict,则按 plugin id 匹配并注入到对应插件的 manifest.config 中。\n\nbuiltin-commands:\n # send_local_attachment 默认只允许发送 active workspace 内的相对路径。\n # 如确实需要发送工作区外的本地文件,可打开下面开关。\n allow_external_attachment_paths: false\n # 可选白名单目录;为空表示打开上方开关后允许任意绝对路径。\n # external_attachment_roots:\n # - \"D:/Pictures\"\n external_attachment_roots: []\n\n# OpenAI-compatible 图片生成(可选)\n# 启用后注册 /draw、/生图 命令和 image_generate tool。\n# image_generation:\n# enabled: true\n# provider: default\n# backends:\n# default:\n# type: openai-images\n# api_key: \"${IMAGE_API_KEY}\"\n# base_url: \"${IMAGE_BASE_URL}\"\n# model: \"gpt-image-1\"\n# output_dir: \"generated/images\"\n# auto_send: true\n\ngithub-notifier:\n # 目标仓库;保持 OWNER/REPO 时插件会视为未配置,不会启动 webhook/polling。\n repo: \"OWNER/REPO\"\n # typed chat address 列表,例如 milky:group:123456789 或 telegram:private:123456789。\n target_chat_addresses: []\n webhook:\n enabled: true\n path: \"github\" # 最终路径: /webhooks/github\n secret: \"${GITHUB_WEBHOOK_SECRET:}\"\n polling:\n enabled: true # webhook 不可用时的 fallback;首次轮询只建立基线\n interval_seconds: 60\n api_base_url: \"https://api.github.com\"\n token: \"${GITHUB_TOKEN:}\" # 私有仓库或更高 rate limit 时填写\n registration:\n enabled: false # 开启后可在聊天中使用 /github_watch 动态订阅\n\nconversation_joiner:\n # 主动入话题默认关闭。开启前需要对应群频道启用 group_context_capture,\n # 让未触发消息先进入 MessageObserved。\n enabled: false\n model: cheap # model spec;没有 cheap tag 时可改成 provider/model,或留空使用默认模型\n threshold: 0.75\n max_context_messages: 12\n max_context_chars: 3000\n cooldown_seconds: 300\n max_triggers_per_hour: 3\n debounce_seconds: 20\n decision_timeout_seconds: 8\n persona_context:\n enabled: true # 启用后秘书模型会读取 workspace 中的人设文件辅助判断是否自然入话题\n files:\n - SOUL.md\n max_chars: 4000 # 注入秘书模型的人设上下文总字符上限\n cache_ttl_seconds: 60 # persona 文件缓存时间,避免每条候选消息都读文件\n prefilter:\n ignore_commands: true\n ignore_mentions: true\n min_text_chars: 4\n keyword_hints: []\n sample_rate: 0.15 # 普通候选消息进入秘书模型的采样概率\n keyword_sample_rate: 1.0 # 命中 keyword_hints 后进入秘书模型的采样概率\n groups: {}\n # groups:\n # milky:group:123456789:\n # enabled: true\n # threshold: 0.78\n # cooldown_seconds: 300\n engagement:\n enabled: false # 打开后进入 observing/joining/engaged/cooling 状态机\n join_state_ttl_seconds: 600\n idle_exit_seconds: 180\n max_engaged_seconds: 1800\n response_cooldown_seconds: 45\n engagement_score_alpha: 0.2\n engagement_score_exit_threshold: 0.2\n score_decay_half_life_seconds: 600\n score_decay_floor: 0.0\n batching:\n window_seconds: 8 # 后续群消息进入 batch 的短窗口\n max_messages: 6 # 窗口内消息过多时提前 flush\n max_chars: 2000\n flush_on_mention: true\n continue_gate:\n enabled: true # 每个 flushed batch 交给秘书模型判断是否继续接话\n model: cheap\n threshold: 0.55\n min_messages: 1\n evaluate_interval_seconds: 8\n exit_gate:\n enabled: true\n low_value_threshold: 0.35\n low_value_strikes: 3\n min_messages_per_window: 1\n activity_window_seconds: 120\n\ntelegram:\n bot_token: \"${TELEGRAM_BOT_TOKEN:}\"\n # group_trigger_mode: \"always\" # none / mention / command / always\n # group_context_capture: false # mention/command 模式下,是否记录未触发群消息作为上下文\n # reply_to_inbound: null # true/false 覆盖 router.reply_to_inbound;null/省略表示跟随全局\n # proxy: \"${TELEGRAM_PROXY:}\" # SOCKS5/HTTP 代理,如 socks5://127.0.0.1:1080\n # polling_timeout: 30\n # allowed_chats: []\n\n# Milky QQ Channel(可选)\n# 启用前请先启动 Lagrange.Milky,并确保 nahida_bot/channels/milky/plugin.yaml\n# 可被内置 channel discovery 扫描到。保持注释状态不会启用 Milky。\n#\n# milky:\n# base_url: \"http://127.0.0.1:3000\"\n# access_token: \"${MILKY_ACCESS_TOKEN:}\"\n# api_prefix: \"/api\"\n# event_path: \"/event\"\n# # ws_url: \"ws://127.0.0.1:3000/event\" # 可选:覆盖由 base_url 推导出的 WS 地址\n# command_prefix: \"/\"\n# group_trigger_mode: \"mention\" # none / mention / command / always\n# group_context_capture: false # true 时,未触发群消息只记录为上下文,可供 conversation_joiner 判断\n# reply_to_inbound: null # true/false 覆盖 router.reply_to_inbound;null/省略表示跟随全局\n# allowed_friends: [] # QQ 号白名单;空列表表示不限制\n# allowed_groups: [] # 群号白名单;空列表表示不限制\n# connect_timeout: 10.0\n# heartbeat_timeout: 30.0\n# reconnect_initial_delay: 1.0\n# reconnect_max_delay: 30.0\n# send_retry_attempts: 3\n# send_retry_backoff: 1.0\n# max_text_length: 4000\n# media_download_dir: \"./data/temp/media\"\n# enable_media_download_tool: true\n# resource_url_ttl_hint: 300\n# cache_media_on_receive: true\n# max_forward_depth: 3\n# max_forward_messages: 80\n# forward_render_max_chars: 12000\n# scene_cache_size: 4096\n\n# ── Agent Loop ──────────────────────────────────────────\n# 控制 Agent 循环的行为:迭代轮数、超时、重试策略等。\n# 以下均为默认值,不写则使用默认值。\n#\n# agent:\n# max_steps: 8 # 最大工具调用迭代轮数\n# provider_timeout_seconds: 120.0 # 单次 LLM 调用超时(秒)\n# retry_attempts: 2 # LLM 调用重试次数\n# retry_backoff_seconds: 0.2 # 重试退避间隔(秒)\n# tool_timeout_seconds: 135.0 # 工具执行超时(秒)\n# tool_retry_attempts: 1 # 工具执行重试次数\n# tool_retry_backoff_seconds: 0.1 # 工具重试退避间隔(秒)\n# max_tool_log_chars: 400 # 工具日志截断长度\n# # tool_use_system_prompt: \"...\" # 注入的工具使用提示\n# # provider_error_template: \"...\" # Provider 错误消息模板\n\n# ── Context Budget ──────────────────────────────────────\n# 控制未知模型 fallback 上下文窗口和 reasoning chain 预算。\n# 模型声明 providers.*.models[].capabilities.context_window 时优先使用模型窗口。\n# 以下均为默认值,不写则使用默认值。\n#\n# context:\n# max_tokens: 272000 # 未声明模型窗口时的 fallback context window\n# reserved_tokens: 10000 # 未声明模型窗口时为输出保留的 token\n# # max_chars: null # 字符数上限(兼容旧逻辑,优先使用 max_tokens)\n# # reserved_chars: 0 # 字符保留数\n# summary_max_chars: 2000 # 历史摘要最大字符数\n# reasoning_policy: \"budget\" # strip / append / budget\n# max_reasoning_tokens: 2000 # reasoning chain token 预算\n\n# ── Scheduler ──────────────────────────────────────────\n# 控制定时任务调度行为。\n# 以下均为默认值,不写则使用默认值。\n#\n# scheduler:\n# poll_interval_seconds: 1.0 # 调度轮询间隔(秒)\n# max_concurrent_fires: 5 # 最大并发执行数\n# job_timeout_seconds: 120.0 # 单任务超时(秒)\n# min_interval_seconds: 60 # cron 最小间隔\n# max_prompt_chars: 12000 # 定时任务 prompt 最大字符数\n# max_jobs_per_chat: 20 # 每个会话最大任务数\n# failure_retry_seconds: 300 # 失败重试等待(秒)\n# max_consecutive_failures: 3 # 连续失败上限\n# memory_dreaming_enabled: true # 是否启用内部记忆 dreaming\n# memory_dreaming_interval_seconds: 3600 # dreaming 周期(秒)\n# memory_dreaming_initial_delay_seconds: 300 # 启动后首次 dreaming 延迟\n# memory_dreaming_session_limit: 20 # 单次最多扫描会话数\n# memory_dreaming_recent_turn_limit: 40 # 单会话最多读取 turns 数\n# memory_dreaming_provider_id: \"\" # Legacy;建议改用 memory_dreaming_model\n# memory_dreaming_model: \"\" # model spec;空则默认找 memory tag,失败后走会话模型\n\n# ── Router ─────────────────────────────────────────────\n# 控制消息路由行为。system_prompt 使用顶层 system_prompt 字段。\n# 以下均为默认值,不写则使用默认值。\n#\n# router:\n# # system_prompt: \"...\" # 与顶层 system_prompt 重复,优先使用顶层字段\n# max_history_turns: 200 # 最大历史轮数\n# agent_enabled: true # 是否启用 Agent\n# command_timeout_seconds: 30.0 # 命令执行超时(秒)\n# command_timeout_message: \"Command timed out. Please try again later.\"\n# reply_to_inbound: true # 默认是否引用回复触发消息;平台插件可覆盖\n# group_context:\n# enabled: true # 是否在触发时注入 observed-only 群上下文\n# max_messages: 20 # 最多注入最近多少条未触发群消息\n# ttl_seconds: 900 # 只注入最近 N 秒内的群上下文;0 表示不按时间过滤\n# max_chars: 4000 # 群上下文注入块最大字符数\n\n# ── Model Tags / Specs ─────────────────────────────────\n# providers 的 models 中用 tags 字段标记模型角色:\n# primary / cheap / memory / embedding / reranker / vision\n# 需要内部模型的配置项都接受一个 model spec 字符串;这个字符串可以是 tag,\n# 也可以是 provider/model 或裸模型名。\n\n# ── Memory ─────────────────────────────────────────────\n# 长期记忆检索和 embedding 配置。默认只启用 SQLite FTS;vector/hybrid\n# 需要显式开启,并在 providers.models 中配置带 embedding tag 的模型。\n#\n# memory:\n# enabled: true\n# retrieval:\n# fts_enabled: true\n# vector_enabled: false # 开启后对长期记忆使用 hybrid 检索\n# hybrid_enabled: true\n# vector_backend: json # json / sqlite-vec / none\n# max_injected_items: 5\n# max_injected_chars: 4000\n# embedding:\n# enabled: false\n# model: \"\" # model spec;空则默认找 embedding tag\n# dimensions: 0 # 0 = auto-detect via probe embed call\n# batch_size: 16\n# embed_after_consolidation: true\n# consolidation:\n# rule_based_enabled: true # 是否启用每轮对话后的规则抽取;false 时只保留 dreaming/显式写入\n"}, "6343613ca08a1bf4c6da0b4e3f7b34fabdc49498": {"t": 1785761657.739466, "n": 10640, "h": "ca3fbbd7f4301ce3", "c": "# Nahida Bot 配置文件\n# 参见 nahida_bot.core.config.Settings 了解所有可用字段\n\n# ── 应用 ──────────────────────────────────────────────\napp_name: \"Nahida Bot\"\ndebug: false\nlog_level: \"INFO\" # DEBUG / INFO / WARNING / ERROR\n# log_json: true # 设为 true 输出 JSON 格式日志(生产环境推荐)\n# log_file: \"./data/logs/nahida.log\" # 可选:把应用日志写入文件,不需要 tee\n# log_file_level: \"DEBUG\" # 可选:文件日志级别;默认跟随 log_level\n# log_file_json: true # 文件日志默认使用 JSON Lines\n\n# ── 服务器 ────────────────────────────────────────────\nhost: \"127.0.0.1\"\nport: 6185\n\n# ── 数据库 ────────────────────────────────────────────\ndb_path: \"./data/nahida.db\"\n\n# ── Workspace ─────────────────────────────────────────\nworkspace_base_dir: \"./data/workspace\"\n\n# ── 插件 ──────────────────────────────────────────────\nplugin_paths:\n - \"./plugins\"\n\n# ── Agent / Router ────────────────────────────────────\nsystem_prompt: \"You are a helpful assistant.\"\n\n# ── LLM Providers(dict 格式,key 即 provider id)───\n# 支持多 provider 配置,每个 provider 有独立的 api_key 和 models 列表。\n# models 的第一个元素是该 provider 的默认模型;每个模型可以是字符串,\n# 也可以是 {name, capabilities} 对象。通过 /model 命令可在聊天中切换模型。\n#\n# providers:\n# deepseek-main:\n# type: deepseek\n# api_key: \"${DEEPSEEK_API_KEY}\"\n# # 内部使用 SSE 接收并聚合,降低长推理被误判为读超时的概率。\n# # 不会改变 channel 的发送方式;仍由 AgentLoop 聚合后返回。\n# stream_responses: true\n# # thinking_enabled: false # 关闭 DeepSeek thinking mode\n# models: [\"deepseek-chat\", \"deepseek-reasoner\"]\n# glm:\n# type: glm\n# api_key: \"${GLM_API_KEY}\"\n# models: [\"glm-4-flash\", \"glm-4-plus\"]\n# vision:\n# type: openai-compatible\n# api_key: \"${VISION_API_KEY}\"\n# base_url: \"${VISION_BASE_URL}\"\n# models:\n# - name: \"vision-model\"\n# capabilities:\n# image_input: true\n# max_image_count: 4\n#\n# default_provider: deepseek-main # 可选,默认使用第一个 key\n\nproviders:\n default:\n type: \"openai-compatible\"\n api_key: \"${LLM_API_KEY}\"\n base_url: \"${LLM_BASE_URL}\"\n # 建议开启:provider 内部流式接收并聚合返回,适合长推理/重任务。\n # 支持 openai-compatible/deepseek/glm/groq/anthropic/minimax/openai-responses。\n stream_responses: true\n models:\n - \"${LLM_MODEL}\"\n\ndefault_provider: default\n\n# ── 多模态 / 图片理解 ─────────────────────────────────\n# 主模型有 models[].capabilities.image_input=true 时会直接传图;\n# 主模型没有 image_input 时,按 image_fallback_mode 决定是否调用 fallback vision。\nmultimodal:\n image_fallback_mode: \"auto\" # auto / tool / off\n media_context_policy: \"cache_aware\" # cache_aware / native_recent / description_only\n image_fallback_provider: \"\" # Legacy;建议留空\n image_fallback_model: \"\" # model spec;空则默认找 vision tag\n max_images_per_turn: 4\n max_image_bytes: 10485760\n media_cache_ttl_seconds: 3600\n\n# ── 插件配置 ──────────────────────────────────────────\n# Settings 的 extra=\"allow\" 机制:顶层 key 如果不是已知字段,\n# 且值为 dict,则按 plugin id 匹配并注入到对应插件的 manifest.config 中。\n\nbuiltin-commands:\n # send_local_attachment 默认只允许发送 active workspace 内的相对路径。\n # 如确实需要发送工作区外的本地文件,可打开下面开关。\n allow_external_attachment_paths: false\n # 可选白名单目录;为空表示打开上方开关后允许任意绝对路径。\n # external_attachment_roots:\n # - \"D:/Pictures\"\n external_attachment_roots: []\n\ngithub-notifier:\n # 目标仓库;保持 OWNER/REPO 时插件会视为未配置,不会启动 webhook/polling。\n repo: \"OWNER/REPO\"\n # typed chat address 列表,例如 milky:group:123456789 或 telegram:private:123456789。\n target_chat_addresses: []\n webhook:\n enabled: true\n path: \"github\" # 最终路径: /webhooks/github\n secret: \"${GITHUB_WEBHOOK_SECRET}\"\n polling:\n enabled: true # webhook 不可用时的 fallback;首次轮询只建立基线\n interval_seconds: 60\n api_base_url: \"https://api.github.com\"\n token: \"${GITHUB_TOKEN}\" # 私有仓库或更高 rate limit 时填写\n registration:\n enabled: false # 开启后可在聊天中使用 /github_watch 动态订阅\n\nconversation_joiner:\n # 主动入话题默认关闭。开启前需要对应群频道启用 group_context_capture,\n # 让未触发消息先进入 MessageObserved。\n enabled: false\n model: cheap # model spec;没有 cheap tag 时可改成 provider/model,或留空使用默认模型\n threshold: 0.75\n max_context_messages: 12\n max_context_chars: 3000\n cooldown_seconds: 300\n max_triggers_per_hour: 3\n debounce_seconds: 20\n decision_timeout_seconds: 8\n persona_context:\n enabled: true # 启用后秘书模型会读取 workspace 中的人设文件辅助判断是否自然入话题\n files:\n - SOUL.md\n max_chars: 4000 # 注入秘书模型的人设上下文总字符上限\n cache_ttl_seconds: 60 # persona 文件缓存时间,避免每条候选消息都读文件\n prefilter:\n ignore_commands: true\n ignore_mentions: true\n min_text_chars: 4\n keyword_hints: []\n sample_rate: 0.15 # 普通候选消息进入秘书模型的采样概率\n keyword_sample_rate: 1.0 # 命中 keyword_hints 后进入秘书模型的采样概率\n groups: {}\n # groups:\n # milky:group:123456789:\n # enabled: true\n # threshold: 0.78\n # cooldown_seconds: 300\n\ntelegram:\n bot_token: \"${TELEGRAM_BOT_TOKEN}\"\n # group_trigger_mode: \"always\" # none / mention / command / always\n # group_context_capture: false # mention/command 模式下,是否记录未触发群消息作为上下文\n # reply_to_inbound: null # true/false 覆盖 router.reply_to_inbound;null/省略表示跟随全局\n # proxy: \"${TELEGRAM_PROXY:}\" # SOCKS5/HTTP 代理,如 socks5://127.0.0.1:1080\n # polling_timeout: 30\n # allowed_chats: []\n\n# Milky QQ Channel(可选)\n# 启用前请先启动 Lagrange.Milky,并确保 nahida_bot/channels/milky/plugin.yaml\n# 可被内置 channel discovery 扫描到。保持注释状态不会启用 Milky。\n#\n# milky:\n# base_url: \"http://127.0.0.1:3000\"\n# access_token: \"${MILKY_ACCESS_TOKEN}\"\n# api_prefix: \"/api\"\n# event_path: \"/event\"\n# # ws_url: \"ws://127.0.0.1:3000/event\" # 可选:覆盖由 base_url 推导出的 WS 地址\n# command_prefix: \"/\"\n# group_trigger_mode: \"mention\" # none / mention / command / always\n# group_context_capture: false # true 时,未触发群消息只记录为上下文,可供 conversation_joiner 判断\n# reply_to_inbound: null # true/false 覆盖 router.reply_to_inbound;null/省略表示跟随全局\n# allowed_friends: [] # QQ 号白名单;空列表表示不限制\n# allowed_groups: [] # 群号白名单;空列表表示不限制\n# connect_timeout: 10.0\n# heartbeat_timeout: 30.0\n# reconnect_initial_delay: 1.0\n# reconnect_max_delay: 30.0\n# send_retry_attempts: 3\n# send_retry_backoff: 1.0\n# max_text_length: 4000\n# media_download_dir: \"./data/temp/media\"\n# enable_media_download_tool: true\n# resource_url_ttl_hint: 300\n# cache_media_on_receive: true\n# max_forward_depth: 3\n# max_forward_messages: 80\n# forward_render_max_chars: 12000\n# scene_cache_size: 4096\n\n# ── Agent Loop ──────────────────────────────────────────\n# 控制 Agent 循环的行为:迭代轮数、超时、重试策略等。\n# 以下均为默认值,不写则使用默认值。\n#\n# agent:\n# max_steps: 8 # 最大工具调用迭代轮数\n# provider_timeout_seconds: 120.0 # 单次 LLM 调用超时(秒)\n# retry_attempts: 2 # LLM 调用重试次数\n# retry_backoff_seconds: 0.2 # 重试退避间隔(秒)\n# tool_timeout_seconds: 135.0 # 工具执行超时(秒)\n# tool_retry_attempts: 1 # 工具执行重试次数\n# tool_retry_backoff_seconds: 0.1 # 工具重试退避间隔(秒)\n# max_tool_log_chars: 400 # 工具日志截断长度\n# # tool_use_system_prompt: \"...\" # 注入的工具使用提示\n# # provider_error_template: \"...\" # Provider 错误消息模板\n\n# ── Context Budget ──────────────────────────────────────\n# 控制未知模型 fallback 上下文窗口和 reasoning chain 预算。\n# 模型声明 providers.*.models[].capabilities.context_window 时优先使用模型窗口。\n# 以下均为默认值,不写则使用默认值。\n#\n# context:\n# max_tokens: 272000 # 未声明模型窗口时的 fallback context window\n# reserved_tokens: 10000 # 未声明模型窗口时为输出保留的 token\n# # max_chars: null # 字符数上限(兼容旧逻辑,优先使用 max_tokens)\n# # reserved_chars: 0 # 字符保留数\n# summary_max_chars: 2000 # 历史摘要最大字符数\n# reasoning_policy: \"budget\" # strip / append / budget\n# max_reasoning_tokens: 2000 # reasoning chain token 预算\n\n# ── Scheduler ──────────────────────────────────────────\n# 控制定时任务调度行为。\n# 以下均为默认值,不写则使用默认值。\n#\n# scheduler:\n# poll_interval_seconds: 1.0 # 调度轮询间隔(秒)\n# max_concurrent_fires: 5 # 最大并发执行数\n# job_timeout_seconds: 120.0 # 单任务超时(秒)\n# min_interval_seconds: 60 # cron 最小间隔(秒)\n# max_prompt_chars: 12000 # 定时任务 prompt 最大字符数\n# max_jobs_per_chat: 20 # 每个会话最大任务数\n# failure_retry_seconds: 300 # 失败重试等待(秒)\n# max_consecutive_failures: 3 # 连续失败上限\n# memory_dreaming_enabled: true # 是否启用内部记忆 dreaming\n# memory_dreaming_interval_seconds: 3600 # dreaming 周期(秒)\n# memory_dreaming_initial_delay_seconds: 300 # 启动后首次 dreaming 延迟(秒)\n# memory_dreaming_session_limit: 20 # 单次最多扫描会话数\n# memory_dreaming_recent_turn_limit: 40 # 单会话最多读取 turns 数\n# memory_dreaming_provider_id: \"\" # Legacy;建议改用 memory_dreaming_model\n# memory_dreaming_model: \"\" # model spec;空则默认找 memory tag,失败后走会话模型\n\n# ── Model Tags / Specs ─────────────────────────────────\n# providers 的 models 中可以用 tags 字段标记模型角色。\n# 需要内部模型的配置项都接受一个 model spec 字符串;这个字符串可以是 tag,\n# 也可以是 provider/model 或裸模型名。\n# models:\n# - name: deepseek-chat\n# tags: [primary] # 主对话模型(隐式:每个 provider 的第一个模型)\n# - name: deepseek-chat-lite\n# tags: [cheap, memory] # 低成本后台任务 / 记忆 dreaming\n#\n# 可用 tags: primary / cheap / memory / embedding / reranker / vision\n\n# ── Memory ─────────────────────────────────────────────\n# 长期记忆检索和 embedding 配置。默认只启用 SQLite FTS;vector/hybrid\n# 需要显式开启,并在 providers.models 中配置带 embedding tag 的模型。\n#\n# memory:\n# enabled: true\n# retrieval:\n# fts_enabled: true\n# vector_enabled: false # 开启后对长期记忆使用 hybrid 检索\n# hybrid_enabled: true\n# vector_backend: json # json / sqlite-vec / none\n# max_injected_items: 5\n# max_injected_chars: 4000\n# embedding:\n# enabled: false\n# model: \"\" # model spec;空则默认找 embedding tag\n# dimensions: 0 # 0 = auto-detect via probe embed call\n# batch_size: 16\n# embed_after_consolidation: true\n# consolidation:\n# rule_based_enabled: true # 是否启用每轮对话后的规则抽取;false 时只保留 dreaming/显式写入\n\n# ── Router ─────────────────────────────────────────────\n# 控制消息路由行为。system_prompt 使用顶层 system_prompt 字段。\n# 以下均为默认值,不写则使用默认值。\n#\n# router:\n# # system_prompt: \"...\" # 与顶层 system_prompt 重复,优先使用顶层字段\n# max_history_turns: 200 # 最大历史轮数\n# agent_enabled: true # 是否启用 Agent\n# command_timeout_seconds: 30.0 # 命令执行超时(秒)\n# command_timeout_message: \"Command timed out. Please try again later.\"\n# reply_to_inbound: true # 默认是否引用回复触发消息;平台插件可覆盖\n# group_context:\n# enabled: true # 是否在触发时注入 observed-only 群上下文\n# max_messages: 20 # 最多注入最近多少条未触发群消息\n# ttl_seconds: 900 # 只注入最近 N 秒内的群上下文;0 表示不按时间过滤\n# max_chars: 4000 # 群上下文注入块最大字符数\n"}, "494296caa80d6be1f0aeb33a7c562ef971e644cc": {"t": 1785761684.303761, "n": 8989, "h": "68cff21c123f4b25", "c": "# Nahida Bot 配置文件\n# 参见 nahida_bot.core.config.Settings 了解所有可用字段\n\n# ── 应用 ──────────────────────────────────────────────\napp_name: \"Nahida Bot\"\ndebug: false\nlog_level: \"INFO\" # DEBUG / INFO / WARNING / ERROR\n# log_json: true # 设为 true 输出 JSON 格式日志(生产环境推荐)\n# log_file: \"./data/logs/nahida.log\" # 可选:把应用日志写入文件,不需要 tee\n# log_file_level: \"DEBUG\" # 可选:文件日志级别;默认跟随 log_level\n# log_file_json: true # 文件日志默认使用 JSON Lines\n\n# ── 服务器 ────────────────────────────────────────────\nhost: \"127.0.0.1\"\nport: 6185\n\n# ── 数据库 ────────────────────────────────────────────\ndb_path: \"./data/nahida.db\"\n\n# ── Workspace ─────────────────────────────────────────\nworkspace_base_dir: \"./data/workspace\"\n\n# ── 插件 ──────────────────────────────────────────────\nplugin_paths:\n - \"./plugins\"\n\n# ── Agent / Router ────────────────────────────────────\nsystem_prompt: \"You are a helpful assistant.\"\n\n# ── LLM Providers(dict 格式,key 即 provider id)───\n# 支持多 provider 配置,每个 provider 有独立的 api_key 和 models 列表。\n# models 的第一个元素是该 provider 的默认模型;每个模型可以是字符串,\n# 也可以是 {name, capabilities} 对象。通过 /model 命令可在聊天中切换模型。\n#\n# providers:\n# deepseek-main:\n# type: deepseek\n# api_key: \"${DEEPSEEK_API_KEY}\"\n# # 内部使用 SSE 接收并聚合,降低长推理被误判为读超时的概率。\n# # 不会改变 channel 的发送方式;仍由 AgentLoop 聚合后返回。\n# stream_responses: true\n# # thinking_enabled: false # 关闭 DeepSeek thinking mode\n# models: [\"deepseek-chat\", \"deepseek-reasoner\"]\n# glm:\n# type: glm\n# api_key: \"${GLM_API_KEY}\"\n# models: [\"glm-4-flash\", \"glm-4-plus\"]\n# vision:\n# type: openai-compatible\n# api_key: \"${VISION_API_KEY}\"\n# base_url: \"${VISION_BASE_URL}\"\n# models:\n# - name: \"vision-model\"\n# capabilities:\n# image_input: true\n# max_image_count: 4\n#\n# default_provider: deepseek-main # 可选,默认使用第一个 key\n\nproviders:\n default:\n type: \"openai-compatible\"\n api_key: \"${LLM_API_KEY}\"\n base_url: \"${LLM_BASE_URL}\"\n # 建议开启:provider 内部流式接收并聚合返回,适合长推理/重任务。\n # 支持 openai-compatible/deepseek/glm/groq/anthropic/minimax/openai-responses。\n stream_responses: true\n models:\n - \"${LLM_MODEL}\"\n\ndefault_provider: default\n\n# ── 多模态 / 图片理解 ─────────────────────────────────\n# 主模型有 models[].capabilities.image_input=true 时会直接传图;\n# 主模型没有 image_input 时,按 image_fallback_mode 决定是否调用 fallback vision。\nmultimodal:\n image_fallback_mode: \"auto\" # auto / tool / off\n media_context_policy: \"cache_aware\" # cache_aware / native_recent / description_only\n image_fallback_provider: \"\" # Legacy;建议留空\n image_fallback_model: \"\" # model spec;空则默认找 vision tag\n max_images_per_turn: 4\n max_image_bytes: 10485760\n media_cache_ttl_seconds: 3600\n\n# ── 插件配置 ──────────────────────────────────────────\n# Settings 的 extra=\"allow\" 机制:顶层 key 如果不是已知字段,\n# 且值为 dict,则按 plugin id 匹配并注入到对应插件的 manifest.config 中。\n\nbuiltin-commands:\n # send_local_attachment 默认只允许发送 active workspace 内的相对路径。\n # 如确实需要发送工作区外的本地文件,可打开下面开关。\n allow_external_attachment_paths: false\n # 可选白名单目录;为空表示打开上方开关后允许任意绝对路径。\n # external_attachment_roots:\n # - \"D:/Pictures\"\n external_attachment_roots: []\n\ntelegram:\n bot_token: \"${TELEGRAM_BOT_TOKEN}\"\n # group_trigger_mode: \"always\" # always / mention / command\n # group_context_capture: false # mention/command 模式下,是否记录未触发群消息作为上下文\n # reply_to_inbound: null # true/false 覆盖 router.reply_to_inbound;null/省略表示跟随全局\n # proxy: \"${TELEGRAM_PROXY:}\" # SOCKS5/HTTP 代理,如 socks5://127.0.0.1:1080\n # polling_timeout: 30\n # allowed_chats: []\n\n# Milky QQ Channel(可选)\n# 启用前请先启动 Lagrange.Milky,并确保 nahida_bot/channels/milky/plugin.yaml\n# 可被内置 channel discovery 扫描到。保持注释状态不会启用 Milky。\n#\n# milky:\n# base_url: \"http://127.0.0.1:3000\"\n# access_token: \"${MILKY_ACCESS_TOKEN}\"\n# api_prefix: \"/api\"\n# event_path: \"/event\"\n# # ws_url: \"ws://127.0.0.1:3000/event\" # 可选:覆盖由 base_url 推导出的 WS 地址\n# command_prefix: \"/\"\n# group_trigger_mode: \"mention\" # mention / command / always\n# group_context_capture: false # true 时,未 at/非命令的群消息只记录为上下文,不触发回复\n# reply_to_inbound: null # true/false 覆盖 router.reply_to_inbound;null/省略表示跟随全局\n# allowed_friends: [] # QQ 号白名单;空列表表示不限制\n# allowed_groups: [] # 群号白名单;空列表表示不限制\n# connect_timeout: 10.0\n# heartbeat_timeout: 30.0\n# reconnect_initial_delay: 1.0\n# reconnect_max_delay: 30.0\n# send_retry_attempts: 3\n# send_retry_backoff: 1.0\n# max_text_length: 4000\n# media_download_dir: \"./data/temp/media\"\n# enable_media_download_tool: true\n# resource_url_ttl_hint: 300\n# cache_media_on_receive: true\n# max_forward_depth: 3\n# max_forward_messages: 80\n# forward_render_max_chars: 12000\n# scene_cache_size: 4096\n\n# ── Agent Loop ──────────────────────────────────────────\n# 控制 Agent 循环的行为:迭代轮数、超时、重试策略等。\n# 以下均为默认值,不写则使用默认值。\n#\n# agent:\n# max_steps: 8 # 最大工具调用迭代轮数\n# provider_timeout_seconds: 120.0 # 单次 LLM 调用超时(秒)\n# retry_attempts: 2 # LLM 调用重试次数\n# retry_backoff_seconds: 0.2 # 重试退避间隔(秒)\n# tool_timeout_seconds: 135.0 # 工具执行超时(秒)\n# tool_retry_attempts: 1 # 工具执行重试次数\n# tool_retry_backoff_seconds: 0.1 # 工具重试退避间隔(秒)\n# max_tool_log_chars: 400 # 工具日志截断长度\n# # tool_use_system_prompt: \"...\" # 注入的工具使用提示\n# # provider_error_template: \"...\" # Provider 错误消息模板\n\n# ── Context Budget ──────────────────────────────────────\n# 控制未知模型 fallback 上下文窗口和 reasoning chain 预算。\n# 模型声明 providers.*.models[].capabilities.context_window 时优先使用模型窗口。\n# 以下均为默认值,不写则使用默认值。\n#\n# context:\n# max_tokens: 272000 # 未声明模型窗口时的 fallback context window\n# reserved_tokens: 10000 # 未声明模型窗口时为输出保留的 token\n# # max_chars: null # 字符数上限(兼容旧逻辑,优先使用 max_tokens)\n# # reserved_chars: 0 # 字符保留数\n# summary_max_chars: 2000 # 历史摘要最大字符数\n# reasoning_policy: \"budget\" # strip / append / budget\n# max_reasoning_tokens: 2000 # reasoning chain token 预算\n\n# ── Scheduler ──────────────────────────────────────────\n# 控制定时任务调度行为。\n# 以下均为默认值,不写则使用默认值。\n#\n# scheduler:\n# poll_interval_seconds: 1.0 # 调度轮询间隔(秒)\n# max_concurrent_fires: 5 # 最大并发执行数\n# job_timeout_seconds: 120.0 # 单任务超时(秒)\n# min_interval_seconds: 60 # cron 最小间隔(秒)\n# max_prompt_chars: 12000 # 定时任务 prompt 最大字符数\n# max_jobs_per_chat: 20 # 每个会话最大任务数\n# failure_retry_seconds: 300 # 失败重试等待(秒)\n# max_consecutive_failures: 3 # 连续失败上限\n# memory_dreaming_enabled: true # 是否启用内部记忆 dreaming\n# memory_dreaming_interval_seconds: 3600 # dreaming 周期(秒)\n# memory_dreaming_initial_delay_seconds: 300 # 启动后首次 dreaming 延迟(秒)\n# memory_dreaming_session_limit: 20 # 单次最多扫描会话数\n# memory_dreaming_recent_turn_limit: 40 # 单会话最多读取 turns 数\n# memory_dreaming_provider_id: \"\" # Legacy;建议改用 memory_dreaming_model\n# memory_dreaming_model: \"\" # model spec;空则默认找 memory tag,失败后走会话模型\n\n# ── Model Tags / Specs ─────────────────────────────────\n# providers 的 models 中可以用 tags 字段标记模型角色。\n# 需要内部模型的配置项都接受一个 model spec 字符串;这个字符串可以是 tag,\n# 也可以是 provider/model 或裸模型名。\n# models:\n# - name: deepseek-chat\n# tags: [primary] # 主对话模型(隐式:每个 provider 的第一个模型)\n# - name: deepseek-chat-lite\n# tags: [cheap, memory] # 低成本后台任务 / 记忆 dreaming\n#\n# 可用 tags: primary / cheap / memory / embedding / reranker / vision\n\n# ── Memory ─────────────────────────────────────────────\n# 长期记忆检索和 embedding 配置。默认只启用 SQLite FTS;vector/hybrid\n# 需要显式开启,并在 providers.models 中配置带 embedding tag 的模型。\n#\n# memory:\n# enabled: true\n# retrieval:\n# fts_enabled: true\n# vector_enabled: false # 开启后对长期记忆使用 hybrid 检索\n# hybrid_enabled: true\n# vector_backend: json # json / sqlite-vec / none\n# max_injected_items: 5\n# max_injected_chars: 4000\n# embedding:\n# enabled: false\n# model: \"\" # model spec;空则默认找 embedding tag\n# dimensions: 0 # 0 = auto-detect via probe embed call\n# batch_size: 16\n# embed_after_consolidation: true\n# consolidation:\n# rule_based_enabled: true # 是否启用每轮对话后的规则抽取;false 时只保留 dreaming/显式写入\n\n# ── Router ─────────────────────────────────────────────\n# 控制消息路由行为。system_prompt 使用顶层 system_prompt 字段。\n# 以下均为默认值,不写则使用默认值。\n#\n# router:\n# # system_prompt: \"...\" # 与顶层 system_prompt 重复,优先使用顶层字段\n# max_history_turns: 200 # 最大历史轮数\n# agent_enabled: true # 是否启用 Agent\n# command_timeout_seconds: 30.0 # 命令执行超时(秒)\n# command_timeout_message: \"Command timed out. Please try again later.\"\n# reply_to_inbound: true # 默认是否引用回复触发消息;平台插件可覆盖\n# group_context:\n# enabled: true # 是否在触发时注入 observed-only 群上下文\n# max_messages: 20 # 最多注入最近多少条未触发群消息\n# ttl_seconds: 900 # 只注入最近 N 秒内的群上下文;0 表示不按时间过滤\n# max_chars: 4000 # 群上下文注入块最大字符数\n"}, "095f252d5271998bc5e61ef2fad45059ce5f43c4": {"t": 1785761685.8566446, "n": 8818, "h": "e6a27e8ae1550513", "c": "# Nahida Bot 配置文件\n# 参见 nahida_bot.core.config.Settings 了解所有可用字段\n\n# ── 应用 ──────────────────────────────────────────────\napp_name: \"Nahida Bot\"\ndebug: false\nlog_level: \"INFO\" # DEBUG / INFO / WARNING / ERROR\n# log_json: true # 设为 true 输出 JSON 格式日志(生产环境推荐)\n# log_file: \"./data/logs/nahida.log\" # 可选:把应用日志写入文件,不需要 tee\n# log_file_level: \"DEBUG\" # 可选:文件日志级别;默认跟随 log_level\n# log_file_json: true # 文件日志默认使用 JSON Lines\n\n# ── 服务器 ────────────────────────────────────────────\nhost: \"127.0.0.1\"\nport: 6185\n\n# ── 数据库 ────────────────────────────────────────────\ndb_path: \"./data/nahida.db\"\n\n# ── Workspace ─────────────────────────────────────────\nworkspace_base_dir: \"./data/workspace\"\n\n# ── 插件 ──────────────────────────────────────────────\nplugin_paths:\n - \"./plugins\"\n\n# ── Agent / Router ────────────────────────────────────\nsystem_prompt: \"You are a helpful assistant.\"\n\n# ── LLM Providers(dict 格式,key 即 provider id)───\n# 支持多 provider 配置,每个 provider 有独立的 api_key 和 models 列表。\n# models 的第一个元素是该 provider 的默认模型;每个模型可以是字符串,\n# 也可以是 {name, capabilities} 对象。通过 /model 命令可在聊天中切换模型。\n#\n# providers:\n# deepseek-main:\n# type: deepseek\n# api_key: \"${DEEPSEEK_API_KEY}\"\n# # 内部使用 SSE 接收并聚合,降低长推理被误判为读超时的概率。\n# # 不会改变 channel 的发送方式;仍由 AgentLoop 聚合后返回。\n# stream_responses: true\n# models: [\"deepseek-chat\", \"deepseek-reasoner\"]\n# glm:\n# type: glm\n# api_key: \"${GLM_API_KEY}\"\n# models: [\"glm-4-flash\", \"glm-4-plus\"]\n# vision:\n# type: openai-compatible\n# api_key: \"${VISION_API_KEY}\"\n# base_url: \"${VISION_BASE_URL}\"\n# models:\n# - name: \"vision-model\"\n# capabilities:\n# image_input: true\n# max_image_count: 4\n#\n# default_provider: deepseek-main # 可选,默认使用第一个 key\n\nproviders:\n default:\n type: \"openai-compatible\"\n api_key: \"${LLM_API_KEY}\"\n base_url: \"${LLM_BASE_URL}\"\n # 建议开启:provider 内部流式接收并聚合返回,适合长推理/重任务。\n # 支持 openai-compatible/deepseek/glm/groq/anthropic/minimax/openai-responses。\n stream_responses: true\n models:\n - \"${LLM_MODEL}\"\n\ndefault_provider: default\n\n# ── 多模态 / 图片理解 ─────────────────────────────────\n# 主模型有 models[].capabilities.image_input=true 时会直接传图;\n# 主模型没有 image_input 时,按 image_fallback_mode 决定是否调用 fallback vision。\nmultimodal:\n image_fallback_mode: \"auto\" # auto / tool / off\n media_context_policy: \"cache_aware\" # cache_aware / native_recent / description_only\n image_fallback_provider: \"\" # Legacy;建议留空\n image_fallback_model: \"\" # model spec;空则默认找 vision tag\n max_images_per_turn: 4\n max_image_bytes: 10485760\n media_cache_ttl_seconds: 3600\n\n# ── 插件配置 ──────────────────────────────────────────\n# Settings 的 extra=\"allow\" 机制:顶层 key 如果不是已知字段,\n# 且值为 dict,则按 plugin id 匹配并注入到对应插件的 manifest.config 中。\n\nbuiltin-commands:\n # send_local_attachment 默认只允许发送 active workspace 内的相对路径。\n # 如确实需要发送工作区外的本地文件,可打开下面开关。\n allow_external_attachment_paths: false\n # 可选白名单目录;为空表示打开上方开关后允许任意绝对路径。\n # external_attachment_roots:\n # - \"D:/Pictures\"\n external_attachment_roots: []\n\ntelegram:\n bot_token: \"${TELEGRAM_BOT_TOKEN}\"\n # group_trigger_mode: \"always\" # always / mention / command\n # group_context_capture: false # mention/command 模式下,是否记录未触发群消息作为上下文\n # reply_to_inbound: null # true/false 覆盖 router.reply_to_inbound;null/省略表示跟随全局\n # proxy: \"${TELEGRAM_PROXY:}\" # SOCKS5/HTTP 代理,如 socks5://127.0.0.1:1080\n # polling_timeout: 30\n # allowed_chats: []\n\n# Milky QQ Channel(可选)\n# 启用前请先启动 Lagrange.Milky,并确保 nahida_bot/channels/milky/plugin.yaml\n# 可被内置 channel discovery 扫描到。保持注释状态不会启用 Milky。\n#\n# milky:\n# base_url: \"http://127.0.0.1:3000\"\n# access_token: \"${MILKY_ACCESS_TOKEN}\"\n# api_prefix: \"/api\"\n# event_path: \"/event\"\n# # ws_url: \"ws://127.0.0.1:3000/event\" # 可选:覆盖由 base_url 推导出的 WS 地址\n# command_prefix: \"/\"\n# group_trigger_mode: \"mention\" # mention / command / always\n# group_context_capture: false # true 时,未 at/非命令的群消息只记录为上下文,不触发回复\n# reply_to_inbound: null # true/false 覆盖 router.reply_to_inbound;null/省略表示跟随全局\n# allowed_friends: [] # QQ 号白名单;空列表表示不限制\n# allowed_groups: [] # 群号白名单;空列表表示不限制\n# connect_timeout: 10.0\n# heartbeat_timeout: 30.0\n# reconnect_initial_delay: 1.0\n# reconnect_max_delay: 30.0\n# send_retry_attempts: 3\n# send_retry_backoff: 1.0\n# max_text_length: 4000\n# media_download_dir: \"./data/temp/media\"\n# enable_media_download_tool: true\n# resource_url_ttl_hint: 300\n# cache_media_on_receive: true\n# max_forward_depth: 3\n# max_forward_messages: 80\n# forward_render_max_chars: 12000\n# scene_cache_size: 4096\n\n# ── Agent Loop ──────────────────────────────────────────\n# 控制 Agent 循环的行为:迭代轮数、超时、重试策略等。\n# 以下均为默认值,不写则使用默认值。\n#\n# agent:\n# max_steps: 8 # 最大工具调用迭代轮数\n# provider_timeout_seconds: 30.0 # 单次 LLM 调用超时(秒)\n# retry_attempts: 2 # LLM 调用重试次数\n# retry_backoff_seconds: 0.2 # 重试退避间隔(秒)\n# tool_timeout_seconds: 135.0 # 工具执行超时(秒)\n# tool_retry_attempts: 1 # 工具执行重试次数\n# tool_retry_backoff_seconds: 0.1 # 工具重试退避间隔(秒)\n# max_tool_log_chars: 400 # 工具日志截断长度\n# # tool_use_system_prompt: \"...\" # 注入的工具使用提示\n# # provider_error_template: \"...\" # Provider 错误消息模板\n\n# ── Context Budget ──────────────────────────────────────\n# 控制上下文窗口大小和 reasoning chain 预算。\n# 以下均为默认值,不写则使用默认值。\n#\n# context:\n# max_tokens: 8000 # 最大 token 预算\n# reserved_tokens: 1000 # 为输出保留的 token\n# # max_chars: null # 字符数上限(兼容旧逻辑,优先使用 max_tokens)\n# # reserved_chars: 0 # 字符保留数\n# summary_max_chars: 600 # 历史摘要最大字符数\n# reasoning_policy: \"budget\" # strip / append / budget\n# max_reasoning_tokens: 2000 # reasoning chain token 预算\n\n# ── Scheduler ──────────────────────────────────────────\n# 控制定时任务调度行为。\n# 以下均为默认值,不写则使用默认值。\n#\n# scheduler:\n# poll_interval_seconds: 1.0 # 调度轮询间隔(秒)\n# max_concurrent_fires: 5 # 最大并发执行数\n# job_timeout_seconds: 120.0 # 单任务超时(秒)\n# min_interval_seconds: 60 # cron 最小间隔(秒)\n# max_prompt_chars: 4000 # 定时任务 prompt 最大字符数\n# max_jobs_per_chat: 20 # 每个会话最大任务数\n# failure_retry_seconds: 300 # 失败重试等待(秒)\n# max_consecutive_failures: 3 # 连续失败上限\n# memory_dreaming_enabled: true # 是否启用内部记忆 dreaming\n# memory_dreaming_interval_seconds: 3600 # dreaming 周期(秒)\n# memory_dreaming_initial_delay_seconds: 300 # 启动后首次 dreaming 延迟(秒)\n# memory_dreaming_session_limit: 20 # 单次最多扫描会话数\n# memory_dreaming_recent_turn_limit: 40 # 单会话最多读取 turns 数\n# memory_dreaming_provider_id: \"\" # Legacy;建议改用 memory_dreaming_model\n# memory_dreaming_model: \"\" # model spec;空则默认找 memory tag,失败后走会话模型\n\n# ── Model Tags / Specs ─────────────────────────────────\n# providers 的 models 中可以用 tags 字段标记模型角色。\n# 需要内部模型的配置项都接受一个 model spec 字符串;这个字符串可以是 tag,\n# 也可以是 provider/model 或裸模型名。\n# models:\n# - name: deepseek-chat\n# tags: [primary] # 主对话模型(隐式:每个 provider 的第一个模型)\n# - name: deepseek-chat-lite\n# tags: [cheap, memory] # 低成本后台任务 / 记忆 dreaming\n#\n# 可用 tags: primary / cheap / memory / embedding / reranker / vision\n\n# ── Memory ─────────────────────────────────────────────\n# 长期记忆检索和 embedding 配置。默认只启用 SQLite FTS;vector/hybrid\n# 需要显式开启,并在 providers.models 中配置带 embedding tag 的模型。\n#\n# memory:\n# enabled: true\n# retrieval:\n# fts_enabled: true\n# vector_enabled: false # 开启后对长期记忆使用 hybrid 检索\n# hybrid_enabled: true\n# vector_backend: json # json / sqlite-vec / none\n# max_injected_items: 5\n# max_injected_chars: 1200\n# embedding:\n# enabled: false\n# model: \"\" # model spec;空则默认找 embedding tag\n# dimensions: 0 # 0 = auto-detect via probe embed call\n# batch_size: 16\n# embed_after_consolidation: true\n# consolidation:\n# rule_based_enabled: true # 是否启用每轮对话后的规则抽取;false 时只保留 dreaming/显式写入\n\n# ── Router ─────────────────────────────────────────────\n# 控制消息路由行为。system_prompt 使用顶层 system_prompt 字段。\n# 以下均为默认值,不写则使用默认值。\n#\n# router:\n# # system_prompt: \"...\" # 与顶层 system_prompt 重复,优先使用顶层字段\n# max_history_turns: 50 # 最大历史轮数\n# agent_enabled: true # 是否启用 Agent\n# command_timeout_seconds: 30.0 # 命令执行超时(秒)\n# command_timeout_message: \"Command timed out. Please try again later.\"\n# reply_to_inbound: true # 默认是否引用回复触发消息;平台插件可覆盖\n# group_context:\n# enabled: true # 是否在触发时注入 observed-only 群上下文\n# max_messages: 20 # 最多注入最近多少条未触发群消息\n# ttl_seconds: 900 # 只注入最近 N 秒内的群上下文;0 表示不按时间过滤\n# max_chars: 4000 # 群上下文注入块最大字符数\n"}, "01203285ad9b6104ad006fac94c2ee46e2f25fc2": {"t": 1785761691.9083178, "n": 8632, "h": "defe0d7a33821f5a", "c": "# Nahida Bot 配置文件\n# 参见 nahida_bot.core.config.Settings 了解所有可用字段\n\n# ── 应用 ──────────────────────────────────────────────\napp_name: \"Nahida Bot\"\ndebug: false\nlog_level: \"INFO\" # DEBUG / INFO / WARNING / ERROR\n# log_json: true # 设为 true 输出 JSON 格式日志(生产环境推荐)\n\n# ── 服务器 ────────────────────────────────────────────\nhost: \"127.0.0.1\"\nport: 6185\n\n# ── 数据库 ────────────────────────────────────────────\ndb_path: \"./data/nahida.db\"\n\n# ── Workspace ─────────────────────────────────────────\nworkspace_base_dir: \"./data/workspace\"\n\n# ── 插件 ──────────────────────────────────────────────\nplugin_paths:\n - \"./plugins\"\n\n# ── Agent / Router ────────────────────────────────────\nsystem_prompt: \"You are a helpful assistant.\"\n\n# ── LLM Providers(dict 格式,key 即 provider id)───\n# 支持多 provider 配置,每个 provider 有独立的 api_key 和 models 列表。\n# models 的第一个元素是该 provider 的默认模型;每个模型可以是字符串,\n# 也可以是 {name, capabilities} 对象。通过 /model 命令可在聊天中切换模型。\n#\n# providers:\n# deepseek-main:\n# type: deepseek\n# api_key: \"${DEEPSEEK_API_KEY}\"\n# # 内部使用 SSE 接收并聚合,降低长推理被误判为读超时的概率。\n# # 不会改变 channel 的发送方式;仍由 AgentLoop 聚合后返回。\n# stream_responses: true\n# models: [\"deepseek-chat\", \"deepseek-reasoner\"]\n# glm:\n# type: glm\n# api_key: \"${GLM_API_KEY}\"\n# models: [\"glm-4-flash\", \"glm-4-plus\"]\n# vision:\n# type: openai-compatible\n# api_key: \"${VISION_API_KEY}\"\n# base_url: \"${VISION_BASE_URL}\"\n# models:\n# - name: \"vision-model\"\n# capabilities:\n# image_input: true\n# max_image_count: 4\n#\n# default_provider: deepseek-main # 可选,默认使用第一个 key\n\nproviders:\n default:\n type: \"openai-compatible\"\n api_key: \"${LLM_API_KEY}\"\n base_url: \"${LLM_BASE_URL}\"\n # 建议开启:provider 内部流式接收并聚合返回,适合长推理/重任务。\n # 支持 openai-compatible/deepseek/glm/groq/anthropic/minimax/openai-responses。\n stream_responses: true\n models:\n - \"${LLM_MODEL}\"\n\ndefault_provider: default\n\n# ── 多模态 / 图片理解 ─────────────────────────────────\n# 主模型有 models[].capabilities.image_input=true 时会直接传图;\n# 主模型没有 image_input 时,按 image_fallback_mode 决定是否调用 fallback vision。\nmultimodal:\n image_fallback_mode: \"auto\" # auto / tool / off\n media_context_policy: \"cache_aware\" # cache_aware / native_recent / description_only\n image_fallback_provider: \"\" # Legacy;建议留空\n image_fallback_model: \"\" # model spec;空则默认找 vision tag\n max_images_per_turn: 4\n max_image_bytes: 10485760\n media_cache_ttl_seconds: 3600\n\n# ── 插件配置 ──────────────────────────────────────────\n# Settings 的 extra=\"allow\" 机制:顶层 key 如果不是已知字段,\n# 且值为 dict,则按 plugin id 匹配并注入到对应插件的 manifest.config 中。\n\nbuiltin-commands:\n # send_local_attachment 默认只允许发送 active workspace 内的相对路径。\n # 如确实需要发送工作区外的本地文件,可打开下面开关。\n allow_external_attachment_paths: false\n # 可选白名单目录;为空表示打开上方开关后允许任意绝对路径。\n # external_attachment_roots:\n # - \"D:/Pictures\"\n external_attachment_roots: []\n\ntelegram:\n bot_token: \"${TELEGRAM_BOT_TOKEN}\"\n # group_trigger_mode: \"always\" # always / mention / command\n # group_context_capture: false # mention/command 模式下,是否记录未触发群消息作为上下文\n # reply_to_inbound: null # true/false 覆盖 router.reply_to_inbound;null/省略表示跟随全局\n # proxy: \"${TELEGRAM_PROXY:}\" # SOCKS5/HTTP 代理,如 socks5://127.0.0.1:1080\n # polling_timeout: 30\n # allowed_chats: []\n\n# Milky QQ Channel(可选)\n# 启用前请先启动 Lagrange.Milky,并确保 nahida_bot/channels/milky/plugin.yaml\n# 可被内置 channel discovery 扫描到。保持注释状态不会启用 Milky。\n#\n# milky:\n# base_url: \"http://127.0.0.1:3000\"\n# access_token: \"${MILKY_ACCESS_TOKEN}\"\n# api_prefix: \"/api\"\n# event_path: \"/event\"\n# # ws_url: \"ws://127.0.0.1:3000/event\" # 可选:覆盖由 base_url 推导出的 WS 地址\n# command_prefix: \"/\"\n# group_trigger_mode: \"mention\" # mention / command / always\n# group_context_capture: false # true 时,未 at/非命令的群消息只记录为上下文,不触发回复\n# reply_to_inbound: null # true/false 覆盖 router.reply_to_inbound;null/省略表示跟随全局\n# allowed_friends: [] # QQ 号白名单;空列表表示不限制\n# allowed_groups: [] # 群号白名单;空列表表示不限制\n# connect_timeout: 10.0\n# heartbeat_timeout: 30.0\n# reconnect_initial_delay: 1.0\n# reconnect_max_delay: 30.0\n# send_retry_attempts: 3\n# send_retry_backoff: 1.0\n# max_text_length: 4000\n# media_download_dir: \"./data/temp/media\"\n# enable_media_download_tool: true\n# resource_url_ttl_hint: 300\n# cache_media_on_receive: true\n# max_forward_depth: 3\n# max_forward_messages: 80\n# forward_render_max_chars: 12000\n# scene_cache_size: 4096\n\n# ── Agent Loop ──────────────────────────────────────────\n# 控制 Agent 循环的行为:迭代轮数、超时、重试策略等。\n# 以下均为默认值,不写则使用默认值。\n#\n# agent:\n# max_steps: 8 # 最大工具调用迭代轮数\n# provider_timeout_seconds: 30.0 # 单次 LLM 调用超时(秒)\n# retry_attempts: 2 # LLM 调用重试次数\n# retry_backoff_seconds: 0.2 # 重试退避间隔(秒)\n# tool_timeout_seconds: 135.0 # 工具执行超时(秒)\n# tool_retry_attempts: 1 # 工具执行重试次数\n# tool_retry_backoff_seconds: 0.1 # 工具重试退避间隔(秒)\n# max_tool_log_chars: 400 # 工具日志截断长度\n# # tool_use_system_prompt: \"...\" # 注入的工具使用提示\n# # provider_error_template: \"...\" # Provider 错误消息模板\n\n# ── Context Budget ──────────────────────────────────────\n# 控制上下文窗口大小和 reasoning chain 预算。\n# 以下均为默认值,不写则使用默认值。\n#\n# context:\n# max_tokens: 8000 # 最大 token 预算\n# reserved_tokens: 1000 # 为输出保留的 token\n# # max_chars: null # 字符数上限(兼容旧逻辑,优先使用 max_tokens)\n# # reserved_chars: 0 # 字符保留数\n# summary_max_chars: 600 # 历史摘要最大字符数\n# reasoning_policy: \"budget\" # strip / append / budget\n# max_reasoning_tokens: 2000 # reasoning chain token 预算\n\n# ── Scheduler ──────────────────────────────────────────\n# 控制定时任务调度行为。\n# 以下均为默认值,不写则使用默认值。\n#\n# scheduler:\n# poll_interval_seconds: 1.0 # 调度轮询间隔(秒)\n# max_concurrent_fires: 5 # 最大并发执行数\n# job_timeout_seconds: 120.0 # 单任务超时(秒)\n# min_interval_seconds: 60 # cron 最小间隔(秒)\n# max_prompt_chars: 4000 # 定时任务 prompt 最大字符数\n# max_jobs_per_chat: 20 # 每个会话最大任务数\n# failure_retry_seconds: 300 # 失败重试等待(秒)\n# max_consecutive_failures: 3 # 连续失败上限\n# memory_dreaming_enabled: true # 是否启用内部记忆 dreaming\n# memory_dreaming_interval_seconds: 3600 # dreaming 周期(秒)\n# memory_dreaming_initial_delay_seconds: 300 # 启动后首次 dreaming 延迟(秒)\n# memory_dreaming_session_limit: 20 # 单次最多扫描会话数\n# memory_dreaming_recent_turn_limit: 40 # 单会话最多读取 turns 数\n# memory_dreaming_provider_id: \"\" # Legacy;建议改用 memory_dreaming_model\n# memory_dreaming_model: \"\" # model spec;空则默认找 memory tag,失败后走会话模型\n\n# ── Model Tags / Specs ─────────────────────────────────\n# providers 的 models 中可以用 tags 字段标记模型角色。\n# 需要内部模型的配置项都接受一个 model spec 字符串;这个字符串可以是 tag,\n# 也可以是 provider/model 或裸模型名。\n# models:\n# - name: deepseek-chat\n# tags: [primary] # 主对话模型(隐式:每个 provider 的第一个模型)\n# - name: deepseek-chat-lite\n# tags: [cheap, memory] # 低成本后台任务 / 记忆 dreaming\n#\n# 可用 tags: primary / cheap / memory / embedding / reranker / vision\n\n# ── Memory ─────────────────────────────────────────────\n# 长期记忆检索和 embedding 配置。默认只启用 SQLite FTS;vector/hybrid\n# 需要显式开启,并在 providers.models 中配置带 embedding tag 的模型。\n#\n# memory:\n# enabled: true\n# retrieval:\n# fts_enabled: true\n# vector_enabled: false # 开启后对长期记忆使用 hybrid 检索\n# hybrid_enabled: true\n# vector_backend: json # json / sqlite-vec / none\n# max_injected_items: 5\n# max_injected_chars: 1200\n# embedding:\n# enabled: false\n# model: \"\" # model spec;空则默认找 embedding tag\n# dimensions: 0 # 0 = auto-detect via probe embed call\n# batch_size: 16\n# embed_after_consolidation: true\n# consolidation:\n# rule_based_enabled: true # 是否启用每轮对话后的规则抽取;false 时只保留 dreaming/显式写入\n\n# ── Router ─────────────────────────────────────────────\n# 控制消息路由行为。system_prompt 使用顶层 system_prompt 字段。\n# 以下均为默认值,不写则使用默认值。\n#\n# router:\n# # system_prompt: \"...\" # 与顶层 system_prompt 重复,优先使用顶层字段\n# max_history_turns: 50 # 最大历史轮数\n# agent_enabled: true # 是否启用 Agent\n# command_timeout_seconds: 30.0 # 命令执行超时(秒)\n# command_timeout_message: \"Command timed out. Please try again later.\"\n# reply_to_inbound: true # 默认是否引用回复触发消息;平台插件可覆盖\n# group_context:\n# enabled: true # 是否在触发时注入 observed-only 群上下文\n# max_messages: 20 # 最多注入最近多少条未触发群消息\n# ttl_seconds: 900 # 只注入最近 N 秒内的群上下文;0 表示不按时间过滤\n# max_chars: 4000 # 群上下文注入块最大字符数\n"}, "fef6733c71886656078d11637a8f344c2d9aa710": {"t": 1785761695.3274004, "n": 8388, "h": "86d672f0add9b4b2", "c": "# Nahida Bot 配置文件\n# 参见 nahida_bot.core.config.Settings 了解所有可用字段\n\n# ── 应用 ──────────────────────────────────────────────\napp_name: \"Nahida Bot\"\ndebug: false\nlog_level: \"INFO\" # DEBUG / INFO / WARNING / ERROR\n# log_json: true # 设为 true 输出 JSON 格式日志(生产环境推荐)\n\n# ── 服务器 ────────────────────────────────────────────\nhost: \"127.0.0.1\"\nport: 6185\n\n# ── 数据库 ────────────────────────────────────────────\ndb_path: \"./data/nahida.db\"\n\n# ── Workspace ─────────────────────────────────────────\nworkspace_base_dir: \"./data/workspace\"\n\n# ── 插件 ──────────────────────────────────────────────\nplugin_paths:\n - \"./plugins\"\n\n# ── Agent / Router ────────────────────────────────────\nsystem_prompt: \"You are a helpful assistant.\"\n\n# ── LLM Providers(dict 格式,key 即 provider id)───\n# 支持多 provider 配置,每个 provider 有独立的 api_key 和 models 列表。\n# models 的第一个元素是该 provider 的默认模型;每个模型可以是字符串,\n# 也可以是 {name, capabilities} 对象。通过 /model 命令可在聊天中切换模型。\n#\n# providers:\n# deepseek-main:\n# type: deepseek\n# api_key: \"${DEEPSEEK_API_KEY}\"\n# # 内部使用 SSE 接收并聚合,降低长推理被误判为读超时的概率。\n# # 不会改变 channel 的发送方式;仍由 AgentLoop 聚合后返回。\n# stream_responses: true\n# models: [\"deepseek-chat\", \"deepseek-reasoner\"]\n# glm:\n# type: glm\n# api_key: \"${GLM_API_KEY}\"\n# models: [\"glm-4-flash\", \"glm-4-plus\"]\n# vision:\n# type: openai-compatible\n# api_key: \"${VISION_API_KEY}\"\n# base_url: \"${VISION_BASE_URL}\"\n# models:\n# - name: \"vision-model\"\n# capabilities:\n# image_input: true\n# max_image_count: 4\n#\n# default_provider: deepseek-main # 可选,默认使用第一个 key\n\nproviders:\n default:\n type: \"openai-compatible\"\n api_key: \"${LLM_API_KEY}\"\n base_url: \"${LLM_BASE_URL}\"\n # 建议开启:provider 内部流式接收并聚合返回,适合长推理/重任务。\n # 支持 openai-compatible/deepseek/glm/groq/anthropic/minimax/openai-responses。\n stream_responses: true\n models:\n - \"${LLM_MODEL}\"\n\ndefault_provider: default\n\n# ── 多模态 / 图片理解 ─────────────────────────────────\n# 主模型有 models[].capabilities.image_input=true 时会直接传图;\n# 主模型没有 image_input 时,按 image_fallback_mode 决定是否调用 fallback vision。\nmultimodal:\n image_fallback_mode: \"auto\" # auto / tool / off\n media_context_policy: \"cache_aware\" # cache_aware / native_recent / description_only\n image_fallback_provider: \"\" # Legacy;建议留空\n image_fallback_model: \"\" # model spec;空则默认找 vision tag\n max_images_per_turn: 4\n max_image_bytes: 10485760\n media_cache_ttl_seconds: 3600\n\n# ── 插件配置 ──────────────────────────────────────────\n# Settings 的 extra=\"allow\" 机制:顶层 key 如果不是已知字段,\n# 且值为 dict,则按 plugin id 匹配并注入到对应插件的 manifest.config 中。\n\nbuiltin-commands:\n # send_local_attachment 默认只允许发送 active workspace 内的相对路径。\n # 如确实需要发送工作区外的本地文件,可打开下面开关。\n allow_external_attachment_paths: false\n # 可选白名单目录;为空表示打开上方开关后允许任意绝对路径。\n # external_attachment_roots:\n # - \"D:/Pictures\"\n external_attachment_roots: []\n\ntelegram:\n bot_token: \"${TELEGRAM_BOT_TOKEN}\"\n # group_trigger_mode: \"always\" # always / mention / command\n # group_context_capture: false # mention/command 模式下,是否记录未触发群消息作为上下文\n # proxy: \"${TELEGRAM_PROXY:}\" # SOCKS5/HTTP 代理,如 socks5://127.0.0.1:1080\n # polling_timeout: 30\n # allowed_chats: []\n\n# Milky QQ Channel(可选)\n# 启用前请先启动 Lagrange.Milky,并确保 nahida_bot/channels/milky/plugin.yaml\n# 可被内置 channel discovery 扫描到。保持注释状态不会启用 Milky。\n#\n# milky:\n# base_url: \"http://127.0.0.1:3000\"\n# access_token: \"${MILKY_ACCESS_TOKEN}\"\n# api_prefix: \"/api\"\n# event_path: \"/event\"\n# # ws_url: \"ws://127.0.0.1:3000/event\" # 可选:覆盖由 base_url 推导出的 WS 地址\n# command_prefix: \"/\"\n# group_trigger_mode: \"mention\" # mention / command / always\n# group_context_capture: false # true 时,未 at/非命令的群消息只记录为上下文,不触发回复\n# allowed_friends: [] # QQ 号白名单;空列表表示不限制\n# allowed_groups: [] # 群号白名单;空列表表示不限制\n# connect_timeout: 10.0\n# heartbeat_timeout: 30.0\n# reconnect_initial_delay: 1.0\n# reconnect_max_delay: 30.0\n# send_retry_attempts: 3\n# send_retry_backoff: 1.0\n# max_text_length: 4000\n# media_download_dir: \"./data/temp/media\"\n# enable_media_download_tool: true\n# resource_url_ttl_hint: 300\n# cache_media_on_receive: true\n# max_forward_depth: 3\n# max_forward_messages: 80\n# forward_render_max_chars: 12000\n# scene_cache_size: 4096\n\n# ── Agent Loop ──────────────────────────────────────────\n# 控制 Agent 循环的行为:迭代轮数、超时、重试策略等。\n# 以下均为默认值,不写则使用默认值。\n#\n# agent:\n# max_steps: 8 # 最大工具调用迭代轮数\n# provider_timeout_seconds: 30.0 # 单次 LLM 调用超时(秒)\n# retry_attempts: 2 # LLM 调用重试次数\n# retry_backoff_seconds: 0.2 # 重试退避间隔(秒)\n# tool_timeout_seconds: 135.0 # 工具执行超时(秒)\n# tool_retry_attempts: 1 # 工具执行重试次数\n# tool_retry_backoff_seconds: 0.1 # 工具重试退避间隔(秒)\n# max_tool_log_chars: 400 # 工具日志截断长度\n# # tool_use_system_prompt: \"...\" # 注入的工具使用提示\n# # provider_error_template: \"...\" # Provider 错误消息模板\n\n# ── Context Budget ──────────────────────────────────────\n# 控制上下文窗口大小和 reasoning chain 预算。\n# 以下均为默认值,不写则使用默认值。\n#\n# context:\n# max_tokens: 8000 # 最大 token 预算\n# reserved_tokens: 1000 # 为输出保留的 token\n# # max_chars: null # 字符数上限(兼容旧逻辑,优先使用 max_tokens)\n# # reserved_chars: 0 # 字符保留数\n# summary_max_chars: 600 # 历史摘要最大字符数\n# reasoning_policy: \"budget\" # strip / append / budget\n# max_reasoning_tokens: 2000 # reasoning chain token 预算\n\n# ── Scheduler ──────────────────────────────────────────\n# 控制定时任务调度行为。\n# 以下均为默认值,不写则使用默认值。\n#\n# scheduler:\n# poll_interval_seconds: 1.0 # 调度轮询间隔(秒)\n# max_concurrent_fires: 5 # 最大并发执行数\n# job_timeout_seconds: 120.0 # 单任务超时(秒)\n# min_interval_seconds: 60 # cron 最小间隔(秒)\n# max_prompt_chars: 4000 # 定时任务 prompt 最大字符数\n# max_jobs_per_chat: 20 # 每个会话最大任务数\n# failure_retry_seconds: 300 # 失败重试等待(秒)\n# max_consecutive_failures: 3 # 连续失败上限\n# memory_dreaming_enabled: true # 是否启用内部记忆 dreaming\n# memory_dreaming_interval_seconds: 3600 # dreaming 周期(秒)\n# memory_dreaming_initial_delay_seconds: 300 # 启动后首次 dreaming 延迟(秒)\n# memory_dreaming_session_limit: 20 # 单次最多扫描会话数\n# memory_dreaming_recent_turn_limit: 40 # 单会话最多读取 turns 数\n# memory_dreaming_provider_id: \"\" # Legacy;建议改用 memory_dreaming_model\n# memory_dreaming_model: \"\" # model spec;空则默认找 memory tag,失败后走会话模型\n\n# ── Model Tags / Specs ─────────────────────────────────\n# providers 的 models 中可以用 tags 字段标记模型角色。\n# 需要内部模型的配置项都接受一个 model spec 字符串;这个字符串可以是 tag,\n# 也可以是 provider/model 或裸模型名。\n# models:\n# - name: deepseek-chat\n# tags: [primary] # 主对话模型(隐式:每个 provider 的第一个模型)\n# - name: deepseek-chat-lite\n# tags: [cheap, memory] # 低成本后台任务 / 记忆 dreaming\n#\n# 可用 tags: primary / cheap / memory / embedding / reranker / vision\n\n# ── Memory ─────────────────────────────────────────────\n# 长期记忆检索和 embedding 配置。默认只启用 SQLite FTS;vector/hybrid\n# 需要显式开启,并在 providers.models 中配置带 embedding tag 的模型。\n#\n# memory:\n# enabled: true\n# retrieval:\n# fts_enabled: true\n# vector_enabled: false # 开启后对长期记忆使用 hybrid 检索\n# hybrid_enabled: true\n# vector_backend: json # json / sqlite-vec / none\n# max_injected_items: 5\n# max_injected_chars: 1200\n# embedding:\n# enabled: false\n# model: \"\" # model spec;空则默认找 embedding tag\n# dimensions: 0 # 0 = auto-detect via probe embed call\n# batch_size: 16\n# embed_after_consolidation: true\n# consolidation:\n# rule_based_enabled: true # 是否启用每轮对话后的规则抽取;false 时只保留 dreaming/显式写入\n\n# ── Router ─────────────────────────────────────────────\n# 控制消息路由行为。system_prompt 使用顶层 system_prompt 字段。\n# 以下均为默认值,不写则使用默认值。\n#\n# router:\n# # system_prompt: \"...\" # 与顶层 system_prompt 重复,优先使用顶层字段\n# max_history_turns: 50 # 最大历史轮数\n# agent_enabled: true # 是否启用 Agent\n# command_timeout_seconds: 30.0 # 命令执行超时(秒)\n# command_timeout_message: \"Command timed out. Please try again later.\"\n# group_context:\n# enabled: true # 是否在触发时注入 observed-only 群上下文\n# max_messages: 20 # 最多注入最近多少条未触发群消息\n# ttl_seconds: 900 # 只注入最近 N 秒内的群上下文;0 表示不按时间过滤\n# max_chars: 4000 # 群上下文注入块最大字符数\n"}, "9927c7b39b511683b4b677cc0bf0d63a220f2c16": {"t": 1785761697.6764066, "n": 8121, "h": "18c48db31b2286e4", "c": "# Nahida Bot 配置文件\n# 参见 nahida_bot.core.config.Settings 了解所有可用字段\n\n# ── 应用 ──────────────────────────────────────────────\napp_name: \"Nahida Bot\"\ndebug: false\nlog_level: \"INFO\" # DEBUG / INFO / WARNING / ERROR\n# log_json: true # 设为 true 输出 JSON 格式日志(生产环境推荐)\n\n# ── 服务器 ────────────────────────────────────────────\nhost: \"127.0.0.1\"\nport: 6185\n\n# ── 数据库 ────────────────────────────────────────────\ndb_path: \"./data/nahida.db\"\n\n# ── Workspace ─────────────────────────────────────────\nworkspace_base_dir: \"./data/workspace\"\n\n# ── 插件 ──────────────────────────────────────────────\nplugin_paths:\n - \"./plugins\"\n\n# ── Agent / Router ────────────────────────────────────\nsystem_prompt: \"You are a helpful assistant.\"\n\n# ── LLM Providers(dict 格式,key 即 provider id)───\n# 支持多 provider 配置,每个 provider 有独立的 api_key 和 models 列表。\n# models 的第一个元素是该 provider 的默认模型;每个模型可以是字符串,\n# 也可以是 {name, capabilities} 对象。通过 /model 命令可在聊天中切换模型。\n#\n# providers:\n# deepseek-main:\n# type: deepseek\n# api_key: \"${DEEPSEEK_API_KEY}\"\n# # 内部使用 SSE 接收并聚合,降低长推理被误判为读超时的概率。\n# # 不会改变 channel 的发送方式;仍由 AgentLoop 聚合后返回。\n# stream_responses: true\n# models: [\"deepseek-chat\", \"deepseek-reasoner\"]\n# glm:\n# type: glm\n# api_key: \"${GLM_API_KEY}\"\n# models: [\"glm-4-flash\", \"glm-4-plus\"]\n# vision:\n# type: openai-compatible\n# api_key: \"${VISION_API_KEY}\"\n# base_url: \"${VISION_BASE_URL}\"\n# models:\n# - name: \"vision-model\"\n# capabilities:\n# image_input: true\n# max_image_count: 4\n#\n# default_provider: deepseek-main # 可选,默认使用第一个 key\n\nproviders:\n default:\n type: \"openai-compatible\"\n api_key: \"${LLM_API_KEY}\"\n base_url: \"${LLM_BASE_URL}\"\n # 建议开启:provider 内部流式接收并聚合返回,适合长推理/重任务。\n # 支持 openai-compatible/deepseek/glm/groq/anthropic/minimax/openai-responses。\n stream_responses: true\n models:\n - \"${LLM_MODEL}\"\n\ndefault_provider: default\n\n# ── 多模态 / 图片理解 ─────────────────────────────────\n# 主模型有 models[].capabilities.image_input=true 时会直接传图;\n# 主模型没有 image_input 时,按 image_fallback_mode 决定是否调用 fallback vision。\nmultimodal:\n image_fallback_mode: \"auto\" # auto / tool / off\n media_context_policy: \"cache_aware\" # cache_aware / native_recent / description_only\n image_fallback_provider: \"\" # Legacy;建议留空\n image_fallback_model: \"\" # model spec;空则默认找 vision tag\n max_images_per_turn: 4\n max_image_bytes: 10485760\n media_cache_ttl_seconds: 3600\n\n# ── 插件配置 ──────────────────────────────────────────\n# Settings 的 extra=\"allow\" 机制:顶层 key 如果不是已知字段,\n# 且值为 dict,则按 plugin id 匹配并注入到对应插件的 manifest.config 中。\n\ntelegram:\n bot_token: \"${TELEGRAM_BOT_TOKEN}\"\n # group_trigger_mode: \"always\" # always / mention / command\n # group_context_capture: false # mention/command 模式下,是否记录未触发群消息作为上下文\n # proxy: \"${TELEGRAM_PROXY:}\" # SOCKS5/HTTP 代理,如 socks5://127.0.0.1:1080\n # polling_timeout: 30\n # allowed_chats: []\n\n# Milky QQ Channel(可选)\n# 启用前请先启动 Lagrange.Milky,并确保 nahida_bot/channels/milky/plugin.yaml\n# 可被内置 channel discovery 扫描到。保持注释状态不会启用 Milky。\n#\n# milky:\n# base_url: \"http://127.0.0.1:3000\"\n# access_token: \"${MILKY_ACCESS_TOKEN}\"\n# api_prefix: \"/api\"\n# event_path: \"/event\"\n# # ws_url: \"ws://127.0.0.1:3000/event\" # 可选:覆盖由 base_url 推导出的 WS 地址\n# command_prefix: \"/\"\n# group_trigger_mode: \"mention\" # mention / command / always\n# group_context_capture: false # true 时,未 at/非命令的群消息只记录为上下文,不触发回复\n# allowed_friends: [] # QQ 号白名单;空列表表示不限制\n# allowed_groups: [] # 群号白名单;空列表表示不限制\n# connect_timeout: 10.0\n# heartbeat_timeout: 30.0\n# reconnect_initial_delay: 1.0\n# reconnect_max_delay: 30.0\n# send_retry_attempts: 3\n# send_retry_backoff: 1.0\n# max_text_length: 4000\n# media_download_dir: \"./data/temp/media\"\n# enable_media_download_tool: true\n# resource_url_ttl_hint: 300\n# cache_media_on_receive: true\n# max_forward_depth: 3\n# max_forward_messages: 80\n# forward_render_max_chars: 12000\n# scene_cache_size: 4096\n\n# ── Agent Loop ──────────────────────────────────────────\n# 控制 Agent 循环的行为:迭代轮数、超时、重试策略等。\n# 以下均为默认值,不写则使用默认值。\n#\n# agent:\n# max_steps: 8 # 最大工具调用迭代轮数\n# provider_timeout_seconds: 30.0 # 单次 LLM 调用超时(秒)\n# retry_attempts: 2 # LLM 调用重试次数\n# retry_backoff_seconds: 0.2 # 重试退避间隔(秒)\n# tool_timeout_seconds: 135.0 # 工具执行超时(秒)\n# tool_retry_attempts: 1 # 工具执行重试次数\n# tool_retry_backoff_seconds: 0.1 # 工具重试退避间隔(秒)\n# max_tool_log_chars: 400 # 工具日志截断长度\n# # tool_use_system_prompt: \"...\" # 注入的工具使用提示\n# # provider_error_template: \"...\" # Provider 错误消息模板\n\n# ── Context Budget ──────────────────────────────────────\n# 控制上下文窗口大小和 reasoning chain 预算。\n# 以下均为默认值,不写则使用默认值。\n#\n# context:\n# max_tokens: 8000 # 最大 token 预算\n# reserved_tokens: 1000 # 为输出保留的 token\n# # max_chars: null # 字符数上限(兼容旧逻辑,优先使用 max_tokens)\n# # reserved_chars: 0 # 字符保留数\n# summary_max_chars: 600 # 历史摘要最大字符数\n# reasoning_policy: \"budget\" # strip / append / budget\n# max_reasoning_tokens: 2000 # reasoning chain token 预算\n\n# ── Scheduler ──────────────────────────────────────────\n# 控制定时任务调度行为。\n# 以下均为默认值,不写则使用默认值。\n#\n# scheduler:\n# poll_interval_seconds: 1.0 # 调度轮询间隔(秒)\n# max_concurrent_fires: 5 # 最大并发执行数\n# job_timeout_seconds: 120.0 # 单任务超时(秒)\n# min_interval_seconds: 60 # cron 最小间隔(秒)\n# max_prompt_chars: 4000 # 定时任务 prompt 最大字符数\n# max_jobs_per_chat: 20 # 每个会话最大任务数\n# failure_retry_seconds: 300 # 失败重试等待(秒)\n# max_consecutive_failures: 3 # 连续失败上限\n# memory_dreaming_enabled: true # 是否启用内部记忆 dreaming\n# memory_dreaming_interval_seconds: 3600 # dreaming 周期(秒)\n# memory_dreaming_initial_delay_seconds: 300 # 启动后首次 dreaming 延迟(秒)\n# memory_dreaming_session_limit: 20 # 单次最多扫描会话数\n# memory_dreaming_recent_turn_limit: 40 # 单会话最多读取 turns 数\n# memory_dreaming_provider_id: \"\" # Legacy;建议改用 memory_dreaming_model\n# memory_dreaming_model: \"\" # model spec;空则默认找 memory tag,失败后走会话模型\n\n# ── Model Tags / Specs ─────────────────────────────────\n# providers 的 models 中可以用 tags 字段标记模型角色。\n# 需要内部模型的配置项都接受一个 model spec 字符串;这个字符串可以是 tag,\n# 也可以是 provider/model 或裸模型名。\n# models:\n# - name: deepseek-chat\n# tags: [primary] # 主对话模型(隐式:每个 provider 的第一个模型)\n# - name: deepseek-chat-lite\n# tags: [cheap, memory] # 低成本后台任务 / 记忆 dreaming\n#\n# 可用 tags: primary / cheap / memory / embedding / reranker / vision\n\n# ── Memory ─────────────────────────────────────────────\n# 长期记忆检索和 embedding 配置。默认只启用 SQLite FTS;vector/hybrid\n# 需要显式开启,并在 providers.models 中配置带 embedding tag 的模型。\n#\n# memory:\n# enabled: true\n# retrieval:\n# fts_enabled: true\n# vector_enabled: false # 开启后对长期记忆使用 hybrid 检索\n# hybrid_enabled: true\n# vector_backend: json # json / sqlite-vec / none\n# max_injected_items: 5\n# max_injected_chars: 1200\n# embedding:\n# enabled: false\n# model: \"\" # model spec;空则默认找 embedding tag\n# dimensions: 0 # 0 = auto-detect via probe embed call\n# batch_size: 16\n# embed_after_consolidation: true\n# consolidation:\n# rule_based_enabled: true # 是否启用每轮对话后的规则抽取;false 时只保留 dreaming/显式写入\n\n# ── Router ─────────────────────────────────────────────\n# 控制消息路由行为。system_prompt 使用顶层 system_prompt 字段。\n# 以下均为默认值,不写则使用默认值。\n#\n# router:\n# # system_prompt: \"...\" # 与顶层 system_prompt 重复,优先使用顶层字段\n# max_history_turns: 50 # 最大历史轮数\n# agent_enabled: true # 是否启用 Agent\n# command_timeout_seconds: 30.0 # 命令执行超时(秒)\n# command_timeout_message: \"Command timed out. Please try again later.\"\n# group_context:\n# enabled: true # 是否在触发时注入 observed-only 群上下文\n# max_messages: 20 # 最多注入最近多少条未触发群消息\n# ttl_seconds: 900 # 只注入最近 N 秒内的群上下文;0 表示不按时间过滤\n# max_chars: 4000 # 群上下文注入块最大字符数\n"}, "f592b8e2d77b644294fd19657beb5c29fc2e93b5": {"t": 1785761698.9164975, "n": 8106, "h": "1c88ec1a3326cc6b", "c": "# Nahida Bot 配置文件\n# 参见 nahida_bot.core.config.Settings 了解所有可用字段\n\n# ── 应用 ──────────────────────────────────────────────\napp_name: \"Nahida Bot\"\ndebug: false\nlog_level: \"INFO\" # DEBUG / INFO / WARNING / ERROR\n# log_json: true # 设为 true 输出 JSON 格式日志(生产环境推荐)\n\n# ── 服务器 ────────────────────────────────────────────\nhost: \"127.0.0.1\"\nport: 6185\n\n# ── 数据库 ────────────────────────────────────────────\ndb_path: \"./data/nahida.db\"\n\n# ── Workspace ─────────────────────────────────────────\nworkspace_base_dir: \"./data/workspace\"\n\n# ── 插件 ──────────────────────────────────────────────\nplugin_paths:\n - \"./plugins\"\n\n# ── Agent / Router ────────────────────────────────────\nsystem_prompt: \"You are a helpful assistant.\"\n\n# ── LLM Providers(dict 格式,key 即 provider id)───\n# 支持多 provider 配置,每个 provider 有独立的 api_key 和 models 列表。\n# models 的第一个元素是该 provider 的默认模型;每个模型可以是字符串,\n# 也可以是 {name, capabilities} 对象。通过 /model 命令可在聊天中切换模型。\n#\n# providers:\n# deepseek-main:\n# type: deepseek\n# api_key: \"${DEEPSEEK_API_KEY}\"\n# # 内部使用 SSE 接收并聚合,降低长推理被误判为读超时的概率。\n# # 不会改变 channel 的发送方式;仍由 AgentLoop 聚合后返回。\n# stream_responses: true\n# models: [\"deepseek-chat\", \"deepseek-reasoner\"]\n# glm:\n# type: glm\n# api_key: \"${GLM_API_KEY}\"\n# models: [\"glm-4-flash\", \"glm-4-plus\"]\n# vision:\n# type: openai-compatible\n# api_key: \"${VISION_API_KEY}\"\n# base_url: \"${VISION_BASE_URL}\"\n# models:\n# - name: \"vision-model\"\n# capabilities:\n# image_input: true\n# max_image_count: 4\n#\n# default_provider: deepseek-main # 可选,默认使用第一个 key\n\nproviders:\n default:\n type: \"openai-compatible\"\n api_key: \"${LLM_API_KEY}\"\n base_url: \"${LLM_BASE_URL}\"\n # 建议开启:provider 内部流式接收并聚合返回,适合长推理/重任务。\n # 支持 openai-compatible/deepseek/glm/groq/anthropic/minimax/openai-responses。\n stream_responses: true\n models:\n - \"${LLM_MODEL}\"\n\ndefault_provider: default\n\n# ── 多模态 / 图片理解 ─────────────────────────────────\n# 主模型有 models[].capabilities.image_input=true 时会直接传图;\n# 主模型没有 image_input 时,按 image_fallback_mode 决定是否调用 fallback vision。\nmultimodal:\n image_fallback_mode: \"auto\" # auto / tool / off\n media_context_policy: \"cache_aware\" # cache_aware / native_recent / description_only\n image_fallback_provider: \"\" # Legacy;建议留空\n image_fallback_model: \"\" # model spec;空则默认找 vision tag\n max_images_per_turn: 4\n max_image_bytes: 10485760\n media_cache_ttl_seconds: 3600\n\n# ── 插件配置 ──────────────────────────────────────────\n# Settings 的 extra=\"allow\" 机制:顶层 key 如果不是已知字段,\n# 且值为 dict,则按 plugin id 匹配并注入到对应插件的 manifest.config 中。\n\ntelegram:\n bot_token: \"${TELEGRAM_BOT_TOKEN}\"\n # group_trigger_mode: \"always\" # always / mention / command\n # group_context_capture: false # mention/command 模式下,是否记录未触发群消息作为上下文\n # proxy: \"${TELEGRAM_PROXY:}\" # SOCKS5/HTTP 代理,如 socks5://127.0.0.1:1080\n # polling_timeout: 30\n # allowed_chats: []\n\n# Milky QQ Channel(可选)\n# 启用前请先启动 Lagrange.Milky,并确保 nahida_bot/channels/milky/plugin.yaml\n# 可被内置 channel discovery 扫描到。保持注释状态不会启用 Milky。\n#\n# milky:\n# base_url: \"http://127.0.0.1:3000\"\n# access_token: \"${MILKY_ACCESS_TOKEN}\"\n# api_prefix: \"/api\"\n# event_path: \"/event\"\n# # ws_url: \"ws://127.0.0.1:3000/event\" # 可选:覆盖由 base_url 推导出的 WS 地址\n# command_prefix: \"/\"\n# group_trigger_mode: \"mention\" # mention / command / always\n# group_context_capture: false # true 时,未 at/非命令的群消息只记录为上下文,不触发回复\n# allowed_friends: [] # QQ 号白名单;空列表表示不限制\n# allowed_groups: [] # 群号白名单;空列表表示不限制\n# connect_timeout: 10.0\n# heartbeat_timeout: 30.0\n# reconnect_initial_delay: 1.0\n# reconnect_max_delay: 30.0\n# send_retry_attempts: 3\n# send_retry_backoff: 1.0\n# max_text_length: 4000\n# media_download_dir: \"./data/temp/media\"\n# enable_media_download_tool: true\n# resource_url_ttl_hint: 300\n# cache_media_on_receive: true\n# max_forward_depth: 3\n# max_forward_messages: 80\n# forward_render_max_chars: 12000\n# scene_cache_size: 4096\n\n# ── Agent Loop ──────────────────────────────────────────\n# 控制 Agent 循环的行为:迭代轮数、超时、重试策略等。\n# 以下均为默认值,不写则使用默认值。\n#\n# agent:\n# max_steps: 8 # 最大工具调用迭代轮数\n# provider_timeout_seconds: 30.0 # 单次 LLM 调用超时(秒)\n# retry_attempts: 2 # LLM 调用重试次数\n# retry_backoff_seconds: 0.2 # 重试退避间隔(秒)\n# tool_timeout_seconds: 135.0 # 工具执行超时(秒)\n# tool_retry_attempts: 1 # 工具执行重试次数\n# tool_retry_backoff_seconds: 0.1 # 工具重试退避间隔(秒)\n# max_tool_log_chars: 400 # 工具日志截断长度\n# # tool_use_system_prompt: \"...\" # 注入的工具使用提示\n# # provider_error_template: \"...\" # Provider 错误消息模板\n\n# ── Context Budget ──────────────────────────────────────\n# 控制上下文窗口大小和 reasoning chain 预算。\n# 以下均为默认值,不写则使用默认值。\n#\n# context:\n# max_tokens: 8000 # 最大 token 预算\n# reserved_tokens: 1000 # 为输出保留的 token\n# # max_chars: null # 字符数上限(兼容旧逻辑,优先使用 max_tokens)\n# # reserved_chars: 0 # 字符保留数\n# summary_max_chars: 600 # 历史摘要最大字符数\n# reasoning_policy: \"budget\" # strip / append / budget\n# max_reasoning_tokens: 2000 # reasoning chain token 预算\n\n# ── Scheduler ──────────────────────────────────────────\n# 控制定时任务调度行为。\n# 以下均为默认值,不写则使用默认值。\n#\n# scheduler:\n# poll_interval_seconds: 1.0 # 调度轮询间隔(秒)\n# max_concurrent_fires: 5 # 最大并发执行数\n# job_timeout_seconds: 120.0 # 单任务超时(秒)\n# min_interval_seconds: 60 # cron 最小间隔(秒)\n# max_prompt_chars: 4000 # 定时任务 prompt 最大字符数\n# max_jobs_per_chat: 20 # 每个会话最大任务数\n# failure_retry_seconds: 300 # 失败重试等待(秒)\n# max_consecutive_failures: 3 # 连续失败上限\n# memory_dreaming_enabled: true # 是否启用内部记忆 dreaming\n# memory_dreaming_interval_seconds: 3600 # dreaming 周期(秒)\n# memory_dreaming_initial_delay_seconds: 300 # 启动后首次 dreaming 延迟(秒)\n# memory_dreaming_session_limit: 20 # 单次最多扫描会话数\n# memory_dreaming_recent_turn_limit: 40 # 单会话最多读取 turns 数\n# memory_dreaming_provider_id: \"\" # Legacy;建议改用 memory_dreaming_model\n# memory_dreaming_model: \"\" # model spec;空则默认找 memory tag,失败后走会话模型\n\n# ── Model Tags / Specs ─────────────────────────────────\n# providers 的 models 中可以用 tags 字段标记模型角色。\n# 需要内部模型的配置项都接受一个 model spec 字符串;这个字符串可以是 tag,\n# 也可以是 provider/model 或裸模型名。\n# models:\n# - name: deepseek-chat\n# tags: [primary] # 主对话模型(隐式:每个 provider 的第一个模型)\n# - name: deepseek-chat-lite\n# tags: [cheap, memory] # 低成本后台任务 / 记忆 dreaming\n#\n# 可用 tags: primary / cheap / memory / embedding / reranker / vision\n\n# ── Memory ─────────────────────────────────────────────\n# 长期记忆检索和 embedding 配置。默认只启用 SQLite FTS;vector/hybrid\n# 需要显式开启,并在 providers.models 中配置带 embedding tag 的模型。\n#\n# memory:\n# enabled: true\n# retrieval:\n# fts_enabled: true\n# vector_enabled: false # 开启后对长期记忆使用 hybrid 检索\n# hybrid_enabled: true\n# vector_backend: json # json / sqlite-vec / none\n# max_injected_items: 5\n# max_injected_chars: 1200\n# embedding:\n# enabled: false\n# model: \"\" # model spec;空则默认找 embedding tag\n# dimensions: 0 # sqlite-vec 后端必须显式填写维度\n# batch_size: 16\n# embed_after_consolidation: true\n# consolidation:\n# rule_based_enabled: true # 是否启用每轮对话后的规则抽取;false 时只保留 dreaming/显式写入\n\n# ── Router ─────────────────────────────────────────────\n# 控制消息路由行为。system_prompt 使用顶层 system_prompt 字段。\n# 以下均为默认值,不写则使用默认值。\n#\n# router:\n# # system_prompt: \"...\" # 与顶层 system_prompt 重复,优先使用顶层字段\n# max_history_turns: 50 # 最大历史轮数\n# agent_enabled: true # 是否启用 Agent\n# command_timeout_seconds: 30.0 # 命令执行超时(秒)\n# command_timeout_message: \"Command timed out. Please try again later.\"\n# group_context:\n# enabled: true # 是否在触发时注入 observed-only 群上下文\n# max_messages: 20 # 最多注入最近多少条未触发群消息\n# ttl_seconds: 900 # 只注入最近 N 秒内的群上下文;0 表示不按时间过滤\n# max_chars: 4000 # 群上下文注入块最大字符数\n"}, "f78d2e3840b928bc493c7fa41e57872aa8e499e6": {"t": 1785761700.0802786, "n": 8010, "h": "1383174cef63fd3b", "c": "# Nahida Bot 配置文件\n# 参见 nahida_bot.core.config.Settings 了解所有可用字段\n\n# ── 应用 ──────────────────────────────────────────────\napp_name: \"Nahida Bot\"\ndebug: false\nlog_level: \"INFO\" # DEBUG / INFO / WARNING / ERROR\n# log_json: true # 设为 true 输出 JSON 格式日志(生产环境推荐)\n\n# ── 服务器 ────────────────────────────────────────────\nhost: \"127.0.0.1\"\nport: 6185\n\n# ── 数据库 ────────────────────────────────────────────\ndb_path: \"./data/nahida.db\"\n\n# ── Workspace ─────────────────────────────────────────\nworkspace_base_dir: \"./data/workspace\"\n\n# ── 插件 ──────────────────────────────────────────────\nplugin_paths:\n - \"./plugins\"\n\n# ── Agent / Router ────────────────────────────────────\nsystem_prompt: \"You are a helpful assistant.\"\n\n# ── LLM Providers(dict 格式,key 即 provider id)───\n# 支持多 provider 配置,每个 provider 有独立的 api_key 和 models 列表。\n# models 的第一个元素是该 provider 的默认模型;每个模型可以是字符串,\n# 也可以是 {name, capabilities} 对象。通过 /model 命令可在聊天中切换模型。\n#\n# providers:\n# deepseek-main:\n# type: deepseek\n# api_key: \"${DEEPSEEK_API_KEY}\"\n# # 内部使用 SSE 接收并聚合,降低长推理被误判为读超时的概率。\n# # 不会改变 channel 的发送方式;仍由 AgentLoop 聚合后返回。\n# stream_responses: true\n# models: [\"deepseek-chat\", \"deepseek-reasoner\"]\n# glm:\n# type: glm\n# api_key: \"${GLM_API_KEY}\"\n# models: [\"glm-4-flash\", \"glm-4-plus\"]\n# vision:\n# type: openai-compatible\n# api_key: \"${VISION_API_KEY}\"\n# base_url: \"${VISION_BASE_URL}\"\n# models:\n# - name: \"vision-model\"\n# capabilities:\n# image_input: true\n# max_image_count: 4\n#\n# default_provider: deepseek-main # 可选,默认使用第一个 key\n\nproviders:\n default:\n type: \"openai-compatible\"\n api_key: \"${LLM_API_KEY}\"\n base_url: \"${LLM_BASE_URL}\"\n # 建议开启:provider 内部流式接收并聚合返回,适合长推理/重任务。\n # 支持 openai-compatible/deepseek/glm/groq/anthropic/minimax/openai-responses。\n stream_responses: true\n models:\n - \"${LLM_MODEL}\"\n\ndefault_provider: default\n\n# ── 多模态 / 图片理解 ─────────────────────────────────\n# 主模型有 models[].capabilities.image_input=true 时会直接传图;\n# 主模型没有 image_input 时,按 image_fallback_mode 决定是否调用 fallback vision。\nmultimodal:\n image_fallback_mode: \"auto\" # auto / tool / off\n media_context_policy: \"cache_aware\" # cache_aware / native_recent / description_only\n image_fallback_provider: \"\" # Legacy;建议留空\n image_fallback_model: \"\" # model spec;空则默认找 vision tag\n max_images_per_turn: 4\n max_image_bytes: 10485760\n media_cache_ttl_seconds: 3600\n\n# ── 插件配置 ──────────────────────────────────────────\n# Settings 的 extra=\"allow\" 机制:顶层 key 如果不是已知字段,\n# 且值为 dict,则按 plugin id 匹配并注入到对应插件的 manifest.config 中。\n\ntelegram:\n bot_token: \"${TELEGRAM_BOT_TOKEN}\"\n # group_trigger_mode: \"always\" # always / mention / command\n # group_context_capture: false # mention/command 模式下,是否记录未触发群消息作为上下文\n # proxy: \"${TELEGRAM_PROXY:}\" # SOCKS5/HTTP 代理,如 socks5://127.0.0.1:1080\n # polling_timeout: 30\n # allowed_chats: []\n\n# Milky QQ Channel(可选)\n# 启用前请先启动 Lagrange.Milky,并确保 nahida_bot/channels/milky/plugin.yaml\n# 可被内置 channel discovery 扫描到。保持注释状态不会启用 Milky。\n#\n# milky:\n# base_url: \"http://127.0.0.1:3000\"\n# access_token: \"${MILKY_ACCESS_TOKEN}\"\n# api_prefix: \"/api\"\n# event_path: \"/event\"\n# # ws_url: \"ws://127.0.0.1:3000/event\" # 可选:覆盖由 base_url 推导出的 WS 地址\n# command_prefix: \"/\"\n# group_trigger_mode: \"mention\" # mention / command / always\n# group_context_capture: false # true 时,未 at/非命令的群消息只记录为上下文,不触发回复\n# allowed_friends: [] # QQ 号白名单;空列表表示不限制\n# allowed_groups: [] # 群号白名单;空列表表示不限制\n# connect_timeout: 10.0\n# heartbeat_timeout: 30.0\n# reconnect_initial_delay: 1.0\n# reconnect_max_delay: 30.0\n# send_retry_attempts: 3\n# send_retry_backoff: 1.0\n# max_text_length: 4000\n# media_download_dir: \"./data/temp/media\"\n# enable_media_download_tool: true\n# resource_url_ttl_hint: 300\n# cache_media_on_receive: true\n# max_forward_depth: 3\n# max_forward_messages: 80\n# forward_render_max_chars: 12000\n# scene_cache_size: 4096\n\n# ── Agent Loop ──────────────────────────────────────────\n# 控制 Agent 循环的行为:迭代轮数、超时、重试策略等。\n# 以下均为默认值,不写则使用默认值。\n#\n# agent:\n# max_steps: 8 # 最大工具调用迭代轮数\n# provider_timeout_seconds: 30.0 # 单次 LLM 调用超时(秒)\n# retry_attempts: 2 # LLM 调用重试次数\n# retry_backoff_seconds: 0.2 # 重试退避间隔(秒)\n# tool_timeout_seconds: 135.0 # 工具执行超时(秒)\n# tool_retry_attempts: 1 # 工具执行重试次数\n# tool_retry_backoff_seconds: 0.1 # 工具重试退避间隔(秒)\n# max_tool_log_chars: 400 # 工具日志截断长度\n# # tool_use_system_prompt: \"...\" # 注入的工具使用提示\n# # provider_error_template: \"...\" # Provider 错误消息模板\n\n# ── Context Budget ──────────────────────────────────────\n# 控制上下文窗口大小和 reasoning chain 预算。\n# 以下均为默认值,不写则使用默认值。\n#\n# context:\n# max_tokens: 8000 # 最大 token 预算\n# reserved_tokens: 1000 # 为输出保留的 token\n# # max_chars: null # 字符数上限(兼容旧逻辑,优先使用 max_tokens)\n# # reserved_chars: 0 # 字符保留数\n# summary_max_chars: 600 # 历史摘要最大字符数\n# reasoning_policy: \"budget\" # strip / append / budget\n# max_reasoning_tokens: 2000 # reasoning chain token 预算\n\n# ── Scheduler ──────────────────────────────────────────\n# 控制定时任务调度行为。\n# 以下均为默认值,不写则使用默认值。\n#\n# scheduler:\n# poll_interval_seconds: 1.0 # 调度轮询间隔(秒)\n# max_concurrent_fires: 5 # 最大并发执行数\n# job_timeout_seconds: 120.0 # 单任务超时(秒)\n# min_interval_seconds: 60 # cron 最小间隔(秒)\n# max_prompt_chars: 4000 # 定时任务 prompt 最大字符数\n# max_jobs_per_chat: 20 # 每个会话最大任务数\n# failure_retry_seconds: 300 # 失败重试等待(秒)\n# max_consecutive_failures: 3 # 连续失败上限\n# memory_dreaming_enabled: true # 是否启用内部记忆 dreaming\n# memory_dreaming_interval_seconds: 3600 # dreaming 周期(秒)\n# memory_dreaming_initial_delay_seconds: 300 # 启动后首次 dreaming 延迟(秒)\n# memory_dreaming_session_limit: 20 # 单次最多扫描会话数\n# memory_dreaming_recent_turn_limit: 40 # 单会话最多读取 turns 数\n# memory_dreaming_provider_id: \"\" # Legacy;建议改用 memory_dreaming_model\n# memory_dreaming_model: \"\" # model spec;空则默认找 memory tag,失败后走会话模型\n\n# ── Model Tags / Specs ─────────────────────────────────\n# providers 的 models 中可以用 tags 字段标记模型角色。\n# 需要内部模型的配置项都接受一个 model spec 字符串;这个字符串可以是 tag,\n# 也可以是 provider/model 或裸模型名。\n# models:\n# - name: deepseek-chat\n# tags: [primary] # 主对话模型(隐式:每个 provider 的第一个模型)\n# - name: deepseek-chat-lite\n# tags: [cheap, memory] # 低成本后台任务 / 记忆 dreaming\n#\n# 可用 tags: primary / cheap / memory / embedding / reranker / vision\n\n# ── Memory ─────────────────────────────────────────────\n# 长期记忆检索和 embedding 配置。默认只启用 SQLite FTS;vector/hybrid\n# 需要显式开启,并在 providers.models 中配置带 embedding tag 的模型。\n#\n# memory:\n# enabled: true\n# retrieval:\n# fts_enabled: true\n# vector_enabled: false # 开启后对长期记忆使用 hybrid 检索\n# hybrid_enabled: true\n# vector_backend: json # json / sqlite-vec / none\n# max_injected_items: 5\n# max_injected_chars: 1200\n# embedding:\n# enabled: false\n# model: \"\" # model spec;空则默认找 embedding tag\n# dimensions: 0 # sqlite-vec 后端必须显式填写维度\n# batch_size: 16\n# embed_after_consolidation: true\n\n# ── Router ─────────────────────────────────────────────\n# 控制消息路由行为。system_prompt 使用顶层 system_prompt 字段。\n# 以下均为默认值,不写则使用默认值。\n#\n# router:\n# # system_prompt: \"...\" # 与顶层 system_prompt 重复,优先使用顶层字段\n# max_history_turns: 50 # 最大历史轮数\n# agent_enabled: true # 是否启用 Agent\n# command_timeout_seconds: 30.0 # 命令执行超时(秒)\n# command_timeout_message: \"Command timed out. Please try again later.\"\n# group_context:\n# enabled: true # 是否在触发时注入 observed-only 群上下文\n# max_messages: 20 # 最多注入最近多少条未触发群消息\n# ttl_seconds: 900 # 只注入最近 N 秒内的群上下文;0 表示不按时间过滤\n# max_chars: 4000 # 群上下文注入块最大字符数\n"}, "32e795c898a4d073498093bc6c5db197cea025df": {"t": 1785761701.4710155, "n": 7526, "h": "9811f74556766471", "c": "# Nahida Bot 配置文件\n# 参见 nahida_bot.core.config.Settings 了解所有可用字段\n\n# ── 应用 ──────────────────────────────────────────────\napp_name: \"Nahida Bot\"\ndebug: false\nlog_level: \"INFO\" # DEBUG / INFO / WARNING / ERROR\n# log_json: true # 设为 true 输出 JSON 格式日志(生产环境推荐)\n\n# ── 服务器 ────────────────────────────────────────────\nhost: \"127.0.0.1\"\nport: 6185\n\n# ── 数据库 ────────────────────────────────────────────\ndb_path: \"./data/nahida.db\"\n\n# ── Workspace ─────────────────────────────────────────\nworkspace_base_dir: \"./data/workspace\"\n\n# ── 插件 ──────────────────────────────────────────────\nplugin_paths:\n - \"./plugins\"\n\n# ── Agent / Router ────────────────────────────────────\nsystem_prompt: \"You are a helpful assistant.\"\n\n# ── LLM Providers(dict 格式,key 即 provider id)───\n# 支持多 provider 配置,每个 provider 有独立的 api_key 和 models 列表。\n# models 的第一个元素是该 provider 的默认模型;每个模型可以是字符串,\n# 也可以是 {name, capabilities} 对象。通过 /model 命令可在聊天中切换模型。\n#\n# providers:\n# deepseek-main:\n# type: deepseek\n# api_key: \"${DEEPSEEK_API_KEY}\"\n# # 内部使用 SSE 接收并聚合,降低长推理被误判为读超时的概率。\n# # 不会改变 channel 的发送方式;仍由 AgentLoop 聚合后返回。\n# stream_responses: true\n# models: [\"deepseek-chat\", \"deepseek-reasoner\"]\n# glm:\n# type: glm\n# api_key: \"${GLM_API_KEY}\"\n# models: [\"glm-4-flash\", \"glm-4-plus\"]\n# vision:\n# type: openai-compatible\n# api_key: \"${VISION_API_KEY}\"\n# base_url: \"${VISION_BASE_URL}\"\n# models:\n# - name: \"vision-model\"\n# capabilities:\n# image_input: true\n# max_image_count: 4\n#\n# default_provider: deepseek-main # 可选,默认使用第一个 key\n\nproviders:\n default:\n type: \"openai-compatible\"\n api_key: \"${LLM_API_KEY}\"\n base_url: \"${LLM_BASE_URL}\"\n # 建议开启:provider 内部流式接收并聚合返回,适合长推理/重任务。\n # 支持 openai-compatible/deepseek/glm/groq/anthropic/minimax/openai-responses。\n stream_responses: true\n models:\n - \"${LLM_MODEL}\"\n\ndefault_provider: default\n\n# ── 多模态 / 图片理解 ─────────────────────────────────\n# 主模型有 models[].capabilities.image_input=true 时会直接传图;\n# 主模型没有 image_input 时,按 image_fallback_mode 决定是否调用 fallback vision。\nmultimodal:\n image_fallback_mode: \"auto\" # auto / tool / off\n media_context_policy: \"cache_aware\" # cache_aware / native_recent / description_only\n image_fallback_provider: \"\" # Legacy;建议留空\n image_fallback_model: \"\" # model spec;空则默认找 vision tag\n max_images_per_turn: 4\n max_image_bytes: 10485760\n media_cache_ttl_seconds: 3600\n\n# ── 插件配置 ──────────────────────────────────────────\n# Settings 的 extra=\"allow\" 机制:顶层 key 如果不是已知字段,\n# 且值为 dict,则按 plugin id 匹配并注入到对应插件的 manifest.config 中。\n\ntelegram:\n bot_token: \"${TELEGRAM_BOT_TOKEN}\"\n # proxy: \"${TELEGRAM_PROXY:}\" # SOCKS5/HTTP 代理,如 socks5://127.0.0.1:1080\n # polling_timeout: 30\n # allowed_chats: []\n\n# Milky QQ Channel(可选)\n# 启用前请先启动 Lagrange.Milky,并确保 nahida_bot/channels/milky/plugin.yaml\n# 可被内置 channel discovery 扫描到。保持注释状态不会启用 Milky。\n#\n# milky:\n# base_url: \"http://127.0.0.1:3000\"\n# access_token: \"${MILKY_ACCESS_TOKEN}\"\n# api_prefix: \"/api\"\n# event_path: \"/event\"\n# # ws_url: \"ws://127.0.0.1:3000/event\" # 可选:覆盖由 base_url 推导出的 WS 地址\n# command_prefix: \"/\"\n# group_trigger_mode: \"mention\" # mention / command / always\n# allowed_friends: [] # QQ 号白名单;空列表表示不限制\n# allowed_groups: [] # 群号白名单;空列表表示不限制\n# connect_timeout: 10.0\n# heartbeat_timeout: 30.0\n# reconnect_initial_delay: 1.0\n# reconnect_max_delay: 30.0\n# send_retry_attempts: 3\n# send_retry_backoff: 1.0\n# max_text_length: 4000\n# media_download_dir: \"./data/temp/media\"\n# enable_media_download_tool: true\n# resource_url_ttl_hint: 300\n# cache_media_on_receive: true\n# max_forward_depth: 3\n# max_forward_messages: 80\n# forward_render_max_chars: 12000\n# scene_cache_size: 4096\n\n# ── Agent Loop ──────────────────────────────────────────\n# 控制 Agent 循环的行为:迭代轮数、超时、重试策略等。\n# 以下均为默认值,不写则使用默认值。\n#\n# agent:\n# max_steps: 8 # 最大工具调用迭代轮数\n# provider_timeout_seconds: 30.0 # 单次 LLM 调用超时(秒)\n# retry_attempts: 2 # LLM 调用重试次数\n# retry_backoff_seconds: 0.2 # 重试退避间隔(秒)\n# tool_timeout_seconds: 135.0 # 工具执行超时(秒)\n# tool_retry_attempts: 1 # 工具执行重试次数\n# tool_retry_backoff_seconds: 0.1 # 工具重试退避间隔(秒)\n# max_tool_log_chars: 400 # 工具日志截断长度\n# # tool_use_system_prompt: \"...\" # 注入的工具使用提示\n# # provider_error_template: \"...\" # Provider 错误消息模板\n\n# ── Context Budget ──────────────────────────────────────\n# 控制上下文窗口大小和 reasoning chain 预算。\n# 以下均为默认值,不写则使用默认值。\n#\n# context:\n# max_tokens: 8000 # 最大 token 预算\n# reserved_tokens: 1000 # 为输出保留的 token\n# # max_chars: null # 字符数上限(兼容旧逻辑,优先使用 max_tokens)\n# # reserved_chars: 0 # 字符保留数\n# summary_max_chars: 600 # 历史摘要最大字符数\n# reasoning_policy: \"budget\" # strip / append / budget\n# max_reasoning_tokens: 2000 # reasoning chain token 预算\n\n# ── Scheduler ──────────────────────────────────────────\n# 控制定时任务调度行为。\n# 以下均为默认值,不写则使用默认值。\n#\n# scheduler:\n# poll_interval_seconds: 1.0 # 调度轮询间隔(秒)\n# max_concurrent_fires: 5 # 最大并发执行数\n# job_timeout_seconds: 120.0 # 单任务超时(秒)\n# min_interval_seconds: 60 # cron 最小间隔(秒)\n# max_prompt_chars: 4000 # 定时任务 prompt 最大字符数\n# max_jobs_per_chat: 20 # 每个会话最大任务数\n# failure_retry_seconds: 300 # 失败重试等待(秒)\n# max_consecutive_failures: 3 # 连续失败上限\n# memory_dreaming_enabled: true # 是否启用内部记忆 dreaming\n# memory_dreaming_interval_seconds: 3600 # dreaming 周期(秒)\n# memory_dreaming_initial_delay_seconds: 300 # 启动后首次 dreaming 延迟(秒)\n# memory_dreaming_session_limit: 20 # 单次最多扫描会话数\n# memory_dreaming_recent_turn_limit: 40 # 单会话最多读取 turns 数\n# memory_dreaming_provider_id: \"\" # Legacy;建议改用 memory_dreaming_model\n# memory_dreaming_model: \"\" # model spec;空则默认找 memory tag,失败后走会话模型\n\n# ── Model Tags / Specs ─────────────────────────────────\n# providers 的 models 中可以用 tags 字段标记模型角色。\n# 需要内部模型的配置项都接受一个 model spec 字符串;这个字符串可以是 tag,\n# 也可以是 provider/model 或裸模型名。\n# models:\n# - name: deepseek-chat\n# tags: [primary] # 主对话模型(隐式:每个 provider 的第一个模型)\n# - name: deepseek-chat-lite\n# tags: [cheap, memory] # 低成本后台任务 / 记忆 dreaming\n#\n# 可用 tags: primary / cheap / memory / embedding / reranker / vision\n\n# ── Memory ─────────────────────────────────────────────\n# 长期记忆检索和 embedding 配置。默认只启用 SQLite FTS;vector/hybrid\n# 需要显式开启,并在 providers.models 中配置带 embedding tag 的模型。\n#\n# memory:\n# enabled: true\n# retrieval:\n# fts_enabled: true\n# vector_enabled: false # 开启后对长期记忆使用 hybrid 检索\n# hybrid_enabled: true\n# vector_backend: json # json / sqlite-vec / none\n# max_injected_items: 5\n# max_injected_chars: 1200\n# embedding:\n# enabled: false\n# model: \"\" # model spec;空则默认找 embedding tag\n# dimensions: 0 # sqlite-vec 后端必须显式填写维度\n# batch_size: 16\n# embed_after_consolidation: true\n\n# ── Router ─────────────────────────────────────────────\n# 控制消息路由行为。system_prompt 使用顶层 system_prompt 字段。\n# 以下均为默认值,不写则使用默认值。\n#\n# router:\n# # system_prompt: \"...\" # 与顶层 system_prompt 重复,优先使用顶层字段\n# max_history_turns: 50 # 最大历史轮数\n# agent_enabled: true # 是否启用 Agent\n# command_timeout_seconds: 30.0 # 命令执行超时(秒)\n# command_timeout_message: \"Command timed out. Please try again later.\"\n"}, "1b1eec512e309066ca3628a886a083c82b1836e9": {"t": 1785761702.8639734, "n": 7987, "h": "aef4afc2757aa60d", "c": "# Nahida Bot 配置文件\n# 参见 nahida_bot.core.config.Settings 了解所有可用字段\n\n# ── 应用 ──────────────────────────────────────────────\napp_name: \"Nahida Bot\"\ndebug: false\nlog_level: \"INFO\" # DEBUG / INFO / WARNING / ERROR\n# log_json: true # 设为 true 输出 JSON 格式日志(生产环境推荐)\n\n# ── 服务器 ────────────────────────────────────────────\nhost: \"127.0.0.1\"\nport: 6185\n\n# ── 数据库 ────────────────────────────────────────────\ndb_path: \"./data/nahida.db\"\n\n# ── Workspace ─────────────────────────────────────────\nworkspace_base_dir: \"./data/workspace\"\n\n# ── 插件 ──────────────────────────────────────────────\nplugin_paths:\n - \"./plugins\"\n\n# ── Agent / Router ────────────────────────────────────\nsystem_prompt: \"You are a helpful assistant.\"\n\n# ── LLM Providers(dict 格式,key 即 provider id)───\n# 支持多 provider 配置,每个 provider 有独立的 api_key 和 models 列表。\n# models 的第一个元素是该 provider 的默认模型;每个模型可以是字符串,\n# 也可以是 {name, capabilities} 对象。通过 /model 命令可在聊天中切换模型。\n#\n# providers:\n# deepseek-main:\n# type: deepseek\n# api_key: \"${DEEPSEEK_API_KEY}\"\n# # 内部使用 SSE 接收并聚合,降低长推理被误判为读超时的概率。\n# # 不会改变 channel 的发送方式;仍由 AgentLoop 聚合后返回。\n# stream_responses: true\n# models: [\"deepseek-chat\", \"deepseek-reasoner\"]\n# glm:\n# type: glm\n# api_key: \"${GLM_API_KEY}\"\n# models: [\"glm-4-flash\", \"glm-4-plus\"]\n# vision:\n# type: openai-compatible\n# api_key: \"${VISION_API_KEY}\"\n# base_url: \"${VISION_BASE_URL}\"\n# models:\n# - name: \"vision-model\"\n# capabilities:\n# image_input: true\n# max_image_count: 4\n#\n# default_provider: deepseek-main # 可选,默认使用第一个 key\n\nproviders:\n default:\n type: \"openai-compatible\"\n api_key: \"${LLM_API_KEY}\"\n base_url: \"${LLM_BASE_URL}\"\n # 建议开启:provider 内部流式接收并聚合返回,适合长推理/重任务。\n # 支持 openai-compatible/deepseek/glm/groq/anthropic/minimax/openai-responses。\n stream_responses: true\n models:\n - \"${LLM_MODEL}\"\n\ndefault_provider: default\n\n# ── 多模态 / 图片理解 ─────────────────────────────────\n# 主模型有 models[].capabilities.image_input=true 时会直接传图;\n# 主模型没有 image_input 时,按 image_fallback_mode 决定是否调用 fallback vision。\nmultimodal:\n image_fallback_mode: \"auto\" # auto / tool / off\n media_context_policy: \"cache_aware\" # cache_aware / native_recent / description_only\n image_fallback_provider: \"\" # 例如 \"vision\"\n image_fallback_model: \"\" # 例如 \"vision-model\"\n max_images_per_turn: 4\n max_image_bytes: 10485760\n media_cache_ttl_seconds: 3600\n\n# ── 插件配置 ──────────────────────────────────────────\n# Settings 的 extra=\"allow\" 机制:顶层 key 如果不是已知字段,\n# 且值为 dict,则按 plugin id 匹配并注入到对应插件的 manifest.config 中。\n\ntelegram:\n bot_token: \"${TELEGRAM_BOT_TOKEN}\"\n # proxy: \"${TELEGRAM_PROXY:}\" # SOCKS5/HTTP 代理,如 socks5://127.0.0.1:1080\n # polling_timeout: 30\n # allowed_chats: []\n\n# Milky QQ Channel(可选)\n# 启用前请先启动 Lagrange.Milky,并确保 nahida_bot/channels/milky/plugin.yaml\n# 可被内置 channel discovery 扫描到。保持注释状态不会启用 Milky。\n#\n# milky:\n# base_url: \"http://127.0.0.1:3000\"\n# access_token: \"${MILKY_ACCESS_TOKEN}\"\n# api_prefix: \"/api\"\n# event_path: \"/event\"\n# # ws_url: \"ws://127.0.0.1:3000/event\" # 可选:覆盖由 base_url 推导出的 WS 地址\n# command_prefix: \"/\"\n# group_trigger_mode: \"mention\" # mention / command / always\n# allowed_friends: [] # QQ 号白名单;空列表表示不限制\n# allowed_groups: [] # 群号白名单;空列表表示不限制\n# connect_timeout: 10.0\n# heartbeat_timeout: 30.0\n# reconnect_initial_delay: 1.0\n# reconnect_max_delay: 30.0\n# send_retry_attempts: 3\n# send_retry_backoff: 1.0\n# max_text_length: 4000\n# media_download_dir: \"./data/temp/media\"\n# enable_media_download_tool: true\n# resource_url_ttl_hint: 300\n# cache_media_on_receive: true\n# max_forward_depth: 3\n# max_forward_messages: 80\n# forward_render_max_chars: 12000\n# scene_cache_size: 4096\n\n# ── Agent Loop ──────────────────────────────────────────\n# 控制 Agent 循环的行为:迭代轮数、超时、重试策略等。\n# 以下均为默认值,不写则使用默认值。\n#\n# agent:\n# max_steps: 8 # 最大工具调用迭代轮数\n# provider_timeout_seconds: 30.0 # 单次 LLM 调用超时(秒)\n# retry_attempts: 2 # LLM 调用重试次数\n# retry_backoff_seconds: 0.2 # 重试退避间隔(秒)\n# tool_timeout_seconds: 135.0 # 工具执行超时(秒)\n# tool_retry_attempts: 1 # 工具执行重试次数\n# tool_retry_backoff_seconds: 0.1 # 工具重试退避间隔(秒)\n# max_tool_log_chars: 400 # 工具日志截断长度\n# # tool_use_system_prompt: \"...\" # 注入的工具使用提示\n# # provider_error_template: \"...\" # Provider 错误消息模板\n\n# ── Context Budget ──────────────────────────────────────\n# 控制上下文窗口大小和 reasoning chain 预算。\n# 以下均为默认值,不写则使用默认值。\n#\n# context:\n# max_tokens: 8000 # 最大 token 预算\n# reserved_tokens: 1000 # 为输出保留的 token\n# # max_chars: null # 字符数上限(兼容旧逻辑,优先使用 max_tokens)\n# # reserved_chars: 0 # 字符保留数\n# summary_max_chars: 600 # 历史摘要最大字符数\n# reasoning_policy: \"budget\" # strip / append / budget\n# max_reasoning_tokens: 2000 # reasoning chain token 预算\n\n# ── Scheduler ──────────────────────────────────────────\n# 控制定时任务调度行为。\n# 以下均为默认值,不写则使用默认值。\n#\n# scheduler:\n# poll_interval_seconds: 1.0 # 调度轮询间隔(秒)\n# max_concurrent_fires: 5 # 最大并发执行数\n# job_timeout_seconds: 120.0 # 单任务超时(秒)\n# min_interval_seconds: 60 # cron 最小间隔(秒)\n# max_prompt_chars: 4000 # 定时任务 prompt 最大字符数\n# max_jobs_per_chat: 20 # 每个会话最大任务数\n# failure_retry_seconds: 300 # 失败重试等待(秒)\n# max_consecutive_failures: 3 # 连续失败上限\n# memory_dreaming_enabled: true # 是否启用内部记忆 dreaming\n# memory_dreaming_interval_seconds: 3600 # dreaming 周期(秒)\n# memory_dreaming_initial_delay_seconds: 300 # 启动后首次 dreaming 延迟(秒)\n# memory_dreaming_session_limit: 20 # 单次最多扫描会话数\n# memory_dreaming_recent_turn_limit: 40 # 单会话最多读取 turns 数\n# memory_dreaming_provider_id: \"\" # 专用 provider;空则使用会话当前 provider\n# memory_dreaming_model: \"\" # 专用模型;空则走 model_routing 或会话当前模型\n\n# ── Model Routing ──────────────────────────────────────\n# 按任务类型自动路由到打了 tag 的模型。\n# providers 的 models 中可以用 tags 字段标记模型角色:\n# models:\n# - name: deepseek-chat\n# tags: [primary] # 主对话模型(隐式:每个 provider 的第一个模型)\n# - name: deepseek-chat-lite\n# tags: [cheap, memory] # 低成本后台任务 / 记忆 dreaming\n#\n# 可用 tags: primary / cheap / memory / embedding / reranker / vision\n#\n# model_routing 中的每个任务条目:\n# prefer_tags: 按顺序匹配,找到第一个有此 tag 的模型\n# fallback: 没有匹配时如何处理\n# - session: 使用当前会话的 provider(默认)\n# - default: 使用默认 provider\n# - disabled / none: 不使用任何模型\n#\n# model_routing:\n# memory_dreaming:\n# prefer_tags: [memory, cheap]\n# fallback: session\n# embedding:\n# prefer_tags: [embedding]\n# fallback: none\n# reranker:\n# prefer_tags: [reranker, cheap]\n# fallback: disabled\n\n# ── Memory ─────────────────────────────────────────────\n# 长期记忆检索和 embedding 配置。默认只启用 SQLite FTS;vector/hybrid\n# 需要显式开启,并在 providers.models 中配置带 embedding tag 的模型。\n#\n# memory:\n# enabled: true\n# retrieval:\n# fts_enabled: true\n# vector_enabled: false # 开启后对长期记忆使用 hybrid 检索\n# hybrid_enabled: true\n# vector_backend: json # json / sqlite-vec / none\n# max_injected_items: 5\n# max_injected_chars: 1200\n# embedding:\n# enabled: false\n# provider_id: \"\" # 可选;为空则走 model_routing.embedding\n# model: \"\" # 可选;通常使用 tagged embedding 模型\n# dimensions: 0 # sqlite-vec 后端必须显式填写维度\n# batch_size: 16\n# embed_after_consolidation: true\n\n# ── Router ─────────────────────────────────────────────\n# 控制消息路由行为。system_prompt 使用顶层 system_prompt 字段。\n# 以下均为默认值,不写则使用默认值。\n#\n# router:\n# # system_prompt: \"...\" # 与顶层 system_prompt 重复,优先使用顶层字段\n# max_history_turns: 50 # 最大历史轮数\n# agent_enabled: true # 是否启用 Agent\n# command_timeout_seconds: 30.0 # 命令执行超时(秒)\n# command_timeout_message: \"Command timed out. Please try again later.\"\n"}, "af80aa8256de3e1565ce6f0618cd19caf6247a02": {"t": 1785761704.1841903, "n": 7263, "h": "311254457b79db30", "c": "# Nahida Bot 配置文件\n# 参见 nahida_bot.core.config.Settings 了解所有可用字段\n\n# ── 应用 ──────────────────────────────────────────────\napp_name: \"Nahida Bot\"\ndebug: false\nlog_level: \"INFO\" # DEBUG / INFO / WARNING / ERROR\n# log_json: true # 设为 true 输出 JSON 格式日志(生产环境推荐)\n\n# ── 服务器 ────────────────────────────────────────────\nhost: \"127.0.0.1\"\nport: 6185\n\n# ── 数据库 ────────────────────────────────────────────\ndb_path: \"./data/nahida.db\"\n\n# ── Workspace ─────────────────────────────────────────\nworkspace_base_dir: \"./data/workspace\"\n\n# ── 插件 ──────────────────────────────────────────────\nplugin_paths:\n - \"./plugins\"\n\n# ── Agent / Router ────────────────────────────────────\nsystem_prompt: \"You are a helpful assistant.\"\n\n# ── LLM Providers(dict 格式,key 即 provider id)───\n# 支持多 provider 配置,每个 provider 有独立的 api_key 和 models 列表。\n# models 的第一个元素是该 provider 的默认模型;每个模型可以是字符串,\n# 也可以是 {name, capabilities} 对象。通过 /model 命令可在聊天中切换模型。\n#\n# providers:\n# deepseek-main:\n# type: deepseek\n# api_key: \"${DEEPSEEK_API_KEY}\"\n# # 内部使用 SSE 接收并聚合,降低长推理被误判为读超时的概率。\n# # 不会改变 channel 的发送方式;仍由 AgentLoop 聚合后返回。\n# stream_responses: true\n# models: [\"deepseek-chat\", \"deepseek-reasoner\"]\n# glm:\n# type: glm\n# api_key: \"${GLM_API_KEY}\"\n# models: [\"glm-4-flash\", \"glm-4-plus\"]\n# vision:\n# type: openai-compatible\n# api_key: \"${VISION_API_KEY}\"\n# base_url: \"${VISION_BASE_URL}\"\n# models:\n# - name: \"vision-model\"\n# capabilities:\n# image_input: true\n# max_image_count: 4\n#\n# default_provider: deepseek-main # 可选,默认使用第一个 key\n\nproviders:\n default:\n type: \"openai-compatible\"\n api_key: \"${LLM_API_KEY}\"\n base_url: \"${LLM_BASE_URL}\"\n # 建议开启:provider 内部流式接收并聚合返回,适合长推理/重任务。\n # 支持 openai-compatible/deepseek/glm/groq/anthropic/minimax/openai-responses。\n stream_responses: true\n models:\n - \"${LLM_MODEL}\"\n\ndefault_provider: default\n\n# ── 多模态 / 图片理解 ─────────────────────────────────\n# 主模型有 models[].capabilities.image_input=true 时会直接传图;\n# 主模型没有 image_input 时,按 image_fallback_mode 决定是否调用 fallback vision。\nmultimodal:\n image_fallback_mode: \"auto\" # auto / tool / off\n media_context_policy: \"cache_aware\" # cache_aware / native_recent / description_only\n image_fallback_provider: \"\" # 例如 \"vision\"\n image_fallback_model: \"\" # 例如 \"vision-model\"\n max_images_per_turn: 4\n max_image_bytes: 10485760\n media_cache_ttl_seconds: 3600\n\n# ── 插件配置 ──────────────────────────────────────────\n# Settings 的 extra=\"allow\" 机制:顶层 key 如果不是已知字段,\n# 且值为 dict,则按 plugin id 匹配并注入到对应插件的 manifest.config 中。\n\ntelegram:\n bot_token: \"${TELEGRAM_BOT_TOKEN}\"\n # proxy: \"${TELEGRAM_PROXY:}\" # SOCKS5/HTTP 代理,如 socks5://127.0.0.1:1080\n # polling_timeout: 30\n # allowed_chats: []\n\n# Milky QQ Channel(可选)\n# 启用前请先启动 Lagrange.Milky,并确保 nahida_bot/channels/milky/plugin.yaml\n# 可被内置 channel discovery 扫描到。保持注释状态不会启用 Milky。\n#\n# milky:\n# base_url: \"http://127.0.0.1:3000\"\n# access_token: \"${MILKY_ACCESS_TOKEN}\"\n# api_prefix: \"/api\"\n# event_path: \"/event\"\n# # ws_url: \"ws://127.0.0.1:3000/event\" # 可选:覆盖由 base_url 推导出的 WS 地址\n# command_prefix: \"/\"\n# group_trigger_mode: \"mention\" # mention / command / always\n# allowed_friends: [] # QQ 号白名单;空列表表示不限制\n# allowed_groups: [] # 群号白名单;空列表表示不限制\n# connect_timeout: 10.0\n# heartbeat_timeout: 30.0\n# reconnect_initial_delay: 1.0\n# reconnect_max_delay: 30.0\n# send_retry_attempts: 3\n# send_retry_backoff: 1.0\n# max_text_length: 4000\n# media_download_dir: \"./data/temp/media\"\n# enable_media_download_tool: true\n# resource_url_ttl_hint: 300\n# cache_media_on_receive: true\n# max_forward_depth: 3\n# max_forward_messages: 80\n# forward_render_max_chars: 12000\n# scene_cache_size: 4096\n\n# ── Agent Loop ──────────────────────────────────────────\n# 控制 Agent 循环的行为:迭代轮数、超时、重试策略等。\n# 以下均为默认值,不写则使用默认值。\n#\n# agent:\n# max_steps: 8 # 最大工具调用迭代轮数\n# provider_timeout_seconds: 30.0 # 单次 LLM 调用超时(秒)\n# retry_attempts: 2 # LLM 调用重试次数\n# retry_backoff_seconds: 0.2 # 重试退避间隔(秒)\n# tool_timeout_seconds: 135.0 # 工具执行超时(秒)\n# tool_retry_attempts: 1 # 工具执行重试次数\n# tool_retry_backoff_seconds: 0.1 # 工具重试退避间隔(秒)\n# max_tool_log_chars: 400 # 工具日志截断长度\n# # tool_use_system_prompt: \"...\" # 注入的工具使用提示\n# # provider_error_template: \"...\" # Provider 错误消息模板\n\n# ── Context Budget ──────────────────────────────────────\n# 控制上下文窗口大小和 reasoning chain 预算。\n# 以下均为默认值,不写则使用默认值。\n#\n# context:\n# max_tokens: 8000 # 最大 token 预算\n# reserved_tokens: 1000 # 为输出保留的 token\n# # max_chars: null # 字符数上限(兼容旧逻辑,优先使用 max_tokens)\n# # reserved_chars: 0 # 字符保留数\n# summary_max_chars: 600 # 历史摘要最大字符数\n# reasoning_policy: \"budget\" # strip / append / budget\n# max_reasoning_tokens: 2000 # reasoning chain token 预算\n\n# ── Scheduler ──────────────────────────────────────────\n# 控制定时任务调度行为。\n# 以下均为默认值,不写则使用默认值。\n#\n# scheduler:\n# poll_interval_seconds: 1.0 # 调度轮询间隔(秒)\n# max_concurrent_fires: 5 # 最大并发执行数\n# job_timeout_seconds: 120.0 # 单任务超时(秒)\n# min_interval_seconds: 60 # cron 最小间隔(秒)\n# max_prompt_chars: 4000 # 定时任务 prompt 最大字符数\n# max_jobs_per_chat: 20 # 每个会话最大任务数\n# failure_retry_seconds: 300 # 失败重试等待(秒)\n# max_consecutive_failures: 3 # 连续失败上限\n# memory_dreaming_enabled: true # 是否启用内部记忆 dreaming\n# memory_dreaming_interval_seconds: 3600 # dreaming 周期(秒)\n# memory_dreaming_initial_delay_seconds: 300 # 启动后首次 dreaming 延迟(秒)\n# memory_dreaming_session_limit: 20 # 单次最多扫描会话数\n# memory_dreaming_recent_turn_limit: 40 # 单会话最多读取 turns 数\n# memory_dreaming_provider_id: \"\" # 专用 provider;空则使用会话当前 provider\n# memory_dreaming_model: \"\" # 专用模型;空则走 model_routing 或会话当前模型\n\n# ── Model Routing ──────────────────────────────────────\n# 按任务类型自动路由到打了 tag 的模型。\n# providers 的 models 中可以用 tags 字段标记模型角色:\n# models:\n# - name: deepseek-chat\n# tags: [primary] # 主对话模型(隐式:每个 provider 的第一个模型)\n# - name: deepseek-chat-lite\n# tags: [cheap, memory] # 低成本后台任务 / 记忆 dreaming\n#\n# 可用 tags: primary / cheap / memory / embedding / reranker / vision\n#\n# model_routing 中的每个任务条目:\n# prefer_tags: 按顺序匹配,找到第一个有此 tag 的模型\n# fallback: 没有匹配时如何处理\n# - session: 使用当前会话的 provider(默认)\n# - default: 使用默认 provider\n# - disabled / none: 不使用任何模型\n#\n# model_routing:\n# memory_dreaming:\n# prefer_tags: [memory, cheap]\n# fallback: session\n# embedding:\n# prefer_tags: [embedding]\n# fallback: none\n# reranker:\n# prefer_tags: [reranker, cheap]\n# fallback: disabled\n\n# ── Router ─────────────────────────────────────────────\n# 控制消息路由行为。system_prompt 使用顶层 system_prompt 字段。\n# 以下均为默认值,不写则使用默认值。\n#\n# router:\n# # system_prompt: \"...\" # 与顶层 system_prompt 重复,优先使用顶层字段\n# max_history_turns: 50 # 最大历史轮数\n# agent_enabled: true # 是否启用 Agent\n# command_timeout_seconds: 30.0 # 命令执行超时(秒)\n# command_timeout_message: \"Command timed out. Please try again later.\"\n"}, "0b38caa8eb1362938de6f7b4e73d7bfbd3cf40c7": {"t": 1785761706.5602946, "n": 6392, "h": "18fbf634cb82892a", "c": "# Nahida Bot 配置文件\n# 参见 nahida_bot.core.config.Settings 了解所有可用字段\n\n# ── 应用 ──────────────────────────────────────────────\napp_name: \"Nahida Bot\"\ndebug: false\nlog_level: \"INFO\" # DEBUG / INFO / WARNING / ERROR\n# log_json: true # 设为 true 输出 JSON 格式日志(生产环境推荐)\n\n# ── 服务器 ────────────────────────────────────────────\nhost: \"127.0.0.1\"\nport: 6185\n\n# ── 数据库 ────────────────────────────────────────────\ndb_path: \"./data/nahida.db\"\n\n# ── Workspace ─────────────────────────────────────────\nworkspace_base_dir: \"./data/workspace\"\n\n# ── 插件 ──────────────────────────────────────────────\nplugin_paths:\n - \"./plugins\"\n\n# ── Agent / Router ────────────────────────────────────\nsystem_prompt: \"You are a helpful assistant.\"\n\n# ── LLM Providers(dict 格式,key 即 provider id)───\n# 支持多 provider 配置,每个 provider 有独立的 api_key 和 models 列表。\n# models 的第一个元素是该 provider 的默认模型;每个模型可以是字符串,\n# 也可以是 {name, capabilities} 对象。通过 /model 命令可在聊天中切换模型。\n#\n# providers:\n# deepseek-main:\n# type: deepseek\n# api_key: \"${DEEPSEEK_API_KEY}\"\n# # 内部使用 SSE 接收并聚合,降低长推理被误判为读超时的概率。\n# # 不会改变 channel 的发送方式;仍由 AgentLoop 聚合后返回。\n# stream_responses: true\n# models: [\"deepseek-chat\", \"deepseek-reasoner\"]\n# glm:\n# type: glm\n# api_key: \"${GLM_API_KEY}\"\n# models: [\"glm-4-flash\", \"glm-4-plus\"]\n# vision:\n# type: openai-compatible\n# api_key: \"${VISION_API_KEY}\"\n# base_url: \"${VISION_BASE_URL}\"\n# models:\n# - name: \"vision-model\"\n# capabilities:\n# image_input: true\n# max_image_count: 4\n#\n# default_provider: deepseek-main # 可选,默认使用第一个 key\n\nproviders:\n default:\n type: \"openai-compatible\"\n api_key: \"${LLM_API_KEY}\"\n base_url: \"${LLM_BASE_URL}\"\n # 建议开启:provider 内部流式接收并聚合返回,适合长推理/重任务。\n # 支持 openai-compatible/deepseek/glm/groq/anthropic/minimax/openai-responses。\n stream_responses: true\n models:\n - \"${LLM_MODEL}\"\n\ndefault_provider: default\n\n# ── 多模态 / 图片理解 ─────────────────────────────────\n# 主模型有 models[].capabilities.image_input=true 时会直接传图;\n# 主模型没有 image_input 时,按 image_fallback_mode 决定是否调用 fallback vision。\nmultimodal:\n image_fallback_mode: \"auto\" # auto / tool / off\n media_context_policy: \"cache_aware\" # cache_aware / native_recent / description_only\n image_fallback_provider: \"\" # 例如 \"vision\"\n image_fallback_model: \"\" # 例如 \"vision-model\"\n max_images_per_turn: 4\n max_image_bytes: 10485760\n media_cache_ttl_seconds: 3600\n\n# ── 插件配置 ──────────────────────────────────────────\n# Settings 的 extra=\"allow\" 机制:顶层 key 如果不是已知字段,\n# 且值为 dict,则按 plugin id 匹配并注入到对应插件的 manifest.config 中。\n\ntelegram:\n bot_token: \"${TELEGRAM_BOT_TOKEN}\"\n # proxy: \"${TELEGRAM_PROXY:}\" # SOCKS5/HTTP 代理,如 socks5://127.0.0.1:1080\n # polling_timeout: 30\n # allowed_chats: []\n\n# Milky QQ Channel(可选)\n# 启用前请先启动 Lagrange.Milky,并确保 nahida_bot/channels/milky/plugin.yaml\n# 可被内置 channel discovery 扫描到。保持注释状态不会启用 Milky。\n#\n# milky:\n# base_url: \"http://127.0.0.1:3000\"\n# access_token: \"${MILKY_ACCESS_TOKEN}\"\n# api_prefix: \"/api\"\n# event_path: \"/event\"\n# # ws_url: \"ws://127.0.0.1:3000/event\" # 可选:覆盖由 base_url 推导出的 WS 地址\n# command_prefix: \"/\"\n# group_trigger_mode: \"mention\" # mention / command / always\n# allowed_friends: [] # QQ 号白名单;空列表表示不限制\n# allowed_groups: [] # 群号白名单;空列表表示不限制\n# connect_timeout: 10.0\n# heartbeat_timeout: 30.0\n# reconnect_initial_delay: 1.0\n# reconnect_max_delay: 30.0\n# send_retry_attempts: 3\n# send_retry_backoff: 1.0\n# max_text_length: 4000\n# media_download_dir: \"./data/temp/media\"\n# enable_media_download_tool: true\n# resource_url_ttl_hint: 300\n# cache_media_on_receive: true\n# max_forward_depth: 3\n# max_forward_messages: 80\n# forward_render_max_chars: 12000\n# scene_cache_size: 4096\n\n# ── Agent Loop ──────────────────────────────────────────\n# 控制 Agent 循环的行为:迭代轮数、超时、重试策略等。\n# 以下均为默认值,不写则使用默认值。\n#\n# agent:\n# max_steps: 8 # 最大工具调用迭代轮数\n# provider_timeout_seconds: 30.0 # 单次 LLM 调用超时(秒)\n# retry_attempts: 2 # LLM 调用重试次数\n# retry_backoff_seconds: 0.2 # 重试退避间隔(秒)\n# tool_timeout_seconds: 135.0 # 工具执行超时(秒)\n# tool_retry_attempts: 1 # 工具执行重试次数\n# tool_retry_backoff_seconds: 0.1 # 工具重试退避间隔(秒)\n# max_tool_log_chars: 400 # 工具日志截断长度\n# # tool_use_system_prompt: \"...\" # 注入的工具使用提示\n# # provider_error_template: \"...\" # Provider 错误消息模板\n\n# ── Context Budget ──────────────────────────────────────\n# 控制上下文窗口大小和 reasoning chain 预算。\n# 以下均为默认值,不写则使用默认值。\n#\n# context:\n# max_tokens: 8000 # 最大 token 预算\n# reserved_tokens: 1000 # 为输出保留的 token\n# # max_chars: null # 字符数上限(兼容旧逻辑,优先使用 max_tokens)\n# # reserved_chars: 0 # 字符保留数\n# summary_max_chars: 600 # 历史摘要最大字符数\n# reasoning_policy: \"budget\" # strip / append / budget\n# max_reasoning_tokens: 2000 # reasoning chain token 预算\n\n# ── Scheduler ──────────────────────────────────────────\n# 控制定时任务调度行为。\n# 以下均为默认值,不写则使用默认值。\n#\n# scheduler:\n# poll_interval_seconds: 1.0 # 调度轮询间隔(秒)\n# max_concurrent_fires: 5 # 最大并发执行数\n# job_timeout_seconds: 120.0 # 单任务超时(秒)\n# min_interval_seconds: 60 # cron 最小间隔(秒)\n# max_prompt_chars: 4000 # 定时任务 prompt 最大字符数\n# max_jobs_per_chat: 20 # 每个会话最大任务数\n# failure_retry_seconds: 300 # 失败重试等待(秒)\n# max_consecutive_failures: 3 # 连续失败上限\n# memory_dreaming_enabled: true # 是否启用内部记忆 dreaming\n# memory_dreaming_interval_seconds: 3600 # dreaming 周期(秒)\n# memory_dreaming_initial_delay_seconds: 300 # 启动后首次 dreaming 延迟(秒)\n# memory_dreaming_session_limit: 20 # 单次最多扫描会话数\n# memory_dreaming_recent_turn_limit: 40 # 单会话最多读取 turns 数\n# memory_dreaming_provider_id: \"\" # 专用 provider;空则使用会话当前 provider\n# memory_dreaming_model: \"\" # 专用模型;空则使用会话当前模型\n\n# ── Router ─────────────────────────────────────────────\n# 控制消息路由行为。system_prompt 使用顶层 system_prompt 字段。\n# 以下均为默认值,不写则使用默认值。\n#\n# router:\n# # system_prompt: \"...\" # 与顶层 system_prompt 重复,优先使用顶层字段\n# max_history_turns: 50 # 最大历史轮数\n# agent_enabled: true # 是否启用 Agent\n# command_timeout_seconds: 30.0 # 命令执行超时(秒)\n# command_timeout_message: \"Command timed out. Please try again later.\"\n"}, "4035b7c6300f5036e309a9f883930aa6194f045e": {"t": 1785761707.9614275, "n": 6125, "h": "21745d5c56dbb1a5", "c": "# Nahida Bot 配置文件\n# 参见 nahida_bot.core.config.Settings 了解所有可用字段\n\n# ── 应用 ──────────────────────────────────────────────\napp_name: \"Nahida Bot\"\ndebug: false\nlog_level: \"INFO\" # DEBUG / INFO / WARNING / ERROR\n# log_json: true # 设为 true 输出 JSON 格式日志(生产环境推荐)\n\n# ── 服务器 ────────────────────────────────────────────\nhost: \"127.0.0.1\"\nport: 6185\n\n# ── 数据库 ────────────────────────────────────────────\ndb_path: \"./data/nahida.db\"\n\n# ── Workspace ─────────────────────────────────────────\nworkspace_base_dir: \"./data/workspace\"\n\n# ── 插件 ──────────────────────────────────────────────\nplugin_paths:\n - \"./plugins\"\n\n# ── Agent / Router ────────────────────────────────────\nsystem_prompt: \"You are a helpful assistant.\"\n\n# ── LLM Providers(dict 格式,key 即 provider id)───\n# 支持多 provider 配置,每个 provider 有独立的 api_key 和 models 列表。\n# models 的第一个元素是该 provider 的默认模型;每个模型可以是字符串,\n# 也可以是 {name, capabilities} 对象。通过 /model 命令可在聊天中切换模型。\n#\n# providers:\n# deepseek-main:\n# type: deepseek\n# api_key: \"${DEEPSEEK_API_KEY}\"\n# models: [\"deepseek-chat\", \"deepseek-reasoner\"]\n# glm:\n# type: glm\n# api_key: \"${GLM_API_KEY}\"\n# models: [\"glm-4-flash\", \"glm-4-plus\"]\n# vision:\n# type: openai-compatible\n# api_key: \"${VISION_API_KEY}\"\n# base_url: \"${VISION_BASE_URL}\"\n# models:\n# - name: \"vision-model\"\n# capabilities:\n# image_input: true\n# max_image_count: 4\n#\n# default_provider: deepseek-main # 可选,默认使用第一个 key\n\nproviders:\n default:\n type: \"openai-compatible\"\n api_key: \"${LLM_API_KEY}\"\n base_url: \"${LLM_BASE_URL}\"\n models:\n - \"${LLM_MODEL}\"\n\ndefault_provider: default\n\n# ── 多模态 / 图片理解 ─────────────────────────────────\n# 主模型有 models[].capabilities.image_input=true 时会直接传图;\n# 主模型没有 image_input 时,按 image_fallback_mode 决定是否调用 fallback vision。\nmultimodal:\n image_fallback_mode: \"auto\" # auto / tool / off\n media_context_policy: \"cache_aware\" # cache_aware / native_recent / description_only\n image_fallback_provider: \"\" # 例如 \"vision\"\n image_fallback_model: \"\" # 例如 \"vision-model\"\n max_images_per_turn: 4\n max_image_bytes: 10485760\n media_cache_ttl_seconds: 3600\n\n# ── 插件配置 ──────────────────────────────────────────\n# Settings 的 extra=\"allow\" 机制:顶层 key 如果不是已知字段,\n# 且值为 dict,则按 plugin id 匹配并注入到对应插件的 manifest.config 中。\n\ntelegram:\n bot_token: \"${TELEGRAM_BOT_TOKEN}\"\n # proxy: \"${TELEGRAM_PROXY:}\" # SOCKS5/HTTP 代理,如 socks5://127.0.0.1:1080\n # polling_timeout: 30\n # allowed_chats: []\n\n# Milky QQ Channel(可选)\n# 启用前请先启动 Lagrange.Milky,并确保 nahida_bot/channels/milky/plugin.yaml\n# 可被内置 channel discovery 扫描到。保持注释状态不会启用 Milky。\n#\n# milky:\n# base_url: \"http://127.0.0.1:3000\"\n# access_token: \"${MILKY_ACCESS_TOKEN}\"\n# api_prefix: \"/api\"\n# event_path: \"/event\"\n# # ws_url: \"ws://127.0.0.1:3000/event\" # 可选:覆盖由 base_url 推导出的 WS 地址\n# command_prefix: \"/\"\n# group_trigger_mode: \"mention\" # mention / command / always\n# allowed_friends: [] # QQ 号白名单;空列表表示不限制\n# allowed_groups: [] # 群号白名单;空列表表示不限制\n# connect_timeout: 10.0\n# heartbeat_timeout: 30.0\n# reconnect_initial_delay: 1.0\n# reconnect_max_delay: 30.0\n# send_retry_attempts: 3\n# send_retry_backoff: 1.0\n# max_text_length: 4000\n# media_download_dir: \"./data/temp/media\"\n# enable_media_download_tool: true\n# resource_url_ttl_hint: 300\n# cache_media_on_receive: true\n# max_forward_depth: 3\n# max_forward_messages: 80\n# forward_render_max_chars: 12000\n# scene_cache_size: 4096\n\n# ── Agent Loop ──────────────────────────────────────────\n# 控制 Agent 循环的行为:迭代轮数、超时、重试策略等。\n# 以下均为默认值,不写则使用默认值。\n#\n# agent:\n# max_steps: 8 # 最大工具调用迭代轮数\n# provider_timeout_seconds: 30.0 # 单次 LLM 调用超时(秒)\n# retry_attempts: 2 # LLM 调用重试次数\n# retry_backoff_seconds: 0.2 # 重试退避间隔(秒)\n# tool_timeout_seconds: 135.0 # 工具执行超时(秒)\n# tool_retry_attempts: 1 # 工具执行重试次数\n# tool_retry_backoff_seconds: 0.1 # 工具重试退避间隔(秒)\n# max_tool_log_chars: 400 # 工具日志截断长度\n# # tool_use_system_prompt: \"...\" # 注入的工具使用提示\n# # provider_error_template: \"...\" # Provider 错误消息模板\n\n# ── Context Budget ──────────────────────────────────────\n# 控制上下文窗口大小和 reasoning chain 预算。\n# 以下均为默认值,不写则使用默认值。\n#\n# context:\n# max_tokens: 8000 # 最大 token 预算\n# reserved_tokens: 1000 # 为输出保留的 token\n# # max_chars: null # 字符数上限(兼容旧逻辑,优先使用 max_tokens)\n# # reserved_chars: 0 # 字符保留数\n# summary_max_chars: 600 # 历史摘要最大字符数\n# reasoning_policy: \"budget\" # strip / append / budget\n# max_reasoning_tokens: 2000 # reasoning chain token 预算\n\n# ── Scheduler ──────────────────────────────────────────\n# 控制定时任务调度行为。\n# 以下均为默认值,不写则使用默认值。\n#\n# scheduler:\n# poll_interval_seconds: 1.0 # 调度轮询间隔(秒)\n# max_concurrent_fires: 5 # 最大并发执行数\n# job_timeout_seconds: 120.0 # 单任务超时(秒)\n# min_interval_seconds: 60 # cron 最小间隔(秒)\n# max_prompt_chars: 4000 # 定时任务 prompt 最大字符数\n# max_jobs_per_chat: 20 # 每个会话最大任务数\n# failure_retry_seconds: 300 # 失败重试等待(秒)\n# max_consecutive_failures: 3 # 连续失败上限\n# memory_dreaming_enabled: true # 是否启用内部记忆 dreaming\n# memory_dreaming_interval_seconds: 3600 # dreaming 周期(秒)\n# memory_dreaming_initial_delay_seconds: 300 # 启动后首次 dreaming 延迟(秒)\n# memory_dreaming_session_limit: 20 # 单次最多扫描会话数\n# memory_dreaming_recent_turn_limit: 40 # 单会话最多读取 turns 数\n# memory_dreaming_provider_id: \"\" # 专用 provider;空则使用会话当前 provider\n# memory_dreaming_model: \"\" # 专用模型;空则使用会话当前模型\n\n# ── Router ─────────────────────────────────────────────\n# 控制消息路由行为。system_prompt 使用顶层 system_prompt 字段。\n# 以下均为默认值,不写则使用默认值。\n#\n# router:\n# # system_prompt: \"...\" # 与顶层 system_prompt 重复,优先使用顶层字段\n# max_history_turns: 50 # 最大历史轮数\n# agent_enabled: true # 是否启用 Agent\n# command_timeout_seconds: 30.0 # 命令执行超时(秒)\n# command_timeout_message: \"Command timed out. Please try again later.\"\n"}, "c031dc617d4405b0d56dc49a771112d08dccd931": {"t": 1785761709.259567, "n": 5669, "h": "b825b22cc1a15456", "c": "# Nahida Bot 配置文件\n# 参见 nahida_bot.core.config.Settings 了解所有可用字段\n\n# ── 应用 ──────────────────────────────────────────────\napp_name: \"Nahida Bot\"\ndebug: false\nlog_level: \"INFO\" # DEBUG / INFO / WARNING / ERROR\n# log_json: true # 设为 true 输出 JSON 格式日志(生产环境推荐)\n\n# ── 服务器 ────────────────────────────────────────────\nhost: \"127.0.0.1\"\nport: 6185\n\n# ── 数据库 ────────────────────────────────────────────\ndb_path: \"./data/nahida.db\"\n\n# ── Workspace ─────────────────────────────────────────\nworkspace_base_dir: \"./data/workspace\"\n\n# ── 插件 ──────────────────────────────────────────────\nplugin_paths:\n - \"./plugins\"\n\n# ── Agent / Router ────────────────────────────────────\nsystem_prompt: \"You are a helpful assistant.\"\n\n# ── LLM Providers(dict 格式,key 即 provider id)───\n# 支持多 provider 配置,每个 provider 有独立的 api_key 和 models 列表。\n# models 的第一个元素是该 provider 的默认模型;每个模型可以是字符串,\n# 也可以是 {name, capabilities} 对象。通过 /model 命令可在聊天中切换模型。\n#\n# providers:\n# deepseek-main:\n# type: deepseek\n# api_key: \"${DEEPSEEK_API_KEY}\"\n# models: [\"deepseek-chat\", \"deepseek-reasoner\"]\n# glm:\n# type: glm\n# api_key: \"${GLM_API_KEY}\"\n# models: [\"glm-4-flash\", \"glm-4-plus\"]\n# vision:\n# type: openai-compatible\n# api_key: \"${VISION_API_KEY}\"\n# base_url: \"${VISION_BASE_URL}\"\n# models:\n# - name: \"vision-model\"\n# capabilities:\n# image_input: true\n# max_image_count: 4\n#\n# default_provider: deepseek-main # 可选,默认使用第一个 key\n\nproviders:\n default:\n type: \"openai-compatible\"\n api_key: \"${LLM_API_KEY}\"\n base_url: \"${LLM_BASE_URL}\"\n models:\n - \"${LLM_MODEL}\"\n\ndefault_provider: default\n\n# ── 多模态 / 图片理解 ─────────────────────────────────\n# 主模型有 models[].capabilities.image_input=true 时会直接传图;\n# 主模型没有 image_input 时,按 image_fallback_mode 决定是否调用 fallback vision。\nmultimodal:\n image_fallback_mode: \"auto\" # auto / tool / off\n media_context_policy: \"cache_aware\" # cache_aware / native_recent / description_only\n image_fallback_provider: \"\" # 例如 \"vision\"\n image_fallback_model: \"\" # 例如 \"vision-model\"\n max_images_per_turn: 4\n max_image_bytes: 10485760\n media_cache_ttl_seconds: 3600\n\n# ── 插件配置 ──────────────────────────────────────────\n# Settings 的 extra=\"allow\" 机制:顶层 key 如果不是已知字段,\n# 且值为 dict,则按 plugin id 匹配并注入到对应插件的 manifest.config 中。\n\ntelegram:\n bot_token: \"${TELEGRAM_BOT_TOKEN}\"\n # proxy: \"${TELEGRAM_PROXY:}\" # SOCKS5/HTTP 代理,如 socks5://127.0.0.1:1080\n # polling_timeout: 30\n # allowed_chats: []\n\n# Milky QQ Channel(可选)\n# 启用前请先启动 Lagrange.Milky,并确保 nahida_bot/channels/milky/plugin.yaml\n# 可被内置 channel discovery 扫描到。保持注释状态不会启用 Milky。\n#\n# milky:\n# base_url: \"http://127.0.0.1:3000\"\n# access_token: \"${MILKY_ACCESS_TOKEN}\"\n# api_prefix: \"/api\"\n# event_path: \"/event\"\n# # ws_url: \"ws://127.0.0.1:3000/event\" # 可选:覆盖由 base_url 推导出的 WS 地址\n# command_prefix: \"/\"\n# group_trigger_mode: \"mention\" # mention / command / always\n# allowed_friends: [] # QQ 号白名单;空列表表示不限制\n# allowed_groups: [] # 群号白名单;空列表表示不限制\n# connect_timeout: 10.0\n# heartbeat_timeout: 30.0\n# reconnect_initial_delay: 1.0\n# reconnect_max_delay: 30.0\n# send_retry_attempts: 3\n# send_retry_backoff: 1.0\n# max_text_length: 4000\n# media_download_dir: \"./data/temp/media\"\n# enable_media_download_tool: true\n# resource_url_ttl_hint: 300\n# cache_media_on_receive: true\n# max_forward_depth: 3\n# max_forward_messages: 80\n# forward_render_max_chars: 12000\n# scene_cache_size: 4096\n\n# ── Agent Loop ──────────────────────────────────────────\n# 控制 Agent 循环的行为:迭代轮数、超时、重试策略等。\n# 以下均为默认值,不写则使用默认值。\n#\n# agent:\n# max_steps: 8 # 最大工具调用迭代轮数\n# provider_timeout_seconds: 30.0 # 单次 LLM 调用超时(秒)\n# retry_attempts: 2 # LLM 调用重试次数\n# retry_backoff_seconds: 0.2 # 重试退避间隔(秒)\n# tool_timeout_seconds: 135.0 # 工具执行超时(秒)\n# tool_retry_attempts: 1 # 工具执行重试次数\n# tool_retry_backoff_seconds: 0.1 # 工具重试退避间隔(秒)\n# max_tool_log_chars: 400 # 工具日志截断长度\n# # tool_use_system_prompt: \"...\" # 注入的工具使用提示\n# # provider_error_template: \"...\" # Provider 错误消息模板\n\n# ── Context Budget ──────────────────────────────────────\n# 控制上下文窗口大小和 reasoning chain 预算。\n# 以下均为默认值,不写则使用默认值。\n#\n# context:\n# max_tokens: 8000 # 最大 token 预算\n# reserved_tokens: 1000 # 为输出保留的 token\n# # max_chars: null # 字符数上限(兼容旧逻辑,优先使用 max_tokens)\n# # reserved_chars: 0 # 字符保留数\n# summary_max_chars: 600 # 历史摘要最大字符数\n# reasoning_policy: \"budget\" # strip / append / budget\n# max_reasoning_tokens: 2000 # reasoning chain token 预算\n\n# ── Scheduler ──────────────────────────────────────────\n# 控制定时任务调度行为。\n# 以下均为默认值,不写则使用默认值。\n#\n# scheduler:\n# poll_interval_seconds: 1.0 # 调度轮询间隔(秒)\n# max_concurrent_fires: 5 # 最大并发执行数\n# job_timeout_seconds: 120.0 # 单任务超时(秒)\n# min_interval_seconds: 60 # cron 最小间隔(秒)\n# max_prompt_chars: 4000 # 定时任务 prompt 最大字符数\n# max_jobs_per_chat: 20 # 每个会话最大任务数\n# failure_retry_seconds: 300 # 失败重试等待(秒)\n# max_consecutive_failures: 3 # 连续失败上限\n\n# ── Router ─────────────────────────────────────────────\n# 控制消息路由行为。system_prompt 使用顶层 system_prompt 字段。\n# 以下均为默认值,不写则使用默认值。\n#\n# router:\n# # system_prompt: \"...\" # 与顶层 system_prompt 重复,优先使用顶层字段\n# max_history_turns: 50 # 最大历史轮数\n# agent_enabled: true # 是否启用 Agent\n# command_timeout_seconds: 30.0 # 命令执行超时(秒)\n# command_timeout_message: \"Command timed out. Please try again later.\"\n"}, "28da1855ddadd420ae898488818db7d5d45cff8c": {"t": 1785761710.4269328, "n": 3506, "h": "a8c939a93ad9e0f8", "c": "# Nahida Bot 配置文件\n# 参见 nahida_bot.core.config.Settings 了解所有可用字段\n\n# ── 应用 ──────────────────────────────────────────────\napp_name: \"Nahida Bot\"\ndebug: false\nlog_level: \"INFO\" # DEBUG / INFO / WARNING / ERROR\n# log_json: true # 设为 true 输出 JSON 格式日志(生产环境推荐)\n\n# ── 服务器 ────────────────────────────────────────────\nhost: \"127.0.0.1\"\nport: 6185\n\n# ── 数据库 ────────────────────────────────────────────\ndb_path: \"./data/nahida.db\"\n\n# ── Workspace ─────────────────────────────────────────\nworkspace_base_dir: \"./data/workspace\"\n\n# ── 插件 ──────────────────────────────────────────────\nplugin_paths:\n - \"./plugins\"\n\n# ── Agent / Router ────────────────────────────────────\nsystem_prompt: \"You are a helpful assistant.\"\n\n# ── LLM Providers(dict 格式,key 即 provider id)───\n# 支持多 provider 配置,每个 provider 有独立的 api_key 和 models 列表。\n# models 的第一个元素是该 provider 的默认模型;每个模型可以是字符串,\n# 也可以是 {name, capabilities} 对象。通过 /model 命令可在聊天中切换模型。\n#\n# providers:\n# deepseek-main:\n# type: deepseek\n# api_key: \"${DEEPSEEK_API_KEY}\"\n# models: [\"deepseek-chat\", \"deepseek-reasoner\"]\n# glm:\n# type: glm\n# api_key: \"${GLM_API_KEY}\"\n# models: [\"glm-4-flash\", \"glm-4-plus\"]\n# vision:\n# type: openai-compatible\n# api_key: \"${VISION_API_KEY}\"\n# base_url: \"${VISION_BASE_URL}\"\n# models:\n# - name: \"vision-model\"\n# capabilities:\n# image_input: true\n# max_image_count: 4\n#\n# default_provider: deepseek-main # 可选,默认使用第一个 key\n\nproviders:\n default:\n type: \"openai-compatible\"\n api_key: \"${LLM_API_KEY}\"\n base_url: \"${LLM_BASE_URL}\"\n models:\n - \"${LLM_MODEL}\"\n\ndefault_provider: default\n\n# ── 多模态 / 图片理解 ─────────────────────────────────\n# 主模型有 models[].capabilities.image_input=true 时会直接传图;\n# 主模型没有 image_input 时,按 image_fallback_mode 决定是否调用 fallback vision。\nmultimodal:\n image_fallback_mode: \"auto\" # auto / tool / off\n media_context_policy: \"cache_aware\" # cache_aware / native_recent / description_only\n image_fallback_provider: \"\" # 例如 \"vision\"\n image_fallback_model: \"\" # 例如 \"vision-model\"\n max_images_per_turn: 4\n max_image_bytes: 10485760\n media_cache_ttl_seconds: 3600\n\n# ── 插件配置 ──────────────────────────────────────────\n# Settings 的 extra=\"allow\" 机制:顶层 key 如果不是已知字段,\n# 且值为 dict,则按 plugin id 匹配并注入到对应插件的 manifest.config 中。\n\ntelegram:\n bot_token: \"${TELEGRAM_BOT_TOKEN}\"\n # proxy: \"${TELEGRAM_PROXY:}\" # SOCKS5/HTTP 代理,如 socks5://127.0.0.1:1080\n # polling_timeout: 30\n # allowed_chats: []\n\n# Milky QQ Channel(可选)\n# 启用前请先启动 Lagrange.Milky,并确保 nahida_bot/channels/milky/plugin.yaml\n# 可被内置 channel discovery 扫描到。保持注释状态不会启用 Milky。\n#\n# milky:\n# base_url: \"http://127.0.0.1:3000\"\n# access_token: \"${MILKY_ACCESS_TOKEN}\"\n# api_prefix: \"/api\"\n# event_path: \"/event\"\n# # ws_url: \"ws://127.0.0.1:3000/event\" # 可选:覆盖由 base_url 推导出的 WS 地址\n# command_prefix: \"/\"\n# group_trigger_mode: \"mention\" # mention / command / always\n# allowed_friends: [] # QQ 号白名单;空列表表示不限制\n# allowed_groups: [] # 群号白名单;空列表表示不限制\n# connect_timeout: 10.0\n# heartbeat_timeout: 30.0\n# reconnect_initial_delay: 1.0\n# reconnect_max_delay: 30.0\n# send_retry_attempts: 3\n# send_retry_backoff: 1.0\n# max_text_length: 4000\n# media_download_dir: \"./data/temp/media\"\n# enable_media_download_tool: true\n# resource_url_ttl_hint: 300\n# cache_media_on_receive: true\n# max_forward_depth: 3\n# max_forward_messages: 80\n# forward_render_max_chars: 12000\n# scene_cache_size: 4096\n"}, "4a79064246692d3c27da6c4190b4d451ce36798b": {"t": 1786068415.9739985, "n": 15635, "h": "ccd3d59b1ee247a2", "c": "# Nahida Bot 配置文件\n# 参见 nahida_bot.core.config.Settings 了解所有可用字段\n\n# ── 应用 ──────────────────────────────────────────────\napp_name: \"Nahida Bot\"\ndebug: false\nlog_level: \"INFO\" # DEBUG / INFO / WARNING / ERROR(控制台级别)\n# log_json: true # 设为 true 输出 JSON 格式日志(生产环境推荐)\n# 可复盘基线(agent-loop 修复 Phase 0):默认把应用日志落盘到 JSON Lines 文件,\n# 文件级别 DEBUG 以便保留 agent_loop.run_completed 的 terminal_state/reason、\n# provider 协议异常、context 来源等字段。控制台仍保持 INFO,不被 DEBUG 刷屏。\nlog_file: \"./data/logs/nahida.log\"\nlog_file_level: \"DEBUG\"\nlog_file_json: true\n# 按文件大小滚动日志:单文件达到 log_file_max_bytes 后轮转,最多保留\n# log_file_backup_count 个历史备份(nahida.log.1、nahida.log.2 …)。\n# max_bytes=0 表示不滚动(日志文件会无限增长)。默认 10 MiB × 5 份。\nlog_file_max_bytes: 10485760 # 单个日志文件上限(字节),0 = 不滚动\nlog_file_backup_count: 5 # 保留的滚动备份数\ndependency_log_level: \"WARNING\" # 三方库默认日志级别;避免 DEBUG 时被 httpx/websockets 等刷屏\n# logger_levels: # 可选:按 logger 名覆盖(注意:会同时作用于控制台与文件)\n# nahida_bot.agent: \"DEBUG\"\n# plugin.rss-notifier: \"DEBUG\"\n# httpx: \"WARNING\"\n\n# ── 服务器 ────────────────────────────────────────────\nhost: \"127.0.0.1\"\nport: 6185\n\n# ── 数据库 ────────────────────────────────────────────\ndb_path: \"./data/nahida.db\"\n\n# ── Workspace ─────────────────────────────────────────\nworkspace_base_dir: \"./data/workspace\"\n\n# ── 插件 ──────────────────────────────────────────────\nplugin_paths:\n - \"./plugins\"\n\n# ── Agent / Router ────────────────────────────────────\nsystem_prompt: \"You are a helpful assistant.\"\n\n# ── LLM Providers(dict 格式,key 即 provider id)───\n# 默认配置已经是多 provider。每个 provider 有独立的 api_key、base_url 和 models。\n# models 的第一个元素是该 provider 的默认模型;每个模型可以是字符串,\n# 也可以是 {name, tags, capabilities} 对象。通过 /model 命令可在聊天中切换模型。\n#\n# 没有配置 api_key 的 provider 会在启动时被跳过;因此可以只填写实际使用的后端。\nproviders:\n deepseek-main:\n type: deepseek\n api_key: \"${DEEPSEEK_LLM_API_KEY:}\"\n base_url: \"${DEEPSEEK_LLM_BASE_URL:https://api.deepseek.com}\"\n # 内部使用 SSE 接收并聚合,可避免长推理期间普通读超时误判。\n stream_responses: true\n # thinking_enabled: false # 关闭 DeepSeek thinking mode\n models:\n - name: \"deepseek-v4-pro\"\n tags: [primary]\n - name: \"deepseek-v4-flash\"\n tags: [cheap, memory]\n\n siliconflow:\n type: \"openai-compatible\"\n api_key: \"${SILICONFLOW_LLM_API_KEY:}\"\n base_url: \"${SILICONFLOW_LLM_BASE_URL:https://api.siliconflow.cn/v1}\"\n merge_system_messages: true\n stream_responses: true\n models:\n - name: \"Qwen/Qwen3-Embedding-8B\"\n tags: [embedding]\n - name: \"Pro/zai-org/GLM-5\"\n tags: [vision]\n - name: \"Qwen/Qwen3.6-35B-A3B\"\n tags: [vision]\n capabilities:\n image_input: true\n max_image_count: 4\n max_image_bytes: 10485760\n\n minimax:\n type: minimax\n api_key: \"${MINIMAX_LLM_API_KEY:}\"\n base_url: \"https://api.minimaxi.com/anthropic\"\n max_tokens: 16000\n stream_responses: true\n models:\n - name: \"MiniMax-M2.5\"\n tags: [cheap]\n - name: \"MiniMax-M2.7\"\n - name: \"MiniMax-M3\"\n\n # OpenAI Responses API(可选)\n # 使用 /responses 端点,支持内置工具(web_search、image_generation 等)\n # 和有状态对话链(previous_response_id)。Reasoning 摘要可通过\n # reasoning_effort 参数控制深度。\n # stream_responses=true 时同样在 provider 内部流式接收并聚合返回。\n openai:\n type: \"openai-responses\"\n api_key: \"${OPENAI_API_KEY:}\"\n base_url: \"${OPENAI_API_BASE_URL:https://api.openai.com/v1}\"\n store_responses: true\n use_previous_response_id: false\n stream_responses: true\n reasoning_effort: \"medium\"\n # built_in_tools: [\"web_search\", \"image_generation\"]\n models:\n - name: \"gpt-5.4\"\n capabilities:\n image_input: true\n image_generation: true\n web_search: true\n tool_calling: true\n reasoning: true\n\ndefault_provider: deepseek-main # 可选,默认使用 providers 中的第一个 key\n\n# ── 多模态 / 图片理解 ─────────────────────────────────\n# image_fallback_mode:\n# auto: 主模型不支持 image_input 时,自动调用 fallback vision 模型生成描述\n# tool: 主模型不支持 image_input 时,注入 image_understand 工具,由主模型按需调用\n# off: 不处理图片,只保留普通文本\n# media_context_policy:\n# cache_aware: 最近图片尽量保留原生内容块,旧图片降级为描述\n# native_recent: 仅最近图片保留原生内容块\n# description_only: 历史图片只使用描述\nmultimodal:\n image_fallback_mode: \"auto\"\n media_context_policy: \"cache_aware\"\n image_fallback_provider: \"\" # Legacy;建议把 provider 写进 image_fallback_model\n image_fallback_model: \"siliconflow/Qwen/Qwen3.6-35B-A3B\"\n max_images_per_turn: 4\n max_image_bytes: 10485760\n media_cache_ttl_seconds: 3600\n\n# ── 插件配置 ──────────────────────────────────────────\n# Settings 的 extra=\"allow\" 机制:顶层 key 如果不是已知字段,\n# 且值为 dict,则按 plugin id 匹配。enabled 由框架消费,其余字段注入插件配置。\n\nbuiltin-commands:\n # send_local_attachment 默认只允许发送 active workspace 内的相对路径。\n # 如确实需要发送工作区外的本地文件,可打开下面开关。\n allow_external_attachment_paths: false\n # 可选白名单目录;为空表示打开上方开关后允许任意绝对路径。\n # external_attachment_roots:\n # - \"<absolute-directory>\"\n external_attachment_roots: []\n\n# OpenAI-compatible 图片生成(可选)\n# 启用后注册 /draw、/生图 命令和 image_generate tool。\n# image_generation:\n# enabled: true\n# provider: default\n# backends:\n# default:\n# type: openai-images\n# api_key: \"${IMAGE_API_KEY}\"\n# base_url: \"${IMAGE_BASE_URL}\"\n# model: \"gpt-image-1\"\n# timeout_seconds: 600\n# download_timeout_seconds: 120\n# trust_env: false\n# force_close_connections: true\n# output_dir: \"generated/images\"\n# auto_send: true\n# max_images_per_24h: 20\n\ngithub-notifier:\n # 目标仓库;保持 OWNER/REPO 时插件会视为未配置,不会启动 webhook/polling。\n repo: \"OWNER/REPO\"\n # typed chat address 列表,例如 milky:group:123456789 或 telegram:private:123456789。\n target_chat_addresses: []\n webhook:\n enabled: true\n path: \"github\" # 最终路径: /webhooks/github\n secret: \"${GITHUB_WEBHOOK_SECRET:}\"\n polling:\n enabled: true # webhook 不可用时的 fallback;首次轮询只建立基线\n interval_seconds: 60\n api_base_url: \"https://api.github.com\"\n token: \"${GITHUB_TOKEN:}\" # 私有仓库或更高 rate limit 时填写\n registration:\n enabled: false # 开启后可在聊天中使用 /github_watch 动态订阅\n\n# RSS/Atom 订阅通知(外部插件 plugins/rss-notifier)\n# rss-notifier:\n# enabled: true\n# # 默认推送目标;feed 未设置 target_chat_addresses 时使用这里。\n# target_chat_addresses:\n# - \"milky:group:123456789\"\n# feeds:\n# - url: \"https://example.com/feed.xml\"\n# title: \"Example\"\n# polling:\n# enabled: true\n# interval_seconds: 300\n# rendering:\n# mode: \"standard\" # compact / standard / rich\n# max_text_chars: 500\n# max_paragraphs: 3\n# include_images: true\n# max_images: 1\n# send_image_attachments: true # 下载图片并作为 photo 附件发送;失败时退化为图片链接\n# max_image_bytes: 5000000\n# registration:\n# enabled: true # 开启后可在聊天中使用 /rss_sub 动态订阅\n\nconversation_joiner:\n # 主动入话题默认关闭。开启前需要对应群频道启用 group_context_capture,\n # 让未触发消息先进入 MessageObserved。\n enabled: false\n model: cheap # model spec;没有 cheap tag 时可改成 provider/model,或留空使用默认模型\n threshold: 0.75\n max_context_messages: 12\n max_context_chars: 3000\n cooldown_seconds: 300\n max_triggers_per_hour: 3\n debounce_seconds: 20\n decision_timeout_seconds: 8\n persona_context:\n enabled: true # 启用后秘书模型会读取 workspace 中的人设文件辅助判断是否自然入话题\n files:\n - SOUL.md\n max_chars: 4000 # 注入秘书模型的人设上下文总字符上限\n cache_ttl_seconds: 60 # persona 文件缓存时间,避免每条候选消息都读文件\n prefilter:\n ignore_commands: true\n ignore_mentions: true\n min_text_chars: 4\n keyword_hints: []\n sample_rate: 0.15 # 普通候选消息进入秘书模型的采样概率\n keyword_sample_rate: 1.0 # 命中 keyword_hints 后进入秘书模型的采样概率\n groups: {}\n # groups:\n # milky:group:123456789:\n # enabled: true\n # threshold: 0.78\n # cooldown_seconds: 300\n engagement:\n enabled: false # 打开后进入 observing/joining/engaged/cooling 状态机\n join_state_ttl_seconds: 600\n idle_exit_seconds: 180\n max_engaged_seconds: 1800\n response_cooldown_seconds: 45\n engagement_score_alpha: 0.2\n engagement_score_exit_threshold: 0.2\n score_decay_half_life_seconds: 600\n score_decay_floor: 0.0\n batching:\n window_seconds: 8 # 后续群消息进入 batch 的短窗口\n max_messages: 6 # 窗口内消息过多时提前 flush\n max_chars: 2000\n flush_on_mention: true\n continue_gate:\n enabled: true # 每个 flushed batch 交给秘书模型判断是否继续接话\n model: cheap\n threshold: 0.55\n min_messages: 1\n evaluate_interval_seconds: 8\n exit_gate:\n enabled: true\n low_value_threshold: 0.35\n low_value_strikes: 3\n min_messages_per_window: 1\n activity_window_seconds: 120\n\ntelegram:\n enabled: true\n bot_token: \"${TELEGRAM_BOT_TOKEN:}\"\n # group_trigger_mode: \"always\" # none / mention / command / always\n # group_context_capture: false # mention/command 模式下,是否记录未触发群消息作为上下文\n # reply_to_inbound: null # true/false 覆盖 router.reply_to_inbound;null/省略表示跟随全局\n # proxy: \"${TELEGRAM_PROXY:}\" # SOCKS5/HTTP 代理,如 socks5://127.0.0.1:1080\n # polling_timeout: 30\n # allowed_chats: []\n\n# Milky QQ Channel(可选)\n# 启用前请先启动 Lagrange.Milky,并确保 nahida_bot/channels/milky/plugin.yaml\n# 可被内置 channel discovery 扫描到。保持注释状态不会启用 Milky。\n#\n# milky:\n# enabled: true\n# base_url: \"http://127.0.0.1:3000\"\n# access_token: \"${MILKY_ACCESS_TOKEN:}\"\n# api_prefix: \"/api\"\n# event_path: \"/event\"\n# # ws_url: \"ws://127.0.0.1:3000/event\" # 可选:覆盖由 base_url 推导出的 WS 地址\n# command_prefix: \"/\"\n# group_trigger_mode: \"mention\" # none / mention / command / always\n# group_context_capture: false # true 时,未触发群消息只记录为上下文,可供 conversation_joiner 判断\n# reply_to_inbound: null # true/false 覆盖 router.reply_to_inbound;null/省略表示跟随全局\n# allowed_friends: [] # QQ 号白名单;空列表表示不限制\n# allowed_groups: [] # 群号白名单;空列表表示不限制\n# connect_timeout: 10.0\n# heartbeat_timeout: 30.0\n# reconnect_initial_delay: 1.0\n# reconnect_max_delay: 30.0\n# send_retry_attempts: 3\n# send_retry_backoff: 1.0\n# max_text_length: 4000\n# media_download_dir: \"./data/temp/media\"\n# enable_media_download_tool: true\n# resource_url_ttl_hint: 300\n# cache_media_on_receive: true\n# max_forward_depth: 3\n# max_forward_messages: 80\n# forward_render_max_chars: 12000\n# scene_cache_size: 4096\n\n# ── Agent Loop ──────────────────────────────────────────\n# 控制 Agent 循环的行为:迭代轮数、超时、重试策略等。\n# 以下均为默认值,不写则使用默认值。\n#\n# agent:\n# max_steps: 8 # 最大工具调用迭代轮数\n# provider_timeout_seconds: 120.0 # 单次 LLM 调用超时(秒)\n# retry_attempts: 2 # LLM 调用重试次数\n# retry_backoff_seconds: 0.2 # 重试退避间隔(秒)\n# tool_timeout_seconds: 135.0 # 工具执行超时(秒)\n# tool_retry_attempts: 1 # 工具执行重试次数\n# tool_retry_backoff_seconds: 0.1 # 工具重试退避间隔(秒)\n# max_tool_log_chars: 400 # 工具日志截断长度\n# # tool_use_system_prompt: \"...\" # 注入的工具使用提示\n# # provider_error_template: \"...\" # Provider 错误消息模板\n\n# ── Agent Runtime(canonical ledger,修复 #24 地基)─────────\n# Phase 1:best-effort 把每个 run 的 canonical 事件流与执行回执落库(附加双写,\n# 不改对外行为)。reading/重放端属 Phase 5。默认代码里为 false;这里置 true 以采集数据。\nagent_runtime:\n canonical_ledger_enabled: true\n # Phase 5:把每个 run 的有序 tool transcript 落到 agent_runs.transcript_json,\n # 下一轮由 TranscriptProjector 投影成成对 tool_use/tool_result 注入历史,\n # 替代被剥离的纯文本叙述(#24 根因)。默认代码里为 false;这里置 true 采集数据。\n # 旧 run(无 transcript_json)自动回退到原文本历史路径。\n transcript_replay_enabled: true\n\n# ── Context Budget ──────────────────────────────────────\n# 控制未知模型 fallback 上下文窗口和 reasoning chain 预算。\n# 模型声明 providers.*.models[].capabilities.context_window 时优先使用模型窗口。\n# 以下均为默认值,不写则使用默认值。\n#\n# context:\n# max_tokens: 272000 # 未声明模型窗口时的 fallback context window\n# reserved_tokens: 10000 # 未声明模型窗口时为输出保留的 token\n# # max_chars: null # 字符数上限(兼容旧逻辑,优先使用 max_tokens)\n# # reserved_chars: 0 # 字符保留数\n# summary_max_chars: 2000 # 历史摘要最大字符数\n# reasoning_policy: \"budget\" # strip / append / budget\n# max_reasoning_tokens: 2000 # reasoning chain token 预算\n\n# ── Identity / delegated authorization ────────────────\n# Identity must be enabled for the privileged-tool gate and tickets to apply.\n# Admins are authenticated account keys assembled from channel + account id;\n# being linked to a Person does not make an account an admin.\n#\n# identity:\n# enabled: false\n# admins:\n# - channel: \"milky\"\n# platform_account_id: \"123456789\"\n# authorization_tickets:\n# enabled: false # explicit opt-in\n# challenge_ttl_seconds: 600 # requester waits for admin approval\n# grant_ttl_seconds: 300 # approved one-use grant lifetime\n# max_grant_ttl_seconds: 900 # hard cap for /auth approve TTL\n\n# ── Scheduler ──────────────────────────────────────────\n# 控制定时任务调度行为。\n# 以下均为默认值,不写则使用默认值。\n#\n# scheduler:\n# poll_interval_seconds: 1.0 # 调度轮询间隔(秒)\n# max_concurrent_fires: 5 # 最大并发执行数\n# job_timeout_seconds: 120.0 # 单任务超时(秒)\n# min_interval_seconds: 60 # cron 最小间隔\n# max_prompt_chars: 12000 # 定时任务 prompt 最大字符数\n# max_jobs_per_chat: 20 # 每个会话最大任务数\n# failure_retry_seconds: 300 # 失败重试等待(秒)\n# max_consecutive_failures: 3 # 连续失败上限\n# memory_dreaming_enabled: true # 是否启用内部记忆 dreaming\n# memory_dreaming_interval_seconds: 3600 # dreaming 周期(秒)\n# memory_dreaming_initial_delay_seconds: 300 # 启动后首次 dreaming 延迟\n# memory_dreaming_session_limit: 20 # 单次最多扫描会话数\n# memory_dreaming_recent_turn_limit: 40 # 单会话最多读取 turns 数\n# memory_dreaming_provider_id: \"\" # Legacy;建议改用 memory_dreaming_model\n# memory_dreaming_model: \"\" # model spec;空则默认找 memory tag,失败后走会话模型\n\n# ── Router ─────────────────────────────────────────────\n# 控制消息路由行为。system_prompt 使用顶层 system_prompt 字段。\n# 以下均为默认值,不写则使用默认值。\n#\n# router:\n# # system_prompt: \"...\" # 与顶层 system_prompt 重复,优先使用顶层字段\n# max_history_turns: 200 # 最大历史轮数\n# agent_enabled: true # 是否启用 Agent\n# command_timeout_seconds: 30.0 # 命令执行超时(秒)\n# command_timeout_message: \"Command timed out. Please try again later.\"\n# reply_to_inbound: true # 默认是否引用回复触发消息;平台插件可覆盖\n# group_context:\n# enabled: true # 是否在触发时注入 observed-only 群上下文\n# max_messages: 20 # 最多注入最近多少条未触发群消息\n# ttl_seconds: 900 # 只注入最近 N 秒内的群上下文;0 表示不按时间过滤\n# max_chars: 4000 # 群上下文注入块最大字符数\n# topic_gap_seconds: 300 # 群消息静默超过此值视为新话题;0 关闭\n# continuity_gap_seconds: 1800 # 对话连续性判定(秒):当前触发与上次对话 turn 间隔超过此值则视为新对话,丢弃旧 history;0 关闭\n\n# ── Model Tags / Specs ─────────────────────────────────\n# providers 的 models 中用 tags 字段标记模型角色:\n# primary / cheap / memory / embedding / reranker / vision\n# 需要内部模型的配置项都接受一个 model spec 字符串;这个字符串可以是 tag,\n# 也可以是 provider/model 或裸模型名。\n\n# ── Memory ─────────────────────────────────────────────\n# 长期记忆检索和 embedding 配置。默认只启用 SQLite FTS;vector/hybrid\n# 需要显式开启,并在 providers.models 中配置带 embedding tag 的模型。\n#\n# memory:\n# enabled: true\n# retrieval:\n# fts_enabled: true\n# vector_enabled: false # 开启后对长期记忆使用 hybrid 检索\n# hybrid_enabled: true\n# vector_backend: json # json / sqlite-vec / none\n# max_injected_items: 5\n# max_injected_chars: 4000\n# embedding:\n# enabled: false\n# model: \"\" # model spec;空则默认找 embedding tag\n# dimensions: 0 # 0 = auto-detect via probe embed call\n# batch_size: 16\n# embed_after_consolidation: true\n# consolidation:\n# rule_based_enabled: true # 是否启用每轮对话后的规则抽取;false 时只保留 dreaming/显式写入\n"}}, "README.md": {"64963d80b74a9f103ae27ce983eb90cc18051040": {"t": 1785746651.6916249, "n": 13321, "h": "60542fe47c0b3cc8", "c": "# 🍃 Nahida Bot\n\n> \n>\n> 「这是**摩诃善法大吉祥智慧主**,智慧之神**布耶尔**,须弥的**草神大人**,你敢和她对视五秒吗?」\n\n欢迎连接到属于你的私有「虚空终端」!**Nahida Bot** 不仅仅是一个冷冰冰的机器,而是一个 **Agent 为灵魂**、以 **Workspace 为家**、能长出 **Live2D 桌宠形态**,还能通过 **插件随意换装** 的 Python 智能框架哦~ 🌿\n\n文档:[Docs](https://nahida-bot.cobaltdev.top)\n\n[](https://qm.qq.com/q/rXP8DKCyRi) [](https://app.netlify.com/projects/nahida-bot/deploys)\n\n## ✨ 核心天赋\n\n### 💡 设计理念\n\n- **Agent-first(意识主导)**:以 Agent Loop 为中枢,大语言模型(LLM)在这里不是外挂的工具人,而是真正的主导大脑~\n- **Workspace-native(专属花盆)**:文件就是上下文,工作空间(Workspace)作为一等公民被温柔对待。\n- **Plugin-driven(百变衣橱)**:不需要在核心代码里硬编码,想要什么新能力?装个插件就好啦!\n- **Multi-Provider(万叶一心)**:支持 OpenAI Compatible(含 Responses API)、DeepSeek、Anthropic Claude、GLM、Groq、Minimax 等多种 LLM 后端,运行时随心切换~\n- **Multi-Channel(千风引路)**:Telegram Bot + Milky QQ(Lagrange.Milky)+ OneBot v11/v12(NapCat/Lagrange/LLOneBot),统一的消息标准化与 ChannelService 协议~\n- **Desktop Pet(梦中之相)**:Tauri + Rust + Vue 3 + Live2D(PixiJS)打造的边缘隐藏式桌宠,鼠标靠近 / Gateway 推送 / CRON 到点时从屏幕角落唤出,还能本地 TTS 发声~\n- **Multimodal(万象识图)**:原生 vision 图片理解 or 自动 fallback 描述 or image_understand 工具,三种模式自适应~\n- **Memory & Retrieval(梦境刻录)**:SQLite 会话记忆 + FTS 关键词检索 + 向量检索 + 混合检索 + LLM 记忆巩固;独立的 Document Store 让知识库与记忆各自安家~\n- **Knowledge Base(须弥图书馆)**:内置知识库插件,导入 PDF/Word/PPT/Excel 等文档,MarkItDown 转换 + 分块 + FTS/向量/混合检索 + 可选 embedding~\n- **Agent Orchestration(子机协作)**:主 Agent 可 spawn 子 Agent 执行后台任务,支持 spawn / wait / stop 全生命周期~\n- **Cron & Dreaming(时之沙)**:定时任务调度 + 记忆 dreaming(LLM 驱动的周期性记忆整理与巩固)~\n- **MCP Support(外道魔术)**:Model Context Protocol 客户端集成,对接外部 MCP 工具服务器~\n- **Gateway & WebUI(世界树控制台)**:FastAPI REST API + Vue 3 SPA 运维面板 + SSE 实时事件推送;密码/OTP 登录、配置可视化管理、CRON/Session/文件/知识库/插件/Skills/用量管理~\n- **Ops-friendly(无忧除虫)**:可观测、可诊断、好发布,就算遇到了 Bug 也能轻松捉虫🐞!\n\n## 📈 成长进度(项目状态)\n\n目前小吉祥草王已完成 **Phase 4 全闭环 + WebUI 主体 + Desktop 桌宠 + OneBot Channel**:Telegram / Milky QQ / OneBot 三 Channel、Multi-Provider、内置命令/工具/插件体系、Subagent 编排、Multimodal、Scheduler 与 Memory Dreaming、知识库与生图插件、Gateway REST API、WebUI 运维面板(Vue 3)、Desktop Live2D 桌宠、SSE 实时事件、登录及权限体系均已可用。\n\n### 🌟 已点亮的命座 ✅\n\n- [x] 净土的基石与质量把控(Phase 0)\n- [x] 核心生命循环:应用容器、分层配置、事件脉络与观测日志(Phase 1)\n- [x] 专属花盆(Workspace):空间管理、文件沙盒、指令注入(Phase 2.1-2.2)\n- [x] 智慧运转(Agent Loop):消息拼装、模型调用、工具闭环、推理链传播(Phase 2.3-2.4)\n- [x] 记忆流转:SQLite 会话记忆、FTS 检索、向量检索、混合检索(Phase 2.5)\n- [x] 推理链健壮性:OpenAI/DeepSeek/Claude 多后端推理提取与上下文回传,Anthropic reasoning effort + 1M context 支持(Phase 2.8)\n- [x] 万象识图:Vision 原生传图、fallback 自动描述/工具模式、MediaCache/MediaResolver(Phase 2.9)\n- [x] 插件系统:Manifest 声明、Loader 发现加载、权限检查、生命周期隔离、命令与工具注册(Phase 3.1-3.6)\n- [x] 接引通道 Telegram:长轮询、消息标准化、HTML/Markdown 转换、群聊 @mention、媒体降级(Phase 4.1-4.5)\n- [x] 接引通道 Milky QQ:Lagrange.Milky WebSocket 事件流、消息段建模、群聊触发策略、合并转发解析(Phase 4.6)\n- [x] 接引通道 OneBot:v11/v12 双版本统一抽象、正向 WebSocket + WebHook、CQ 码与 array segment 归一化\n- [x] Multi-Provider:per-request model override、Provider 类型运行时注册、pre/post-agent 分阶段加载、OpenAI Responses API\n- [x] MCP 集成:Model Context Protocol 客户端、工具适配、连接管理\n- [x] 知识库插件:文档导入(MarkItDown 富文档转换)、分块、FTS/向量/混合检索、可选 embedding、SQLite Document Store\n- [x] 生图插件:OpenAI 兼容 Images API 后端、`/draw`·`/生图` 命令、24h 滚动配额管理、自动发送附件\n- [x] 群聊主动接入插件(Conversation Joiner):observed-only 群上下文观察 + engagement 状态机,决定何时自然加入话题(in-memory MVP)\n- [x] Desktop 桌宠:Tauri + Rust + Vue 3 + Live2D,边缘隐藏窗口、接近检测、气泡/输入框、本地 TTS 播放管线\n- [x] Subagent 编排:spawn 子 Agent、BackgroundTask 账本、policy hook、父子 session 管理(Phase 3.8 主体)\n- [x] 记忆与文档存储:Memory Store(consolidation/markdown/scope)+ Document Store 分离,按 chat/global scope 隔离的持久记忆\n- [x] 集中式 TaskManager:统一管理 asyncio 任务生命周期与优雅停止\n- [x] 定时调度:Cron 定时任务 + Memory Dreaming LLM 记忆巩固\n- [x] 会话级别推理设置:`/reasoning on|off|effort <level>|reset`\n- [x] 群聊上下文注入:observed-only 消息记录 + 触发时注入最近群上下文\n- [x] 内置命令 12 个:`/reset`、`/new`、`/status`、`/model`、`/reasoning`、`/help`、`/memory`、`/agents`、`/agent_stop`、`/agent_wait`、`/cron`、`/stop`\n- [x] 内置工具 16+:`workspace_read/write`、`send_local_attachment`、`memory_read/write`、`exec`、`web_fetch`、`plan`、`cron_*`、`agent_*`、`image_understand`,外加知识库检索、生图等插件工具\n- [x] Gateway REST API:`/api/health`、`/api/status`、`/api/send`、`/api/sessions`、`/api/cron`(全局管理)、`/api/config`(读写/校验/备份)、`/api/files`(workspace 文件管理)、`/api/kb`(知识库导入与检索)、`/api/plugins`、`/api/skills`、`/api/tokens`(用量)、`/api/messages`、`/api/auth`(登录/登出/session)、`/api/events/stream`(SSE)\n- [x] WebUI 运维面板:Vue 3 + Vite + shadcn-vue + Reka UI,首页状态总览、配置页(YAML 编辑/校验/保存/备份)、CRON 管理、Session 分组浏览、文件管理、知识库导入、插件管理、Skills、用量统计、系统日志、关于页\n- [x] WebUI 登录体系:管理员密码(Argon2id)+ Session Cookie + 登录限速;Bearer Token 兼容脚本/API 调用\n- [x] SSE 实时事件:`status.updated`、`usage.recorded`、`cron.*`、`session.updated`、`config.saved`、`file.updated`\n- [x] Usage Ledger:SQLite 持久化 token 统计(input/output/cached/reasoning),支持按 provider/model/session/source_tag 聚合\n- [x] Cron Session 模式:`main`(注入主 session)、`isolated`(独立 session)、`named`(持久命名 session,跨 run 累积上下文)\n- [x] 回复信号协议:`NO_REPLY` 静默抑制 + `HEARTBEAT_OK` 心跳空转保护\n- [x] SDK 独立成包:`nahida-bot-sdk` 作为 workspace 成员,插件作者可用稳定 API 开发与发布\n- [x] 设计文档 17 份:Agent Core、ChatAddress/SessionID、Cross-Session、Memory System/Scoping、Agent Compaction、Model Routing、Runtime Settings、WebUI、Plugin Web Panels、Cron/WebAPI、OneBot Channel、Conversation Joiner、Knowledge Base、Desktop App、Person Identity、MCP Dynamic Servers、Tool-Produced Image Media\n\n### 🚧 正在进行的光合作用\n\n- [ ] OneBot Channel 收尾:反向 WebSocket、WebHook 生产化、多账号支持与更多 action 覆盖。\n- [ ] Desktop 桌宠完善:通知/番茄钟/CRON 唤出策略打磨、跨平台打包与签名。\n- [ ] 知识库与记忆检索合并重构:Document Store 与 Memory 检索模型统一,引入 LLM 摘要压缩与语义召回(Phase 2.5b)。\n- [ ] 群聊主动接入插件持久化、管理界面与正式 `group_observe_mode`。\n- [ ] 工具产出图片的 media artifact 注册、自动注入与跨轮持久化。\n- [ ] WebUI 高级安全特性:Chat OTP 登录、部署模式(loopback/https/http_emergency)、CSRF 防护。\n- [ ] Workspace Sandbox 安全增强:符号链接、TOCTOU、文件大小、特殊文件对象等防护。\n\n### 📜 未来的建设计划\n\n- [ ] Gateway 与 Node 分布式部署(Phase 5):节点注册、心跳、远程执行协议、WebSocket RPC,远程节点跑重模型。\n- [ ] WebUI 插件页面 surface:插件通过 manifest 声明 WebUI 面板,sandbox iframe 加载。\n- [ ] 人物身份系统(Person Identity):跨 session 的用户/实体识别与画像沉淀。\n- [ ] MCP 动态服务器:运行时增删 MCP server,热加载工具。\n- [ ] 轻量记忆图谱层:实体/关系抽取、主题聚类、GraphRAG 风格全局搜索。\n\n想要了解更详细的建设蓝图?请翻阅 [ROADMAP.md](docs/ROADMAP.md) 吧~\n\n## 🏛️ 虚空系统架构概览\n\n```\n┌──────────────────────────────────────────────────────────────┐\n│ 世界树树冠 (Interface Layer) │\n│ CLI (typer+rich) + WebUI (Vue 3 SPA) + Desktop (Tauri桌宠) │\n├──────────────────────────────────────────────────────────────┤\n│ 世界树树枝 (Gateway-Node Layer) │\n│ FastAPI Gateway (REST + SSE) / Node 分布式网络(规划中) │\n├──────────────────────────────────────────────────────────────┤\n│ 挂件与神之眼 (Plugin Layer) │\n│ 插件加载/权限/命令与工具注册/Channel接入/MCP/知识库/生图/群聊 │\n├──────────────────────────────────────────────────────────────┤\n│ 智慧主脑 (Agent Layer) │\n│ Agent Loop / Subagent编排 / 记忆&文档检索 / 多模态 / Provider │\n├──────────────────────────────────────────────────────────────┤\n│ 专属温室 (Workspace Layer) │\n│ 工作空间管理 / 安全文件沙盒 / 指令文件注入 │\n├──────────────────────────────────────────────────────────────┤\n│ 净土核心 (Core Layer) │\n│ 应用生命周期 / 分层配置 / 事件总线 / 会话管理 / 结构化日志 │\n└──────────────────────────────────────────────────────────────┘\n```\n\n详细的系统图纸存放在教令院的 [ARCHITECTURE](docs/architecture/README.md) 里哦。\n\n## 🚀 启动终端(快速开始)\n\n### 环境要求\n\n- Python 3.12+\n- [astral-uv](https://docs.astral.sh/uv/)\n- [pnpm](https://pnpm.io/)(WebUI 前端 / Desktop 桌宠构建)\n- [Rust](https://www.rust-lang.org/) + [Tauri 2](https://v2.tauri.app/)(仅打包 Desktop 桌宠时需要)\n\n### 安装\n\n```bash\ngit clone https://github.com/AI1379/nahida-bot.git\ncd nahida-bot\n\n# Python 后端\nuv sync\n\n# 如需知识库导入 PDF、Word、PowerPoint、Excel 等文档\nuv sync --extra document-import\n\n# 如需 Telegram Channel,安装可选依赖\nuv sync --group telegram\n\n# WebUI 前端(可选,但推荐)\ncd webui\npnpm install\npnpm build # 输出到 webui/dist/,Gateway 启动时自动挂载\ncd ..\n\n# 类型检查与单元测试,可选\nuv run pyright\nuv run pytest\n\n# 编辑 config.yaml 配置 LLM Provider 和 Channel 后启动\nuv run nahida-bot start\n```\n\n#### Desktop 桌宠(可选)\n\n```bash\ncd desktop\npnpm install\npnpm setup:live2d-core # 下载 Live2D Core 运行时\npnpm dev:web # 仅前端预览(Vite,端口 1420)\npnpm build:web # 构建前端资源\n# 打包桌面端(需要 Rust 工具链):\npnpm build # = tauri build,产物在 desktop/dist\ncd ..\n```\n\n桌宠默认通过 WebSocket 连接本地 Gateway,平时贴在屏幕边缘;可在桌面端配置连接地址、Live2D 模型映射与 TTS 参数。详见 [Desktop 设计文档](docs/design/desktop-app.md)。\n\n#### 知识库文档导入\n\n基础安装可以直接导入 UTF-8 编码的 `.txt`、`.text`、`.md` 和\n`.markdown` 文件。需要完整的知识库文档导入能力时,安装可选依赖:\n\n```bash\nuv sync --extra document-import\n```\n\n安装后可通过 WebUI 导入 PDF、DOCX、PPTX、XLS/XLSX、HTML、CSV、\nJSON、XML、EPUB、Outlook MSG 和 Jupyter Notebook。富文档会先由\n[Microsoft MarkItDown](https://github.com/microsoft/markitdown) 转换为\nMarkdown,再进入现有的分块和检索流程。WebUI 支持一次选择或拖入最多\n20 个文件,单个文件上限为 25 MiB;批量导入会单独报告每个文件的结果,\n失败文件不会回滚已经成功导入的文件。\n\n旧版 `.doc` 不受支持,请先另存为 `.docx`。扫描版 PDF 或以图片为主的\n文档可能无法提取足够文本;当前集成不会启用 MarkItDown 第三方插件或\n云端 OCR。\n\n### CLI 命令\n\n```bash\nnahida-bot version # 显示版本信息\nnahida-bot start [--debug] # 启动应用(含 Gateway + WebUI)\nnahida-bot config # 显示当前配置\nnahida-bot config schema # 显示配置 schema(含插件 schema)\nnahida-bot config validate # 校验配置文件\nnahida-bot doctor # 运行诊断检查\nnahida-bot gateway # 仅启动 Gateway(WebAPI + WebUI)\n```\n\n### 最小配置示例\n\n```yaml\n# config.yaml\napp_name: \"Nahida Bot\"\nlog_level: \"INFO\"\nlog_file: \"./data/logs/nahida.log\"\nlog_file_level: \"DEBUG\"\n\nproviders:\n deepseek-main:\n type: deepseek\n api_key: \"${DEEPSEEK_LLM_API_KEY:}\"\n base_url: \"${DEEPSEEK_LLM_BASE_URL:https://api.deepseek.com}\"\n stream_responses: true\n models:\n - name: \"deepseek-v4-pro\"\n tags: [primary]\n - name: \"deepseek-v4-flash\"\n tags: [cheap, memory]\n\n siliconflow:\n type: \"openai-compatible\"\n api_key: \"${SILICONFLOW_LLM_API_KEY:}\"\n base_url: \"${SILICONFLOW_LLM_BASE_URL:https://api.siliconflow.cn/v1}\"\n stream_responses: true\n models:\n - name: \"Qwen/Qwen3.6-35B-A3B\"\n tags: [vision]\n capabilities:\n image_input: true\n max_image_count: 4\n\ndefault_provider: deepseek-main\n\ntelegram:\n bot_token: \"${TELEGRAM_BOT_TOKEN:}\"\n\n# Milky QQ Channel(可选)\n# milky:\n# base_url: \"http://127.0.0.1:3000\"\n# access_token: \"${MILKY_ACCESS_TOKEN}\"\n# group_trigger_mode: \"mention\"\n\n# OneBot Channel(可选,默认 v11 正向 WS)\n# onebot:\n# protocol_version: \"v11\"\n# ws_url: \"ws://127.0.0.1:3001\"\n# ws_access_token: \"${ONEBOT_ACCESS_TOKEN:}\"\n# webhook_enabled: false\n# webhook_host: \"127.0.0.1\"\n# webhook_port: 6186\n```\n\n配置支持 `${VAR}` 和 `${VAR:default}` 环境变量插值,可选 `.env` 文件加载。`config.yaml` 中包含 Agent Loop、Context Budget、Scheduler、Memory(FTS/Vector/Embedding)、Multimodal、Router、Model Tags、各 Channel 与各插件等完整配置项及详细注释。\n\n## 📚 文档\n\n[文档站点](https://nahida-bot.cobaltdev.top)\n\n| 文档 | 内容 |\n| ---- | ---- |\n| [ARCHITECTURE](docs/architecture/README.md) | 系统架构、分层设计、模块协作 |\n| [ROADMAP](docs/ROADMAP.md) | 路线图、阶段规划、验收清单 |\n| [DEVELOPMENT](docs/guide/development.md) | 代码风格、测试规范、类型检查 |\n| [CONFIGURATION](docs/guide/configuration.md) | 配置指南、环境变量、完整参考 |\n| [config.yaml](config.yaml) | 带注释的完整配置参考 |\n| [设计文档](docs/design/) | WebUI、Plugin Web Panels、Memory、OneBot Channel、Knowledge Base、Desktop App 等 17 份专题设计 |\n\n## 🧩 内置与示例插件\n\n| 插件 | 说明 |\n| ---- | ---- |\n| `builtin-commands` | 核心命令、workspace/memory 工具、exec、web_fetch、plan、cron、agent 编排 |\n| `mcp` | Model Context Protocol 客户端,接入外部 MCP 工具服务器 |\n| `knowledge_base` | 知识库文档导入与 FTS/向量/混合检索 |\n| `image_generation` | OpenAI 兼容 Images API 生图,含配额管理 |\n| `conversation_joiner` | 群聊上下文观察 + 主动接入决策 |\n| `onebot` | OneBot v11/v12 Channel(NapCat/Lagrange/LLOneBot) |\n| [plugins/echo](plugins/echo) · [plugins/github-notifier](plugins/github-notifier) · [plugins/rss-notifier](plugins/rss-notifier) | 可独立安装的示例插件(含独立 pyproject) |\n\n插件作者可基于 [`nahida-bot-sdk`](nahida-bot-sdk) 在独立仓库开发并通过 `plugin.yaml` 声明能力、权限与配置 schema。\n\n## 🤝 参考项目\n\n这里的很多智慧结晶,都离不开前辈们的探索:\n\n| 项目 | 参考内容 |\n|-----|-------|\n| [OpenClaw](https://github.com/openclaw/openclaw) | Agent + Workspace 模式、Gateway-Node 架构灵感、sentinel token 协议 |\n| [Codex](https://github.com/openai/codex) | Agent 核心的经典实现,权限管理与沙箱 |\n| [AstrBot](https://github.com/AstrBotDevs/AstrBot) / [MaiBot](https://github.com/Mai-with-u/MaiBot) | Python LLM bot 领域的老前辈 |\n| [nonebot2](https://github.com/nonebot/nonebot2) | 繁荣的插件生态、跨平台消息适配的经典设计 |\n| [Lagrange](https://github.com/LagrangeDev/LagrangeV2) / [NapCat](https://github.com/NapNeko/NapCatQQ) / [LuckyLilliaBot](https://github.com/LLOneBot/LuckyLilliaBot) | QQ 协议后端 |\n| [pixi-live2d-display](https://github.com/guansss/pixi-live2d-display) / [Tauri](https://v2.tauri.app/) | Desktop 桌宠的 Live2D 渲染与原生壳 |\n| [MarkItDown](https://github.com/microsoft/markitdown) | 知识库富文档到 Markdown 的转换 |\n\n## Star History\n\n<a href=\"https://www.star-history.com/?repos=AI1379%2Fnahida-bot&type=date&legend=top-left\">\n <picture>\n <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://api.star-history.com/chart?repos=AI1379/nahida-bot&type=date&theme=dark&legend=top-left\" />\n <source media=\"(prefers-color-scheme: light)\" srcset=\"https://api.star-history.com/chart?repos=AI1379/nahida-bot&type=date&legend=top-left\" />\n <img alt=\"Star History Chart\" src=\"https://api.star-history.com/chart?repos=AI1379/nahida-bot&type=date&legend=top-left\" />\n </picture>\n</a>\n\n## License\n\n**AGPL-v3.0 License.**\n"}, "2c8aa081aa3a75416926eb1ac08d5488ff4525b1": {"t": 1785761609.2829838, "n": 13321, "h": "60542fe47c0b3cc8", "c": "# 🍃 Nahida Bot\n\n> \n>\n> 「这是**摩诃善法大吉祥智慧主**,智慧之神**布耶尔**,须弥的**草神大人**,你敢和她对视五秒吗?」\n\n欢迎连接到属于你的私有「虚空终端」!**Nahida Bot** 不仅仅是一个冷冰冰的机器,而是一个 **Agent 为灵魂**、以 **Workspace 为家**、能长出 **Live2D 桌宠形态**,还能通过 **插件随意换装** 的 Python 智能框架哦~ 🌿\n\n文档:[Docs](https://nahida-bot.cobaltdev.top)\n\n[](https://qm.qq.com/q/rXP8DKCyRi) [](https://app.netlify.com/projects/nahida-bot/deploys)\n\n## ✨ 核心天赋\n\n### 💡 设计理念\n\n- **Agent-first(意识主导)**:以 Agent Loop 为中枢,大语言模型(LLM)在这里不是外挂的工具人,而是真正的主导大脑~\n- **Workspace-native(专属花盆)**:文件就是上下文,工作空间(Workspace)作为一等公民被温柔对待。\n- **Plugin-driven(百变衣橱)**:不需要在核心代码里硬编码,想要什么新能力?装个插件就好啦!\n- **Multi-Provider(万叶一心)**:支持 OpenAI Compatible(含 Responses API)、DeepSeek、Anthropic Claude、GLM、Groq、Minimax 等多种 LLM 后端,运行时随心切换~\n- **Multi-Channel(千风引路)**:Telegram Bot + Milky QQ(Lagrange.Milky)+ OneBot v11/v12(NapCat/Lagrange/LLOneBot),统一的消息标准化与 ChannelService 协议~\n- **Desktop Pet(梦中之相)**:Tauri + Rust + Vue 3 + Live2D(PixiJS)打造的边缘隐藏式桌宠,鼠标靠近 / Gateway 推送 / CRON 到点时从屏幕角落唤出,还能本地 TTS 发声~\n- **Multimodal(万象识图)**:原生 vision 图片理解 or 自动 fallback 描述 or image_understand 工具,三种模式自适应~\n- **Memory & Retrieval(梦境刻录)**:SQLite 会话记忆 + FTS 关键词检索 + 向量检索 + 混合检索 + LLM 记忆巩固;独立的 Document Store 让知识库与记忆各自安家~\n- **Knowledge Base(须弥图书馆)**:内置知识库插件,导入 PDF/Word/PPT/Excel 等文档,MarkItDown 转换 + 分块 + FTS/向量/混合检索 + 可选 embedding~\n- **Agent Orchestration(子机协作)**:主 Agent 可 spawn 子 Agent 执行后台任务,支持 spawn / wait / stop 全生命周期~\n- **Cron & Dreaming(时之沙)**:定时任务调度 + 记忆 dreaming(LLM 驱动的周期性记忆整理与巩固)~\n- **MCP Support(外道魔术)**:Model Context Protocol 客户端集成,对接外部 MCP 工具服务器~\n- **Gateway & WebUI(世界树控制台)**:FastAPI REST API + Vue 3 SPA 运维面板 + SSE 实时事件推送;密码/OTP 登录、配置可视化管理、CRON/Session/文件/知识库/插件/Skills/用量管理~\n- **Ops-friendly(无忧除虫)**:可观测、可诊断、好发布,就算遇到了 Bug 也能轻松捉虫🐞!\n\n## 📈 成长进度(项目状态)\n\n目前小吉祥草王已完成 **Phase 4 全闭环 + WebUI 主体 + Desktop 桌宠 + OneBot Channel**:Telegram / Milky QQ / OneBot 三 Channel、Multi-Provider、内置命令/工具/插件体系、Subagent 编排、Multimodal、Scheduler 与 Memory Dreaming、知识库与生图插件、Gateway REST API、WebUI 运维面板(Vue 3)、Desktop Live2D 桌宠、SSE 实时事件、登录及权限体系均已可用。\n\n### 🌟 已点亮的命座 ✅\n\n- [x] 净土的基石与质量把控(Phase 0)\n- [x] 核心生命循环:应用容器、分层配置、事件脉络与观测日志(Phase 1)\n- [x] 专属花盆(Workspace):空间管理、文件沙盒、指令注入(Phase 2.1-2.2)\n- [x] 智慧运转(Agent Loop):消息拼装、模型调用、工具闭环、推理链传播(Phase 2.3-2.4)\n- [x] 记忆流转:SQLite 会话记忆、FTS 检索、向量检索、混合检索(Phase 2.5)\n- [x] 推理链健壮性:OpenAI/DeepSeek/Claude 多后端推理提取与上下文回传,Anthropic reasoning effort + 1M context 支持(Phase 2.8)\n- [x] 万象识图:Vision 原生传图、fallback 自动描述/工具模式、MediaCache/MediaResolver(Phase 2.9)\n- [x] 插件系统:Manifest 声明、Loader 发现加载、权限检查、生命周期隔离、命令与工具注册(Phase 3.1-3.6)\n- [x] 接引通道 Telegram:长轮询、消息标准化、HTML/Markdown 转换、群聊 @mention、媒体降级(Phase 4.1-4.5)\n- [x] 接引通道 Milky QQ:Lagrange.Milky WebSocket 事件流、消息段建模、群聊触发策略、合并转发解析(Phase 4.6)\n- [x] 接引通道 OneBot:v11/v12 双版本统一抽象、正向 WebSocket + WebHook、CQ 码与 array segment 归一化\n- [x] Multi-Provider:per-request model override、Provider 类型运行时注册、pre/post-agent 分阶段加载、OpenAI Responses API\n- [x] MCP 集成:Model Context Protocol 客户端、工具适配、连接管理\n- [x] 知识库插件:文档导入(MarkItDown 富文档转换)、分块、FTS/向量/混合检索、可选 embedding、SQLite Document Store\n- [x] 生图插件:OpenAI 兼容 Images API 后端、`/draw`·`/生图` 命令、24h 滚动配额管理、自动发送附件\n- [x] 群聊主动接入插件(Conversation Joiner):observed-only 群上下文观察 + engagement 状态机,决定何时自然加入话题(in-memory MVP)\n- [x] Desktop 桌宠:Tauri + Rust + Vue 3 + Live2D,边缘隐藏窗口、接近检测、气泡/输入框、本地 TTS 播放管线\n- [x] Subagent 编排:spawn 子 Agent、BackgroundTask 账本、policy hook、父子 session 管理(Phase 3.8 主体)\n- [x] 记忆与文档存储:Memory Store(consolidation/markdown/scope)+ Document Store 分离,按 chat/global scope 隔离的持久记忆\n- [x] 集中式 TaskManager:统一管理 asyncio 任务生命周期与优雅停止\n- [x] 定时调度:Cron 定时任务 + Memory Dreaming LLM 记忆巩固\n- [x] 会话级别推理设置:`/reasoning on|off|effort <level>|reset`\n- [x] 群聊上下文注入:observed-only 消息记录 + 触发时注入最近群上下文\n- [x] 内置命令 12 个:`/reset`、`/new`、`/status`、`/model`、`/reasoning`、`/help`、`/memory`、`/agents`、`/agent_stop`、`/agent_wait`、`/cron`、`/stop`\n- [x] 内置工具 16+:`workspace_read/write`、`send_local_attachment`、`memory_read/write`、`exec`、`web_fetch`、`plan`、`cron_*`、`agent_*`、`image_understand`,外加知识库检索、生图等插件工具\n- [x] Gateway REST API:`/api/health`、`/api/status`、`/api/send`、`/api/sessions`、`/api/cron`(全局管理)、`/api/config`(读写/校验/备份)、`/api/files`(workspace 文件管理)、`/api/kb`(知识库导入与检索)、`/api/plugins`、`/api/skills`、`/api/tokens`(用量)、`/api/messages`、`/api/auth`(登录/登出/session)、`/api/events/stream`(SSE)\n- [x] WebUI 运维面板:Vue 3 + Vite + shadcn-vue + Reka UI,首页状态总览、配置页(YAML 编辑/校验/保存/备份)、CRON 管理、Session 分组浏览、文件管理、知识库导入、插件管理、Skills、用量统计、系统日志、关于页\n- [x] WebUI 登录体系:管理员密码(Argon2id)+ Session Cookie + 登录限速;Bearer Token 兼容脚本/API 调用\n- [x] SSE 实时事件:`status.updated`、`usage.recorded`、`cron.*`、`session.updated`、`config.saved`、`file.updated`\n- [x] Usage Ledger:SQLite 持久化 token 统计(input/output/cached/reasoning),支持按 provider/model/session/source_tag 聚合\n- [x] Cron Session 模式:`main`(注入主 session)、`isolated`(独立 session)、`named`(持久命名 session,跨 run 累积上下文)\n- [x] 回复信号协议:`NO_REPLY` 静默抑制 + `HEARTBEAT_OK` 心跳空转保护\n- [x] SDK 独立成包:`nahida-bot-sdk` 作为 workspace 成员,插件作者可用稳定 API 开发与发布\n- [x] 设计文档 17 份:Agent Core、ChatAddress/SessionID、Cross-Session、Memory System/Scoping、Agent Compaction、Model Routing、Runtime Settings、WebUI、Plugin Web Panels、Cron/WebAPI、OneBot Channel、Conversation Joiner、Knowledge Base、Desktop App、Person Identity、MCP Dynamic Servers、Tool-Produced Image Media\n\n### 🚧 正在进行的光合作用\n\n- [ ] OneBot Channel 收尾:反向 WebSocket、WebHook 生产化、多账号支持与更多 action 覆盖。\n- [ ] Desktop 桌宠完善:通知/番茄钟/CRON 唤出策略打磨、跨平台打包与签名。\n- [ ] 知识库与记忆检索合并重构:Document Store 与 Memory 检索模型统一,引入 LLM 摘要压缩与语义召回(Phase 2.5b)。\n- [ ] 群聊主动接入插件持久化、管理界面与正式 `group_observe_mode`。\n- [ ] 工具产出图片的 media artifact 注册、自动注入与跨轮持久化。\n- [ ] WebUI 高级安全特性:Chat OTP 登录、部署模式(loopback/https/http_emergency)、CSRF 防护。\n- [ ] Workspace Sandbox 安全增强:符号链接、TOCTOU、文件大小、特殊文件对象等防护。\n\n### 📜 未来的建设计划\n\n- [ ] Gateway 与 Node 分布式部署(Phase 5):节点注册、心跳、远程执行协议、WebSocket RPC,远程节点跑重模型。\n- [ ] WebUI 插件页面 surface:插件通过 manifest 声明 WebUI 面板,sandbox iframe 加载。\n- [ ] 人物身份系统(Person Identity):跨 session 的用户/实体识别与画像沉淀。\n- [ ] MCP 动态服务器:运行时增删 MCP server,热加载工具。\n- [ ] 轻量记忆图谱层:实体/关系抽取、主题聚类、GraphRAG 风格全局搜索。\n\n想要了解更详细的建设蓝图?请翻阅 [ROADMAP.md](docs/ROADMAP.md) 吧~\n\n## 🏛️ 虚空系统架构概览\n\n```\n┌──────────────────────────────────────────────────────────────┐\n│ 世界树树冠 (Interface Layer) │\n│ CLI (typer+rich) + WebUI (Vue 3 SPA) + Desktop (Tauri桌宠) │\n├──────────────────────────────────────────────────────────────┤\n│ 世界树树枝 (Gateway-Node Layer) │\n│ FastAPI Gateway (REST + SSE) / Node 分布式网络(规划中) │\n├──────────────────────────────────────────────────────────────┤\n│ 挂件与神之眼 (Plugin Layer) │\n│ 插件加载/权限/命令与工具注册/Channel接入/MCP/知识库/生图/群聊 │\n├──────────────────────────────────────────────────────────────┤\n│ 智慧主脑 (Agent Layer) │\n│ Agent Loop / Subagent编排 / 记忆&文档检索 / 多模态 / Provider │\n├──────────────────────────────────────────────────────────────┤\n│ 专属温室 (Workspace Layer) │\n│ 工作空间管理 / 安全文件沙盒 / 指令文件注入 │\n├──────────────────────────────────────────────────────────────┤\n│ 净土核心 (Core Layer) │\n│ 应用生命周期 / 分层配置 / 事件总线 / 会话管理 / 结构化日志 │\n└──────────────────────────────────────────────────────────────┘\n```\n\n详细的系统图纸存放在教令院的 [ARCHITECTURE](docs/architecture/README.md) 里哦。\n\n## 🚀 启动终端(快速开始)\n\n### 环境要求\n\n- Python 3.12+\n- [astral-uv](https://docs.astral.sh/uv/)\n- [pnpm](https://pnpm.io/)(WebUI 前端 / Desktop 桌宠构建)\n- [Rust](https://www.rust-lang.org/) + [Tauri 2](https://v2.tauri.app/)(仅打包 Desktop 桌宠时需要)\n\n### 安装\n\n```bash\ngit clone https://github.com/AI1379/nahida-bot.git\ncd nahida-bot\n\n# Python 后端\nuv sync\n\n# 如需知识库导入 PDF、Word、PowerPoint、Excel 等文档\nuv sync --extra document-import\n\n# 如需 Telegram Channel,安装可选依赖\nuv sync --group telegram\n\n# WebUI 前端(可选,但推荐)\ncd webui\npnpm install\npnpm build # 输出到 webui/dist/,Gateway 启动时自动挂载\ncd ..\n\n# 类型检查与单元测试,可选\nuv run pyright\nuv run pytest\n\n# 编辑 config.yaml 配置 LLM Provider 和 Channel 后启动\nuv run nahida-bot start\n```\n\n#### Desktop 桌宠(可选)\n\n```bash\ncd desktop\npnpm install\npnpm setup:live2d-core # 下载 Live2D Core 运行时\npnpm dev:web # 仅前端预览(Vite,端口 1420)\npnpm build:web # 构建前端资源\n# 打包桌面端(需要 Rust 工具链):\npnpm build # = tauri build,产物在 desktop/dist\ncd ..\n```\n\n桌宠默认通过 WebSocket 连接本地 Gateway,平时贴在屏幕边缘;可在桌面端配置连接地址、Live2D 模型映射与 TTS 参数。详见 [Desktop 设计文档](docs/design/desktop-app.md)。\n\n#### 知识库文档导入\n\n基础安装可以直接导入 UTF-8 编码的 `.txt`、`.text`、`.md` 和\n`.markdown` 文件。需要完整的知识库文档导入能力时,安装可选依赖:\n\n```bash\nuv sync --extra document-import\n```\n\n安装后可通过 WebUI 导入 PDF、DOCX、PPTX、XLS/XLSX、HTML、CSV、\nJSON、XML、EPUB、Outlook MSG 和 Jupyter Notebook。富文档会先由\n[Microsoft MarkItDown](https://github.com/microsoft/markitdown) 转换为\nMarkdown,再进入现有的分块和检索流程。WebUI 支持一次选择或拖入最多\n20 个文件,单个文件上限为 25 MiB;批量导入会单独报告每个文件的结果,\n失败文件不会回滚已经成功导入的文件。\n\n旧版 `.doc` 不受支持,请先另存为 `.docx`。扫描版 PDF 或以图片为主的\n文档可能无法提取足够文本;当前集成不会启用 MarkItDown 第三方插件或\n云端 OCR。\n\n### CLI 命令\n\n```bash\nnahida-bot version # 显示版本信息\nnahida-bot start [--debug] # 启动应用(含 Gateway + WebUI)\nnahida-bot config # 显示当前配置\nnahida-bot config schema # 显示配置 schema(含插件 schema)\nnahida-bot config validate # 校验配置文件\nnahida-bot doctor # 运行诊断检查\nnahida-bot gateway # 仅启动 Gateway(WebAPI + WebUI)\n```\n\n### 最小配置示例\n\n```yaml\n# config.yaml\napp_name: \"Nahida Bot\"\nlog_level: \"INFO\"\nlog_file: \"./data/logs/nahida.log\"\nlog_file_level: \"DEBUG\"\n\nproviders:\n deepseek-main:\n type: deepseek\n api_key: \"${DEEPSEEK_LLM_API_KEY:}\"\n base_url: \"${DEEPSEEK_LLM_BASE_URL:https://api.deepseek.com}\"\n stream_responses: true\n models:\n - name: \"deepseek-v4-pro\"\n tags: [primary]\n - name: \"deepseek-v4-flash\"\n tags: [cheap, memory]\n\n siliconflow:\n type: \"openai-compatible\"\n api_key: \"${SILICONFLOW_LLM_API_KEY:}\"\n base_url: \"${SILICONFLOW_LLM_BASE_URL:https://api.siliconflow.cn/v1}\"\n stream_responses: true\n models:\n - name: \"Qwen/Qwen3.6-35B-A3B\"\n tags: [vision]\n capabilities:\n image_input: true\n max_image_count: 4\n\ndefault_provider: deepseek-main\n\ntelegram:\n bot_token: \"${TELEGRAM_BOT_TOKEN:}\"\n\n# Milky QQ Channel(可选)\n# milky:\n# base_url: \"http://127.0.0.1:3000\"\n# access_token: \"${MILKY_ACCESS_TOKEN}\"\n# group_trigger_mode: \"mention\"\n\n# OneBot Channel(可选,默认 v11 正向 WS)\n# onebot:\n# protocol_version: \"v11\"\n# ws_url: \"ws://127.0.0.1:3001\"\n# ws_access_token: \"${ONEBOT_ACCESS_TOKEN:}\"\n# webhook_enabled: false\n# webhook_host: \"127.0.0.1\"\n# webhook_port: 6186\n```\n\n配置支持 `${VAR}` 和 `${VAR:default}` 环境变量插值,可选 `.env` 文件加载。`config.yaml` 中包含 Agent Loop、Context Budget、Scheduler、Memory(FTS/Vector/Embedding)、Multimodal、Router、Model Tags、各 Channel 与各插件等完整配置项及详细注释。\n\n## 📚 文档\n\n[文档站点](https://nahida-bot.cobaltdev.top)\n\n| 文档 | 内容 |\n| ---- | ---- |\n| [ARCHITECTURE](docs/architecture/README.md) | 系统架构、分层设计、模块协作 |\n| [ROADMAP](docs/ROADMAP.md) | 路线图、阶段规划、验收清单 |\n| [DEVELOPMENT](docs/guide/development.md) | 代码风格、测试规范、类型检查 |\n| [CONFIGURATION](docs/guide/configuration.md) | 配置指南、环境变量、完整参考 |\n| [config.yaml](config.yaml) | 带注释的完整配置参考 |\n| [设计文档](docs/design/) | WebUI、Plugin Web Panels、Memory、OneBot Channel、Knowledge Base、Desktop App 等 17 份专题设计 |\n\n## 🧩 内置与示例插件\n\n| 插件 | 说明 |\n| ---- | ---- |\n| `builtin-commands` | 核心命令、workspace/memory 工具、exec、web_fetch、plan、cron、agent 编排 |\n| `mcp` | Model Context Protocol 客户端,接入外部 MCP 工具服务器 |\n| `knowledge_base` | 知识库文档导入与 FTS/向量/混合检索 |\n| `image_generation` | OpenAI 兼容 Images API 生图,含配额管理 |\n| `conversation_joiner` | 群聊上下文观察 + 主动接入决策 |\n| `onebot` | OneBot v11/v12 Channel(NapCat/Lagrange/LLOneBot) |\n| [plugins/echo](plugins/echo) · [plugins/github-notifier](plugins/github-notifier) · [plugins/rss-notifier](plugins/rss-notifier) | 可独立安装的示例插件(含独立 pyproject) |\n\n插件作者可基于 [`nahida-bot-sdk`](nahida-bot-sdk) 在独立仓库开发并通过 `plugin.yaml` 声明能力、权限与配置 schema。\n\n## 🤝 参考项目\n\n这里的很多智慧结晶,都离不开前辈们的探索:\n\n| 项目 | 参考内容 |\n|-----|-------|\n| [OpenClaw](https://github.com/openclaw/openclaw) | Agent + Workspace 模式、Gateway-Node 架构灵感、sentinel token 协议 |\n| [Codex](https://github.com/openai/codex) | Agent 核心的经典实现,权限管理与沙箱 |\n| [AstrBot](https://github.com/AstrBotDevs/AstrBot) / [MaiBot](https://github.com/Mai-with-u/MaiBot) | Python LLM bot 领域的老前辈 |\n| [nonebot2](https://github.com/nonebot/nonebot2) | 繁荣的插件生态、跨平台消息适配的经典设计 |\n| [Lagrange](https://github.com/LagrangeDev/LagrangeV2) / [NapCat](https://github.com/NapNeko/NapCatQQ) / [LuckyLilliaBot](https://github.com/LLOneBot/LuckyLilliaBot) | QQ 协议后端 |\n| [pixi-live2d-display](https://github.com/guansss/pixi-live2d-display) / [Tauri](https://v2.tauri.app/) | Desktop 桌宠的 Live2D 渲染与原生壳 |\n| [MarkItDown](https://github.com/microsoft/markitdown) | 知识库富文档到 Markdown 的转换 |\n\n## Star History\n\n<a href=\"https://www.star-history.com/?repos=AI1379%2Fnahida-bot&type=date&legend=top-left\">\n <picture>\n <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://api.star-history.com/chart?repos=AI1379/nahida-bot&type=date&theme=dark&legend=top-left\" />\n <source media=\"(prefers-color-scheme: light)\" srcset=\"https://api.star-history.com/chart?repos=AI1379/nahida-bot&type=date&legend=top-left\" />\n <img alt=\"Star History Chart\" src=\"https://api.star-history.com/chart?repos=AI1379/nahida-bot&type=date&legend=top-left\" />\n </picture>\n</a>\n\n## License\n\n**AGPL-v3.0 License.**\n"}, "160a15c9753c2636e94c65685bcfd705f12d5f68": {"t": 1785761612.145945, "n": 12753, "h": "66255c6825debc41", "c": "# 🍃 Nahida Bot\n\n> \n>\n> 「这是**摩诃善法大吉祥智慧主**,智慧之神**布耶尔**,须弥的**草神大人**,你敢和她对视五秒吗?」\n\n欢迎连接到属于你的私有「虚空终端」!**Nahida Bot** 不仅仅是一个冷冰冰的机器,而是一个 **Agent 为灵魂**、以 **Workspace 为家**、能长出 **Live2D 桌宠形态**,还能通过 **插件随意换装** 的 Python 智能框架哦~ 🌿\n\n文档:[Docs](https://nahida-bot.cobaltdev.top)\n\n[](https://qm.qq.com/q/rXP8DKCyRi) [](https://app.netlify.com/projects/nahida-bot/deploys)\n\n## ✨ 核心天赋\n\n### 💡 设计理念\n\n- **Agent-first(意识主导)**:以 Agent Loop 为中枢,大语言模型(LLM)在这里不是外挂的工具人,而是真正的主导大脑~\n- **Workspace-native(专属花盆)**:文件就是上下文,工作空间(Workspace)作为一等公民被温柔对待。\n- **Plugin-driven(百变衣橱)**:不需要在核心代码里硬编码,想要什么新能力?装个插件就好啦!\n- **Multi-Provider(万叶一心)**:支持 OpenAI Compatible(含 Responses API)、DeepSeek、Anthropic Claude、GLM、Groq、Minimax 等多种 LLM 后端,运行时随心切换~\n- **Multi-Channel(千风引路)**:Telegram Bot + Milky QQ(Lagrange.Milky)+ OneBot v11/v12(NapCat/Lagrange/LLOneBot),统一的消息标准化与 ChannelService 协议~\n- **Desktop Pet(梦中之相)**:Tauri + Rust + Vue 3 + Live2D(PixiJS)打造的边缘隐藏式桌宠,鼠标靠近 / Gateway 推送 / CRON 到点时从屏幕角落唤出,还能本地 TTS 发声~\n- **Multimodal(万象识图)**:原生 vision 图片理解 or 自动 fallback 描述 or image_understand 工具,三种模式自适应~\n- **Memory & Retrieval(梦境刻录)**:SQLite 会话记忆 + FTS 关键词检索 + 向量检索 + 混合检索 + LLM 记忆巩固;独立的 Document Store 让知识库与记忆各自安家~\n- **Knowledge Base(须弥图书馆)**:内置知识库插件,导入 PDF/Word/PPT/Excel 等文档,MarkItDown 转换 + 分块 + FTS/向量/混合检索 + 可选 embedding~\n- **Agent Orchestration(子机协作)**:主 Agent 可 spawn 子 Agent 执行后台任务,支持 spawn / wait / stop 全生命周期~\n- **Cron & Dreaming(时之沙)**:定时任务调度 + 记忆 dreaming(LLM 驱动的周期性记忆整理与巩固)~\n- **MCP Support(外道魔术)**:Model Context Protocol 客户端集成,对接外部 MCP 工具服务器~\n- **Gateway & WebUI(世界树控制台)**:FastAPI REST API + Vue 3 SPA 运维面板 + SSE 实时事件推送;密码/OTP 登录、配置可视化管理、CRON/Session/文件/知识库/插件/Skills/用量管理~\n- **Ops-friendly(无忧除虫)**:可观测、可诊断、好发布,就算遇到了 Bug 也能轻松捉虫🐞!\n\n## 📈 成长进度(项目状态)\n\n目前小吉祥草王已完成 **Phase 4 全闭环 + WebUI 主体 + Desktop 桌宠 + OneBot Channel**:Telegram / Milky QQ / OneBot 三 Channel、Multi-Provider、内置命令/工具/插件体系、Subagent 编排、Multimodal、Scheduler 与 Memory Dreaming、知识库与生图插件、Gateway REST API、WebUI 运维面板(Vue 3)、Desktop Live2D 桌宠、SSE 实时事件、登录及权限体系均已可用。\n\n### 🌟 已点亮的命座 ✅\n\n- [x] 净土的基石与质量把控(Phase 0)\n- [x] 核心生命循环:应用容器、分层配置、事件脉络与观测日志(Phase 1)\n- [x] 专属花盆(Workspace):空间管理、文件沙盒、指令注入(Phase 2.1-2.2)\n- [x] 智慧运转(Agent Loop):消息拼装、模型调用、工具闭环、推理链传播(Phase 2.3-2.4)\n- [x] 记忆流转:SQLite 会话记忆、FTS 检索、向量检索、混合检索(Phase 2.5)\n- [x] 推理链健壮性:OpenAI/DeepSeek/Claude 多后端推理提取与上下文回传,Anthropic reasoning effort + 1M context 支持(Phase 2.8)\n- [x] 万象识图:Vision 原生传图、fallback 自动描述/工具模式、MediaCache/MediaResolver(Phase 2.9)\n- [x] 插件系统:Manifest 声明、Loader 发现加载、权限检查、生命周期隔离、命令与工具注册(Phase 3.1-3.6)\n- [x] 接引通道 Telegram:长轮询、消息标准化、HTML/Markdown 转换、群聊 @mention、媒体降级(Phase 4.1-4.5)\n- [x] 接引通道 Milky QQ:Lagrange.Milky WebSocket 事件流、消息段建模、群聊触发策略、合并转发解析(Phase 4.6)\n- [x] 接引通道 OneBot:v11/v12 双版本统一抽象、正向 WebSocket + WebHook、CQ 码与 array segment 归一化\n- [x] Multi-Provider:per-request model override、Provider 类型运行时注册、pre/post-agent 分阶段加载、OpenAI Responses API\n- [x] MCP 集成:Model Context Protocol 客户端、工具适配、连接管理\n- [x] 知识库插件:文档导入(MarkItDown 富文档转换)、分块、FTS/向量/混合检索、可选 embedding、SQLite Document Store\n- [x] 生图插件:OpenAI 兼容 Images API 后端、`/draw`·`/生图` 命令、24h 滚动配额管理、自动发送附件\n- [x] 群聊主动接入插件(Conversation Joiner):observed-only 群上下文观察 + engagement 状态机,决定何时自然加入话题(in-memory MVP)\n- [x] Desktop 桌宠:Tauri + Rust + Vue 3 + Live2D,边缘隐藏窗口、接近检测、气泡/输入框、本地 TTS 播放管线\n- [x] Subagent 编排:spawn 子 Agent、BackgroundTask 账本、policy hook、父子 session 管理(Phase 3.8 主体)\n- [x] 记忆与文档存储:Memory Store(consolidation/markdown/scope)+ Document Store 分离,按 chat/global scope 隔离的持久记忆\n- [x] 集中式 TaskManager:统一管理 asyncio 任务生命周期与优雅停止\n- [x] 定时调度:Cron 定时任务 + Memory Dreaming LLM 记忆巩固\n- [x] 会话级别推理设置:`/reasoning on|off|effort <level>|reset`\n- [x] 群聊上下文注入:observed-only 消息记录 + 触发时注入最近群上下文\n- [x] 内置命令 12 个:`/reset`、`/new`、`/status`、`/model`、`/reasoning`、`/help`、`/memory`、`/agents`、`/agent_stop`、`/agent_wait`、`/cron`、`/stop`\n- [x] 内置工具 16+:`workspace_read/write`、`send_local_attachment`、`memory_read/write`、`exec`、`web_fetch`、`plan`、`cron_*`、`agent_*`、`image_understand`,外加知识库检索、生图等插件工具\n- [x] Gateway REST API:`/api/health`、`/api/status`、`/api/send`、`/api/sessions`、`/api/cron`(全局管理)、`/api/config`(读写/校验/备份)、`/api/files`(workspace 文件管理)、`/api/kb`(知识库导入与检索)、`/api/plugins`、`/api/skills`、`/api/tokens`(用量)、`/api/messages`、`/api/auth`(登录/登出/session)、`/api/events/stream`(SSE)\n- [x] WebUI 运维面板:Vue 3 + Vite + shadcn-vue + Reka UI,首页状态总览、配置页(YAML 编辑/校验/保存/备份)、CRON 管理、Session 分组浏览、文件管理、知识库导入、插件管理、Skills、用量统计、系统日志、关于页\n- [x] WebUI 登录体系:管理员密码(Argon2id)+ Session Cookie + 登录限速;Bearer Token 兼容脚本/API 调用\n- [x] SSE 实时事件:`status.updated`、`usage.recorded`、`cron.*`、`session.updated`、`config.saved`、`file.updated`\n- [x] Usage Ledger:SQLite 持久化 token 统计(input/output/cached/reasoning),支持按 provider/model/session/source_tag 聚合\n- [x] Cron Session 模式:`main`(注入主 session)、`isolated`(独立 session)、`named`(持久命名 session,跨 run 累积上下文)\n- [x] 回复信号协议:`NO_REPLY` 静默抑制 + `HEARTBEAT_OK` 心跳空转保护\n- [x] SDK 独立成包:`nahida-bot-sdk` 作为 workspace 成员,插件作者可用稳定 API 开发与发布\n- [x] 设计文档 17 份:Agent Core、ChatAddress/SessionID、Cross-Session、Memory System/Scoping、Agent Compaction、Model Routing、Runtime Settings、WebUI、Plugin Web Panels、Cron/WebAPI、OneBot Channel、Conversation Joiner、Knowledge Base、Desktop App、Person Identity、MCP Dynamic Servers、Tool-Produced Image Media\n\n### 🚧 正在进行的光合作用\n\n- [ ] OneBot Channel 收尾:反向 WebSocket、WebHook 生产化、多账号支持与更多 action 覆盖。\n- [ ] Desktop 桌宠完善:通知/番茄钟/CRON 唤出策略打磨、跨平台打包与签名。\n- [ ] 知识库与记忆检索合并重构:Document Store 与 Memory 检索模型统一,引入 LLM 摘要压缩与语义召回(Phase 2.5b)。\n- [ ] 群聊主动接入插件持久化、管理界面与正式 `group_observe_mode`。\n- [ ] 工具产出图片的 media artifact 注册、自动注入与跨轮持久化。\n- [ ] WebUI 高级安全特性:Chat OTP 登录、部署模式(loopback/https/http_emergency)、CSRF 防护。\n- [ ] Workspace Sandbox 安全增强:符号链接、TOCTOU、文件大小、特殊文件对象等防护。\n\n### 📜 未来的建设计划\n\n- [ ] Gateway 与 Node 分布式部署(Phase 5):节点注册、心跳、远程执行协议、WebSocket RPC,远程节点跑重模型。\n- [ ] WebUI 插件页面 surface:插件通过 manifest 声明 WebUI 面板,sandbox iframe 加载。\n- [ ] 人物身份系统(Person Identity):跨 session 的用户/实体识别与画像沉淀。\n- [ ] MCP 动态服务器:运行时增删 MCP server,热加载工具。\n- [ ] 轻量记忆图谱层:实体/关系抽取、主题聚类、GraphRAG 风格全局搜索。\n\n想要了解更详细的建设蓝图?请翻阅 [ROADMAP.md](docs/ROADMAP.md) 吧~\n\n## 🏛️ 虚空系统架构概览\n\n```\n┌──────────────────────────────────────────────────────────────┐\n│ 世界树树冠 (Interface Layer) │\n│ CLI (typer+rich) + WebUI (Vue 3 SPA) + Desktop (Tauri桌宠) │\n├──────────────────────────────────────────────────────────────┤\n│ 世界树树枝 (Gateway-Node Layer) │\n│ FastAPI Gateway (REST + SSE) / Node 分布式网络(规划中) │\n├──────────────────────────────────────────────────────────────┤\n│ 挂件与神之眼 (Plugin Layer) │\n│ 插件加载/权限/命令与工具注册/Channel接入/MCP/知识库/生图/群聊 │\n├──────────────────────────────────────────────────────────────┤\n│ 智慧主脑 (Agent Layer) │\n│ Agent Loop / Subagent编排 / 记忆&文档检索 / 多模态 / Provider │\n├──────────────────────────────────────────────────────────────┤\n│ 专属温室 (Workspace Layer) │\n│ 工作空间管理 / 安全文件沙盒 / 指令文件注入 │\n├──────────────────────────────────────────────────────────────┤\n│ 净土核心 (Core Layer) │\n│ 应用生命周期 / 分层配置 / 事件总线 / 会话管理 / 结构化日志 │\n└──────────────────────────────────────────────────────────────┘\n```\n\n详细的系统图纸存放在教令院的 [ARCHITECTURE](docs/architecture/README.md) 里哦。\n\n## 🚀 启动终端(快速开始)\n\n### 环境要求\n\n- Python 3.12+\n- [astral-uv](https://docs.astral.sh/uv/)\n- [pnpm](https://pnpm.io/)(WebUI 前端 / Desktop 桌宠构建)\n- [Rust](https://www.rust-lang.org/) + [Tauri 2](https://v2.tauri.app/)(仅打包 Desktop 桌宠时需要)\n\n### 安装\n\n```bash\ngit clone https://github.com/AI1379/nahida-bot.git\ncd nahida-bot\n\n# Python 后端\nuv sync\n\n# 如需知识库导入 PDF、Word、PowerPoint、Excel 等文档\nuv sync --extra document-import\n\n# 如需 Telegram Channel,安装可选依赖\nuv sync --group telegram\n\n# WebUI 前端(可选,但推荐)\ncd webui\npnpm install\npnpm build # 输出到 webui/dist/,Gateway 启动时自动挂载\ncd ..\n\n# 类型检查与单元测试,可选\nuv run pyright\nuv run pytest\n\n# 编辑 config.yaml 配置 LLM Provider 和 Channel 后启动\nuv run nahida-bot start\n```\n\n#### Desktop 桌宠(可选)\n\n```bash\ncd desktop\npnpm install\npnpm setup:live2d-core # 下载 Live2D Core 运行时\npnpm dev:web # 仅前端预览(Vite,端口 1420)\npnpm build:web # 构建前端资源\n# 打包桌面端(需要 Rust 工具链):\npnpm build # = tauri build,产物在 desktop/dist\ncd ..\n```\n\n桌宠默认通过 WebSocket 连接本地 Gateway,平时贴在屏幕边缘;可在桌面端配置连接地址、Live2D 模型映射与 TTS 参数。详见 [Desktop 设计文档](docs/design/desktop-app.md)。\n\n#### 知识库文档导入\n\n基础安装可以直接导入 UTF-8 编码的 `.txt`、`.text`、`.md` 和\n`.markdown` 文件。需要完整的知识库文档导入能力时,安装可选依赖:\n\n```bash\nuv sync --extra document-import\n```\n\n安装后可通过 WebUI 导入 PDF、DOCX、PPTX、XLS/XLSX、HTML、CSV、\nJSON、XML、EPUB、Outlook MSG 和 Jupyter Notebook。富文档会先由\n[Microsoft MarkItDown](https://github.com/microsoft/markitdown) 转换为\nMarkdown,再进入现有的分块和检索流程。WebUI 支持一次选择或拖入最多\n20 个文件,单个文件上限为 25 MiB;批量导入会单独报告每个文件的结果,\n失败文件不会回滚已经成功导入的文件。\n\n旧版 `.doc` 不受支持,请先另存为 `.docx`。扫描版 PDF 或以图片为主的\n文档可能无法提取足够文本;当前集成不会启用 MarkItDown 第三方插件或\n云端 OCR。\n\n### CLI 命令\n\n```bash\nnahida-bot version # 显示版本信息\nnahida-bot start [--debug] # 启动应用(含 Gateway + WebUI)\nnahida-bot config # 显示当前配置\nnahida-bot config schema # 显示配置 schema(含插件 schema)\nnahida-bot config validate # 校验配置文件\nnahida-bot doctor # 运行诊断检查\nnahida-bot gateway # 仅启动 Gateway(WebAPI + WebUI)\n```\n\n### 最小配置示例\n\n```yaml\n# config.yaml\napp_name: \"Nahida Bot\"\nlog_level: \"INFO\"\nlog_file: \"./data/logs/nahida.log\"\nlog_file_level: \"DEBUG\"\n\nproviders:\n deepseek-main:\n type: deepseek\n api_key: \"${DEEPSEEK_LLM_API_KEY:}\"\n base_url: \"${DEEPSEEK_LLM_BASE_URL:https://api.deepseek.com}\"\n stream_responses: true\n models:\n - name: \"deepseek-v4-pro\"\n tags: [primary]\n - name: \"deepseek-v4-flash\"\n tags: [cheap, memory]\n\n siliconflow:\n type: \"openai-compatible\"\n api_key: \"${SILICONFLOW_LLM_API_KEY:}\"\n base_url: \"${SILICONFLOW_LLM_BASE_URL:https://api.siliconflow.cn/v1}\"\n stream_responses: true\n models:\n - name: \"Qwen/Qwen3.6-35B-A3B\"\n tags: [vision]\n capabilities:\n image_input: true\n max_image_count: 4\n\ndefault_provider: deepseek-main\n\ntelegram:\n bot_token: \"${TELEGRAM_BOT_TOKEN:}\"\n\n# Milky QQ Channel(可选)\n# milky:\n# base_url: \"http://127.0.0.1:3000\"\n# access_token: \"${MILKY_ACCESS_TOKEN}\"\n# group_trigger_mode: \"mention\"\n\n# OneBot Channel(可选,默认 v11 正向 WS)\n# onebot:\n# protocol_version: \"v11\"\n# ws_url: \"ws://127.0.0.1:3001\"\n# ws_access_token: \"${ONEBOT_ACCESS_TOKEN:}\"\n# webhook_enabled: false\n# webhook_host: \"127.0.0.1\"\n# webhook_port: 6186\n```\n\n配置支持 `${VAR}` 和 `${VAR:default}` 环境变量插值,可选 `.env` 文件加载。`config.yaml` 中包含 Agent Loop、Context Budget、Scheduler、Memory(FTS/Vector/Embedding)、Multimodal、Router、Model Tags、各 Channel 与各插件等完整配置项及详细注释。\n\n## 📚 文档\n\n[文档站点](https://nahida-bot.cobaltdev.top)\n\n| 文档 | 内容 |\n| ---- | ---- |\n| [ARCHITECTURE](docs/architecture/README.md) | 系统架构、分层设计、模块协作 |\n| [ROADMAP](docs/ROADMAP.md) | 路线图、阶段规划、验收清单 |\n| [DEVELOPMENT](docs/guide/development.md) | 代码风格、测试规范、类型检查 |\n| [CONFIGURATION](docs/guide/configuration.md) | 配置指南、环境变量、完整参考 |\n| [config.yaml](config.yaml) | 带注释的完整配置参考 |\n| [设计文档](docs/design/) | WebUI、Plugin Web Panels、Memory、OneBot Channel、Knowledge Base、Desktop App 等 17 份专题设计 |\n\n## 🧩 内置与示例插件\n\n| 插件 | 说明 |\n| ---- | ---- |\n| `builtin-commands` | 核心命令、workspace/memory 工具、exec、web_fetch、plan、cron、agent 编排 |\n| `mcp` | Model Context Protocol 客户端,接入外部 MCP 工具服务器 |\n| `knowledge_base` | 知识库文档导入与 FTS/向量/混合检索 |\n| `image_generation` | OpenAI 兼容 Images API 生图,含配额管理 |\n| `conversation_joiner` | 群聊上下文观察 + 主动接入决策 |\n| `onebot` | OneBot v11/v12 Channel(NapCat/Lagrange/LLOneBot) |\n| [plugins/echo](plugins/echo) · [plugins/github-notifier](plugins/github-notifier) · [plugins/rss-notifier](plugins/rss-notifier) | 可独立安装的示例插件(含独立 pyproject) |\n\n插件作者可基于 [`nahida-bot-sdk`](nahida-bot-sdk) 在独立仓库开发并通过 `plugin.yaml` 声明能力、权限与配置 schema。\n\n## 🤝 参考项目\n\n这里的很多智慧结晶,都离不开前辈们的探索:\n\n| 项目 | 参考内容 |\n|-----|-------|\n| [OpenClaw](https://github.com/openclaw/openclaw) | Agent + Workspace 模式、Gateway-Node 架构灵感、sentinel token 协议 |\n| [Codex](https://github.com/openai/codex) | Agent 核心的经典实现,权限管理与沙箱 |\n| [AstrBot](https://github.com/AstrBotDevs/AstrBot) / [MaiBot](https://github.com/Mai-with-u/MaiBot) | Python LLM bot 领域的老前辈 |\n| [nonebot2](https://github.com/nonebot/nonebot2) | 繁荣的插件生态、跨平台消息适配的经典设计 |\n| [Lagrange](https://github.com/LagrangeDev/LagrangeV2) / [NapCat](https://github.com/NapNeko/NapCatQQ) / [LuckyLilliaBot](https://github.com/LLOneBot/LuckyLilliaBot) | QQ 协议后端 |\n| [pixi-live2d-display](https://github.com/guansss/pixi-live2d-display) / [Tauri](https://v2.tauri.app/) | Desktop 桌宠的 Live2D 渲染与原生壳 |\n| [MarkItDown](https://github.com/microsoft/markitdown) | 知识库富文档到 Markdown 的转换 |\n\n## License\n\n**AGPL-v3.0 License.**\n"}, "61dd37ecf8e375d0251d5a653dbb91ccdb5dbdea": {"t": 1785761615.4692295, "n": 12670, "h": "8e00fc10b111c244", "c": "# 🍃 Nahida Bot\n\n> \n>\n> 「这是**摩诃善法大吉祥智慧主**,智慧之神**布耶尔**,须弥的**草神大人**,你敢和她对视五秒吗?」\n\n欢迎连接到属于你的私有「虚空终端」!**Nahida Bot** 不仅仅是一个冷冰冰的机器,而是一个 **Agent 为灵魂**、以 **Workspace 为家**、能长出 **Live2D 桌宠形态**,还能通过 **插件随意换装** 的 Python 智能框架哦~ 🌿\n\n文档:[Docs](https://nahida-bot.cobaltdev.top)\n\n[](https://qm.qq.com/q/rXP8DKCyRi) [](https://app.netlify.com/projects/nahida-bot/deploys)\n\n## ✨ 核心天赋\n\n### 💡 设计理念\n\n- **Agent-first(意识主导)**:以 Agent Loop 为中枢,大语言模型(LLM)在这里不是外挂的工具人,而是真正的主导大脑~\n- **Workspace-native(专属花盆)**:文件就是上下文,工作空间(Workspace)作为一等公民被温柔对待。\n- **Plugin-driven(百变衣橱)**:不需要在核心代码里硬编码,想要什么新能力?装个插件就好啦!\n- **Multi-Provider(万叶一心)**:支持 OpenAI Compatible(含 Responses API)、DeepSeek、Anthropic Claude、GLM、Groq、Minimax 等多种 LLM 后端,运行时随心切换~\n- **Multi-Channel(千风引路)**:Telegram Bot + Milky QQ(Lagrange.Milky)+ OneBot v11/v12(NapCat/Lagrange/LLOneBot),统一的消息标准化与 ChannelService 协议~\n- **Desktop Pet(梦中之相)**:Tauri + Rust + Vue 3 + Live2D(PixiJS)打造的边缘隐藏式桌宠,鼠标靠近 / Gateway 推送 / CRON 到点时从屏幕角落唤出,还能本地 TTS 发声~\n- **Multimodal(万象识图)**:原生 vision 图片理解 or 自动 fallback 描述 or image_understand 工具,三种模式自适应~\n- **Memory & Retrieval(梦境刻录)**:SQLite 会话记忆 + FTS 关键词检索 + 向量检索 + 混合检索 + LLM 记忆巩固;独立的 Document Store 让知识库与记忆各自安家~\n- **Knowledge Base(须弥图书馆)**:内置知识库插件,导入 PDF/Word/PPT/Excel 等文档,MarkItDown 转换 + 分块 + FTS/向量/混合检索 + 可选 embedding~\n- **Agent Orchestration(子机协作)**:主 Agent 可 spawn 子 Agent 执行后台任务,支持 spawn / wait / stop 全生命周期~\n- **Cron & Dreaming(时之沙)**:定时任务调度 + 记忆 dreaming(LLM 驱动的周期性记忆整理与巩固)~\n- **MCP Support(外道魔术)**:Model Context Protocol 客户端集成,对接外部 MCP 工具服务器~\n- **Gateway & WebUI(世界树控制台)**:FastAPI REST API + Vue 3 SPA 运维面板 + SSE 实时事件推送;密码/OTP 登录、配置可视化管理、CRON/Session/文件/知识库/插件/Skills/用量管理~\n- **Ops-friendly(无忧除虫)**:可观测、可诊断、好发布,就算遇到了 Bug 也能轻松捉虫🐞!\n\n## 📈 成长进度(项目状态)\n\n目前小吉祥草王已完成 **Phase 4 全闭环 + WebUI 主体 + Desktop 桌宠 + OneBot Channel**:Telegram / Milky QQ / OneBot 三 Channel、Multi-Provider、内置命令/工具/插件体系、Subagent 编排、Multimodal、Scheduler 与 Memory Dreaming、知识库与生图插件、Gateway REST API、WebUI 运维面板(Vue 3)、Desktop Live2D 桌宠、SSE 实时事件、登录及权限体系均已可用。\n\n### 🌟 已点亮的命座 ✅\n\n- [x] 净土的基石与质量把控(Phase 0)\n- [x] 核心生命循环:应用容器、分层配置、事件脉络与观测日志(Phase 1)\n- [x] 专属花盆(Workspace):空间管理、文件沙盒、指令注入(Phase 2.1-2.2)\n- [x] 智慧运转(Agent Loop):消息拼装、模型调用、工具闭环、推理链传播(Phase 2.3-2.4)\n- [x] 记忆流转:SQLite 会话记忆、FTS 检索、向量检索、混合检索(Phase 2.5)\n- [x] 推理链健壮性:OpenAI/DeepSeek/Claude 多后端推理提取与上下文回传,Anthropic reasoning effort + 1M context 支持(Phase 2.8)\n- [x] 万象识图:Vision 原生传图、fallback 自动描述/工具模式、MediaCache/MediaResolver(Phase 2.9)\n- [x] 插件系统:Manifest 声明、Loader 发现加载、权限检查、生命周期隔离、命令与工具注册(Phase 3.1-3.6)\n- [x] 接引通道 Telegram:长轮询、消息标准化、HTML/Markdown 转换、群聊 @mention、媒体降级(Phase 4.1-4.5)\n- [x] 接引通道 Milky QQ:Lagrange.Milky WebSocket 事件流、消息段建模、群聊触发策略、合并转发解析(Phase 4.6)\n- [x] 接引通道 OneBot:v11/v12 双版本统一抽象、正向 WebSocket + WebHook、CQ 码与 array segment 归一化\n- [x] Multi-Provider:per-request model override、Provider 类型运行时注册、pre/post-agent 分阶段加载、OpenAI Responses API\n- [x] MCP 集成:Model Context Protocol 客户端、工具适配、连接管理\n- [x] 知识库插件:文档导入(MarkItDown 富文档转换)、分块、FTS/向量/混合检索、可选 embedding、SQLite Document Store\n- [x] 生图插件:OpenAI 兼容 Images API 后端、`/draw`·`/生图` 命令、24h 滚动配额管理、自动发送附件\n- [x] 群聊主动接入插件(Conversation Joiner):observed-only 群上下文观察 + engagement 状态机,决定何时自然加入话题(in-memory MVP)\n- [x] Desktop 桌宠:Tauri + Rust + Vue 3 + Live2D,边缘隐藏窗口、接近检测、气泡/输入框、本地 TTS 播放管线\n- [x] Subagent 编排:spawn 子 Agent、BackgroundTask 账本、policy hook、父子 session 管理(Phase 3.8 主体)\n- [x] 记忆与文档存储:Memory Store(consolidation/markdown/scope)+ Document Store 分离,按 chat/global scope 隔离的持久记忆\n- [x] 集中式 TaskManager:统一管理 asyncio 任务生命周期与优雅停止\n- [x] 定时调度:Cron 定时任务 + Memory Dreaming LLM 记忆巩固\n- [x] 会话级别推理设置:`/reasoning on|off|effort <level>|reset`\n- [x] 群聊上下文注入:observed-only 消息记录 + 触发时注入最近群上下文\n- [x] 内置命令 12 个:`/reset`、`/new`、`/status`、`/model`、`/reasoning`、`/help`、`/memory`、`/agents`、`/agent_stop`、`/agent_wait`、`/cron`、`/stop`\n- [x] 内置工具 16+:`workspace_read/write`、`send_local_attachment`、`memory_read/write`、`exec`、`web_fetch`、`plan`、`cron_*`、`agent_*`、`image_understand`,外加知识库检索、生图等插件工具\n- [x] Gateway REST API:`/api/health`、`/api/status`、`/api/send`、`/api/sessions`、`/api/cron`(全局管理)、`/api/config`(读写/校验/备份)、`/api/files`(workspace 文件管理)、`/api/kb`(知识库导入与检索)、`/api/plugins`、`/api/skills`、`/api/tokens`(用量)、`/api/messages`、`/api/auth`(登录/登出/session)、`/api/events/stream`(SSE)\n- [x] WebUI 运维面板:Vue 3 + Vite + shadcn-vue + Reka UI,首页状态总览、配置页(YAML 编辑/校验/保存/备份)、CRON 管理、Session 分组浏览、文件管理、知识库导入、插件管理、Skills、用量统计、系统日志、关于页\n- [x] WebUI 登录体系:管理员密码(Argon2id)+ Session Cookie + 登录限速;Bearer Token 兼容脚本/API 调用\n- [x] SSE 实时事件:`status.updated`、`usage.recorded`、`cron.*`、`session.updated`、`config.saved`、`file.updated`\n- [x] Usage Ledger:SQLite 持久化 token 统计(input/output/cached/reasoning),支持按 provider/model/session/source_tag 聚合\n- [x] Cron Session 模式:`main`(注入主 session)、`isolated`(独立 session)、`named`(持久命名 session,跨 run 累积上下文)\n- [x] 回复信号协议:`NO_REPLY` 静默抑制 + `HEARTBEAT_OK` 心跳空转保护\n- [x] SDK 独立成包:`nahida-bot-sdk` 作为 workspace 成员,插件作者可用稳定 API 开发与发布\n- [x] 设计文档 16 份:Agent Core、ChatAddress/SessionID、Cross-Session、Memory System/Scoping、Agent Compaction、Model Routing、Runtime Settings、WebUI、Cron/WebAPI、OneBot Channel、Conversation Joiner、Knowledge Base、Desktop App、Person Identity、MCP Dynamic Servers、Tool-Produced Image Media\n\n### 🚧 正在进行的光合作用\n\n- [ ] OneBot Channel 收尾:反向 WebSocket、WebHook 生产化、多账号支持与更多 action 覆盖。\n- [ ] Desktop 桌宠完善:通知/番茄钟/CRON 唤出策略打磨、跨平台打包与签名。\n- [ ] 知识库与记忆检索合并重构:Document Store 与 Memory 检索模型统一,引入 LLM 摘要压缩与语义召回(Phase 2.5b)。\n- [ ] 群聊主动接入插件持久化、管理界面与正式 `group_observe_mode`。\n- [ ] 工具产出图片的 media artifact 注册、自动注入与跨轮持久化。\n- [ ] WebUI 高级安全特性:Chat OTP 登录、部署模式(loopback/https/http_emergency)、CSRF 防护。\n- [ ] Workspace Sandbox 安全增强:符号链接、TOCTOU、文件大小、特殊文件对象等防护。\n\n### 📜 未来的建设计划\n\n- [ ] Gateway 与 Node 分布式部署(Phase 5):节点注册、心跳、远程执行协议、WebSocket RPC,远程节点跑重模型。\n- [ ] WebUI 插件页面 surface:插件通过 manifest 声明 WebUI 面板,sandbox iframe 加载。\n- [ ] 人物身份系统(Person Identity):跨 session 的用户/实体识别与画像沉淀。\n- [ ] MCP 动态服务器:运行时增删 MCP server,热加载工具。\n- [ ] 轻量记忆图谱层:实体/关系抽取、主题聚类、GraphRAG 风格全局搜索。\n\n想要了解更详细的建设蓝图?请翻阅 [ROADMAP.md](docs/ROADMAP.md) 吧~\n\n## 🏛️ 虚空系统架构概览\n\n```\n┌──────────────────────────────────────────────────────────────┐\n│ 世界树树冠 (Interface Layer) │\n│ CLI (typer+rich) + WebUI (Vue 3 SPA) + Desktop (Tauri桌宠) │\n├──────────────────────────────────────────────────────────────┤\n│ 世界树树枝 (Gateway-Node Layer) │\n│ FastAPI Gateway (REST + SSE) / Node 分布式网络(规划中) │\n├──────────────────────────────────────────────────────────────┤\n│ 挂件与神之眼 (Plugin Layer) │\n│ 插件加载/权限/命令与工具注册/Channel接入/MCP/知识库/生图/群聊 │\n├──────────────────────────────────────────────────────────────┤\n│ 智慧主脑 (Agent Layer) │\n│ Agent Loop / Subagent编排 / 记忆&文档检索 / 多模态 / Provider │\n├──────────────────────────────────────────────────────────────┤\n│ 专属温室 (Workspace Layer) │\n│ 工作空间管理 / 安全文件沙盒 / 指令文件注入 │\n├──────────────────────────────────────────────────────────────┤\n│ 净土核心 (Core Layer) │\n│ 应用生命周期 / 分层配置 / 事件总线 / 会话管理 / 结构化日志 │\n└──────────────────────────────────────────────────────────────┘\n```\n\n详细的系统图纸存放在教令院的 [ARCHITECTURE](docs/architecture/README.md) 里哦。\n\n## 🚀 启动终端(快速开始)\n\n### 环境要求\n\n- Python 3.12+\n- [astral-uv](https://docs.astral.sh/uv/)\n- [pnpm](https://pnpm.io/)(WebUI 前端 / Desktop 桌宠构建)\n- [Rust](https://www.rust-lang.org/) + [Tauri 2](https://v2.tauri.app/)(仅打包 Desktop 桌宠时需要)\n\n### 安装\n\n```bash\ngit clone https://github.com/AI1379/nahida-bot.git\ncd nahida-bot\n\n# Python 后端\nuv sync\n\n# 如需知识库导入 PDF、Word、PowerPoint、Excel 等文档\nuv sync --extra document-import\n\n# 如需 Telegram Channel,安装可选依赖\nuv sync --group telegram\n\n# WebUI 前端(可选,但推荐)\ncd webui\npnpm install\npnpm build # 输出到 webui/dist/,Gateway 启动时自动挂载\ncd ..\n\n# 类型检查与单元测试,可选\nuv run pyright\nuv run pytest\n\n# 编辑 config.yaml 配置 LLM Provider 和 Channel 后启动\nuv run nahida-bot start\n```\n\n#### Desktop 桌宠(可选)\n\n```bash\ncd desktop\npnpm install\npnpm setup:live2d-core # 下载 Live2D Core 运行时\npnpm dev:web # 仅前端预览(Vite,端口 1420)\npnpm build:web # 构建前端资源\n# 打包桌面端(需要 Rust 工具链):\npnpm build # = tauri build,产物在 desktop/dist\ncd ..\n```\n\n桌宠默认通过 WebSocket 连接本地 Gateway,平时贴在屏幕边缘;可在桌面端配置连接地址、Live2D 模型映射与 TTS 参数。详见 [Desktop 设计文档](docs/design/desktop-app.md)。\n\n#### 知识库文档导入\n\n基础安装可以直接导入 UTF-8 编码的 `.txt`、`.text`、`.md` 和\n`.markdown` 文件。需要完整的知识库文档导入能力时,安装可选依赖:\n\n```bash\nuv sync --extra document-import\n```\n\n安装后可通过 WebUI 导入 PDF、DOCX、PPTX、XLS/XLSX、HTML、CSV、\nJSON、XML、EPUB、Outlook MSG 和 Jupyter Notebook。富文档会先由\n[Microsoft MarkItDown](https://github.com/microsoft/markitdown) 转换为\nMarkdown,再进入现有的分块和检索流程。WebUI 支持一次选择或拖入最多\n20 个文件,单个文件上限为 25 MiB;批量导入会单独报告每个文件的结果,\n失败文件不会回滚已经成功导入的文件。\n\n旧版 `.doc` 不受支持,请先另存为 `.docx`。扫描版 PDF 或以图片为主的\n文档可能无法提取足够文本;当前集成不会启用 MarkItDown 第三方插件或\n云端 OCR。\n\n### CLI 命令\n\n```bash\nnahida-bot version # 显示版本信息\nnahida-bot start [--debug] # 启动应用(含 Gateway + WebUI)\nnahida-bot config # 显示当前配置\nnahida-bot config schema # 显示配置 schema(含插件 schema)\nnahida-bot config validate # 校验配置文件\nnahida-bot doctor # 运行诊断检查\nnahida-bot gateway # 仅启动 Gateway(WebAPI + WebUI)\n```\n\n### 最小配置示例\n\n```yaml\n# config.yaml\napp_name: \"Nahida Bot\"\nlog_level: \"INFO\"\nlog_file: \"./data/logs/nahida.log\"\nlog_file_level: \"DEBUG\"\n\nproviders:\n deepseek-main:\n type: deepseek\n api_key: \"${DEEPSEEK_LLM_API_KEY:}\"\n base_url: \"${DEEPSEEK_LLM_BASE_URL:https://api.deepseek.com}\"\n stream_responses: true\n models:\n - name: \"deepseek-v4-pro\"\n tags: [primary]\n - name: \"deepseek-v4-flash\"\n tags: [cheap, memory]\n\n siliconflow:\n type: \"openai-compatible\"\n api_key: \"${SILICONFLOW_LLM_API_KEY:}\"\n base_url: \"${SILICONFLOW_LLM_BASE_URL:https://api.siliconflow.cn/v1}\"\n stream_responses: true\n models:\n - name: \"Qwen/Qwen3.6-35B-A3B\"\n tags: [vision]\n capabilities:\n image_input: true\n max_image_count: 4\n\ndefault_provider: deepseek-main\n\ntelegram:\n bot_token: \"${TELEGRAM_BOT_TOKEN:}\"\n\n# Milky QQ Channel(可选)\n# milky:\n# base_url: \"http://127.0.0.1:3000\"\n# access_token: \"${MILKY_ACCESS_TOKEN}\"\n# group_trigger_mode: \"mention\"\n\n# OneBot Channel(可选,默认 v11 正向 WS)\n# onebot:\n# protocol_version: \"v11\"\n# ws_url: \"ws://127.0.0.1:3001\"\n# ws_access_token: \"${ONEBOT_ACCESS_TOKEN:}\"\n# webhook_enabled: false\n# webhook_host: \"127.0.0.1\"\n# webhook_port: 6186\n```\n\n配置支持 `${VAR}` 和 `${VAR:default}` 环境变量插值,可选 `.env` 文件加载。`config.yaml` 中包含 Agent Loop、Context Budget、Scheduler、Memory(FTS/Vector/Embedding)、Multimodal、Router、Model Tags、各 Channel 与各插件等完整配置项及详细注释。\n\n## 📚 文档\n\n[文档站点](https://nahida-bot.cobaltdev.top)\n\n| 文档 | 内容 |\n| ---- | ---- |\n| [ARCHITECTURE](docs/architecture/README.md) | 系统架构、分层设计、模块协作 |\n| [ROADMAP](docs/ROADMAP.md) | 路线图、阶段规划、验收清单 |\n| [DEVELOPMENT](docs/guide/development.md) | 代码风格、测试规范、类型检查 |\n| [CONFIGURATION](docs/guide/configuration.md) | 配置指南、环境变量、完整参考 |\n| [config.yaml](config.yaml) | 带注释的完整配置参考 |\n| [设计文档](docs/design/) | WebUI、Memory、OneBot Channel、Knowledge Base、Desktop App 等 16 份专题设计 |\n\n## 🧩 内置与示例插件\n\n| 插件 | 说明 |\n| ---- | ---- |\n| `builtin-commands` | 核心命令、workspace/memory 工具、exec、web_fetch、plan、cron、agent 编排 |\n| `mcp` | Model Context Protocol 客户端,接入外部 MCP 工具服务器 |\n| `knowledge_base` | 知识库文档导入与 FTS/向量/混合检索 |\n| `image_generation` | OpenAI 兼容 Images API 生图,含配额管理 |\n| `conversation_joiner` | 群聊上下文观察 + 主动接入决策 |\n| `onebot` | OneBot v11/v12 Channel(NapCat/Lagrange/LLOneBot) |\n| [plugins/echo](plugins/echo) · [plugins/github-notifier](plugins/github-notifier) | 可独立安装的示例插件(含独立 pyproject) |\n\n插件作者可基于 [`nahida-bot-sdk`](nahida-bot-sdk) 在独立仓库开发并通过 `plugin.yaml` 声明能力、权限与配置 schema。\n\n## 🤝 参考项目\n\n这里的很多智慧结晶,都离不开前辈们的探索:\n\n| 项目 | 参考内容 |\n|-----|-------|\n| [OpenClaw](https://github.com/openclaw/openclaw) | Agent + Workspace 模式、Gateway-Node 架构灵感、sentinel token 协议 |\n| [Codex](https://github.com/openai/codex) | Agent 核心的经典实现,权限管理与沙箱 |\n| [AstrBot](https://github.com/AstrBotDevs/AstrBot) / [MaiBot](https://github.com/Mai-with-u/MaiBot) | Python LLM bot 领域的老前辈 |\n| [nonebot2](https://github.com/nonebot/nonebot2) | 繁荣的插件生态、跨平台消息适配的经典设计 |\n| [Lagrange](https://github.com/LagrangeDev/LagrangeV2) / [NapCat](https://github.com/NapNeko/NapCatQQ) / [LuckyLilliaBot](https://github.com/LLOneBot/LuckyLilliaBot) | QQ 协议后端 |\n| [pixi-live2d-display](https://github.com/guansss/pixi-live2d-display) / [Tauri](https://v2.tauri.app/) | Desktop 桌宠的 Live2D 渲染与原生壳 |\n| [MarkItDown](https://github.com/microsoft/markitdown) | 知识库富文档到 Markdown 的转换 |\n\n## License\n\n**AGPL-v3.0 License.**\n"}, "7589d7f7e2494a896ff5a0427442f5941c5883e0": {"t": 1785761622.646735, "n": 9518, "h": "fb0e99e49b7f467d", "c": "# 🍃 Nahida Bot\n\n> \n>\n> 「这是**摩诃善法大吉祥智慧主**,智慧之神**布耶尔**,须弥的**草神大人**,你敢和她对视五秒吗?」\n\n欢迎连接到属于你的私有「虚空终端」!**Nahida Bot** 不仅仅是一个冷冰冰的机器,而是一个 **Agent 为灵魂**、以 **Workspace 为家**,还能通过 **插件随意换装** 的 Python 智能框架哦~ 🌿\n\n文档:[Docs](https://nahida-bot.cobaltdev.top)\n\n[](https://qm.qq.com/q/rXP8DKCyRi) [](https://app.netlify.com/projects/nahida-bot/deploys)\n\n## ✨ 核心天赋\n\n### 💡 设计理念\n\n- **Agent-first(意识主导)**:以 Agent Loop 为中枢,大语言模型(LLM)在这里不是外挂的工具人,而是真正的主导大脑~\n- **Workspace-native(专属花盆)**:文件就是上下文,工作空间(Workspace)作为一等公民被温柔对待。\n- **Plugin-driven(百变衣橱)**:不需要在核心代码里硬编码,想要什么新能力?装个插件就好啦!\n- **Multi-Provider(万叶一心)**:支持 OpenAI Compatible、DeepSeek、Anthropic Claude、GLM、Groq、Minimax 等多种 LLM 后端,运行时随心切换~\n- **Multi-Channel(千风引路)**:Telegram Bot + Milky QQ(Lagrange.Milky),统一的消息标准化与 ChannelService 协议;OneBot v11/v12 设计中~\n- **Multimodal(万象识图)**:原生 vision 图片理解 or 自动 fallback 描述 or image_understand 工具,三种模式自适应~\n- **Memory & Retrieval(梦境刻录)**:SQLite 会话记忆 + FTS 关键词检索 + 向量检索 + 混合检索 + LLM 记忆巩固~\n- **Agent Orchestration(子机协作)**:主 Agent 可 spawn 子 Agent 执行后台任务,支持 spawn / wait / stop 全生命周期~\n- **Cron & Dreaming(时之沙)**:定时任务调度 + 记忆 dreaming(LLM 驱动的周期性记忆整理与巩固)~\n- **MCP Support(外道魔术)**:Model Context Protocol 客户端集成,对接外部 MCP 工具服务器~\n- **Gateway & WebUI(世界树控制台)**:FastAPI REST API + Vue 3 SPA 运维面板 + SSE 实时事件推送;密码/OTP 登录、配置可视化管理、CRON/Session/文件管理~\n- **Ops-friendly(无忧除虫)**:可观测、可诊断、好发布,就算遇到了 Bug 也能轻松捉虫🐞!\n\n## 📈 成长进度(项目状态)\n\n目前小吉祥草王已完成 **Phase 4 全闭环 + WebUI 主体**:Telegram + Milky QQ 双 Channel、Multi-Provider、内置命令/工具/插件体系、Subagent 编排、Multimodal、Scheduler 与 Memory Dreaming、Gateway REST API、WebUI 运维面板(Vue 3)、SSE 实时事件、登录及权限体系均已可用。OneBot v11/v12 双版本协议支持正在设计中。\n\n### 🌟 已点亮的命座 ✅\n\n- [x] 净土的基石与质量把控(Phase 0)\n- [x] 核心生命循环:应用容器、分层配置、事件脉络与观测日志(Phase 1)\n- [x] 专属花盆(Workspace):空间管理、文件沙盒、指令注入(Phase 2.1-2.2)\n- [x] 智慧运转(Agent Loop):消息拼装、模型调用、工具闭环、推理链传播(Phase 2.3-2.4)\n- [x] 记忆流转:SQLite 会话记忆、FTS 检索、向量检索、混合检索(Phase 2.5)\n- [x] 推理链健壮性:OpenAI/DeepSeek/Claude 多后端推理提取与上下文回传(Phase 2.8)\n- [x] 万象识图:Vision 原生传图、fallback 自动描述/工具模式、MediaCache/MediaResolver(Phase 2.9)\n- [x] 插件系统:Manifest 声明、Loader 发现加载、权限检查、生命周期隔离、命令与工具注册(Phase 3.1-3.6)\n- [x] 接引通道 Telegram:长轮询、消息标准化、HTML/Markdown 转换、群聊 @mention、媒体降级(Phase 4.1-4.5)\n- [x] 接引通道 Milky QQ:Lagrange.Milky WebSocket 事件流、消息段建模、群聊触发策略、合并转发解析(Phase 4.6)\n- [x] Multi-Provider:per-request model override、Provider 类型运行时注册、pre/post-agent 分阶段加载\n- [x] MCP 集成:Model Context Protocol 客户端、工具适配、连接管理\n- [x] Subagent 编排:spawn 子 Agent、BackgroundTask 账本、policy hook、父子 session 管理(Phase 3.8 主体)\n- [x] 定时调度:Cron 定时任务 + Memory Dreaming LLM 记忆巩固\n- [x] 会话级别推理设置:`/reasoning on|off|effort <level>|reset`\n- [x] 群聊上下文注入:observed-only 消息记录 + 触发时注入最近群上下文\n- [x] 内置命令 11 个:`/reset`、`/new`、`/status`、`/model`、`/reasoning`、`/help`、`/memory`、`/agents`、`/agent_stop`、`/agent_wait`、`/stop`\n- [x] 内置工具 14+:`workspace_read/write`、`memory_read/write`、`exec`、`web_fetch`、`plan`、`cron_*`、`agent_*`、`image_understand`\n- [x] Gateway REST API:`/api/health`、`/api/status`、`/api/send`、`/api/sessions`、`/api/cron`(全局管理)、`/api/config`(读写/校验/备份)、`/api/files`(workspace 文件管理)、`/api/auth`(登录/登出/session)、`/api/events/stream`(SSE)\n- [x] WebUI 运维面板:Vue 3 + Vite + shadcn-vue + Reka UI,首页状态总览、配置页(YAML 编辑/校验/保存/备份)、CRON 管理、Session 分组浏览、文件管理、系统日志\n- [x] WebUI 登录体系:管理员密码(Argon2id)+ Session Cookie + 登录限速;Bearer Token 兼容脚本/API 调用\n- [x] SSE 实时事件:`status.updated`、`usage.recorded`、`cron.*`、`session.updated`、`config.saved`、`file.updated`\n- [x] Usage Ledger:SQLite 持久化 token 统计(input/output/cached/reasoning),支持按 provider/model/session/source_tag 聚合\n- [x] Cron Session 模式:`main`(注入主 session)、`isolated`(独立 session)、`named`(持久命名 session,跨 run 累积上下文)\n- [x] 回复信号协议:`NO_REPLY` 静默抑制 + `HEARTBEAT_OK` 心跳空转保护\n- [x] 设计文档 10+:WebUI、Memory、Cron/WebAPI、ChatAddress/SessionID、Cross-Session、Memory Scoping、Agent Compaction、Agent Loop、Model Routing、Runtime Settings、OneBot Channel\n\n### 🚧 正在进行的光合作用\n\n- [ ] OneBot v11/v12 Channel 插件开发(设计文档已完成,即将进入 Phase 0 实现)。\n- [ ] WebUI 高级安全特性:Chat OTP 登录、部署模式(loopback/https/http_emergency)、CSRF 防护。\n- [ ] Workspace Sandbox 安全增强:符号链接、TOCTOU、文件大小、特殊文件对象等防护。\n- [ ] 插件配置、MockBotAPI 和 SDK 分离整理。\n\n### 📜 未来的建设计划\n\n- [ ] OneBot Channel 完整实现:正向 WS(v11 双工 + v12 事件)、WebHook 模式、多账号支持。\n- [ ] Gateway 与 Node 分布式部署(Phase 5):节点注册、心跳、远程执行协议、WebSocket RPC。\n- [ ] WebUI 插件页面 surface:插件通过 manifest 声明 WebUI 面板,sandbox iframe 加载。\n- [ ] 轻量记忆图谱层:实体/关系抽取、主题聚类、GraphRAG 风格全局搜索。\n\n想要了解更详细的建设蓝图?请翻阅 [ROADMAP.md](docs/ROADMAP.md) 吧~\n\n## 🏛️ 虚空系统架构概览\n\n```\n┌──────────────────────────────────────────────────────────────┐\n│ 世界树树冠 (Interface Layer) │\n│ CLI (typer+rich) + WebUI (Vue 3 SPA) │\n├──────────────────────────────────────────────────────────────┤\n│ 世界树树枝 (Gateway-Node Layer) │\n│ FastAPI Gateway (REST + SSE) / Node 分布式网络(规划中) │\n├──────────────────────────────────────────────────────────────┤\n│ 挂件与神之眼 (Plugin Layer) │\n│ 插件加载/权限管理/命令注册/工具注册/Channel接入/MCP集成 │\n├──────────────────────────────────────────────────────────────┤\n│ 智慧主脑 (Agent Layer) │\n│ Agent Loop / Subagent编排 / 记忆检索 / 多模态 / Provider抽象 │\n├──────────────────────────────────────────────────────────────┤\n│ 专属温室 (Workspace Layer) │\n│ 工作空间管理 / 安全文件沙盒 / 指令文件注入 │\n├──────────────────────────────────────────────────────────────┤\n│ 净土核心 (Core Layer) │\n│ 应用生命周期 / 分层配置 / 事件总线 / 会话管理 / 结构化日志 │\n└──────────────────────────────────────────────────────────────┘\n```\n\n详细的系统图纸存放在教令院的 [ARCHITECTURE](docs/architecture/README.md) 里哦。\n\n## 🚀 启动终端(快速开始)\n\n### 环境要求\n\n- Python 3.12+\n- [astral-uv](https://docs.astral.sh/uv/)\n- [pnpm](https://pnpm.io/)(WebUI 前端构建)\n\n### 安装\n\n```bash\ngit clone https://github.com/AI1379/nahida-bot.git\ncd nahida-bot\n\n# Python 后端\nuv sync\n\n# 如需知识库导入 PDF、Word、PowerPoint、Excel 等文档\nuv sync --extra document-import\n\n# 如需 Telegram Channel,安装可选依赖\nuv sync --group telegram\n\n# WebUI 前端(可选,但推荐)\ncd webui\npnpm install\npnpm build # 输出到 webui/dist/,Gateway 启动时自动挂载\ncd ..\n\n# 类型检查与单元测试,可选\nuv run pyright\nuv run pytest\n\n# 编辑 config.yaml 配置 LLM Provider 和 Channel 后启动\nuv run nahida-bot start\n```\n\n#### 知识库文档导入\n\n基础安装可以直接导入 UTF-8 编码的 `.txt`、`.text`、`.md` 和\n`.markdown` 文件。需要完整的知识库文档导入能力时,安装可选依赖:\n\n```bash\nuv sync --extra document-import\n```\n\n安装后可通过 WebUI 导入 PDF、DOCX、PPTX、XLS/XLSX、HTML、CSV、\nJSON、XML、EPUB、Outlook MSG 和 Jupyter Notebook。富文档会先由\n[Microsoft MarkItDown](https://github.com/microsoft/markitdown) 转换为\nMarkdown,再进入现有的分块和检索流程。WebUI 支持一次选择或拖入最多\n20 个文件,单个文件上限为 25 MiB;批量导入会单独报告每个文件的结果,\n失败文件不会回滚已经成功导入的文件。\n\n旧版 `.doc` 不受支持,请先另存为 `.docx`。扫描版 PDF 或以图片为主的\n文档可能无法提取足够文本;当前集成不会启用 MarkItDown 第三方插件或\n云端 OCR。\n\n### CLI 命令\n\n```bash\nnahida-bot version # 显示版本信息\nnahida-bot start [--debug] # 启动应用(含 Gateway + WebUI)\nnahida-bot config # 显示当前配置\nnahida-bot config schema # 显示配置 schema(含插件 schema)\nnahida-bot config validate # 校验配置文件\nnahida-bot doctor # 运行诊断检查\nnahida-bot gateway # 仅启动 Gateway(WebAPI + WebUI)\n```\n\n### 最小配置示例\n\n```yaml\n# config.yaml\napp_name: \"Nahida Bot\"\nlog_level: \"INFO\"\nlog_file: \"./data/logs/nahida.log\"\nlog_file_level: \"DEBUG\"\n\nproviders:\n deepseek-main:\n type: deepseek\n api_key: \"${DEEPSEEK_LLM_API_KEY:}\"\n base_url: \"${DEEPSEEK_LLM_BASE_URL:https://api.deepseek.com}\"\n stream_responses: true\n models:\n - name: \"deepseek-v4-pro\"\n tags: [primary]\n - name: \"deepseek-v4-flash\"\n tags: [cheap, memory]\n\n siliconflow:\n type: \"openai-compatible\"\n api_key: \"${SILICONFLOW_LLM_API_KEY:}\"\n base_url: \"${SILICONFLOW_LLM_BASE_URL:https://api.siliconflow.cn/v1}\"\n stream_responses: true\n models:\n - name: \"Qwen/Qwen3.6-35B-A3B\"\n tags: [vision]\n capabilities:\n image_input: true\n max_image_count: 4\n\ndefault_provider: deepseek-main\n\ntelegram:\n bot_token: \"${TELEGRAM_BOT_TOKEN:}\"\n\n# Milky QQ Channel(可选)\n# milky:\n# base_url: \"http://127.0.0.1:3000\"\n# access_token: \"${MILKY_ACCESS_TOKEN}\"\n# group_trigger_mode: \"mention\"\n```\n\n配置支持 `${VAR}` 和 `${VAR:default}` 环境变量插值,可选 `.env` 文件加载。`config.yaml` 中包含 Agent Loop、Context Budget、Scheduler、Memory(FTS/Vector/Embedding)、Multimodal、Router、Model Tags 等完整配置项及详细注释。\n\n## 📚 文档\n\n[文档站点](https://nahida-bot.cobaltdev.top)\n\n| 文档 | 内容 |\n| ---- | ---- |\n| [ARCHITECTURE](docs/architecture/README.md) | 系统架构、分层设计、模块协作 |\n| [ROADMAP](docs/ROADMAP.md) | 路线图、阶段规划、验收清单 |\n| [DEVELOPMENT](docs/guide/development.md) | 代码风格、测试规范、类型检查 |\n| [CONFIGURATION](docs/guide/configuration.md) | 配置指南、环境变量、完整参考 |\n| [config.yaml](config.yaml) | 带注释的完整配置参考 |\n| [设计文档](docs/design/) | WebUI、Memory、OneBot Channel 等专题设计 |\n\n## 🤝 参考项目\n\n这里的很多智慧结晶,都离不开前辈们的探索:\n\n| 项目 | 参考内容 |\n|-----|-------|\n| [OpenClaw](https://github.com/openclaw/openclaw) | Agent + Workspace 模式、Gateway-Node 架构灵感、sentinel token 协议 |\n| [Codex](https://github.com/openai/codex) | Agent 核心的经典实现,权限管理与沙箱 |\n| [AstrBot](https://github.com/AstrBotDevs/AstrBot) / [MaiBot](https://github.com/Mai-with-u/MaiBot) | Python LLM bot 领域的老前辈 |\n| [nonebot2](https://github.com/nonebot/nonebot2) | 繁荣的插件生态、跨平台消息适配的经典设计 |\n| [Lagrange](https://github.com/LagrangeDev/LagrangeV2) / [NapCat](https://github.com/NapNeko/NapCatQQ) / [LuckyLilliaBot](https://github.com/LLOneBot/LuckyLilliaBot) | QQ 协议后端 |\n\n## License\n\n**AGPL-v3.0 License.**\n"}, "9e64b7dfaaa25bf0280b8884848840124587f64f": {"t": 1785761624.076575, "n": 8938, "h": "7b810165d69450c8", "c": "# 🍃 Nahida Bot\n\n> \n>\n> 「这是**摩诃善法大吉祥智慧主**,智慧之神**布耶尔**,须弥的**草神大人**,你敢和她对视五秒吗?」\n\n欢迎连接到属于你的私有「虚空终端」!**Nahida Bot** 不仅仅是一个冷冰冰的机器,而是一个 **Agent 为灵魂**、以 **Workspace 为家**,还能通过 **插件随意换装** 的 Python 智能框架哦~ 🌿\n\n文档:[Docs](https://nahida-bot.cobaltdev.top)\n\n[](https://qm.qq.com/q/rXP8DKCyRi) [](https://app.netlify.com/projects/nahida-bot/deploys)\n\n## ✨ 核心天赋\n\n### 💡 设计理念\n\n- **Agent-first(意识主导)**:以 Agent Loop 为中枢,大语言模型(LLM)在这里不是外挂的工具人,而是真正的主导大脑~\n- **Workspace-native(专属花盆)**:文件就是上下文,工作空间(Workspace)作为一等公民被温柔对待。\n- **Plugin-driven(百变衣橱)**:不需要在核心代码里硬编码,想要什么新能力?装个插件就好啦!\n- **Multi-Provider(万叶一心)**:支持 OpenAI Compatible、DeepSeek、Anthropic Claude、GLM、Groq、Minimax 等多种 LLM 后端,运行时随心切换~\n- **Multi-Channel(千风引路)**:Telegram Bot + Milky QQ(Lagrange.Milky),统一的消息标准化与 ChannelService 协议;OneBot v11/v12 设计中~\n- **Multimodal(万象识图)**:原生 vision 图片理解 or 自动 fallback 描述 or image_understand 工具,三种模式自适应~\n- **Memory & Retrieval(梦境刻录)**:SQLite 会话记忆 + FTS 关键词检索 + 向量检索 + 混合检索 + LLM 记忆巩固~\n- **Agent Orchestration(子机协作)**:主 Agent 可 spawn 子 Agent 执行后台任务,支持 spawn / wait / stop 全生命周期~\n- **Cron & Dreaming(时之沙)**:定时任务调度 + 记忆 dreaming(LLM 驱动的周期性记忆整理与巩固)~\n- **MCP Support(外道魔术)**:Model Context Protocol 客户端集成,对接外部 MCP 工具服务器~\n- **Gateway & WebUI(世界树控制台)**:FastAPI REST API + Vue 3 SPA 运维面板 + SSE 实时事件推送;密码/OTP 登录、配置可视化管理、CRON/Session/文件管理~\n- **Ops-friendly(无忧除虫)**:可观测、可诊断、好发布,就算遇到了 Bug 也能轻松捉虫🐞!\n\n## 📈 成长进度(项目状态)\n\n目前小吉祥草王已完成 **Phase 4 全闭环 + WebUI 主体**:Telegram + Milky QQ 双 Channel、Multi-Provider、内置命令/工具/插件体系、Subagent 编排、Multimodal、Scheduler 与 Memory Dreaming、Gateway REST API、WebUI 运维面板(Vue 3)、SSE 实时事件、登录及权限体系均已可用。OneBot v11/v12 双版本协议支持正在设计中。\n\n### 🌟 已点亮的命座 ✅\n\n- [x] 净土的基石与质量把控(Phase 0)\n- [x] 核心生命循环:应用容器、分层配置、事件脉络与观测日志(Phase 1)\n- [x] 专属花盆(Workspace):空间管理、文件沙盒、指令注入(Phase 2.1-2.2)\n- [x] 智慧运转(Agent Loop):消息拼装、模型调用、工具闭环、推理链传播(Phase 2.3-2.4)\n- [x] 记忆流转:SQLite 会话记忆、FTS 检索、向量检索、混合检索(Phase 2.5)\n- [x] 推理链健壮性:OpenAI/DeepSeek/Claude 多后端推理提取与上下文回传(Phase 2.8)\n- [x] 万象识图:Vision 原生传图、fallback 自动描述/工具模式、MediaCache/MediaResolver(Phase 2.9)\n- [x] 插件系统:Manifest 声明、Loader 发现加载、权限检查、生命周期隔离、命令与工具注册(Phase 3.1-3.6)\n- [x] 接引通道 Telegram:长轮询、消息标准化、HTML/Markdown 转换、群聊 @mention、媒体降级(Phase 4.1-4.5)\n- [x] 接引通道 Milky QQ:Lagrange.Milky WebSocket 事件流、消息段建模、群聊触发策略、合并转发解析(Phase 4.6)\n- [x] Multi-Provider:per-request model override、Provider 类型运行时注册、pre/post-agent 分阶段加载\n- [x] MCP 集成:Model Context Protocol 客户端、工具适配、连接管理\n- [x] Subagent 编排:spawn 子 Agent、BackgroundTask 账本、policy hook、父子 session 管理(Phase 3.8 主体)\n- [x] 定时调度:Cron 定时任务 + Memory Dreaming LLM 记忆巩固\n- [x] 会话级别推理设置:`/reasoning on|off|effort <level>|reset`\n- [x] 群聊上下文注入:observed-only 消息记录 + 触发时注入最近群上下文\n- [x] 内置命令 11 个:`/reset`、`/new`、`/status`、`/model`、`/reasoning`、`/help`、`/memory`、`/agents`、`/agent_stop`、`/agent_wait`、`/stop`\n- [x] 内置工具 14+:`workspace_read/write`、`memory_read/write`、`exec`、`web_fetch`、`plan`、`cron_*`、`agent_*`、`image_understand`\n- [x] Gateway REST API:`/api/health`、`/api/status`、`/api/send`、`/api/sessions`、`/api/cron`(全局管理)、`/api/config`(读写/校验/备份)、`/api/files`(workspace 文件管理)、`/api/auth`(登录/登出/session)、`/api/events/stream`(SSE)\n- [x] WebUI 运维面板:Vue 3 + Vite + shadcn-vue + Reka UI,首页状态总览、配置页(YAML 编辑/校验/保存/备份)、CRON 管理、Session 分组浏览、文件管理、系统日志\n- [x] WebUI 登录体系:管理员密码(Argon2id)+ Session Cookie + 登录限速;Bearer Token 兼容脚本/API 调用\n- [x] SSE 实时事件:`status.updated`、`usage.recorded`、`cron.*`、`session.updated`、`config.saved`、`file.updated`\n- [x] Usage Ledger:SQLite 持久化 token 统计(input/output/cached/reasoning),支持按 provider/model/session/source_tag 聚合\n- [x] Cron Session 模式:`main`(注入主 session)、`isolated`(独立 session)、`named`(持久命名 session,跨 run 累积上下文)\n- [x] 回复信号协议:`NO_REPLY` 静默抑制 + `HEARTBEAT_OK` 心跳空转保护\n- [x] 设计文档 10+:WebUI、Memory、Cron/WebAPI、ChatAddress/SessionID、Cross-Session、Memory Scoping、Agent Compaction、Agent Loop、Model Routing、Runtime Settings、OneBot Channel\n\n### 🚧 正在进行的光合作用\n\n- [ ] OneBot v11/v12 Channel 插件开发(设计文档已完成,即将进入 Phase 0 实现)。\n- [ ] WebUI 高级安全特性:Chat OTP 登录、部署模式(loopback/https/http_emergency)、CSRF 防护。\n- [ ] Workspace Sandbox 安全增强:符号链接、TOCTOU、文件大小、特殊文件对象等防护。\n- [ ] 插件配置、MockBotAPI 和 SDK 分离整理。\n\n### 📜 未来的建设计划\n\n- [ ] OneBot Channel 完整实现:正向 WS(v11 双工 + v12 事件)、WebHook 模式、多账号支持。\n- [ ] Gateway 与 Node 分布式部署(Phase 5):节点注册、心跳、远程执行协议、WebSocket RPC。\n- [ ] WebUI 插件页面 surface:插件通过 manifest 声明 WebUI 面板,sandbox iframe 加载。\n- [ ] 轻量记忆图谱层:实体/关系抽取、主题聚类、GraphRAG 风格全局搜索。\n\n想要了解更详细的建设蓝图?请翻阅 [ROADMAP.md](docs/ROADMAP.md) 吧~\n\n## 🏛️ 虚空系统架构概览\n\n```\n┌──────────────────────────────────────────────────────────────┐\n│ 世界树树冠 (Interface Layer) │\n│ CLI (typer+rich) + WebUI (Vue 3 SPA) │\n├──────────────────────────────────────────────────────────────┤\n│ 世界树树枝 (Gateway-Node Layer) │\n│ FastAPI Gateway (REST + SSE) / Node 分布式网络(规划中) │\n├──────────────────────────────────────────────────────────────┤\n│ 挂件与神之眼 (Plugin Layer) │\n│ 插件加载/权限管理/命令注册/工具注册/Channel接入/MCP集成 │\n├──────────────────────────────────────────────────────────────┤\n│ 智慧主脑 (Agent Layer) │\n│ Agent Loop / Subagent编排 / 记忆检索 / 多模态 / Provider抽象 │\n├──────────────────────────────────────────────────────────────┤\n│ 专属温室 (Workspace Layer) │\n│ 工作空间管理 / 安全文件沙盒 / 指令文件注入 │\n├──────────────────────────────────────────────────────────────┤\n│ 净土核心 (Core Layer) │\n│ 应用生命周期 / 分层配置 / 事件总线 / 会话管理 / 结构化日志 │\n└──────────────────────────────────────────────────────────────┘\n```\n\n详细的系统图纸存放在教令院的 [ARCHITECTURE](docs/architecture/README.md) 里哦。\n\n## 🚀 启动终端(快速开始)\n\n### 环境要求\n\n- Python 3.12+\n- [astral-uv](https://docs.astral.sh/uv/)\n- [pnpm](https://pnpm.io/)(WebUI 前端构建)\n\n### 安装\n\n```bash\ngit clone https://github.com/AI1379/nahida-bot.git\ncd nahida-bot\n\n# Python 后端\nuv sync\n\n# 如需 Telegram Channel,安装可选依赖\nuv sync --group telegram\n\n# WebUI 前端(可选,但推荐)\ncd webui\npnpm install\npnpm build # 输出到 webui/dist/,Gateway 启动时自动挂载\ncd ..\n\n# 类型检查与单元测试,可选\nuv run pyright\nuv run pytest\n\n# 编辑 config.yaml 配置 LLM Provider 和 Channel 后启动\nuv run nahida-bot start\n```\n\n### CLI 命令\n\n```bash\nnahida-bot version # 显示版本信息\nnahida-bot start [--debug] # 启动应用(含 Gateway + WebUI)\nnahida-bot config # 显示当前配置\nnahida-bot config schema # 显示配置 schema(含插件 schema)\nnahida-bot config validate # 校验配置文件\nnahida-bot doctor # 运行诊断检查\nnahida-bot gateway # 仅启动 Gateway(WebAPI + WebUI)\n```\n\n### 最小配置示例\n\n```yaml\n# config.yaml\napp_name: \"Nahida Bot\"\nlog_level: \"INFO\"\nlog_file: \"./data/logs/nahida.log\"\nlog_file_level: \"DEBUG\"\n\nproviders:\n deepseek-main:\n type: deepseek\n api_key: \"${DEEPSEEK_LLM_API_KEY:}\"\n base_url: \"${DEEPSEEK_LLM_BASE_URL:https://api.deepseek.com}\"\n stream_responses: true\n models:\n - name: \"deepseek-v4-pro\"\n tags: [primary]\n - name: \"deepseek-v4-flash\"\n tags: [cheap, memory]\n\n siliconflow:\n type: \"openai-compatible\"\n api_key: \"${SILICONFLOW_LLM_API_KEY:}\"\n base_url: \"${SILICONFLOW_LLM_BASE_URL:https://api.siliconflow.cn/v1}\"\n stream_responses: true\n models:\n - name: \"Qwen/Qwen3.6-35B-A3B\"\n tags: [vision]\n capabilities:\n image_input: true\n max_image_count: 4\n\ndefault_provider: deepseek-main\n\ntelegram:\n bot_token: \"${TELEGRAM_BOT_TOKEN:}\"\n\n# Milky QQ Channel(可选)\n# milky:\n# base_url: \"http://127.0.0.1:3000\"\n# access_token: \"${MILKY_ACCESS_TOKEN}\"\n# group_trigger_mode: \"mention\"\n```\n\n配置支持 `${VAR}` 和 `${VAR:default}` 环境变量插值,可选 `.env` 文件加载。`config.yaml` 中包含 Agent Loop、Context Budget、Scheduler、Memory(FTS/Vector/Embedding)、Multimodal、Router、Model Tags 等完整配置项及详细注释。\n\n## 📚 文档\n\n[文档站点](https://nahida-bot.cobaltdev.top)\n\n| 文档 | 内容 |\n| ---- | ---- |\n| [ARCHITECTURE](docs/architecture/README.md) | 系统架构、分层设计、模块协作 |\n| [ROADMAP](docs/ROADMAP.md) | 路线图、阶段规划、验收清单 |\n| [DEVELOPMENT](docs/guide/development.md) | 代码风格、测试规范、类型检查 |\n| [CONFIGURATION](docs/guide/configuration.md) | 配置指南、环境变量、完整参考 |\n| [config.yaml](config.yaml) | 带注释的完整配置参考 |\n| [设计文档](docs/design/) | WebUI、Memory、OneBot Channel 等专题设计 |\n\n## 🤝 参考项目\n\n这里的很多智慧结晶,都离不开前辈们的探索:\n\n| 项目 | 参考内容 |\n|-----|-------|\n| [OpenClaw](https://github.com/openclaw/openclaw) | Agent + Workspace 模式、Gateway-Node 架构灵感、sentinel token 协议 |\n| [Codex](https://github.com/openai/codex) | Agent 核心的经典实现,权限管理与沙箱 |\n| [AstrBot](https://github.com/AstrBotDevs/AstrBot) / [MaiBot](https://github.com/Mai-with-u/MaiBot) | Python LLM bot 领域的老前辈 |\n| [nonebot2](https://github.com/nonebot/nonebot2) | 繁荣的插件生态、跨平台消息适配的经典设计 |\n| [Lagrange](https://github.com/LagrangeDev/LagrangeV2) / [NapCat](https://github.com/NapNeko/NapCatQQ) / [LuckyLilliaBot](https://github.com/LLOneBot/LuckyLilliaBot) | QQ 协议后端 |\n\n## License\n\n**AGPL-v3.0 License.**\n"}, "836d7a991c23409614665d4414cceda4b0d119f1": {"t": 1785761625.973065, "n": 8454, "h": "87f17d8bfd86ad3f", "c": "# 🍃 Nahida Bot\n\n> \n>\n> 「这是**摩诃善法大吉祥智慧主**,智慧之神**布耶尔**,须弥的**草神大人**,你敢和她对视五秒吗?」\n\n欢迎连接到属于你的私有「虚空终端」!**Nahida Bot** 不仅仅是一个冷冰冰的机器,而是一个 **Agent 为灵魂**、以 **Workspace 为家**,还能通过 **插件随意换装** 的 Python 智能框架哦~ 🌿\n\n文档:[Docs](https://nahida-bot.cobaltdev.top)\n\n[](https://qm.qq.com/q/rXP8DKCyRi) [](https://app.netlify.com/projects/nahida-bot/deploys)\n\n## ✨ 核心天赋\n\n### 💡 设计理念\n\n- **Agent-first(意识主导)**:以 Agent Loop 为中枢,大语言模型(LLM)在这里不是外挂的工具人,而是真正的主导大脑~\n- **Workspace-native(专属花盆)**:文件就是上下文,工作空间(Workspace)作为一等公民被温柔对待。\n- **Plugin-driven(百变衣橱)**:不需要在核心代码里硬编码,想要什么新能力?装个插件就好啦!\n- **Multi-Provider(万叶一心)**:支持 OpenAI Compatible、DeepSeek、Anthropic Claude、GLM、Groq、Minimax 等多种 LLM 后端,运行时随心切换~\n- **Multi-Channel(千风引路)**:Telegram Bot + Milky QQ(Lagrange.Milky),统一的消息标准化与 ChannelService 协议;OneBot v11/v12 设计中~\n- **Multimodal(万象识图)**:原生 vision 图片理解 or 自动 fallback 描述 or image_understand 工具,三种模式自适应~\n- **Memory & Retrieval(梦境刻录)**:SQLite 会话记忆 + FTS 关键词检索 + 向量检索 + 混合检索 + LLM 记忆巩固~\n- **Agent Orchestration(子机协作)**:主 Agent 可 spawn 子 Agent 执行后台任务,支持 spawn / wait / stop 全生命周期~\n- **Cron & Dreaming(时之沙)**:定时任务调度 + 记忆 dreaming(LLM 驱动的周期性记忆整理与巩固)~\n- **MCP Support(外道魔术)**:Model Context Protocol 客户端集成,对接外部 MCP 工具服务器~\n- **Gateway & WebUI(世界树控制台)**:FastAPI REST API + Vue 3 SPA 运维面板 + SSE 实时事件推送;密码/OTP 登录、配置可视化管理、CRON/Session/文件管理~\n- **Ops-friendly(无忧除虫)**:可观测、可诊断、好发布,就算遇到了 Bug 也能轻松捉虫🐞!\n\n## 📈 成长进度(项目状态)\n\n目前小吉祥草王已完成 **Phase 4 全闭环 + WebUI 主体**:Telegram + Milky QQ 双 Channel、Multi-Provider、内置命令/工具/插件体系、Subagent 编排、Multimodal、Scheduler 与 Memory Dreaming、Gateway REST API、WebUI 运维面板(Vue 3)、SSE 实时事件、登录及权限体系均已可用。OneBot v11/v12 双版本协议支持正在设计中。\n\n### 🌟 已点亮的命座 ✅\n\n- [x] 净土的基石与质量把控(Phase 0)\n- [x] 核心生命循环:应用容器、分层配置、事件脉络与观测日志(Phase 1)\n- [x] 专属花盆(Workspace):空间管理、文件沙盒、指令注入(Phase 2.1-2.2)\n- [x] 智慧运转(Agent Loop):消息拼装、模型调用、工具闭环、推理链传播(Phase 2.3-2.4)\n- [x] 记忆流转:SQLite 会话记忆、FTS 检索、向量检索、混合检索(Phase 2.5)\n- [x] 推理链健壮性:OpenAI/DeepSeek/Claude 多后端推理提取与上下文回传(Phase 2.8)\n- [x] 万象识图:Vision 原生传图、fallback 自动描述/工具模式、MediaCache/MediaResolver(Phase 2.9)\n- [x] 插件系统:Manifest 声明、Loader 发现加载、权限检查、生命周期隔离、命令与工具注册(Phase 3.1-3.6)\n- [x] 接引通道 Telegram:长轮询、消息标准化、HTML/Markdown 转换、群聊 @mention、媒体降级(Phase 4.1-4.5)\n- [x] 接引通道 Milky QQ:Lagrange.Milky WebSocket 事件流、消息段建模、群聊触发策略、合并转发解析(Phase 4.6)\n- [x] Multi-Provider:per-request model override、Provider 类型运行时注册、pre/post-agent 分阶段加载\n- [x] MCP 集成:Model Context Protocol 客户端、工具适配、连接管理\n- [x] Subagent 编排:spawn 子 Agent、BackgroundTask 账本、policy hook、父子 session 管理(Phase 3.8 主体)\n- [x] 定时调度:Cron 定时任务 + Memory Dreaming LLM 记忆巩固\n- [x] 会话级别推理设置:`/reasoning on|off|effort <level>|reset`\n- [x] 群聊上下文注入:observed-only 消息记录 + 触发时注入最近群上下文\n- [x] 内置命令 11 个:`/reset`、`/new`、`/status`、`/model`、`/reasoning`、`/help`、`/memory`、`/agents`、`/agent_stop`、`/agent_wait`、`/stop`\n- [x] 内置工具 14+:`workspace_read/write`、`memory_read/write`、`exec`、`web_fetch`、`plan`、`cron_*`、`agent_*`、`image_understand`\n- [x] Gateway REST API:`/api/health`、`/api/status`、`/api/send`、`/api/sessions`、`/api/cron`(全局管理)、`/api/config`(读写/校验/备份)、`/api/files`(workspace 文件管理)、`/api/auth`(登录/登出/session)、`/api/events/stream`(SSE)\n- [x] WebUI 运维面板:Vue 3 + Vite + shadcn-vue + Reka UI,首页状态总览、配置页(YAML 编辑/校验/保存/备份)、CRON 管理、Session 分组浏览、文件管理、系统日志\n- [x] WebUI 登录体系:管理员密码(Argon2id)+ Session Cookie + 登录限速;Bearer Token 兼容脚本/API 调用\n- [x] SSE 实时事件:`status.updated`、`usage.recorded`、`cron.*`、`session.updated`、`config.saved`、`file.updated`\n- [x] Usage Ledger:SQLite 持久化 token 统计(input/output/cached/reasoning),支持按 provider/model/session/source_tag 聚合\n- [x] Cron Session 模式:`main`(注入主 session)、`isolated`(独立 session)、`named`(持久命名 session,跨 run 累积上下文)\n- [x] 回复信号协议:`NO_REPLY` 静默抑制 + `HEARTBEAT_OK` 心跳空转保护\n- [x] 设计文档 10+:WebUI、Memory、Cron/WebAPI、ChatAddress/SessionID、Cross-Session、Memory Scoping、Agent Compaction、Agent Loop、Model Routing、Runtime Settings、OneBot Channel\n\n### 🚧 正在进行的光合作用\n\n- [ ] OneBot v11/v12 Channel 插件开发(设计文档已完成,即将进入 Phase 0 实现)。\n- [ ] WebUI 高级安全特性:Chat OTP 登录、部署模式(loopback/https/http_emergency)、CSRF 防护。\n- [ ] Workspace Sandbox 安全增强:符号链接、TOCTOU、文件大小、特殊文件对象等防护。\n- [ ] 插件配置、MockBotAPI 和 SDK 分离整理。\n\n### 📜 未来的建设计划\n\n- [ ] OneBot Channel 完整实现:正向 WS(v11 双工 + v12 事件)、WebHook 模式、多账号支持。\n- [ ] Gateway 与 Node 分布式部署(Phase 5):节点注册、心跳、远程执行协议、WebSocket RPC。\n- [ ] WebUI 插件页面 surface:插件通过 manifest 声明 WebUI 面板,sandbox iframe 加载。\n- [ ] 轻量记忆图谱层:实体/关系抽取、主题聚类、GraphRAG 风格全局搜索。\n\n想要了解更详细的建设蓝图?请翻阅 [ROADMAP.md](docs/ROADMAP.md) 吧~\n\n## 🏛️ 虚空系统架构概览\n\n```\n┌──────────────────────────────────────────────────────────────┐\n│ 世界树树冠 (Interface Layer) │\n│ CLI (typer+rich) + WebUI (Vue 3 SPA) │\n├──────────────────────────────────────────────────────────────┤\n│ 世界树树枝 (Gateway-Node Layer) │\n│ FastAPI Gateway (REST + SSE) / Node 分布式网络(规划中) │\n├──────────────────────────────────────────────────────────────┤\n│ 挂件与神之眼 (Plugin Layer) │\n│ 插件加载/权限管理/命令注册/工具注册/Channel接入/MCP集成 │\n├──────────────────────────────────────────────────────────────┤\n│ 智慧主脑 (Agent Layer) │\n│ Agent Loop / Subagent编排 / 记忆检索 / 多模态 / Provider抽象 │\n├──────────────────────────────────────────────────────────────┤\n│ 专属温室 (Workspace Layer) │\n│ 工作空间管理 / 安全文件沙盒 / 指令文件注入 │\n├──────────────────────────────────────────────────────────────┤\n│ 净土核心 (Core Layer) │\n│ 应用生命周期 / 分层配置 / 事件总线 / 会话管理 / 结构化日志 │\n└──────────────────────────────────────────────────────────────┘\n```\n\n详细的系统图纸存放在教令院的 [ARCHITECTURE](docs/architecture/README.md) 里哦。\n\n## 🚀 启动终端(快速开始)\n\n### 环境要求\n\n- Python 3.12+\n- [astral-uv](https://docs.astral.sh/uv/)\n- [pnpm](https://pnpm.io/)(WebUI 前端构建)\n\n### 安装\n\n```bash\ngit clone https://github.com/AI1379/nahida-bot.git\ncd nahida-bot\n\n# Python 后端\nuv sync\n\n# 如需 Telegram Channel,安装可选依赖\nuv sync --group telegram\n\n# WebUI 前端(可选,但推荐)\ncd webui\npnpm install\npnpm build # 输出到 webui/dist/,Gateway 启动时自动挂载\ncd ..\n\n# 类型检查与单元测试,可选\nuv run pyright\nuv run pytest\n\n# 编辑 config.yaml 配置 LLM Provider 和 Channel 后启动\nuv run nahida-bot start\n```\n\n### CLI 命令\n\n```bash\nnahida-bot version # 显示版本信息\nnahida-bot start [--debug] # 启动应用(含 Gateway + WebUI)\nnahida-bot config # 显示当前配置\nnahida-bot config schema # 显示配置 schema(含插件 schema)\nnahida-bot config validate # 校验配置文件\nnahida-bot doctor # 运行诊断检查\nnahida-bot gateway # 仅启动 Gateway(WebAPI + WebUI)\n```\n\n### 最小配置示例\n\n```yaml\n# config.yaml\napp_name: \"Nahida Bot\"\nlog_level: \"INFO\"\nlog_file: \"./data/logs/nahida.log\"\nlog_file_level: \"DEBUG\"\n\nproviders:\n default:\n type: \"openai-compatible\"\n api_key: \"${LLM_API_KEY}\"\n base_url: \"${LLM_BASE_URL}\"\n stream_responses: true\n models:\n - \"${LLM_MODEL}\"\n\ndefault_provider: default\n\ntelegram:\n bot_token: \"${TELEGRAM_BOT_TOKEN}\"\n\n# Milky QQ Channel(可选)\n# milky:\n# base_url: \"http://127.0.0.1:3000\"\n# access_token: \"${MILKY_ACCESS_TOKEN}\"\n# group_trigger_mode: \"mention\"\n```\n\n配置支持 `${VAR}` 和 `${VAR:default}` 环境变量插值,可选 `.env` 文件加载。`config.yaml` 中包含 Agent Loop、Context Budget、Scheduler、Memory(FTS/Vector/Embedding)、Multimodal、Router、Model Tags 等完整配置项及详细注释。\n\n## 📚 文档\n\n[文档站点](https://nahida-bot.cobaltdev.top)\n\n| 文档 | 内容 |\n| ---- | ---- |\n| [ARCHITECTURE](docs/architecture/README.md) | 系统架构、分层设计、模块协作 |\n| [ROADMAP](docs/ROADMAP.md) | 路线图、阶段规划、验收清单 |\n| [DEVELOPMENT](docs/guide/development.md) | 代码风格、测试规范、类型检查 |\n| [CONFIGURATION](docs/guide/configuration.md) | 配置指南、环境变量、完整参考 |\n| [config.yaml](config.yaml) | 带注释的完整配置参考 |\n| [设计文档](docs/design/) | WebUI、Memory、OneBot Channel 等专题设计 |\n\n## 🤝 参考项目\n\n这里的很多智慧结晶,都离不开前辈们的探索:\n\n| 项目 | 参考内容 |\n|-----|-------|\n| [OpenClaw](https://github.com/openclaw/openclaw) | Agent + Workspace 模式、Gateway-Node 架构灵感、sentinel token 协议 |\n| [Codex](https://github.com/openai/codex) | Agent 核心的经典实现,权限管理与沙箱 |\n| [AstrBot](https://github.com/AstrBotDevs/AstrBot) / [MaiBot](https://github.com/Mai-with-u/MaiBot) | Python LLM bot 领域的老前辈 |\n| [nonebot2](https://github.com/nonebot/nonebot2) | 繁荣的插件生态、跨平台消息适配的经典设计 |\n| [Lagrange](https://github.com/LagrangeDev/LagrangeV2) / [NapCat](https://github.com/NapNeko/NapCatQQ) / [LuckyLilliaBot](https://github.com/LLOneBot/LuckyLilliaBot) | QQ 协议后端 |\n\n## License\n\n**AGPL-v3.0 License.**\n"}, "63c64f7237dd34184bd547bd82504cd2736b4619": {"t": 1785761627.3252544, "n": 8174, "h": "9cfcc7fcd67c33a7", "c": "# 🍃 Nahida Bot\n\n> \n>\n> 「这是**摩诃善法大吉祥智慧主**,智慧之神**布耶尔**,须弥的**草神大人**,你敢和她对视五秒吗?」\n\n欢迎连接到属于你的私有「虚空终端」!**Nahida Bot** 不仅仅是一个冷冰冰的机器,而是一个 **Agent 为灵魂**、以 **Workspace 为家**,还能通过 **插件随意换装** 的 Python 智能框架哦~ 🌿\n\n文档:[Docs](https://nahida-bot.cobaltdev.top)\n\n[](https://qm.qq.com/q/rXP8DKCyRi) [](https://app.netlify.com/projects/nahida-bot/deploys)\n\n## ✨ 核心天赋\n\n### 💡 设计理念\n\n- **Agent-first(意识主导)**:以 Agent Loop 为中枢,大语言模型(LLM)在这里不是外挂的工具人,而是真正的主导大脑~\n- **Workspace-native(专属花盆)**:文件就是上下文,工作空间(Workspace)作为一等公民被温柔对待。\n- **Plugin-driven(百变衣橱)**:不需要在核心代码里硬编码,想要什么新能力?装个插件就好啦!\n- **Multi-Provider(万叶一心)**:支持 OpenAI Compatible、DeepSeek、Anthropic Claude、GLM、Groq、Minimax 等多种 LLM 后端,运行时随心切换~\n- **Multi-Channel(千风引路)**:Telegram Bot + Milky QQ(Lagrange.Milky),统一的消息标准化与 ChannelService 协议;OneBot v11/v12 设计中~\n- **Multimodal(万象识图)**:原生 vision 图片理解 or 自动 fallback 描述 or image_understand 工具,三种模式自适应~\n- **Memory & Retrieval(梦境刻录)**:SQLite 会话记忆 + FTS 关键词检索 + 向量检索 + 混合检索 + LLM 记忆巩固~\n- **Agent Orchestration(子机协作)**:主 Agent 可 spawn 子 Agent 执行后台任务,支持 spawn / wait / stop 全生命周期~\n- **Cron & Dreaming(时之沙)**:定时任务调度 + 记忆 dreaming(LLM 驱动的周期性记忆整理与巩固)~\n- **MCP Support(外道魔术)**:Model Context Protocol 客户端集成,对接外部 MCP 工具服务器~\n- **Gateway & WebUI(世界树控制台)**:FastAPI REST API + Vue 3 SPA 运维面板 + SSE 实时事件推送;密码/OTP 登录、配置可视化管理、CRON/Session/文件管理~\n- **Ops-friendly(无忧除虫)**:可观测、可诊断、好发布,就算遇到了 Bug 也能轻松捉虫🐞!\n\n## 📈 成长进度(项目状态)\n\n目前小吉祥草王已完成 **Phase 4 全闭环 + WebUI 主体**:Telegram + Milky QQ 双 Channel、Multi-Provider、内置命令/工具/插件体系、Subagent 编排、Multimodal、Scheduler 与 Memory Dreaming、Gateway REST API、WebUI 运维面板(Vue 3)、SSE 实时事件、登录及权限体系均已可用。OneBot v11/v12 双版本协议支持正在设计中。\n\n### 🌟 已点亮的命座 ✅\n\n- [x] 净土的基石与质量把控(Phase 0)\n- [x] 核心生命循环:应用容器、分层配置、事件脉络与观测日志(Phase 1)\n- [x] 专属花盆(Workspace):空间管理、文件沙盒、指令注入(Phase 2.1-2.2)\n- [x] 智慧运转(Agent Loop):消息拼装、模型调用、工具闭环、推理链传播(Phase 2.3-2.4)\n- [x] 记忆流转:SQLite 会话记忆、FTS 检索、向量检索、混合检索(Phase 2.5)\n- [x] 推理链健壮性:OpenAI/DeepSeek/Claude 多后端推理提取与上下文回传(Phase 2.8)\n- [x] 万象识图:Vision 原生传图、fallback 自动描述/工具模式、MediaCache/MediaResolver(Phase 2.9)\n- [x] 插件系统:Manifest 声明、Loader 发现加载、权限检查、生命周期隔离、命令与工具注册(Phase 3.1-3.6)\n- [x] 接引通道 Telegram:长轮询、消息标准化、HTML/Markdown 转换、群聊 @mention、媒体降级(Phase 4.1-4.5)\n- [x] 接引通道 Milky QQ:Lagrange.Milky WebSocket 事件流、消息段建模、群聊触发策略、合并转发解析(Phase 4.6)\n- [x] Multi-Provider:per-request model override、Provider 类型运行时注册、pre/post-agent 分阶段加载\n- [x] MCP 集成:Model Context Protocol 客户端、工具适配、连接管理\n- [x] Subagent 编排:spawn 子 Agent、BackgroundTask 账本、policy hook、父子 session 管理(Phase 3.8 主体)\n- [x] 定时调度:Cron 定时任务 + Memory Dreaming LLM 记忆巩固\n- [x] 会话级别推理设置:`/reasoning on|off|effort <level>|reset`\n- [x] 群聊上下文注入:observed-only 消息记录 + 触发时注入最近群上下文\n- [x] 内置命令 11 个:`/reset`、`/new`、`/status`、`/model`、`/reasoning`、`/help`、`/memory`、`/agents`、`/agent_stop`、`/agent_wait`、`/stop`\n- [x] 内置工具 14+:`workspace_read/write`、`memory_read/write`、`exec`、`web_fetch`、`plan`、`cron_*`、`agent_*`、`image_understand`\n- [x] Gateway REST API:`/api/health`、`/api/status`、`/api/send`、`/api/sessions`、`/api/cron`(全局管理)、`/api/config`(读写/校验/备份)、`/api/files`(workspace 文件管理)、`/api/auth`(登录/登出/session)、`/api/events/stream`(SSE)\n- [x] WebUI 运维面板:Vue 3 + Vite + shadcn-vue + Reka UI,首页状态总览、配置页(YAML 编辑/校验/保存/备份)、CRON 管理、Session 分组浏览、文件管理、系统日志\n- [x] WebUI 登录体系:管理员密码(Argon2id)+ Session Cookie + 登录限速;Bearer Token 兼容脚本/API 调用\n- [x] SSE 实时事件:`status.updated`、`usage.recorded`、`cron.*`、`session.updated`、`config.saved`、`file.updated`\n- [x] Usage Ledger:SQLite 持久化 token 统计(input/output/cached/reasoning),支持按 provider/model/session/source_tag 聚合\n- [x] Cron Session 模式:`main`(注入主 session)、`isolated`(独立 session)、`named`(持久命名 session,跨 run 累积上下文)\n- [x] 回复信号协议:`NO_REPLY` 静默抑制 + `HEARTBEAT_OK` 心跳空转保护\n- [x] 设计文档 10+:WebUI、Memory、Cron/WebAPI、ChatAddress/SessionID、Cross-Session、Memory Scoping、Agent Compaction、Agent Loop、Model Routing、Runtime Settings、OneBot Channel\n\n### 🚧 正在进行的光合作用\n\n- [ ] OneBot v11/v12 Channel 插件开发(设计文档已完成,即将进入 Phase 0 实现)。\n- [ ] WebUI 高级安全特性:Chat OTP 登录、部署模式(loopback/https/http_emergency)、CSRF 防护。\n- [ ] Workspace Sandbox 安全增强:符号链接、TOCTOU、文件大小、特殊文件对象等防护。\n- [ ] 插件配置、MockBotAPI 和 SDK 分离整理。\n\n### 📜 未来的建设计划\n\n- [ ] OneBot Channel 完整实现:正向 WS(v11 双工 + v12 事件)、WebHook 模式、多账号支持。\n- [ ] Gateway 与 Node 分布式部署(Phase 5):节点注册、心跳、远程执行协议、WebSocket RPC。\n- [ ] WebUI 插件页面 surface:插件通过 manifest 声明 WebUI 面板,sandbox iframe 加载。\n- [ ] 轻量记忆图谱层:实体/关系抽取、主题聚类、GraphRAG 风格全局搜索。\n\n想要了解更详细的建设蓝图?请翻阅 [ROADMAP.md](docs/ROADMAP.md) 吧~\n\n## 🏛️ 虚空系统架构概览\n\n```\n┌──────────────────────────────────────────────────────────────┐\n│ 世界树树冠 (Interface Layer) │\n│ CLI (typer+rich) + WebUI (Vue 3 SPA) │\n├──────────────────────────────────────────────────────────────┤\n│ 世界树树枝 (Gateway-Node Layer) │\n│ FastAPI Gateway (REST + SSE) / Node 分布式网络(规划中) │\n├──────────────────────────────────────────────────────────────┤\n│ 挂件与神之眼 (Plugin Layer) │\n│ 插件加载/权限管理/命令注册/工具注册/Channel接入/MCP集成 │\n├──────────────────────────────────────────────────────────────┤\n│ 智慧主脑 (Agent Layer) │\n│ Agent Loop / Subagent编排 / 记忆检索 / 多模态 / Provider抽象 │\n├──────────────────────────────────────────────────────────────┤\n│ 专属温室 (Workspace Layer) │\n│ 工作空间管理 / 安全文件沙盒 / 指令文件注入 │\n├──────────────────────────────────────────────────────────────┤\n│ 净土核心 (Core Layer) │\n│ 应用生命周期 / 分层配置 / 事件总线 / 会话管理 / 结构化日志 │\n└──────────────────────────────────────────────────────────────┘\n```\n\n详细的系统图纸存放在教令院的 [ARCHITECTURE](docs/architecture/README.md) 里哦。\n\n## 🚀 启动终端(快速开始)\n\n### 环境要求\n\n- Python 3.12+\n- [astral-uv](https://docs.astral.sh/uv/)\n- [pnpm](https://pnpm.io/)(WebUI 前端构建)\n\n### 安装\n\n```bash\ngit clone https://github.com/your-org/nahida-bot.git\ncd nahida-bot\n\n# Python 后端\nuv sync\n\n# 如需 Telegram Channel,安装可选依赖\nuv sync --group telegram\n\n# WebUI 前端(可选,但推荐)\ncd webui\npnpm install\npnpm build # 输出到 webui/dist/,Gateway 启动时自动挂载\ncd ..\n\n# 类型检查与单元测试,可选\nuv run pyright\nuv run pytest\n\n# 编辑 config.yaml 配置 LLM Provider 和 Channel 后启动\nuv run nahida-bot start\n```\n\n### CLI 命令\n\n```bash\nnahida-bot version # 显示版本信息\nnahida-bot start [--debug] # 启动应用(含 Gateway + WebUI)\nnahida-bot config # 显示当前配置\nnahida-bot config schema # 显示配置 schema(含插件 schema)\nnahida-bot config validate # 校验配置文件\nnahida-bot doctor # 运行诊断检查\nnahida-bot gateway # 仅启动 Gateway(WebAPI + WebUI)\n```\n\n### 最小配置示例\n\n```yaml\n# config.yaml\napp_name: \"Nahida Bot\"\nlog_level: \"INFO\"\nlog_file: \"./data/logs/nahida.log\"\nlog_file_level: \"DEBUG\"\n\nproviders:\n default:\n type: \"openai-compatible\"\n api_key: \"${LLM_API_KEY}\"\n base_url: \"${LLM_BASE_URL}\"\n stream_responses: true\n models:\n - \"${LLM_MODEL}\"\n\ndefault_provider: default\n\ntelegram:\n bot_token: \"${TELEGRAM_BOT_TOKEN}\"\n\n# Milky QQ Channel(可选)\n# milky:\n# base_url: \"http://127.0.0.1:3000\"\n# access_token: \"${MILKY_ACCESS_TOKEN}\"\n# group_trigger_mode: \"mention\"\n```\n\n配置支持 `${VAR}` 和 `${VAR:default}` 环境变量插值,可选 `.env` 文件加载。`config.yaml` 中包含 Agent Loop、Context Budget、Scheduler、Memory(FTS/Vector/Embedding)、Multimodal、Router、Model Tags 等完整配置项及详细注释。\n\n## 📚 文档\n\n| 文档 | 内容 |\n| ---- | ---- |\n| [ARCHITECTURE](docs/architecture/README.md) | 系统架构、分层设计、模块协作 |\n| [ROADMAP](docs/ROADMAP.md) | 路线图、阶段规划、验收清单 |\n| [DEVELOPMENT](docs/guide/development.md) | 代码风格、测试规范、类型检查 |\n| [CONFIGURATION](docs/guide/configuration.md) | 配置指南、环境变量、完整参考 |\n| [config.yaml](config.yaml) | 带注释的完整配置参考 |\n| [设计文档](docs/design/) | WebUI、Memory、OneBot Channel 等专题设计 |\n\n## 🤝 参考项目\n\n这里的很多智慧结晶,都离不开前辈们的探索:\n\n| 项目 | 参考内容 |\n|-----|-------|\n| OpenClaw | Agent + Workspace 模式、Gateway-Node 架构灵感、sentinel token 协议 |\n| AstrBot | Python LLM bot 领域的重量级项目 |\n| nonebot2 | 繁荣的插件生态、跨平台消息适配的绝佳设计 |\n| OneBot v11/v12 | QQ 平台统一协议标准,NapCat/Lagrange/LLOneBot 实现 |\n| LiteLLM | 多 Provider 模型的优雅抽象和错误兼容 |\n| aiogram | Telegram Bot API 领域建模和异步处理 |\n| Milky / Lagrange | QQ 平台接入协议与实现 |\n\n## License\n\n**AGPL-v3.0 License.**\n"}, "50393f05bc774198f4643eb7df7964e5758da513": {"t": 1785761631.1269903, "n": 7966, "h": "d60d34ceef74fbd2", "c": "# 🍃 Nahida Bot\n\n> \n>\n> 「这是**摩诃善法大吉祥智慧主**,智慧之神**布耶尔**,须弥的**草神大人**,你敢和她对视五秒吗?」\n\n欢迎连接到属于你的私有「虚空终端」!**Nahida Bot** 不仅仅是一个冷冰冰的机器,而是一个 **Agent 为灵魂**、以 **Workspace 为家**,还能通过 **插件随意换装** 的 Python 智能框架哦~ 🌿\n\n[](https://qm.qq.com/q/rXP8DKCyRi)\n\n## ✨ 核心天赋\n\n### 💡 设计理念\n\n- **Agent-first(意识主导)**:以 Agent Loop 为中枢,大语言模型(LLM)在这里不是外挂的工具人,而是真正的主导大脑~\n- **Workspace-native(专属花盆)**:文件就是上下文,工作空间(Workspace)作为一等公民被温柔对待。\n- **Plugin-driven(百变衣橱)**:不需要在核心代码里硬编码,想要什么新能力?装个插件就好啦!\n- **Multi-Provider(万叶一心)**:支持 OpenAI Compatible、DeepSeek、Anthropic Claude、GLM、Groq、Minimax 等多种 LLM 后端,运行时随心切换~\n- **Multi-Channel(千风引路)**:Telegram Bot + Milky QQ(Lagrange.Milky),统一的消息标准化与 ChannelService 协议;OneBot v11/v12 设计中~\n- **Multimodal(万象识图)**:原生 vision 图片理解 or 自动 fallback 描述 or image_understand 工具,三种模式自适应~\n- **Memory & Retrieval(梦境刻录)**:SQLite 会话记忆 + FTS 关键词检索 + 向量检索 + 混合检索 + LLM 记忆巩固~\n- **Agent Orchestration(子机协作)**:主 Agent 可 spawn 子 Agent 执行后台任务,支持 spawn / wait / stop 全生命周期~\n- **Cron & Dreaming(时之沙)**:定时任务调度 + 记忆 dreaming(LLM 驱动的周期性记忆整理与巩固)~\n- **MCP Support(外道魔术)**:Model Context Protocol 客户端集成,对接外部 MCP 工具服务器~\n- **Gateway & WebUI(世界树控制台)**:FastAPI REST API + Vue 3 SPA 运维面板 + SSE 实时事件推送;密码/OTP 登录、配置可视化管理、CRON/Session/文件管理~\n- **Ops-friendly(无忧除虫)**:可观测、可诊断、好发布,就算遇到了 Bug 也能轻松捉虫🐞!\n\n## 📈 成长进度(项目状态)\n\n目前小吉祥草王已完成 **Phase 4 全闭环 + WebUI 主体**:Telegram + Milky QQ 双 Channel、Multi-Provider、内置命令/工具/插件体系、Subagent 编排、Multimodal、Scheduler 与 Memory Dreaming、Gateway REST API、WebUI 运维面板(Vue 3)、SSE 实时事件、登录及权限体系均已可用。OneBot v11/v12 双版本协议支持正在设计中。\n\n### 🌟 已点亮的命座 ✅\n\n- [x] 净土的基石与质量把控(Phase 0)\n- [x] 核心生命循环:应用容器、分层配置、事件脉络与观测日志(Phase 1)\n- [x] 专属花盆(Workspace):空间管理、文件沙盒、指令注入(Phase 2.1-2.2)\n- [x] 智慧运转(Agent Loop):消息拼装、模型调用、工具闭环、推理链传播(Phase 2.3-2.4)\n- [x] 记忆流转:SQLite 会话记忆、FTS 检索、向量检索、混合检索(Phase 2.5)\n- [x] 推理链健壮性:OpenAI/DeepSeek/Claude 多后端推理提取与上下文回传(Phase 2.8)\n- [x] 万象识图:Vision 原生传图、fallback 自动描述/工具模式、MediaCache/MediaResolver(Phase 2.9)\n- [x] 插件系统:Manifest 声明、Loader 发现加载、权限检查、生命周期隔离、命令与工具注册(Phase 3.1-3.6)\n- [x] 接引通道 Telegram:长轮询、消息标准化、HTML/Markdown 转换、群聊 @mention、媒体降级(Phase 4.1-4.5)\n- [x] 接引通道 Milky QQ:Lagrange.Milky WebSocket 事件流、消息段建模、群聊触发策略、合并转发解析(Phase 4.6)\n- [x] Multi-Provider:per-request model override、Provider 类型运行时注册、pre/post-agent 分阶段加载\n- [x] MCP 集成:Model Context Protocol 客户端、工具适配、连接管理\n- [x] Subagent 编排:spawn 子 Agent、BackgroundTask 账本、policy hook、父子 session 管理(Phase 3.8 主体)\n- [x] 定时调度:Cron 定时任务 + Memory Dreaming LLM 记忆巩固\n- [x] 会话级别推理设置:`/reasoning on|off|effort <level>|reset`\n- [x] 群聊上下文注入:observed-only 消息记录 + 触发时注入最近群上下文\n- [x] 内置命令 11 个:`/reset`、`/new`、`/status`、`/model`、`/reasoning`、`/help`、`/memory`、`/agents`、`/agent_stop`、`/agent_wait`、`/stop`\n- [x] 内置工具 14+:`workspace_read/write`、`memory_read/write`、`exec`、`web_fetch`、`plan`、`cron_*`、`agent_*`、`image_understand`\n- [x] Gateway REST API:`/api/health`、`/api/status`、`/api/send`、`/api/sessions`、`/api/cron`(全局管理)、`/api/config`(读写/校验/备份)、`/api/files`(workspace 文件管理)、`/api/auth`(登录/登出/session)、`/api/events/stream`(SSE)\n- [x] WebUI 运维面板:Vue 3 + Vite + shadcn-vue + Reka UI,首页状态总览、配置页(YAML 编辑/校验/保存/备份)、CRON 管理、Session 分组浏览、文件管理、系统日志\n- [x] WebUI 登录体系:管理员密码(Argon2id)+ Session Cookie + 登录限速;Bearer Token 兼容脚本/API 调用\n- [x] SSE 实时事件:`status.updated`、`usage.recorded`、`cron.*`、`session.updated`、`config.saved`、`file.updated`\n- [x] Usage Ledger:SQLite 持久化 token 统计(input/output/cached/reasoning),支持按 provider/model/session/source_tag 聚合\n- [x] Cron Session 模式:`main`(注入主 session)、`isolated`(独立 session)、`named`(持久命名 session,跨 run 累积上下文)\n- [x] 回复信号协议:`NO_REPLY` 静默抑制 + `HEARTBEAT_OK` 心跳空转保护\n- [x] 设计文档 10+:WebUI、Memory、Cron/WebAPI、ChatAddress/SessionID、Cross-Session、Memory Scoping、Agent Compaction、Agent Loop、Model Routing、Runtime Settings、OneBot Channel\n\n### 🚧 正在进行的光合作用\n\n- [ ] OneBot v11/v12 Channel 插件开发(设计文档已完成,即将进入 Phase 0 实现)。\n- [ ] WebUI 高级安全特性:Chat OTP 登录、部署模式(loopback/https/http_emergency)、CSRF 防护。\n- [ ] Workspace Sandbox 安全增强:符号链接、TOCTOU、文件大小、特殊文件对象等防护。\n- [ ] 插件配置、MockBotAPI 和 SDK 分离整理。\n\n### 📜 未来的建设计划\n\n- [ ] OneBot Channel 完整实现:正向 WS(v11 双工 + v12 事件)、WebHook 模式、多账号支持。\n- [ ] Gateway 与 Node 分布式部署(Phase 5):节点注册、心跳、远程执行协议、WebSocket RPC。\n- [ ] WebUI 插件页面 surface:插件通过 manifest 声明 WebUI 面板,sandbox iframe 加载。\n- [ ] 轻量记忆图谱层:实体/关系抽取、主题聚类、GraphRAG 风格全局搜索。\n\n想要了解更详细的建设蓝图?请翻阅 [ROADMAP.md](docs/ROADMAP.md) 吧~\n\n## 🏛️ 虚空系统架构概览\n\n```\n┌──────────────────────────────────────────────────────────────┐\n│ 世界树树冠 (Interface Layer) │\n│ CLI (typer+rich) + WebUI (Vue 3 SPA) │\n├──────────────────────────────────────────────────────────────┤\n│ 世界树树枝 (Gateway-Node Layer) │\n│ FastAPI Gateway (REST + SSE) / Node 分布式网络(规划中) │\n├──────────────────────────────────────────────────────────────┤\n│ 挂件与神之眼 (Plugin Layer) │\n│ 插件加载/权限管理/命令注册/工具注册/Channel接入/MCP集成 │\n├──────────────────────────────────────────────────────────────┤\n│ 智慧主脑 (Agent Layer) │\n│ Agent Loop / Subagent编排 / 记忆检索 / 多模态 / Provider抽象 │\n├──────────────────────────────────────────────────────────────┤\n│ 专属温室 (Workspace Layer) │\n│ 工作空间管理 / 安全文件沙盒 / 指令文件注入 │\n├──────────────────────────────────────────────────────────────┤\n│ 净土核心 (Core Layer) │\n│ 应用生命周期 / 分层配置 / 事件总线 / 会话管理 / 结构化日志 │\n└──────────────────────────────────────────────────────────────┘\n```\n\n详细的系统图纸存放在教令院的 [ARCHITECTURE](docs/architecture/README.md) 里哦。\n\n## 🚀 启动终端(快速开始)\n\n### 环境要求\n\n- Python 3.12+\n- [astral-uv](https://docs.astral.sh/uv/)\n- [pnpm](https://pnpm.io/)(WebUI 前端构建)\n\n### 安装\n\n```bash\ngit clone https://github.com/your-org/nahida-bot.git\ncd nahida-bot\n\n# Python 后端\nuv sync\n\n# 如需 Telegram Channel,安装可选依赖\nuv sync --group telegram\n\n# WebUI 前端(可选,但推荐)\ncd webui\npnpm install\npnpm build # 输出到 webui/dist/,Gateway 启动时自动挂载\ncd ..\n\n# 类型检查与单元测试,可选\nuv run pyright\nuv run pytest\n\n# 编辑 config.yaml 配置 LLM Provider 和 Channel 后启动\nuv run nahida-bot start\n```\n\n### CLI 命令\n\n```bash\nnahida-bot version # 显示版本信息\nnahida-bot start [--debug] # 启动应用(含 Gateway + WebUI)\nnahida-bot config # 显示当前配置\nnahida-bot config schema # 显示配置 schema(含插件 schema)\nnahida-bot config validate # 校验配置文件\nnahida-bot doctor # 运行诊断检查\nnahida-bot gateway # 仅启动 Gateway(WebAPI + WebUI)\n```\n\n### 最小配置示例\n\n```yaml\n# config.yaml\napp_name: \"Nahida Bot\"\nlog_level: \"INFO\"\nlog_file: \"./data/logs/nahida.log\"\nlog_file_level: \"DEBUG\"\n\nproviders:\n default:\n type: \"openai-compatible\"\n api_key: \"${LLM_API_KEY}\"\n base_url: \"${LLM_BASE_URL}\"\n stream_responses: true\n models:\n - \"${LLM_MODEL}\"\n\ndefault_provider: default\n\ntelegram:\n bot_token: \"${TELEGRAM_BOT_TOKEN}\"\n\n# Milky QQ Channel(可选)\n# milky:\n# base_url: \"http://127.0.0.1:3000\"\n# access_token: \"${MILKY_ACCESS_TOKEN}\"\n# group_trigger_mode: \"mention\"\n```\n\n配置支持 `${VAR}` 和 `${VAR:default}` 环境变量插值,可选 `.env` 文件加载。`config.yaml` 中包含 Agent Loop、Context Budget、Scheduler、Memory(FTS/Vector/Embedding)、Multimodal、Router、Model Tags 等完整配置项及详细注释。\n\n## 📚 文档\n\n| 文档 | 内容 |\n| ---- | ---- |\n| [ARCHITECTURE](docs/architecture/README.md) | 系统架构、分层设计、模块协作 |\n| [ROADMAP](docs/ROADMAP.md) | 路线图、阶段规划、验收清单 |\n| [DEVELOPMENT](docs/guide/development.md) | 代码风格、测试规范、类型检查 |\n| [CONFIGURATION](docs/guide/configuration.md) | 配置指南、环境变量、完整参考 |\n| [config.yaml](config.yaml) | 带注释的完整配置参考 |\n| [设计文档](docs/design/) | WebUI、Memory、OneBot Channel 等专题设计 |\n\n## 🤝 参考项目\n\n这里的很多智慧结晶,都离不开前辈们的探索:\n\n| 项目 | 参考内容 |\n|-----|-------|\n| OpenClaw | Agent + Workspace 模式、Gateway-Node 架构灵感、sentinel token 协议 |\n| AstrBot | Python LLM bot 领域的重量级项目 |\n| nonebot2 | 繁荣的插件生态、跨平台消息适配的绝佳设计 |\n| OneBot v11/v12 | QQ 平台统一协议标准,NapCat/Lagrange/LLOneBot 实现 |\n| LiteLLM | 多 Provider 模型的优雅抽象和错误兼容 |\n| aiogram | Telegram Bot API 领域建模和异步处理 |\n| Milky / Lagrange | QQ 平台接入协议与实现 |\n\n## License\n\n**AGPL-v3.0 License.**\n"}, "efa05612c414408bb947241b5abf314c98b9fea4": {"t": 1785761635.0440528, "n": 7953, "h": "dbbd77d69422c143", "c": "# 🍃 Nahida Bot\n\n> \n>\n> 「这是**摩诃善法大吉祥智慧主**,智慧之神**布耶尔**,须弥的**草神大人**,你敢和她对视五秒吗?」\n\n欢迎连接到属于你的私有「虚空终端」!**Nahida Bot** 不仅仅是一个冷冰冰的机器,而是一个 **Agent 为灵魂**、以 **Workspace 为家**,还能通过 **插件随意换装** 的 Python 智能框架哦~ 🌿\n\n[](https://qm.qq.com/q/rXP8DKCyRi)\n\n## ✨ 核心天赋\n\n### 💡 设计理念\n\n- **Agent-first(意识主导)**:以 Agent Loop 为中枢,大语言模型(LLM)在这里不是外挂的工具人,而是真正的主导大脑~\n- **Workspace-native(专属花盆)**:文件就是上下文,工作空间(Workspace)作为一等公民被温柔对待。\n- **Plugin-driven(百变衣橱)**:不需要在核心代码里硬编码,想要什么新能力?装个插件就好啦!\n- **Multi-Provider(万叶一心)**:支持 OpenAI Compatible、DeepSeek、Anthropic Claude、GLM、Groq、Minimax 等多种 LLM 后端,运行时随心切换~\n- **Multi-Channel(千风引路)**:Telegram Bot + Milky QQ(Lagrange.Milky),统一的消息标准化与 ChannelService 协议;OneBot v11/v12 设计中~\n- **Multimodal(万象识图)**:原生 vision 图片理解 or 自动 fallback 描述 or image_understand 工具,三种模式自适应~\n- **Memory & Retrieval(梦境刻录)**:SQLite 会话记忆 + FTS 关键词检索 + 向量检索 + 混合检索 + LLM 记忆巩固~\n- **Agent Orchestration(子机协作)**:主 Agent 可 spawn 子 Agent 执行后台任务,支持 spawn / wait / stop 全生命周期~\n- **Cron & Dreaming(时之沙)**:定时任务调度 + 记忆 dreaming(LLM 驱动的周期性记忆整理与巩固)~\n- **MCP Support(外道魔术)**:Model Context Protocol 客户端集成,对接外部 MCP 工具服务器~\n- **Gateway & WebUI(世界树控制台)**:FastAPI REST API + Vue 3 SPA 运维面板 + SSE 实时事件推送;密码/OTP 登录、配置可视化管理、CRON/Session/文件管理~\n- **Ops-friendly(无忧除虫)**:可观测、可诊断、好发布,就算遇到了 Bug 也能轻松捉虫🐞!\n\n## 📈 成长进度(项目状态)\n\n目前小吉祥草王已完成 **Phase 4 全闭环 + WebUI 主体**:Telegram + Milky QQ 双 Channel、Multi-Provider、内置命令/工具/插件体系、Subagent 编排、Multimodal、Scheduler 与 Memory Dreaming、Gateway REST API、WebUI 运维面板(Vue 3)、SSE 实时事件、登录及权限体系均已可用。OneBot v11/v12 双版本协议支持正在设计中。\n\n### 🌟 已点亮的命座 ✅\n\n- [x] 净土的基石与质量把控(Phase 0)\n- [x] 核心生命循环:应用容器、分层配置、事件脉络与观测日志(Phase 1)\n- [x] 专属花盆(Workspace):空间管理、文件沙盒、指令注入(Phase 2.1-2.2)\n- [x] 智慧运转(Agent Loop):消息拼装、模型调用、工具闭环、推理链传播(Phase 2.3-2.4)\n- [x] 记忆流转:SQLite 会话记忆、FTS 检索、向量检索、混合检索(Phase 2.5)\n- [x] 推理链健壮性:OpenAI/DeepSeek/Claude 多后端推理提取与上下文回传(Phase 2.8)\n- [x] 万象识图:Vision 原生传图、fallback 自动描述/工具模式、MediaCache/MediaResolver(Phase 2.9)\n- [x] 插件系统:Manifest 声明、Loader 发现加载、权限检查、生命周期隔离、命令与工具注册(Phase 3.1-3.6)\n- [x] 接引通道 Telegram:长轮询、消息标准化、HTML/Markdown 转换、群聊 @mention、媒体降级(Phase 4.1-4.5)\n- [x] 接引通道 Milky QQ:Lagrange.Milky WebSocket 事件流、消息段建模、群聊触发策略、合并转发解析(Phase 4.6)\n- [x] Multi-Provider:per-request model override、Provider 类型运行时注册、pre/post-agent 分阶段加载\n- [x] MCP 集成:Model Context Protocol 客户端、工具适配、连接管理\n- [x] Subagent 编排:spawn 子 Agent、BackgroundTask 账本、policy hook、父子 session 管理(Phase 3.8 主体)\n- [x] 定时调度:Cron 定时任务 + Memory Dreaming LLM 记忆巩固\n- [x] 会话级别推理设置:`/reasoning on|off|effort <level>|reset`\n- [x] 群聊上下文注入:observed-only 消息记录 + 触发时注入最近群上下文\n- [x] 内置命令 11 个:`/reset`、`/new`、`/status`、`/model`、`/reasoning`、`/help`、`/memory`、`/agents`、`/agent_stop`、`/agent_wait`、`/stop`\n- [x] 内置工具 14+:`workspace_read/write`、`memory_read/write`、`exec`、`web_fetch`、`plan`、`cron_*`、`agent_*`、`image_understand`\n- [x] Gateway REST API:`/api/health`、`/api/status`、`/api/send`、`/api/sessions`、`/api/cron`(全局管理)、`/api/config`(读写/校验/备份)、`/api/files`(workspace 文件管理)、`/api/auth`(登录/登出/session)、`/api/events/stream`(SSE)\n- [x] WebUI 运维面板:Vue 3 + Vite + shadcn-vue + Reka UI,首页状态总览、配置页(YAML 编辑/校验/保存/备份)、CRON 管理、Session 分组浏览、文件管理、系统日志\n- [x] WebUI 登录体系:管理员密码(Argon2id)+ Session Cookie + 登录限速;Bearer Token 兼容脚本/API 调用\n- [x] SSE 实时事件:`status.updated`、`usage.recorded`、`cron.*`、`session.updated`、`config.saved`、`file.updated`\n- [x] Usage Ledger:SQLite 持久化 token 统计(input/output/cached/reasoning),支持按 provider/model/session/source_tag 聚合\n- [x] Cron Session 模式:`main`(注入主 session)、`isolated`(独立 session)、`named`(持久命名 session,跨 run 累积上下文)\n- [x] 回复信号协议:`NO_REPLY` 静默抑制 + `HEARTBEAT_OK` 心跳空转保护\n- [x] 设计文档 10+:WebUI、Memory、Cron/WebAPI、ChatAddress/SessionID、Cross-Session、Memory Scoping、Agent Compaction、Agent Loop、Model Routing、Runtime Settings、OneBot Channel\n\n### 🚧 正在进行的光合作用\n\n- [ ] OneBot v11/v12 Channel 插件开发(设计文档已完成,即将进入 Phase 0 实现)。\n- [ ] WebUI 高级安全特性:Chat OTP 登录、部署模式(loopback/https/http_emergency)、CSRF 防护。\n- [ ] Workspace Sandbox 安全增强:符号链接、TOCTOU、文件大小、特殊文件对象等防护。\n- [ ] 插件配置、MockBotAPI 和 SDK 分离整理。\n\n### 📜 未来的建设计划\n\n- [ ] OneBot Channel 完整实现:正向 WS(v11 双工 + v12 事件)、WebHook 模式、多账号支持。\n- [ ] Gateway 与 Node 分布式部署(Phase 5):节点注册、心跳、远程执行协议、WebSocket RPC。\n- [ ] WebUI 插件页面 surface:插件通过 manifest 声明 WebUI 面板,sandbox iframe 加载。\n- [ ] 轻量记忆图谱层:实体/关系抽取、主题聚类、GraphRAG 风格全局搜索。\n\n想要了解更详细的建设蓝图?请翻阅 [ROADMAP.md](docs/ROADMAP.md) 吧~\n\n## 🏛️ 虚空系统架构概览\n\n```\n┌──────────────────────────────────────────────────────────────┐\n│ 世界树树冠 (Interface Layer) │\n│ CLI (typer+rich) + WebUI (Vue 3 SPA) │\n├──────────────────────────────────────────────────────────────┤\n│ 世界树树枝 (Gateway-Node Layer) │\n│ FastAPI Gateway (REST + SSE) / Node 分布式网络(规划中) │\n├──────────────────────────────────────────────────────────────┤\n│ 挂件与神之眼 (Plugin Layer) │\n│ 插件加载/权限管理/命令注册/工具注册/Channel接入/MCP集成 │\n├──────────────────────────────────────────────────────────────┤\n│ 智慧主脑 (Agent Layer) │\n│ Agent Loop / Subagent编排 / 记忆检索 / 多模态 / Provider抽象 │\n├──────────────────────────────────────────────────────────────┤\n│ 专属温室 (Workspace Layer) │\n│ 工作空间管理 / 安全文件沙盒 / 指令文件注入 │\n├──────────────────────────────────────────────────────────────┤\n│ 净土核心 (Core Layer) │\n│ 应用生命周期 / 分层配置 / 事件总线 / 会话管理 / 结构化日志 │\n└──────────────────────────────────────────────────────────────┘\n```\n\n详细的系统图纸存放在教令院的 [ARCHITECTURE](docs/architecture/README.md) 里哦。\n\n## 🚀 启动终端(快速开始)\n\n### 环境要求\n\n- Python 3.12+\n- [astral-uv](https://docs.astral.sh/uv/)\n- [pnpm](https://pnpm.io/)(WebUI 前端构建)\n\n### 安装\n\n```bash\ngit clone https://github.com/your-org/nahida-bot.git\ncd nahida-bot\n\n# Python 后端\nuv sync\n\n# 如需 Telegram Channel,安装可选依赖\nuv sync --group telegram\n\n# WebUI 前端(可选,但推荐)\ncd webui\npnpm install\npnpm build # 输出到 webui/dist/,Gateway 启动时自动挂载\ncd ..\n\n# 类型检查与单元测试,可选\nuv run pyright\nuv run pytest\n\n# 编辑 config.yaml 配置 LLM Provider 和 Channel 后启动\nuv run nahida-bot start\n```\n\n### CLI 命令\n\n```bash\nnahida-bot version # 显示版本信息\nnahida-bot start [--debug] # 启动应用(含 Gateway + WebUI)\nnahida-bot config # 显示当前配置\nnahida-bot config schema # 显示配置 schema(含插件 schema)\nnahida-bot config validate # 校验配置文件\nnahida-bot doctor # 运行诊断检查\nnahida-bot gateway # 仅启动 Gateway(WebAPI + WebUI)\n```\n\n### 最小配置示例\n\n```yaml\n# config.yaml\napp_name: \"Nahida Bot\"\nlog_level: \"INFO\"\nlog_file: \"./data/logs/nahida.log\"\nlog_file_level: \"DEBUG\"\n\nproviders:\n default:\n type: \"openai-compatible\"\n api_key: \"${LLM_API_KEY}\"\n base_url: \"${LLM_BASE_URL}\"\n stream_responses: true\n models:\n - \"${LLM_MODEL}\"\n\ndefault_provider: default\n\ntelegram:\n bot_token: \"${TELEGRAM_BOT_TOKEN}\"\n\n# Milky QQ Channel(可选)\n# milky:\n# base_url: \"http://127.0.0.1:3000\"\n# access_token: \"${MILKY_ACCESS_TOKEN}\"\n# group_trigger_mode: \"mention\"\n```\n\n配置支持 `${VAR}` 和 `${VAR:default}` 环境变量插值,可选 `.env` 文件加载。`config.yaml` 中包含 Agent Loop、Context Budget、Scheduler、Memory(FTS/Vector/Embedding)、Multimodal、Router、Model Tags 等完整配置项及详细注释。\n\n## 📚 文档\n\n| 文档 | 内容 |\n| ---- | ---- |\n| [ARCHITECTURE](docs/architecture/README.md) | 系统架构、分层设计、模块协作 |\n| [ROADMAP](docs/ROADMAP.md) | 路线图、阶段规划、验收清单 |\n| [DEVELOPMENT](docs/DEVELOPMENT.md) | 代码风格、测试规范、类型检查 |\n| [CONFIGURATION](docs/CONFIGURATION.md) | 配置指南、环境变量、完整参考 |\n| [config.yaml](config.yaml) | 带注释的完整配置参考 |\n| [设计文档](docs/todos/) | WebUI、Memory、OneBot Channel 等专题设计 |\n\n## 🤝 参考项目\n\n这里的很多智慧结晶,都离不开前辈们的探索:\n\n| 项目 | 参考内容 |\n|-----|-------|\n| OpenClaw | Agent + Workspace 模式、Gateway-Node 架构灵感、sentinel token 协议 |\n| AstrBot | Python LLM bot 领域的重量级项目 |\n| nonebot2 | 繁荣的插件生态、跨平台消息适配的绝佳设计 |\n| OneBot v11/v12 | QQ 平台统一协议标准,NapCat/Lagrange/LLOneBot 实现 |\n| LiteLLM | 多 Provider 模型的优雅抽象和错误兼容 |\n| aiogram | Telegram Bot API 领域建模和异步处理 |\n| Milky / Lagrange | QQ 平台接入协议与实现 |\n\n## License\n\n**AGPL-v3.0 License.**\n"}, "35a784fa18ea8d335f6cd810023b66d5542aab4d": {"t": 1785761640.7624636, "n": 7863, "h": "4a4a85d170a3fabb", "c": "# 🍃 Nahida Bot\n\n> \n>\n> 「这是**摩诃善法大吉祥智慧主**,智慧之神**布耶尔**,须弥的**草神大人**,你敢和她对视五秒吗?」\n\n欢迎连接到属于你的私有「虚空终端」!**Nahida Bot** 不仅仅是一个冷冰冰的机器,而是一个 **Agent 为灵魂**、以 **Workspace 为家**,还能通过 **插件随意换装** 的 Python 智能框架哦~ 🌿\n\nQQ 群:529674493\n\n## ✨ 核心天赋\n\n### 💡 设计理念\n\n- **Agent-first(意识主导)**:以 Agent Loop 为中枢,大语言模型(LLM)在这里不是外挂的工具人,而是真正的主导大脑~\n- **Workspace-native(专属花盆)**:文件就是上下文,工作空间(Workspace)作为一等公民被温柔对待。\n- **Plugin-driven(百变衣橱)**:不需要在核心代码里硬编码,想要什么新能力?装个插件就好啦!\n- **Multi-Provider(万叶一心)**:支持 OpenAI Compatible、DeepSeek、Anthropic Claude、GLM、Groq、Minimax 等多种 LLM 后端,运行时随心切换~\n- **Multi-Channel(千风引路)**:Telegram Bot + Milky QQ(Lagrange.Milky),统一的消息标准化与 ChannelService 协议;OneBot v11/v12 设计中~\n- **Multimodal(万象识图)**:原生 vision 图片理解 or 自动 fallback 描述 or image_understand 工具,三种模式自适应~\n- **Memory & Retrieval(梦境刻录)**:SQLite 会话记忆 + FTS 关键词检索 + 向量检索 + 混合检索 + LLM 记忆巩固~\n- **Agent Orchestration(子机协作)**:主 Agent 可 spawn 子 Agent 执行后台任务,支持 spawn / wait / stop 全生命周期~\n- **Cron & Dreaming(时之沙)**:定时任务调度 + 记忆 dreaming(LLM 驱动的周期性记忆整理与巩固)~\n- **MCP Support(外道魔术)**:Model Context Protocol 客户端集成,对接外部 MCP 工具服务器~\n- **Gateway & WebUI(世界树控制台)**:FastAPI REST API + Vue 3 SPA 运维面板 + SSE 实时事件推送;密码/OTP 登录、配置可视化管理、CRON/Session/文件管理~\n- **Ops-friendly(无忧除虫)**:可观测、可诊断、好发布,就算遇到了 Bug 也能轻松捉虫🐞!\n\n## 📈 成长进度(项目状态)\n\n目前小吉祥草王已完成 **Phase 4 全闭环 + WebUI 主体**:Telegram + Milky QQ 双 Channel、Multi-Provider、内置命令/工具/插件体系、Subagent 编排、Multimodal、Scheduler 与 Memory Dreaming、Gateway REST API、WebUI 运维面板(Vue 3)、SSE 实时事件、登录及权限体系均已可用。OneBot v11/v12 双版本协议支持正在设计中。\n\n### 🌟 已点亮的命座 ✅\n\n- [x] 净土的基石与质量把控(Phase 0)\n- [x] 核心生命循环:应用容器、分层配置、事件脉络与观测日志(Phase 1)\n- [x] 专属花盆(Workspace):空间管理、文件沙盒、指令注入(Phase 2.1-2.2)\n- [x] 智慧运转(Agent Loop):消息拼装、模型调用、工具闭环、推理链传播(Phase 2.3-2.4)\n- [x] 记忆流转:SQLite 会话记忆、FTS 检索、向量检索、混合检索(Phase 2.5)\n- [x] 推理链健壮性:OpenAI/DeepSeek/Claude 多后端推理提取与上下文回传(Phase 2.8)\n- [x] 万象识图:Vision 原生传图、fallback 自动描述/工具模式、MediaCache/MediaResolver(Phase 2.9)\n- [x] 插件系统:Manifest 声明、Loader 发现加载、权限检查、生命周期隔离、命令与工具注册(Phase 3.1-3.6)\n- [x] 接引通道 Telegram:长轮询、消息标准化、HTML/Markdown 转换、群聊 @mention、媒体降级(Phase 4.1-4.5)\n- [x] 接引通道 Milky QQ:Lagrange.Milky WebSocket 事件流、消息段建模、群聊触发策略、合并转发解析(Phase 4.6)\n- [x] Multi-Provider:per-request model override、Provider 类型运行时注册、pre/post-agent 分阶段加载\n- [x] MCP 集成:Model Context Protocol 客户端、工具适配、连接管理\n- [x] Subagent 编排:spawn 子 Agent、BackgroundTask 账本、policy hook、父子 session 管理(Phase 3.8 主体)\n- [x] 定时调度:Cron 定时任务 + Memory Dreaming LLM 记忆巩固\n- [x] 会话级别推理设置:`/reasoning on|off|effort <level>|reset`\n- [x] 群聊上下文注入:observed-only 消息记录 + 触发时注入最近群上下文\n- [x] 内置命令 11 个:`/reset`、`/new`、`/status`、`/model`、`/reasoning`、`/help`、`/memory`、`/agents`、`/agent_stop`、`/agent_wait`、`/stop`\n- [x] 内置工具 14+:`workspace_read/write`、`memory_read/write`、`exec`、`web_fetch`、`plan`、`cron_*`、`agent_*`、`image_understand`\n- [x] Gateway REST API:`/api/health`、`/api/status`、`/api/send`、`/api/sessions`、`/api/cron`(全局管理)、`/api/config`(读写/校验/备份)、`/api/files`(workspace 文件管理)、`/api/auth`(登录/登出/session)、`/api/events/stream`(SSE)\n- [x] WebUI 运维面板:Vue 3 + Vite + shadcn-vue + Reka UI,首页状态总览、配置页(YAML 编辑/校验/保存/备份)、CRON 管理、Session 分组浏览、文件管理、系统日志\n- [x] WebUI 登录体系:管理员密码(Argon2id)+ Session Cookie + 登录限速;Bearer Token 兼容脚本/API 调用\n- [x] SSE 实时事件:`status.updated`、`usage.recorded`、`cron.*`、`session.updated`、`config.saved`、`file.updated`\n- [x] Usage Ledger:SQLite 持久化 token 统计(input/output/cached/reasoning),支持按 provider/model/session/source_tag 聚合\n- [x] Cron Session 模式:`main`(注入主 session)、`isolated`(独立 session)、`named`(持久命名 session,跨 run 累积上下文)\n- [x] 回复信号协议:`NO_REPLY` 静默抑制 + `HEARTBEAT_OK` 心跳空转保护\n- [x] 设计文档 10+:WebUI、Memory、Cron/WebAPI、ChatAddress/SessionID、Cross-Session、Memory Scoping、Agent Compaction、Agent Loop、Model Routing、Runtime Settings、OneBot Channel\n\n### 🚧 正在进行的光合作用\n\n- [ ] OneBot v11/v12 Channel 插件开发(设计文档已完成,即将进入 Phase 0 实现)。\n- [ ] WebUI 高级安全特性:Chat OTP 登录、部署模式(loopback/https/http_emergency)、CSRF 防护。\n- [ ] Workspace Sandbox 安全增强:符号链接、TOCTOU、文件大小、特殊文件对象等防护。\n- [ ] 插件配置、MockBotAPI 和 SDK 分离整理。\n\n### 📜 未来的建设计划\n\n- [ ] OneBot Channel 完整实现:正向 WS(v11 双工 + v12 事件)、WebHook 模式、多账号支持。\n- [ ] Gateway 与 Node 分布式部署(Phase 5):节点注册、心跳、远程执行协议、WebSocket RPC。\n- [ ] WebUI 插件页面 surface:插件通过 manifest 声明 WebUI 面板,sandbox iframe 加载。\n- [ ] 轻量记忆图谱层:实体/关系抽取、主题聚类、GraphRAG 风格全局搜索。\n\n想要了解更详细的建设蓝图?请翻阅 [ROADMAP.md](docs/ROADMAP.md) 吧~\n\n## 🏛️ 虚空系统架构概览\n\n```\n┌──────────────────────────────────────────────────────────────┐\n│ 世界树树冠 (Interface Layer) │\n│ CLI (typer+rich) + WebUI (Vue 3 SPA) │\n├──────────────────────────────────────────────────────────────┤\n│ 世界树树枝 (Gateway-Node Layer) │\n│ FastAPI Gateway (REST + SSE) / Node 分布式网络(规划中) │\n├──────────────────────────────────────────────────────────────┤\n│ 挂件与神之眼 (Plugin Layer) │\n│ 插件加载/权限管理/命令注册/工具注册/Channel接入/MCP集成 │\n├──────────────────────────────────────────────────────────────┤\n│ 智慧主脑 (Agent Layer) │\n│ Agent Loop / Subagent编排 / 记忆检索 / 多模态 / Provider抽象 │\n├──────────────────────────────────────────────────────────────┤\n│ 专属温室 (Workspace Layer) │\n│ 工作空间管理 / 安全文件沙盒 / 指令文件注入 │\n├──────────────────────────────────────────────────────────────┤\n│ 净土核心 (Core Layer) │\n│ 应用生命周期 / 分层配置 / 事件总线 / 会话管理 / 结构化日志 │\n└──────────────────────────────────────────────────────────────┘\n```\n\n详细的系统图纸存放在教令院的 [ARCHITECTURE](docs/architecture/README.md) 里哦。\n\n## 🚀 启动终端(快速开始)\n\n### 环境要求\n\n- Python 3.12+\n- [astral-uv](https://docs.astral.sh/uv/)\n- [pnpm](https://pnpm.io/)(WebUI 前端构建)\n\n### 安装\n\n```bash\ngit clone https://github.com/your-org/nahida-bot.git\ncd nahida-bot\n\n# Python 后端\nuv sync\n\n# 如需 Telegram Channel,安装可选依赖\nuv sync --group telegram\n\n# WebUI 前端(可选,但推荐)\ncd webui\npnpm install\npnpm build # 输出到 webui/dist/,Gateway 启动时自动挂载\ncd ..\n\n# 类型检查与单元测试,可选\nuv run pyright\nuv run pytest\n\n# 编辑 config.yaml 配置 LLM Provider 和 Channel 后启动\nuv run nahida-bot start\n```\n\n### CLI 命令\n\n```bash\nnahida-bot version # 显示版本信息\nnahida-bot start [--debug] # 启动应用(含 Gateway + WebUI)\nnahida-bot config # 显示当前配置\nnahida-bot config schema # 显示配置 schema(含插件 schema)\nnahida-bot config validate # 校验配置文件\nnahida-bot doctor # 运行诊断检查\nnahida-bot gateway # 仅启动 Gateway(WebAPI + WebUI)\n```\n\n### 最小配置示例\n\n```yaml\n# config.yaml\napp_name: \"Nahida Bot\"\nlog_level: \"INFO\"\nlog_file: \"./data/logs/nahida.log\"\nlog_file_level: \"DEBUG\"\n\nproviders:\n default:\n type: \"openai-compatible\"\n api_key: \"${LLM_API_KEY}\"\n base_url: \"${LLM_BASE_URL}\"\n stream_responses: true\n models:\n - \"${LLM_MODEL}\"\n\ndefault_provider: default\n\ntelegram:\n bot_token: \"${TELEGRAM_BOT_TOKEN}\"\n\n# Milky QQ Channel(可选)\n# milky:\n# base_url: \"http://127.0.0.1:3000\"\n# access_token: \"${MILKY_ACCESS_TOKEN}\"\n# group_trigger_mode: \"mention\"\n```\n\n配置支持 `${VAR}` 和 `${VAR:default}` 环境变量插值,可选 `.env` 文件加载。`config.yaml` 中包含 Agent Loop、Context Budget、Scheduler、Memory(FTS/Vector/Embedding)、Multimodal、Router、Model Tags 等完整配置项及详细注释。\n\n## 📚 文档\n\n| 文档 | 内容 |\n| ---- | ---- |\n| [ARCHITECTURE](docs/architecture/README.md) | 系统架构、分层设计、模块协作 |\n| [ROADMAP](docs/ROADMAP.md) | 路线图、阶段规划、验收清单 |\n| [DEVELOPMENT](docs/DEVELOPMENT.md) | 代码风格、测试规范、类型检查 |\n| [CONFIGURATION](docs/CONFIGURATION.md) | 配置指南、环境变量、完整参考 |\n| [config.yaml](config.yaml) | 带注释的完整配置参考 |\n| [设计文档](docs/todos/) | WebUI、Memory、OneBot Channel 等专题设计 |\n\n## 🤝 参考项目\n\n这里的很多智慧结晶,都离不开前辈们的探索:\n\n| 项目 | 参考内容 |\n|-----|-------|\n| OpenClaw | Agent + Workspace 模式、Gateway-Node 架构灵感、sentinel token 协议 |\n| AstrBot | Python LLM bot 领域的重量级项目 |\n| nonebot2 | 繁荣的插件生态、跨平台消息适配的绝佳设计 |\n| OneBot v11/v12 | QQ 平台统一协议标准,NapCat/Lagrange/LLOneBot 实现 |\n| LiteLLM | 多 Provider 模型的优雅抽象和错误兼容 |\n| aiogram | Telegram Bot API 领域建模和异步处理 |\n| Milky / Lagrange | QQ 平台接入协议与实现 |\n\n## License\n\n**AGPL-v3.0 License.**\n"}, "095f252d5271998bc5e61ef2fad45059ce5f43c4": {"t": 1785761642.9456565, "n": 5978, "h": "86e1108fded4c2b2", "c": "# 🍃 Nahida Bot\n\n> \n>\n> 「这是**摩诃善法大吉祥智慧主**,智慧之神**布耶尔**,须弥的**草神大人**,你敢和她对视五秒吗?」\n\n欢迎连接到属于你的私有「虚空终端」!**Nahida Bot** 不仅仅是一个冷冰冰的机器,而是一个 **Agent 为灵魂**、以 **Workspace 为家**,还能通过 **插件随意换装** 的 Python 智能框架哦~ 🌿\n\nQQ 群:529674493\n\n## ✨ 核心天赋\n\n### 💡 设计理念\n\n- **Agent-first(意识主导)**:以 Agent Loop 为中枢,大语言模型(LLM)在这里不是外挂的工具人,而是真正的主导大脑~\n- **Workspace-native(专属花盆)**:文件就是上下文,工作空间(Workspace)作为一等公民被温柔对待。\n- **Plugin-driven(百变衣橱)**:不需要在核心代码里硬编码,想要什么新能力?装个插件就好啦!\n- **Multi-Provider(万叶一心)**:支持 OpenAI Compatible、DeepSeek、Anthropic Claude、GLM、Groq、Minimax 等多种 LLM 后端,运行时随心切换~\n- **Multi-Channel(千风引路)**:Telegram Bot + Milky QQ(Lagrange.Milky),统一的消息标准化与 ChannelService 协议~\n- **Multimodal(万象识图)**:原生 vision 图片理解 or 自动 fallback 描述 or image_understand 工具,三种模式自适应~\n- **Memory & Retrieval(梦境刻录)**:SQLite 会话记忆 + FTS 关键词检索 + 向量检索 + 混合检索 + LLM 记忆巩固~\n- **Agent Orchestration(子机协作)**:主 Agent 可 spawn 子 Agent 执行后台任务,支持 spawn / wait / stop 全生命周期~\n- **Cron & Dreaming(时之沙)**:定时任务调度 + 记忆 dreaming(LLM 驱动的周期性记忆整理与巩固)~\n- **MCP Support(外道魔术)**:Model Context Protocol 客户端集成,对接外部 MCP 工具服务器~\n- **Gateway-Node-ready(世界树网络)**:天然支持远程节点和分布式执行,把智慧的枝蔓延伸到各个角落~\n- **Ops-friendly(无忧除虫)**:可观测、可诊断、好发布,就算遇到了 Bug 也能轻松捉虫🐞!\n\n## 📈 成长进度(项目状态)\n\n目前小吉祥草王已完成 **Phase 4 全闭环**:Telegram + Milky QQ 双 Channel、Multi-Provider、内置命令/工具/插件体系、Subagent 编排、Multimodal、Scheduler 与 Memory Dreaming 均主体可用。\n\n### 🌟 已点亮的命座 ✅\n\n- [x] 净土的基石与质量把控(Phase 0)\n- [x] 核心生命循环:应用容器、分层配置、事件脉络与观测日志(Phase 1)\n- [x] 专属花盆(Workspace):空间管理、文件沙盒、指令注入(Phase 2.1-2.2)\n- [x] 智慧运转(Agent Loop):消息拼装、模型调用、工具闭环、推理链传播(Phase 2.3-2.4)\n- [x] 记忆流转:SQLite 会话记忆、FTS 检索、向量检索、混合检索(Phase 2.5)\n- [x] 推理链健壮性:OpenAI/DeepSeek/Claude 多后端推理提取与上下文回传(Phase 2.8)\n- [x] 万象识图:Vision 原生传图、fallback 自动描述/工具模式、MediaCache/MediaResolver(Phase 2.9)\n- [x] 插件系统:Manifest 声明、Loader 发现加载、权限检查、生命周期隔离、命令与工具注册(Phase 3.1-3.6)\n- [x] 接引通道 Telegram:长轮询、消息标准化、HTML/Markdown 转换、群聊 @mention、媒体降级(Phase 4.1-4.5)\n- [x] 接引通道 Milky QQ:Lagrange.Milky WebSocket 事件流、消息段建模、群聊触发策略、合并转发解析(Phase 4.6)\n- [x] Multi-Provider:per-request model override、Provider 类型运行时注册、pre/post-agent 分阶段加载\n- [x] MCP 集成:Model Context Protocol 客户端、工具适配、连接管理\n- [x] Subagent 编排:spawn 子 Agent、BackgroundTask 账本、policy hook、父子 session 管理(Phase 3.8 主体)\n- [x] 定时调度:Cron 定时任务 + Memory Dreaming LLM 记忆巩固\n- [x] 会话级别推理设置:`/reasoning on|off|effort <level>|reset`\n- [x] 群聊上下文注入:observed-only 消息记录 + 触发时注入最近群上下文\n- [x] 内置命令 11 个:`/reset`、`/new`、`/status`、`/model`、`/reasoning`、`/help`、`/memory`、`/agents`、`/agent_stop`、`/agent_wait`、`/stop`\n- [x] 内置工具 14+:`workspace_read/write`、`memory_read/write`、`exec`、`web_fetch`、`plan`、`cron_*`、`agent_*`、`image_understand`\n\n### 🚧 正在进行的光合作用\n\n- [ ] Workspace Sandbox 安全增强:符号链接、TOCTOU、文件大小、特殊文件对象等防护。\n- [ ] 插件配置、MockBotAPI 和 SDK 分离整理。\n- [ ] Gateway 与 Node 分布式执行闭环。\n\n### 📜 未来的建设计划\n\n- [ ] Gateway 与 Node 分布式部署(Phase 5)\n- [ ] 可视化面板与运维工具(WebUI)(Phase 6)\n\n想要了解更详细的建设蓝图?请翻阅 [ROADMAP.md](docs/ROADMAP.md) 吧~\n\n## 🏛️ 虚空系统架构概览\n\n```\n┌─────────────────────────────────────────────────────────────┐\n│ 世界树树冠 (Interface Layer) │\n│ CLI (typer+rich) / WebUI (计划中) │\n├─────────────────────────────────────────────────────────────┤\n│ 世界树树枝 (Gateway-Node Layer) │\n│ 远程节点通讯 / 智慧分布式网络(规划中) │\n├─────────────────────────────────────────────────────────────┤\n│ 挂件与神之眼 (Plugin Layer) │\n│ 插件加载/权限管理/命令注册/工具注册/Channel接入/MCP集成 │\n├─────────────────────────────────────────────────────────────┤\n│ 智慧主脑 (Agent Layer) │\n│ Agent Loop / Subagent编排 / 记忆检索 / 多模态 / Provider抽象 │\n├─────────────────────────────────────────────────────────────┤\n│ 专属温室 (Workspace Layer) │\n│ 工作空间管理 / 安全文件沙盒 / 指令文件注入 │\n├─────────────────────────────────────────────────────────────┤\n│ 净土核心 (Core Layer) │\n│ 应用生命周期 / 分层配置 / 事件总线 / 会话管理 / 结构化日志 │\n└─────────────────────────────────────────────────────────────┘\n```\n\n详细的系统图纸存放在教令院的 [ARCHITECTURE](docs/architecture/README.md) 里哦。\n\n## 🚀 启动终端(快速开始)\n\n### 环境要求\n\n- Python 3.12+\n- [astral-uv](https://docs.astral.sh/uv/)\n\n### 安装\n\n```bash\ngit clone https://github.com/your-org/nahida-bot.git\ncd nahida-bot\n\nuv sync\n\n# 如需 Telegram Channel,安装可选依赖\nuv sync --group telegram\n\n# 类型检查与单元测试,可选\nuv run pyright\nuv run pytest\n\n# 编辑 config.yaml 配置 LLM Provider 和 Channel 后启动\nuv run nahida-bot start\n```\n\n### CLI 命令\n\n```bash\nnahida-bot version # 显示版本信息\nnahida-bot start [--debug] # 启动应用(可指定 --config-yaml / --log-file)\nnahida-bot config # 显示当前配置\nnahida-bot doctor # 运行诊断检查\n```\n\n### 最小配置示例\n\n```yaml\n# config.yaml\napp_name: \"Nahida Bot\"\nlog_level: \"INFO\"\nlog_file: \"./data/logs/nahida.log\"\nlog_file_level: \"DEBUG\"\n\nproviders:\n default:\n type: \"openai-compatible\"\n api_key: \"${LLM_API_KEY}\"\n base_url: \"${LLM_BASE_URL}\"\n stream_responses: true\n models:\n - \"${LLM_MODEL}\"\n\ndefault_provider: default\n\ntelegram:\n bot_token: \"${TELEGRAM_BOT_TOKEN}\"\n\n# Milky QQ Channel(可选)\n# milky:\n# base_url: \"http://127.0.0.1:3000\"\n# access_token: \"${MILKY_ACCESS_TOKEN}\"\n# group_trigger_mode: \"mention\"\n```\n\n配置支持 `${VAR}` 和 `${VAR:default}` 环境变量插值,可选 `.env` 文件加载。`config.yaml` 中包含 Agent Loop、Context Budget、Scheduler、Memory(FTS/Vector/Embedding)、Multimodal、Router、Model Tags 等完整配置项及详细注释。\n\n## 📚 文档\n\n| 文档 | 内容 |\n| ---- | ---- |\n| [ARCHITECTURE](docs/architecture/README.md) | 系统架构、分层设计、模块协作 |\n| [ROADMAP](docs/ROADMAP.md) | 路线图、阶段规划、验收清单 |\n| [DEVELOPMENT](docs/DEVELOPMENT.md) | 代码风格、测试规范、类型检查 |\n| [config.yaml](config.yaml) | 带注释的完整配置参考 |\n\n## 🤝 参考项目\n\n这里的很多智慧结晶,都离不开前辈们的探索:\n\n| 项目 | 参考内容 |\n|-----|-------|\n| OpenClaw | Agent + Workspace 模式、Gateway-Node 架构灵感、sentinel token 协议 |\n| AstrBot | Python LLM bot 领域的重量级项目 |\n| nonebot2 | 繁荣的插件生态、跨平台消息适配的绝佳设计 |\n| LiteLLM | 多 Provider 模型的优雅抽象和错误兼容 |\n| aiogram | Telegram Bot API 领域建模和异步处理 |\n| Milky / Lagrange | QQ 平台接入协议与实现 |\n\n## License\n\n**AGPL-v3.0 License.**\n"}, "e9d17d8c90220aa24e1276f700e128282aca96d1": {"t": 1785761646.2762747, "n": 5891, "h": "f4bec2b03d462296", "c": "# 🍃 Nahida Bot\n\n> \n>\n> 「这是**摩诃善法大吉祥智慧主**,智慧之神**布耶尔**,须弥的**草神大人**,你敢和她对视五秒吗?」\n\n欢迎连接到属于你的私有「虚空终端」!**Nahida Bot** 不仅仅是一个冷冰冰的机器,而是一个 **Agent 为灵魂**、以 **Workspace 为家**,还能通过 **插件随意换装** 的 Python 智能框架哦~ 🌿\n\nQQ 群:529674493\n\n## ✨ 核心天赋\n\n### 💡 设计理念\n\n- **Agent-first(意识主导)**:以 Agent Loop 为中枢,大语言模型(LLM)在这里不是外挂的工具人,而是真正的主导大脑~\n- **Workspace-native(专属花盆)**:文件就是上下文,工作空间(Workspace)作为一等公民被温柔对待。\n- **Plugin-driven(百变衣橱)**:不需要在核心代码里硬编码,想要什么新能力?装个插件就好啦!\n- **Multi-Provider(万叶一心)**:支持 OpenAI Compatible、DeepSeek、Anthropic Claude、GLM、Groq、Minimax 等多种 LLM 后端,运行时随心切换~\n- **Multi-Channel(千风引路)**:Telegram Bot + Milky QQ(Lagrange.Milky),统一的消息标准化与 ChannelService 协议~\n- **Multimodal(万象识图)**:原生 vision 图片理解 or 自动 fallback 描述 or image_understand 工具,三种模式自适应~\n- **Memory & Retrieval(梦境刻录)**:SQLite 会话记忆 + FTS 关键词检索 + 向量检索 + 混合检索 + LLM 记忆巩固~\n- **Agent Orchestration(子机协作)**:主 Agent 可 spawn 子 Agent 执行后台任务,支持 spawn / wait / stop 全生命周期~\n- **Cron & Dreaming(时之沙)**:定时任务调度 + 记忆 dreaming(LLM 驱动的周期性记忆整理与巩固)~\n- **MCP Support(外道魔术)**:Model Context Protocol 客户端集成,对接外部 MCP 工具服务器~\n- **Gateway-Node-ready(世界树网络)**:天然支持远程节点和分布式执行,把智慧的枝蔓延伸到各个角落~\n- **Ops-friendly(无忧除虫)**:可观测、可诊断、好发布,就算遇到了 Bug 也能轻松捉虫🐞!\n\n## 📈 成长进度(项目状态)\n\n目前小吉祥草王已完成 **Phase 4 全闭环**:Telegram + Milky QQ 双 Channel、Multi-Provider、内置命令/工具/插件体系、Subagent 编排、Multimodal、Scheduler 与 Memory Dreaming 均主体可用。\n\n### 🌟 已点亮的命座 ✅\n\n- [x] 净土的基石与质量把控(Phase 0)\n- [x] 核心生命循环:应用容器、分层配置、事件脉络与观测日志(Phase 1)\n- [x] 专属花盆(Workspace):空间管理、文件沙盒、指令注入(Phase 2.1-2.2)\n- [x] 智慧运转(Agent Loop):消息拼装、模型调用、工具闭环、推理链传播(Phase 2.3-2.4)\n- [x] 记忆流转:SQLite 会话记忆、FTS 检索、向量检索、混合检索(Phase 2.5)\n- [x] 推理链健壮性:OpenAI/DeepSeek/Claude 多后端推理提取与上下文回传(Phase 2.8)\n- [x] 万象识图:Vision 原生传图、fallback 自动描述/工具模式、MediaCache/MediaResolver(Phase 2.9)\n- [x] 插件系统:Manifest 声明、Loader 发现加载、权限检查、生命周期隔离、命令与工具注册(Phase 3.1-3.6)\n- [x] 接引通道 Telegram:长轮询、消息标准化、HTML/Markdown 转换、群聊 @mention、媒体降级(Phase 4.1-4.5)\n- [x] 接引通道 Milky QQ:Lagrange.Milky WebSocket 事件流、消息段建模、群聊触发策略、合并转发解析(Phase 4.6)\n- [x] Multi-Provider:per-request model override、Provider 类型运行时注册、pre/post-agent 分阶段加载\n- [x] MCP 集成:Model Context Protocol 客户端、工具适配、连接管理\n- [x] Subagent 编排:spawn 子 Agent、BackgroundTask 账本、policy hook、父子 session 管理(Phase 3.8 主体)\n- [x] 定时调度:Cron 定时任务 + Memory Dreaming LLM 记忆巩固\n- [x] 会话级别推理设置:`/reasoning on|off|effort <level>|reset`\n- [x] 群聊上下文注入:observed-only 消息记录 + 触发时注入最近群上下文\n- [x] 内置命令 11 个:`/reset`、`/new`、`/status`、`/model`、`/reasoning`、`/help`、`/memory`、`/agents`、`/agent_stop`、`/agent_wait`、`/stop`\n- [x] 内置工具 14+:`workspace_read/write`、`memory_read/write`、`exec`、`web_fetch`、`plan`、`cron_*`、`agent_*`、`image_understand`\n\n### 🚧 正在进行的光合作用\n\n- [ ] Workspace Sandbox 安全增强:符号链接、TOCTOU、文件大小、特殊文件对象等防护。\n- [ ] 插件配置、MockBotAPI 和 SDK 分离整理。\n- [ ] Gateway 与 Node 分布式执行闭环。\n\n### 📜 未来的建设计划\n\n- [ ] Gateway 与 Node 分布式部署(Phase 5)\n- [ ] 可视化面板与运维工具(WebUI)(Phase 6)\n\n想要了解更详细的建设蓝图?请翻阅 [ROADMAP.md](docs/ROADMAP.md) 吧~\n\n## 🏛️ 虚空系统架构概览\n\n```\n┌─────────────────────────────────────────────────────────────┐\n│ 世界树树冠 (Interface Layer) │\n│ CLI (typer+rich) / WebUI (计划中) │\n├─────────────────────────────────────────────────────────────┤\n│ 世界树树枝 (Gateway-Node Layer) │\n│ 远程节点通讯 / 智慧分布式网络(规划中) │\n├─────────────────────────────────────────────────────────────┤\n│ 挂件与神之眼 (Plugin Layer) │\n│ 插件加载/权限管理/命令注册/工具注册/Channel接入/MCP集成 │\n├─────────────────────────────────────────────────────────────┤\n│ 智慧主脑 (Agent Layer) │\n│ Agent Loop / Subagent编排 / 记忆检索 / 多模态 / Provider抽象 │\n├─────────────────────────────────────────────────────────────┤\n│ 专属温室 (Workspace Layer) │\n│ 工作空间管理 / 安全文件沙盒 / 指令文件注入 │\n├─────────────────────────────────────────────────────────────┤\n│ 净土核心 (Core Layer) │\n│ 应用生命周期 / 分层配置 / 事件总线 / 会话管理 / 结构化日志 │\n└─────────────────────────────────────────────────────────────┘\n```\n\n详细的系统图纸存放在教令院的 [ARCHITECTURE](docs/architecture/README.md) 里哦。\n\n## 🚀 启动终端(快速开始)\n\n### 环境要求\n\n- Python 3.12+\n- [astral-uv](https://docs.astral.sh/uv/)\n\n### 安装\n\n```bash\ngit clone https://github.com/your-org/nahida-bot.git\ncd nahida-bot\n\nuv sync\n\n# 如需 Telegram Channel,安装可选依赖\nuv sync --group telegram\n\n# 类型检查与单元测试,可选\nuv run pyright\nuv run pytest\n\n# 编辑 config.yaml 配置 LLM Provider 和 Channel 后启动\nuv run nahida-bot start\n```\n\n### CLI 命令\n\n```bash\nnahida-bot version # 显示版本信息\nnahida-bot start [--debug] # 启动应用(可指定 --config-yaml 路径)\nnahida-bot config # 显示当前配置\nnahida-bot doctor # 运行诊断检查\n```\n\n### 最小配置示例\n\n```yaml\n# config.yaml\napp_name: \"Nahida Bot\"\n\nproviders:\n default:\n type: \"openai-compatible\"\n api_key: \"${LLM_API_KEY}\"\n base_url: \"${LLM_BASE_URL}\"\n stream_responses: true\n models:\n - \"${LLM_MODEL}\"\n\ndefault_provider: default\n\ntelegram:\n bot_token: \"${TELEGRAM_BOT_TOKEN}\"\n\n# Milky QQ Channel(可选)\n# milky:\n# base_url: \"http://127.0.0.1:3000\"\n# access_token: \"${MILKY_ACCESS_TOKEN}\"\n# group_trigger_mode: \"mention\"\n```\n\n配置支持 `${VAR}` 和 `${VAR:default}` 环境变量插值,可选 `.env` 文件加载。`config.yaml` 中包含 Agent Loop、Context Budget、Scheduler、Memory(FTS/Vector/Embedding)、Multimodal、Router、Model Tags 等完整配置项及详细注释。\n\n## 📚 文档\n\n| 文档 | 内容 |\n| ---- | ---- |\n| [ARCHITECTURE](docs/architecture/README.md) | 系统架构、分层设计、模块协作 |\n| [ROADMAP](docs/ROADMAP.md) | 路线图、阶段规划、验收清单 |\n| [DEVELOPMENT](docs/DEVELOPMENT.md) | 代码风格、测试规范、类型检查 |\n| [config.yaml](config.yaml) | 带注释的完整配置参考 |\n\n## 🤝 参考项目\n\n这里的很多智慧结晶,都离不开前辈们的探索:\n\n| 项目 | 参考内容 |\n|-----|-------|\n| OpenClaw | Agent + Workspace 模式、Gateway-Node 架构灵感、sentinel token 协议 |\n| AstrBot | Python LLM bot 领域的重量级项目 |\n| nonebot2 | 繁荣的插件生态、跨平台消息适配的绝佳设计 |\n| LiteLLM | 多 Provider 模型的优雅抽象和错误兼容 |\n| aiogram | Telegram Bot API 领域建模和异步处理 |\n| Milky / Lagrange | QQ 平台接入协议与实现 |\n\n## License\n\n**AGPL-v3.0 License.**\n"}, "0e678b6d11b79116b85a0748af51898cfbca7925": {"t": 1785761647.769203, "n": 3458, "h": "32b88e91805b3389", "c": "# 🍃 Nahida Bot\n\n> \n>\n> 「这是**摩诃善法大吉祥智慧主**,须弥的**草神大人**,你敢和她对视五秒吗?」\n\n欢迎连接到属于你的私有「虚空终端」!**Nahida Bot** 不仅仅是一个冷冰冰的机器,而是一个 **Agent 为灵魂**、以 **Workspace 为家**,还能通过 **插件随意换装** 的 Python 智能框架哦~ 🌿\n\nQQ 群:529674493\n\n## ✨ 核心天赋\n\n### 💡 设计理念\n\n- **Agent-first(意识主导)**:以 Agent Loop 为中枢,大语言模型(LLM)在这里不是外挂的工具人,而是真正的主导大脑~\n- **Workspace-native(专属花盆)**:文件就是上下文,工作空间(Workspace)作为一等公民被温柔对待。\n- **Plugin-driven(百变衣橱)**:不需要在核心代码里硬编码,想要什么新能力?装个插件就好啦!\n- **Gateway-Node-ready(世界树网络)**:天然支持远程节点和分布式执行,把智慧的枝蔓延伸到各个角落~\n- **Ops-friendly(无忧除虫)**:可观测、可诊断、好发布,就算遇到了 Bug 也能轻松捉虫🐞!\n\n## 📈 成长进度(项目状态)\n\n目前小吉祥草王已完成 **Phase 4(Telegram 接入 + Multi-Provider + 内置命令)** 的主体闭环,已经具备真实 Channel、Agent、Workspace、Plugin 与记忆持久化的最小可用运行路径。\n\n### 🌟 已点亮的命座 ✅\n\n- [x] 净土的基石与质量把控(Phase 0)\n- [x] 核心生命循环:应用容器、配置文件、事件脉络与观测日志(Phase 1)\n- [x] 专属花盆(Workspace)基石:空间管理、文件沙盒隔离、记忆上下文注入(Phase 2.1-2.2)\n- [x] 智慧运转(Agent Loop):消息拼装、模型调用、工具调用闭环、推理链传播(Phase 2.3-2.8)\n- [x] 记忆流转与梦境刻录:SQLite 会话记忆与关键词检索(Phase 2.5)\n- [x] 插件系统:Manifest、Loader、权限检查、生命周期、命令与工具注册(Phase 3)\n- [x] 接引通道:Telegram 长轮询、消息标准化、媒体降级、出站 HTML 转换(Phase 4)\n- [x] 内置命令:`/reset`、`/new`、`/status`、`/model`、`/help`(Phase 4.5)\n\n### 🚧 正在进行的光合作用\n\n- [ ] Provider 模型切换增强:同一 Provider 下按请求覆盖具体 model,而不是只切 provider slot。\n- [ ] Workspace Sandbox 安全增强:符号链接、TOCTOU、文件大小、特殊文件对象等防护。\n- [ ] 插件配置、MockBotAPI 和 SDK 分离整理。\n- [ ] Gateway 与 Node 分布式执行闭环。\n\n### 📜 未来的须弥建设计划\n\n- [ ] 虚空终端的广域部署(Gateway 与 Node 分布式)(Phase 5)\n- [ ] 漂亮的可视化面板与教令院运维工具(WebUI)(Phase 6)\n\n想要了解更详细的须弥建设蓝图?请翻阅 [ROADMAP.md](docs/ROADMAP.md) 吧~\n\n## 🏛️ 虚空系统架构概览\n\n```\n┌─────────────────────────────────────────────────────────────┐\n│ 世界树树冠 (Interface Layer) │\n│ CLI / WebUI / API │\n├─────────────────────────────────────────────────────────────┤\n│ 世界树树枝 (Gateway-Node Layer) │\n│ 远程节点通讯 / 智慧分布式网络 │\n├─────────────────────────────────────────────────────────────┤\n│ 挂件与神之眼 (Plugin Layer) │\n│ 插件加载 / 权限管理 / 外部接引通道 / 道具注册 │\n├─────────────────────────────────────────────────────────────┤\n│ 智慧主脑 (Agent Layer) │\n│ LLM 推理循环 / 梦境上下文机制 / 记忆 / 模型连接抽象 │\n├─────────────────────────────────────────────────────────────┤\n│ 专属温室 (Workspace Layer) │\n│ 工作空间管理 / 安全文件沙盒 / 记忆浇灌 │\n├─────────────────────────────────────────────────────────────┤\n│ 净土核心 (Core Layer) │\n│ 应用生命树 / 法则配置 / 事件脉搏 / 观测日志 / 异常 │\n└─────────────────────────────────────────────────────────────┘\n```\n\n详细的系统图纸存放在教令院的 [ARCHITECTURE](docs/architecture/README.md) 里哦。\n\n## 🚀 启动终端(快速开始)\n\n### 环境要求\n\n- Python 3.12+\n- [astral-uv](https://docs.astral.sh/uv/)\n\n### 安装\n\n```bash\ngit clone https://github.com/your-org/nahida-bot.git\ncd nahida-bot\n\nuv sync\n\n# 类型检查与单元测试,可选\nuv run pyright\nuv run pytest\n\nuv run nahida-bot start\n```\n\n### CLI 命令\n\n```bash\nnahida-bot version\nnahida-bot start [--debug]\nnahida-bot config\nnahida-bot doctor\n```\n\n## 📚 文档\n\n- [ARCHITECTURE](docs/architecture/README.md)\n- [ROADMAP.md](docs/ROADMAP.md)\n- [DEVELOPMENT.md](docs/DEVELOPMENT.md)\n\n## 🤝 参考项目\n\n这里的很多智慧结晶,都离不开前辈们的探索:\n\n| 项目 | 参考内容 |\n|-----|-------|\n| OpenClaw | Agent + Workspace 的模式、Gateway-Node 架构灵感 |\n| AstrBot | Python LLM bot 领域的重量级项目 |\n| nonebot2 | 繁荣的插件生态、跨平台消息适配的绝佳设计 |\n| LiteLLM | 多 Provider 模型的优雅抽象和防报错平权 |\n\n## License\n\n**DO WHAT THE FUCK YOU WANT TO.**\n"}, "3366712da70ac1a78f79d8ace991ce1ea8357338": {"t": 1785761649.1434705, "n": 3327, "h": "1a51b4881ebd40a8", "c": "# 🍃 Nahida Bot\n\n> \n>\n> 「这是**摩诃善法大吉祥智慧主**,须弥的**草神大人**,你敢和她对视五秒吗?」\n\n欢迎连接到属于你的私有「虚空终端」!**Nahida Bot** 不仅仅是一个冷冰冰的机器,而是一个 **Agent 为灵魂**、以 **Workspace 为家**,还能通过 **插件随意换装** 的 Python 智能框架哦~ 🌿\n\nQQ 群:529674493\n\n## ✨ 核心天赋\n\n### 💡 设计理念\n\n- **Agent-first(意识主导)**:以 Agent Loop 为中枢,大语言模型(LLM)在这里不是外挂的工具人,而是真正的主导大脑~\n- **Workspace-native(专属花盆)**:文件就是上下文,工作空间(Workspace)作为一等公民被温柔对待。\n- **Plugin-driven(百变衣橱)**:不需要在核心代码里硬编码,想要什么新能力?装个插件就好啦!\n- **Gateway-Node-ready(世界树网络)**:天然支持远程节点和分布式执行,把智慧的枝蔓延伸到各个角落~\n- **Ops-friendly(无忧除虫)**:可观测、可诊断、好发布,就算遇到了 Bug 也能轻松捉虫🐞!\n\n## 📈 成长进度(项目状态)\n\n目前小吉祥草王正处于 **Phase 2(Agent 与 Workspace 的萌芽期)**,核心的生命循环机制已经搭建好啦~ 🌱\n\n### 🌟 已点亮的命座 ✅\n\n- [x] 净土的基石与质量把控(Phase 0)\n- [x] 核心生命循环:应用容器、配置文件、事件脉络与观测日志(Phase 1)\n- [x] 专属花盆(Workspace)基石:空间管理、文件沙盒隔离、记忆上下文注入(Phase 2.1-2.2)\n- [x] 智慧运转(Agent Loop):消息拼装、模型共鸣、工具协议(Phase 2.3)\n- [x] 梦境链接(Provider 抽象):OpenAI 兼容接口、错误归一化平权(Phase 2.3)\n- [x] 神力感知(Provider 感知 Token 预算):精准把控消耗(Phase 2.3)\n\n### 🚧 正在进行的光合作用\n\n- [ ] 幻境工具通信闭环(Tool Calling 协议)(Phase 2.4)\n- [ ] 记忆流转与梦境刻录(持久化)(Phase 2.5)\n- [ ] 保护花盆的安全强化魔法(Workspace Sandbox 安全增强)⚠️(Phase 2.7)\n- [ ] 梦境反馈的抗干扰训练(Provider 响应健壮性)(Phase 2.8)\n\n### 📜 未来的须弥建设计划\n\n- [ ] 插件系统与连接外部的 Channel 接口(Phase 3)\n- [ ] 各大社交平台的接引通道实现(Phase 4)\n- [ ] 虚空终端的广域部署(Gateway 与 Node 分布式)(Phase 5)\n- [ ] 漂亮的可视化面板与教令院运维工具(WebUI)(Phase 6)\n\n想要了解更详细的须弥建设蓝图?请翻阅 [ROADMAP.md](docs/ROADMAP.md) 吧~\n\n## 🏛️ 虚空系统架构概览\n\n```\n┌─────────────────────────────────────────────────────────────┐\n│ 世界树树冠 (Interface Layer) │\n│ CLI / WebUI / API │\n├─────────────────────────────────────────────────────────────┤\n│ 世界树树枝 (Gateway-Node Layer) │\n│ 远程节点通讯 / 智慧分布式网络 │\n├─────────────────────────────────────────────────────────────┤\n│ 挂件与神之眼 (Plugin Layer) │\n│ 插件加载 / 权限管理 / 外部接引通道 / 道具注册 │\n├─────────────────────────────────────────────────────────────┤\n│ 智慧主脑 (Agent Layer) │\n│ LLM 推理循环 / 梦境上下文机制 / 记忆 / 模型连接抽象 │\n├─────────────────────────────────────────────────────────────┤\n│ 专属温室 (Workspace Layer) │\n│ 工作空间管理 / 安全文件沙盒 / 记忆浇灌 │\n├─────────────────────────────────────────────────────────────┤\n│ 净土核心 (Core Layer) │\n│ 应用生命树 / 法则配置 / 事件脉搏 / 观测日志 / 异常 │\n└─────────────────────────────────────────────────────────────┘\n```\n\n详细的系统图纸存放在教令院的 [ARCHITECTURE](docs/architecture/README.md) 里哦。\n\n## 🚀 启动终端(快速开始)\n\n### 环境要求\n\n- Python 3.12+\n- [astral-uv](https://docs.astral.sh/uv/)\n\n### 安装\n\n```bash\ngit clone https://github.com/your-org/nahida-bot.git\ncd nahida-bot\n\nuv sync\n\n# 类型检查与单元测试,可选\nuv run pyright\nuv run pytest\n\nuv run nahida-bot start\n```\n\n### CLI 命令\n\n```bash\nnahida-bot version\nnahida-bot start [--debug]\nnahida-bot config\nnahida-bot doctor\n```\n\n## 📚 文档\n\n- [ARCHITECTURE](docs/architecture/README.md)\n- [ROADMAP.md](docs/ROADMAP.md)\n- [DEVELOPMENT.md](docs/DEVELOPMENT.md)\n\n## 🤝 参考项目\n\n这里的很多智慧结晶,都离不开前辈们的探索:\n\n| 项目 | 参考内容 |\n|-----|-------|\n| OpenClaw | Agent + Workspace 的模式、Gateway-Node 架构灵感 |\n| AstrBot | Python LLM bot 领域的重量级项目 |\n| nonebot2 | 繁荣的插件生态、跨平台消息适配的绝佳设计 |\n| LiteLLM | 多 Provider 模型的优雅抽象和防报错平权 |\n\n## License\n\n**DO WHAT THE FUCK YOU WANT TO.**\n"}, "a8064317f169e3ac9cdb58ad6fbeb962ce1c466b": {"t": 1785761651.3286302, "n": 3319, "h": "57c55efa7c9116c7", "c": "# 🍃 Nahida Bot\n\n> \n>\n> 「这是**摩诃善法大吉祥智慧主**,须弥的**草神大人**,你敢和她对视五秒吗?」\n\n欢迎连接到属于你的私有「虚空终端」!**Nahida Bot** 不仅仅是一个冷冰冰的机器,而是一个 **Agent 为灵魂**、以 **Workspace 为家**,还能通过 **插件随意换装** 的 Python 智能框架哦~ 🌿\n\nQQ 群:529674493\n\n## ✨ 核心天赋\n\n### 💡 设计理念\n\n- **Agent-first(意识主导)**:以 Agent Loop 为中枢,大语言模型(LLM)在这里不是外挂的工具人,而是真正的主导大脑~\n- **Workspace-native(专属花盆)**:文件就是上下文,工作空间(Workspace)作为一等公民被温柔对待。\n- **Plugin-driven(百变衣橱)**:不需要在核心代码里硬编码,想要什么新能力?装个插件就好啦!\n- **Gateway-Node-ready(世界树网络)**:天然支持远程节点和分布式执行,把智慧的枝蔓延伸到各个角落~\n- **Ops-friendly(无忧除虫)**:可观测、可诊断、好发布,就算遇到了 Bug 也能轻松捉虫🐞!\n\n## 📈 成长进度(项目状态)\n\n目前小吉祥草王正处于 **Phase 2(Agent 与 Workspace 的萌芽期)**,核心的生命循环机制已经搭建好啦~ 🌱\n\n### 🌟 已点亮的命座 ✅\n\n- [x] 净土的基石与质量把控(Phase 0)\n- [x] 核心生命循环:应用容器、配置文件、事件脉络与观测日志(Phase 1)\n- [x] 专属花盆(Workspace)基石:空间管理、文件沙盒隔离、记忆上下文注入(Phase 2.1-2.2)\n- [x] 智慧运转(Agent Loop):消息拼装、模型共鸣、工具协议(Phase 2.3)\n- [x] 梦境链接(Provider 抽象):OpenAI 兼容接口、错误归一化平权(Phase 2.3)\n- [x] 神力感知(Provider 感知 Token 预算):精准把控消耗(Phase 2.3)\n\n### 🚧 正在进行的光合作用\n\n- [ ] 幻境工具通信闭环(Tool Calling 协议)(Phase 2.4)\n- [ ] 记忆流转与梦境刻录(持久化)(Phase 2.5)\n- [ ] 保护花盆的安全强化魔法(Workspace Sandbox 安全增强)⚠️(Phase 2.7)\n- [ ] 梦境反馈的抗干扰训练(Provider 响应健壮性)(Phase 2.8)\n\n### 📜 未来的须弥建设计划\n\n- [ ] 插件系统与连接外部的 Channel 接口(Phase 3)\n- [ ] 各大社交平台的接引通道实现(Phase 4)\n- [ ] 虚空终端的广域部署(Gateway 与 Node 分布式)(Phase 5)\n- [ ] 漂亮的可视化面板与教令院运维工具(WebUI)(Phase 6)\n\n想要了解更详细的须弥建设蓝图?请翻阅 [ROADMAP.md](docs/ROADMAP.md) 吧~\n\n## 🏛️ 虚空系统架构概览\n\n```\n┌─────────────────────────────────────────────────────────────┐\n│ 世界树树冠 (Interface Layer) │\n│ CLI / WebUI / API │\n├─────────────────────────────────────────────────────────────┤\n│ 世界树树枝 (Gateway-Node Layer) │\n│ 远程节点通讯 / 智慧分布式网络 │\n├─────────────────────────────────────────────────────────────┤\n│ 挂件与神之眼 (Plugin Layer) │\n│ 插件加载 / 权限管理 / 外部接引通道 / 道具注册 │\n├─────────────────────────────────────────────────────────────┤\n│ 智慧主脑 (Agent Layer) │\n│ LLM 推理循环 / 梦境上下文机制 / 记忆 / 模型连接抽象 │\n├─────────────────────────────────────────────────────────────┤\n│ 专属温室 (Workspace Layer) │\n│ 工作空间管理 / 安全文件沙盒 / 记忆浇灌 │\n├─────────────────────────────────────────────────────────────┤\n│ 净土核心 (Core Layer) │\n│ 应用生命树 / 法则配置 / 事件脉搏 / 观测日志 / 异常 │\n└─────────────────────────────────────────────────────────────┘\n```\n\n详细的系统图纸存放在教令院的 [ARCHITECTURE.md](docs/ARCHITECTURE.md) 里哦。\n\n## 🚀 启动终端(快速开始)\n\n### 环境要求\n\n- Python 3.12+\n- [astral-uv](https://docs.astral.sh/uv/)\n\n### 安装\n\n```bash\ngit clone https://github.com/your-org/nahida-bot.git\ncd nahida-bot\n\nuv sync\n\n# 类型检查与单元测试,可选\nuv run pyright\nuv run pytest\n\nuv run nahida-bot start\n```\n\n### CLI 命令\n\n```bash\nnahida-bot version\nnahida-bot start [--debug]\nnahida-bot config\nnahida-bot doctor\n```\n\n## 📚 文档\n\n- [ARCHITECTURE.md](docs/ARCHITECTURE.md)\n- [ROADMAP.md](docs/ROADMAP.md)\n- [DEVELOPMENT.md](docs/DEVELOPMENT.md)\n\n## 🤝 参考项目\n\n这里的很多智慧结晶,都离不开前辈们的探索:\n\n| 项目 | 参考内容 |\n|-----|-------|\n| OpenClaw | Agent + Workspace 的模式、Gateway-Node 架构灵感 |\n| AstrBot | Python LLM bot 领域的重量级项目 |\n| nonebot2 | 繁荣的插件生态、跨平台消息适配的绝佳设计 |\n| LiteLLM | 多 Provider 模型的优雅抽象和防报错平权 |\n\n## License\n\n**DO WHAT THE FUCK YOU WANT TO.**\n"}, "b8566363d254c9a1c731abe934b3f2830dc5fd06": {"t": 1785761655.5814805, "n": 3303, "h": "8b4c5ceab9cff6b8", "c": "# 🍃 Nahida Bot\n\n> \n>\n> 「这是**摩诃善法大吉祥智慧主**,须弥的**草神大人**,你敢和她对视五秒吗?」\n\n欢迎连接到属于你的私有「虚空终端」!**Nahida Bot** 不仅仅是一个冷冰冰的机器,而是一个 **Agent 为灵魂**、以 **Workspace 为家**,还能通过 **插件随意换装** 的 Python 智能框架哦~ 🌿\n\n## ✨ 核心天赋\n\n### 💡 设计理念\n\n- **Agent-first(意识主导)**:以 Agent Loop 为中枢,大语言模型(LLM)在这里不是外挂的工具人,而是真正的主导大脑~\n- **Workspace-native(专属花盆)**:文件就是上下文,工作空间(Workspace)作为一等公民被温柔对待。\n- **Plugin-driven(百变衣橱)**:不需要在核心代码里硬编码,想要什么新能力?装个插件就好啦!\n- **Gateway-Node-ready(世界树网络)**:天然支持远程节点和分布式执行,把智慧的枝蔓延伸到各个角落~\n- **Ops-friendly(无忧除虫)**:可观测、可诊断、好发布,就算遇到了 Bug 也能轻松捉虫🐞!\n\n## 📈 成长进度(项目状态)\n\n目前小吉祥草王正处于 **Phase 2(Agent 与 Workspace 的萌芽期)**,核心的生命循环机制已经搭建好啦~ 🌱\n\n### 🌟 已点亮的命座 ✅\n\n- [x] 净土的基石与质量把控(Phase 0)\n- [x] 核心生命循环:应用容器、配置文件、事件脉络与观测日志(Phase 1)\n- [x] 专属花盆(Workspace)基石:空间管理、文件沙盒隔离、记忆上下文注入(Phase 2.1-2.2)\n- [x] 智慧运转(Agent Loop):消息拼装、模型共鸣、工具协议(Phase 2.3)\n- [x] 梦境链接(Provider 抽象):OpenAI 兼容接口、错误归一化平权(Phase 2.3)\n- [x] 神力感知(Provider 感知 Token 预算):精准把控消耗(Phase 2.3)\n\n### 🚧 正在进行的光合作用\n\n- [ ] 幻境工具通信闭环(Tool Calling 协议)(Phase 2.4)\n- [ ] 记忆流转与梦境刻录(持久化)(Phase 2.5)\n- [ ] 保护花盆的安全强化魔法(Workspace Sandbox 安全增强)⚠️(Phase 2.7)\n- [ ] 梦境反馈的抗干扰训练(Provider 响应健壮性)(Phase 2.8)\n\n### 📜 未来的须弥建设计划\n\n- [ ] 插件系统与连接外部的 Channel 接口(Phase 3)\n- [ ] 各大社交平台的接引通道实现(Phase 4)\n- [ ] 虚空终端的广域部署(Gateway 与 Node 分布式)(Phase 5)\n- [ ] 漂亮的可视化面板与教令院运维工具(WebUI)(Phase 6)\n\n想要了解更详细的须弥建设蓝图?请翻阅 [ROADMAP.md](docs/ROADMAP.md) 吧~\n\n## 🏛️ 虚空系统架构概览\n\n```\n┌─────────────────────────────────────────────────────────────┐\n│ 世界树树冠 (Interface Layer) │\n│ CLI / WebUI / API │\n├─────────────────────────────────────────────────────────────┤\n│ 世界树树枝 (Gateway-Node Layer) │\n│ 远程节点通讯 / 智慧分布式网络 │\n├─────────────────────────────────────────────────────────────┤\n│ 挂件与神之眼 (Plugin Layer) │\n│ 插件加载 / 权限管理 / 外部接引通道 / 道具注册 │\n├─────────────────────────────────────────────────────────────┤\n│ 智慧主脑 (Agent Layer) │\n│ LLM 推理循环 / 梦境上下文机制 / 记忆 / 模型连接抽象 │\n├─────────────────────────────────────────────────────────────┤\n│ 专属温室 (Workspace Layer) │\n│ 工作空间管理 / 安全文件沙盒 / 记忆浇灌 │\n├─────────────────────────────────────────────────────────────┤\n│ 净土核心 (Core Layer) │\n│ 应用生命树 / 法则配置 / 事件脉搏 / 观测日志 / 异常 │\n└─────────────────────────────────────────────────────────────┘\n```\n\n详细的系统图纸存放在教令院的 [ARCHITECTURE.md](docs/ARCHITECTURE.md) 里哦。\n\n## 🚀 启动终端(快速开始)\n\n### 环境要求\n\n- Python 3.12+\n- [astral-uv](https://docs.astral.sh/uv/)\n\n### 安装\n\n```bash\ngit clone https://github.com/your-org/nahida-bot.git\ncd nahida-bot\n\nuv sync\n\n# 类型检查与单元测试,可选\nuv run pyright\nuv run pytest\n\nuv run nahida-bot start\n```\n\n### CLI 命令\n\n```bash\nnahida-bot version\nnahida-bot start [--debug]\nnahida-bot config\nnahida-bot doctor\n```\n\n## 📚 文档\n\n- [ARCHITECTURE.md](docs/ARCHITECTURE.md)\n- [ROADMAP.md](docs/ROADMAP.md)\n- [DEVELOPMENT.md](docs/DEVELOPMENT.md)\n\n## 🤝 参考项目\n\n这里的很多智慧结晶,都离不开前辈们的探索:\n\n| 项目 | 参考内容 |\n|-----|-------|\n| OpenClaw | Agent + Workspace 的模式、Gateway-Node 架构灵感 |\n| AstrBot | Python LLM bot 领域的重量级项目 |\n| nonebot2 | 繁荣的插件生态、跨平台消息适配的绝佳设计 |\n| LiteLLM | 多 Provider 模型的优雅抽象和防报错平权 |\n\n## License\n\n**DO WHAT THE FUCK YOU WANT TO.**\n"}, "f7c6d382258d8028bd62b1817cca2cc043e88ef7": {"t": 1785761658.128391, "n": 3835, "h": "e5b808b84ebd6b22", "c": "# Nahida Bot\n\n> \n>\n> 这是**摩诃善法大吉祥智慧主**,须弥的**草神大人**,你敢和她对视五秒吗?\n\n一个以 **Agent 为核心**、以 **Workspace 为中心**、可通过 **插件扩展** 的 Python Bot 框架。\n\n## 核心特性\n\n### 设计理念\n\n- **Agent-first**:以 Agent Loop 为中枢,而不是把 LLM 当外挂\n- **Workspace-native**:文件即上下文,工作空间是一等对象\n- **Plugin-driven**:能力扩展通过插件,不通过核心硬编码\n- **Gateway-Node-ready**:天然支持远程节点和分布式执行\n- **Ops-friendly**:可观测、可诊断、可发布\n\n### 技术栈\n\n| 领域 | 技术选型 |\n|-----|---------|\n| 运行时 | Python 3.12+ / asyncio |\n| 类型系统 | Pydantic v2 + pyright |\n| Web 框架 | FastAPI + Uvicorn |\n| 数据存储 | SQLite + aiosqlite |\n| CLI | Typer + Rich |\n| 日志 | Structlog |\n| 包管理 | uv |\n\n## 项目状态\n\n当前处于 **Phase 2**(Agent 与 Workspace 联合阶段),核心运行时已可用。\n\n### 已完成 ✅\n\n- [x] 项目地基与质量闸门(Phase 0)\n- [x] 核心运行时:应用容器、配置、事件、日志(Phase 1)\n- [x] Workspace 基线:空间管理、文件沙盒、上下文注入(Phase 2.1-2.2)\n- [x] Agent Loop:消息组装、模型调用、工具协议(Phase 2.3)\n- [x] Provider 抽象:OpenAI 兼容接口、错误归一化(Phase 2.3)\n- [x] Provider 感知 Token 预算(Phase 2.3)\n\n### 进行中 🚧\n\n- [ ] Tool Calling 协议闭环(Phase 2.4)\n- [ ] 记忆模型与持久化(Phase 2.5)\n- [ ] Workspace Sandbox 安全增强(Phase 2.7)⚠️\n- [ ] Provider 响应健壮性(Phase 2.8)\n\n### 规划中 📋\n\n- [ ] 插件系统与 Channel 接口(Phase 3)\n- [ ] 平台接入实现(Phase 4)\n- [ ] Gateway 与 Node 分布式(Phase 5)\n- [ ] WebUI 与运维工具(Phase 6)\n\n详细路线图见 [ROADMAP.md](docs/ROADMAP.md)。\n\n## 架构概览\n\n```\n┌─────────────────────────────────────────────────────────────┐\n│ Interface Layer │\n│ CLI / WebUI / API │\n├─────────────────────────────────────────────────────────────┤\n│ Gateway-Node Layer │\n│ 远程节点通信 / 分布式执行 │\n├─────────────────────────────────────────────────────────────┤\n│ Plugin Layer │\n│ 插件加载 / 权限管理 / Channel 接口 / 工具注册 │\n├─────────────────────────────────────────────────────────────┤\n│ Agent Layer │\n│ LLM 推理循环 / 上下文管理 / 记忆 / Provider 抽象 │\n├─────────────────────────────────────────────────────────────┤\n│ Workspace Layer │\n│ 工作空间 / 文件沙盒 / 上下文注入 │\n├─────────────────────────────────────────────────────────────┤\n│ Core Layer │\n│ 应用容器 / 生命周期 / 配置 / 事件 / 日志 / 异常 │\n└─────────────────────────────────────────────────────────────┘\n```\n\n详细架构设计见 [ARCHITECTURE.md](docs/ARCHITECTURE.md)。\n\n## 快速开始\n\n### 环境要求\n\n- Python 3.12+\n- [uv](https://docs.astral.sh/uv/) 包管理器\n\n### 安装\n\n```bash\n# 克隆仓库\ngit clone https://github.com/your-org/nahida-bot.git\ncd nahida-bot\n\n# 安装依赖\nuv sync\n\n# 运行类型检查\nuv run pyright\n\n# 运行测试\nuv run pytest\n\n# 启动应用\nuv run nahida-bot start\n```\n\n### CLI 命令\n\n```bash\nnahida-bot version # 显示版本\nnahida-bot start [--debug] # 启动应用\nnahida-bot config # 显示配置\nnahida-bot doctor # 诊断检查\n```\n\n## 目录结构\n\n```\nnahida_bot/\n├── core/ # 核心层:应用容器、配置、事件、日志\n├── workspace/ # 工作空间:空间管理、文件沙盒\n├── agent/ # Agent 层:推理循环、上下文、Provider\n│ └── providers/ # Provider 实现:OpenAI 兼容等\n├── plugins/ # 插件系统(规划中)\n├── gateway/ # Gateway 服务(规划中)\n├── node/ # Node 客户端(规划中)\n├── db/ # 数据库层(规划中)\n└── cli/ # 命令行接口\n```\n\n## 文档\n\n- [ARCHITECTURE.md](docs/ARCHITECTURE.md) - 架构设计文档\n- [ROADMAP.md](docs/ROADMAP.md) - 开发路线图\n- [DEVELOPMENT.md](docs/DEVELOPMENT.md) - 开发指南\n\n## 参考项目\n\n| 项目 | 借鉴点 |\n|-----|-------|\n| OpenClaw | Agent + Workspace 模式、Gateway-Node 架构 |\n| AstrBot | 项目初始化、配置日志、Dashboard 设计 |\n| nonebot2 | 插件生态、消息适配设计 |\n| LiteLLM | 多 Provider 抽象和错误兼容 |\n| OneBot/NapCat | Channel 协议设计、多通信方式支持 |\n\n## 安全说明\n\n⚠️ **重要**:当前 Workspace Sandbox 实现存在已知安全风险(符号链接攻击、TOCTOU 等),Phase 2.7 将完成安全加固。在生产环境使用前,请确保完成安全增强。\n\n详见 [ROADMAP.md](docs/ROADMAP.md) 第 8 节\"风险与约束\"。\n\n## License\n\nDO WHAT THE FUCK YOU WANT TO.\n"}, "226bb7673500fa8eaacdb9dc9ec84e71330f2c10": {"t": 1785761662.0421028, "n": 420, "h": "1a031f4b6abf85e0", "c": "# Nahida Bot\n\n> \n>\n> 这是**摩诃善法大吉祥智慧主**,须弥的**草神大人**,你敢和她对视五秒吗?\n\n~~这是一个应群友要求做的 QQ 机器人,基于 [nonebot2](https://nonebot.dev)~~\n\n这是一个使用 Python 重新实现的类 OpenClaw 的机器人,因为原版龙虾的代码实在是不堪入目,实现过程有参考 AstrBot 的部分,~~也有参考 Claude Code~~。\n\n## 功能\n\n- [ ] Agent 系统\n- [ ] Channel + 插件系统\n- [ ] Gateway + Node 系统\n- [ ] WebUI\n\n## 开发\n\n见[DEVELOPMENT.md](docs/DEVELOPMENT.md)\n\n## License\n\nDO WHAT THE FUCK YOU WANT TO.\n"}, "d78bb2922713c28979146e3aa6fa39fb87611aa2": {"t": 1785761664.8625774, "n": 277, "h": "5da2f3a953da90fc", "c": "# Nahida Bot\n\n> \n>\n> 这是**摩诃善法大吉祥智慧主**,须弥的**草神大人**,你敢和她对视五秒吗?\n\n这是一个应群友要求做的 QQ 机器人,基于 [nonebot2](https://nonebot.dev)\n\n## 功能\n\n- [ ] 基础功能\n- [ ] pixiv搜索\n- [ ] 漫画搜索下载\n- [ ] 基于DeepSeek-R1/SiliconFlow的角色扮演\n\n## License\n\nDO WHAT THE FUCK YOU WANT TO.\n"}, "4a79064246692d3c27da6c4190b4d451ce36798b": {"t": 1786068485.4012234, "n": 13321, "h": "60542fe47c0b3cc8", "c": "# 🍃 Nahida Bot\n\n> \n>\n> 「这是**摩诃善法大吉祥智慧主**,智慧之神**布耶尔**,须弥的**草神大人**,你敢和她对视五秒吗?」\n\n欢迎连接到属于你的私有「虚空终端」!**Nahida Bot** 不仅仅是一个冷冰冰的机器,而是一个 **Agent 为灵魂**、以 **Workspace 为家**、能长出 **Live2D 桌宠形态**,还能通过 **插件随意换装** 的 Python 智能框架哦~ 🌿\n\n文档:[Docs](https://nahida-bot.cobaltdev.top)\n\n[](https://qm.qq.com/q/rXP8DKCyRi) [](https://app.netlify.com/projects/nahida-bot/deploys)\n\n## ✨ 核心天赋\n\n### 💡 设计理念\n\n- **Agent-first(意识主导)**:以 Agent Loop 为中枢,大语言模型(LLM)在这里不是外挂的工具人,而是真正的主导大脑~\n- **Workspace-native(专属花盆)**:文件就是上下文,工作空间(Workspace)作为一等公民被温柔对待。\n- **Plugin-driven(百变衣橱)**:不需要在核心代码里硬编码,想要什么新能力?装个插件就好啦!\n- **Multi-Provider(万叶一心)**:支持 OpenAI Compatible(含 Responses API)、DeepSeek、Anthropic Claude、GLM、Groq、Minimax 等多种 LLM 后端,运行时随心切换~\n- **Multi-Channel(千风引路)**:Telegram Bot + Milky QQ(Lagrange.Milky)+ OneBot v11/v12(NapCat/Lagrange/LLOneBot),统一的消息标准化与 ChannelService 协议~\n- **Desktop Pet(梦中之相)**:Tauri + Rust + Vue 3 + Live2D(PixiJS)打造的边缘隐藏式桌宠,鼠标靠近 / Gateway 推送 / CRON 到点时从屏幕角落唤出,还能本地 TTS 发声~\n- **Multimodal(万象识图)**:原生 vision 图片理解 or 自动 fallback 描述 or image_understand 工具,三种模式自适应~\n- **Memory & Retrieval(梦境刻录)**:SQLite 会话记忆 + FTS 关键词检索 + 向量检索 + 混合检索 + LLM 记忆巩固;独立的 Document Store 让知识库与记忆各自安家~\n- **Knowledge Base(须弥图书馆)**:内置知识库插件,导入 PDF/Word/PPT/Excel 等文档,MarkItDown 转换 + 分块 + FTS/向量/混合检索 + 可选 embedding~\n- **Agent Orchestration(子机协作)**:主 Agent 可 spawn 子 Agent 执行后台任务,支持 spawn / wait / stop 全生命周期~\n- **Cron & Dreaming(时之沙)**:定时任务调度 + 记忆 dreaming(LLM 驱动的周期性记忆整理与巩固)~\n- **MCP Support(外道魔术)**:Model Context Protocol 客户端集成,对接外部 MCP 工具服务器~\n- **Gateway & WebUI(世界树控制台)**:FastAPI REST API + Vue 3 SPA 运维面板 + SSE 实时事件推送;密码/OTP 登录、配置可视化管理、CRON/Session/文件/知识库/插件/Skills/用量管理~\n- **Ops-friendly(无忧除虫)**:可观测、可诊断、好发布,就算遇到了 Bug 也能轻松捉虫🐞!\n\n## 📈 成长进度(项目状态)\n\n目前小吉祥草王已完成 **Phase 4 全闭环 + WebUI 主体 + Desktop 桌宠 + OneBot Channel**:Telegram / Milky QQ / OneBot 三 Channel、Multi-Provider、内置命令/工具/插件体系、Subagent 编排、Multimodal、Scheduler 与 Memory Dreaming、知识库与生图插件、Gateway REST API、WebUI 运维面板(Vue 3)、Desktop Live2D 桌宠、SSE 实时事件、登录及权限体系均已可用。\n\n### 🌟 已点亮的命座 ✅\n\n- [x] 净土的基石与质量把控(Phase 0)\n- [x] 核心生命循环:应用容器、分层配置、事件脉络与观测日志(Phase 1)\n- [x] 专属花盆(Workspace):空间管理、文件沙盒、指令注入(Phase 2.1-2.2)\n- [x] 智慧运转(Agent Loop):消息拼装、模型调用、工具闭环、推理链传播(Phase 2.3-2.4)\n- [x] 记忆流转:SQLite 会话记忆、FTS 检索、向量检索、混合检索(Phase 2.5)\n- [x] 推理链健壮性:OpenAI/DeepSeek/Claude 多后端推理提取与上下文回传,Anthropic reasoning effort + 1M context 支持(Phase 2.8)\n- [x] 万象识图:Vision 原生传图、fallback 自动描述/工具模式、MediaCache/MediaResolver(Phase 2.9)\n- [x] 插件系统:Manifest 声明、Loader 发现加载、权限检查、生命周期隔离、命令与工具注册(Phase 3.1-3.6)\n- [x] 接引通道 Telegram:长轮询、消息标准化、HTML/Markdown 转换、群聊 @mention、媒体降级(Phase 4.1-4.5)\n- [x] 接引通道 Milky QQ:Lagrange.Milky WebSocket 事件流、消息段建模、群聊触发策略、合并转发解析(Phase 4.6)\n- [x] 接引通道 OneBot:v11/v12 双版本统一抽象、正向 WebSocket + WebHook、CQ 码与 array segment 归一化\n- [x] Multi-Provider:per-request model override、Provider 类型运行时注册、pre/post-agent 分阶段加载、OpenAI Responses API\n- [x] MCP 集成:Model Context Protocol 客户端、工具适配、连接管理\n- [x] 知识库插件:文档导入(MarkItDown 富文档转换)、分块、FTS/向量/混合检索、可选 embedding、SQLite Document Store\n- [x] 生图插件:OpenAI 兼容 Images API 后端、`/draw`·`/生图` 命令、24h 滚动配额管理、自动发送附件\n- [x] 群聊主动接入插件(Conversation Joiner):observed-only 群上下文观察 + engagement 状态机,决定何时自然加入话题(in-memory MVP)\n- [x] Desktop 桌宠:Tauri + Rust + Vue 3 + Live2D,边缘隐藏窗口、接近检测、气泡/输入框、本地 TTS 播放管线\n- [x] Subagent 编排:spawn 子 Agent、BackgroundTask 账本、policy hook、父子 session 管理(Phase 3.8 主体)\n- [x] 记忆与文档存储:Memory Store(consolidation/markdown/scope)+ Document Store 分离,按 chat/global scope 隔离的持久记忆\n- [x] 集中式 TaskManager:统一管理 asyncio 任务生命周期与优雅停止\n- [x] 定时调度:Cron 定时任务 + Memory Dreaming LLM 记忆巩固\n- [x] 会话级别推理设置:`/reasoning on|off|effort <level>|reset`\n- [x] 群聊上下文注入:observed-only 消息记录 + 触发时注入最近群上下文\n- [x] 内置命令 12 个:`/reset`、`/new`、`/status`、`/model`、`/reasoning`、`/help`、`/memory`、`/agents`、`/agent_stop`、`/agent_wait`、`/cron`、`/stop`\n- [x] 内置工具 16+:`workspace_read/write`、`send_local_attachment`、`memory_read/write`、`exec`、`web_fetch`、`plan`、`cron_*`、`agent_*`、`image_understand`,外加知识库检索、生图等插件工具\n- [x] Gateway REST API:`/api/health`、`/api/status`、`/api/send`、`/api/sessions`、`/api/cron`(全局管理)、`/api/config`(读写/校验/备份)、`/api/files`(workspace 文件管理)、`/api/kb`(知识库导入与检索)、`/api/plugins`、`/api/skills`、`/api/tokens`(用量)、`/api/messages`、`/api/auth`(登录/登出/session)、`/api/events/stream`(SSE)\n- [x] WebUI 运维面板:Vue 3 + Vite + shadcn-vue + Reka UI,首页状态总览、配置页(YAML 编辑/校验/保存/备份)、CRON 管理、Session 分组浏览、文件管理、知识库导入、插件管理、Skills、用量统计、系统日志、关于页\n- [x] WebUI 登录体系:管理员密码(Argon2id)+ Session Cookie + 登录限速;Bearer Token 兼容脚本/API 调用\n- [x] SSE 实时事件:`status.updated`、`usage.recorded`、`cron.*`、`session.updated`、`config.saved`、`file.updated`\n- [x] Usage Ledger:SQLite 持久化 token 统计(input/output/cached/reasoning),支持按 provider/model/session/source_tag 聚合\n- [x] Cron Session 模式:`main`(注入主 session)、`isolated`(独立 session)、`named`(持久命名 session,跨 run 累积上下文)\n- [x] 回复信号协议:`NO_REPLY` 静默抑制 + `HEARTBEAT_OK` 心跳空转保护\n- [x] SDK 独立成包:`nahida-bot-sdk` 作为 workspace 成员,插件作者可用稳定 API 开发与发布\n- [x] 设计文档 17 份:Agent Core、ChatAddress/SessionID、Cross-Session、Memory System/Scoping、Agent Compaction、Model Routing、Runtime Settings、WebUI、Plugin Web Panels、Cron/WebAPI、OneBot Channel、Conversation Joiner、Knowledge Base、Desktop App、Person Identity、MCP Dynamic Servers、Tool-Produced Image Media\n\n### 🚧 正在进行的光合作用\n\n- [ ] OneBot Channel 收尾:反向 WebSocket、WebHook 生产化、多账号支持与更多 action 覆盖。\n- [ ] Desktop 桌宠完善:通知/番茄钟/CRON 唤出策略打磨、跨平台打包与签名。\n- [ ] 知识库与记忆检索合并重构:Document Store 与 Memory 检索模型统一,引入 LLM 摘要压缩与语义召回(Phase 2.5b)。\n- [ ] 群聊主动接入插件持久化、管理界面与正式 `group_observe_mode`。\n- [ ] 工具产出图片的 media artifact 注册、自动注入与跨轮持久化。\n- [ ] WebUI 高级安全特性:Chat OTP 登录、部署模式(loopback/https/http_emergency)、CSRF 防护。\n- [ ] Workspace Sandbox 安全增强:符号链接、TOCTOU、文件大小、特殊文件对象等防护。\n\n### 📜 未来的建设计划\n\n- [ ] Gateway 与 Node 分布式部署(Phase 5):节点注册、心跳、远程执行协议、WebSocket RPC,远程节点跑重模型。\n- [ ] WebUI 插件页面 surface:插件通过 manifest 声明 WebUI 面板,sandbox iframe 加载。\n- [ ] 人物身份系统(Person Identity):跨 session 的用户/实体识别与画像沉淀。\n- [ ] MCP 动态服务器:运行时增删 MCP server,热加载工具。\n- [ ] 轻量记忆图谱层:实体/关系抽取、主题聚类、GraphRAG 风格全局搜索。\n\n想要了解更详细的建设蓝图?请翻阅 [ROADMAP.md](docs/ROADMAP.md) 吧~\n\n## 🏛️ 虚空系统架构概览\n\n```\n┌──────────────────────────────────────────────────────────────┐\n│ 世界树树冠 (Interface Layer) │\n│ CLI (typer+rich) + WebUI (Vue 3 SPA) + Desktop (Tauri桌宠) │\n├──────────────────────────────────────────────────────────────┤\n│ 世界树树枝 (Gateway-Node Layer) │\n│ FastAPI Gateway (REST + SSE) / Node 分布式网络(规划中) │\n├──────────────────────────────────────────────────────────────┤\n│ 挂件与神之眼 (Plugin Layer) │\n│ 插件加载/权限/命令与工具注册/Channel接入/MCP/知识库/生图/群聊 │\n├──────────────────────────────────────────────────────────────┤\n│ 智慧主脑 (Agent Layer) │\n│ Agent Loop / Subagent编排 / 记忆&文档检索 / 多模态 / Provider │\n├──────────────────────────────────────────────────────────────┤\n│ 专属温室 (Workspace Layer) │\n│ 工作空间管理 / 安全文件沙盒 / 指令文件注入 │\n├──────────────────────────────────────────────────────────────┤\n│ 净土核心 (Core Layer) │\n│ 应用生命周期 / 分层配置 / 事件总线 / 会话管理 / 结构化日志 │\n└──────────────────────────────────────────────────────────────┘\n```\n\n详细的系统图纸存放在教令院的 [ARCHITECTURE](docs/architecture/README.md) 里哦。\n\n## 🚀 启动终端(快速开始)\n\n### 环境要求\n\n- Python 3.12+\n- [astral-uv](https://docs.astral.sh/uv/)\n- [pnpm](https://pnpm.io/)(WebUI 前端 / Desktop 桌宠构建)\n- [Rust](https://www.rust-lang.org/) + [Tauri 2](https://v2.tauri.app/)(仅打包 Desktop 桌宠时需要)\n\n### 安装\n\n```bash\ngit clone https://github.com/AI1379/nahida-bot.git\ncd nahida-bot\n\n# Python 后端\nuv sync\n\n# 如需知识库导入 PDF、Word、PowerPoint、Excel 等文档\nuv sync --extra document-import\n\n# 如需 Telegram Channel,安装可选依赖\nuv sync --group telegram\n\n# WebUI 前端(可选,但推荐)\ncd webui\npnpm install\npnpm build # 输出到 webui/dist/,Gateway 启动时自动挂载\ncd ..\n\n# 类型检查与单元测试,可选\nuv run pyright\nuv run pytest\n\n# 编辑 config.yaml 配置 LLM Provider 和 Channel 后启动\nuv run nahida-bot start\n```\n\n#### Desktop 桌宠(可选)\n\n```bash\ncd desktop\npnpm install\npnpm setup:live2d-core # 下载 Live2D Core 运行时\npnpm dev:web # 仅前端预览(Vite,端口 1420)\npnpm build:web # 构建前端资源\n# 打包桌面端(需要 Rust 工具链):\npnpm build # = tauri build,产物在 desktop/dist\ncd ..\n```\n\n桌宠默认通过 WebSocket 连接本地 Gateway,平时贴在屏幕边缘;可在桌面端配置连接地址、Live2D 模型映射与 TTS 参数。详见 [Desktop 设计文档](docs/design/desktop-app.md)。\n\n#### 知识库文档导入\n\n基础安装可以直接导入 UTF-8 编码的 `.txt`、`.text`、`.md` 和\n`.markdown` 文件。需要完整的知识库文档导入能力时,安装可选依赖:\n\n```bash\nuv sync --extra document-import\n```\n\n安装后可通过 WebUI 导入 PDF、DOCX、PPTX、XLS/XLSX、HTML、CSV、\nJSON、XML、EPUB、Outlook MSG 和 Jupyter Notebook。富文档会先由\n[Microsoft MarkItDown](https://github.com/microsoft/markitdown) 转换为\nMarkdown,再进入现有的分块和检索流程。WebUI 支持一次选择或拖入最多\n20 个文件,单个文件上限为 25 MiB;批量导入会单独报告每个文件的结果,\n失败文件不会回滚已经成功导入的文件。\n\n旧版 `.doc` 不受支持,请先另存为 `.docx`。扫描版 PDF 或以图片为主的\n文档可能无法提取足够文本;当前集成不会启用 MarkItDown 第三方插件或\n云端 OCR。\n\n### CLI 命令\n\n```bash\nnahida-bot version # 显示版本信息\nnahida-bot start [--debug] # 启动应用(含 Gateway + WebUI)\nnahida-bot config # 显示当前配置\nnahida-bot config schema # 显示配置 schema(含插件 schema)\nnahida-bot config validate # 校验配置文件\nnahida-bot doctor # 运行诊断检查\nnahida-bot gateway # 仅启动 Gateway(WebAPI + WebUI)\n```\n\n### 最小配置示例\n\n```yaml\n# config.yaml\napp_name: \"Nahida Bot\"\nlog_level: \"INFO\"\nlog_file: \"./data/logs/nahida.log\"\nlog_file_level: \"DEBUG\"\n\nproviders:\n deepseek-main:\n type: deepseek\n api_key: \"${DEEPSEEK_LLM_API_KEY:}\"\n base_url: \"${DEEPSEEK_LLM_BASE_URL:https://api.deepseek.com}\"\n stream_responses: true\n models:\n - name: \"deepseek-v4-pro\"\n tags: [primary]\n - name: \"deepseek-v4-flash\"\n tags: [cheap, memory]\n\n siliconflow:\n type: \"openai-compatible\"\n api_key: \"${SILICONFLOW_LLM_API_KEY:}\"\n base_url: \"${SILICONFLOW_LLM_BASE_URL:https://api.siliconflow.cn/v1}\"\n stream_responses: true\n models:\n - name: \"Qwen/Qwen3.6-35B-A3B\"\n tags: [vision]\n capabilities:\n image_input: true\n max_image_count: 4\n\ndefault_provider: deepseek-main\n\ntelegram:\n bot_token: \"${TELEGRAM_BOT_TOKEN:}\"\n\n# Milky QQ Channel(可选)\n# milky:\n# base_url: \"http://127.0.0.1:3000\"\n# access_token: \"${MILKY_ACCESS_TOKEN}\"\n# group_trigger_mode: \"mention\"\n\n# OneBot Channel(可选,默认 v11 正向 WS)\n# onebot:\n# protocol_version: \"v11\"\n# ws_url: \"ws://127.0.0.1:3001\"\n# ws_access_token: \"${ONEBOT_ACCESS_TOKEN:}\"\n# webhook_enabled: false\n# webhook_host: \"127.0.0.1\"\n# webhook_port: 6186\n```\n\n配置支持 `${VAR}` 和 `${VAR:default}` 环境变量插值,可选 `.env` 文件加载。`config.yaml` 中包含 Agent Loop、Context Budget、Scheduler、Memory(FTS/Vector/Embedding)、Multimodal、Router、Model Tags、各 Channel 与各插件等完整配置项及详细注释。\n\n## 📚 文档\n\n[文档站点](https://nahida-bot.cobaltdev.top)\n\n| 文档 | 内容 |\n| ---- | ---- |\n| [ARCHITECTURE](docs/architecture/README.md) | 系统架构、分层设计、模块协作 |\n| [ROADMAP](docs/ROADMAP.md) | 路线图、阶段规划、验收清单 |\n| [DEVELOPMENT](docs/guide/development.md) | 代码风格、测试规范、类型检查 |\n| [CONFIGURATION](docs/guide/configuration.md) | 配置指南、环境变量、完整参考 |\n| [config.yaml](config.yaml) | 带注释的完整配置参考 |\n| [设计文档](docs/design/) | WebUI、Plugin Web Panels、Memory、OneBot Channel、Knowledge Base、Desktop App 等 17 份专题设计 |\n\n## 🧩 内置与示例插件\n\n| 插件 | 说明 |\n| ---- | ---- |\n| `builtin-commands` | 核心命令、workspace/memory 工具、exec、web_fetch、plan、cron、agent 编排 |\n| `mcp` | Model Context Protocol 客户端,接入外部 MCP 工具服务器 |\n| `knowledge_base` | 知识库文档导入与 FTS/向量/混合检索 |\n| `image_generation` | OpenAI 兼容 Images API 生图,含配额管理 |\n| `conversation_joiner` | 群聊上下文观察 + 主动接入决策 |\n| `onebot` | OneBot v11/v12 Channel(NapCat/Lagrange/LLOneBot) |\n| [plugins/echo](plugins/echo) · [plugins/github-notifier](plugins/github-notifier) · [plugins/rss-notifier](plugins/rss-notifier) | 可独立安装的示例插件(含独立 pyproject) |\n\n插件作者可基于 [`nahida-bot-sdk`](nahida-bot-sdk) 在独立仓库开发并通过 `plugin.yaml` 声明能力、权限与配置 schema。\n\n## 🤝 参考项目\n\n这里的很多智慧结晶,都离不开前辈们的探索:\n\n| 项目 | 参考内容 |\n|-----|-------|\n| [OpenClaw](https://github.com/openclaw/openclaw) | Agent + Workspace 模式、Gateway-Node 架构灵感、sentinel token 协议 |\n| [Codex](https://github.com/openai/codex) | Agent 核心的经典实现,权限管理与沙箱 |\n| [AstrBot](https://github.com/AstrBotDevs/AstrBot) / [MaiBot](https://github.com/Mai-with-u/MaiBot) | Python LLM bot 领域的老前辈 |\n| [nonebot2](https://github.com/nonebot/nonebot2) | 繁荣的插件生态、跨平台消息适配的经典设计 |\n| [Lagrange](https://github.com/LagrangeDev/LagrangeV2) / [NapCat](https://github.com/NapNeko/NapCatQQ) / [LuckyLilliaBot](https://github.com/LLOneBot/LuckyLilliaBot) | QQ 协议后端 |\n| [pixi-live2d-display](https://github.com/guansss/pixi-live2d-display) / [Tauri](https://v2.tauri.app/) | Desktop 桌宠的 Live2D 渲染与原生壳 |\n| [MarkItDown](https://github.com/microsoft/markitdown) | 知识库富文档到 Markdown 的转换 |\n\n## Star History\n\n<a href=\"https://www.star-history.com/?repos=AI1379%2Fnahida-bot&type=date&legend=top-left\">\n <picture>\n <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://api.star-history.com/chart?repos=AI1379/nahida-bot&type=date&theme=dark&legend=top-left\" />\n <source media=\"(prefers-color-scheme: light)\" srcset=\"https://api.star-history.com/chart?repos=AI1379/nahida-bot&type=date&legend=top-left\" />\n <img alt=\"Star History Chart\" src=\"https://api.star-history.com/chart?repos=AI1379/nahida-bot&type=date&legend=top-left\" />\n </picture>\n</a>\n\n## License\n\n**AGPL-v3.0 License.**\n"}}}} |