Files
OpenCode 68a9071cf1 feat: reconcile local master with origin (exa/hot-platform hunters, leaks ledger, latest results)
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.
2026-08-07 12:53:47 +08:00

1 line
716 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"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> ![Avatar](assets/NahidaAvatar1.jpg)\n>\n> 「这是**摩诃善法大吉祥智慧主**,智慧之神**布耶尔**,须弥的**草神大人**,你敢和她对视五秒吗?」\n\n欢迎连接到属于你的私有「虚空终端」!**Nahida Bot** 不仅仅是一个冷冰冰的机器,而是一个 **Agent 为灵魂**、以 **Workspace 为家**、能长出 **Live2D 桌宠形态**,还能通过 **插件随意换装** 的 Python 智能框架哦~ 🌿\n\n文档:[Docs](https://nahida-bot.cobaltdev.top)\n\n[![QQ 群](https://img.shields.io/badge/QQ_Group-529674493-green?logo=qq)](https://qm.qq.com/q/rXP8DKCyRi) [![Netlify Status](https://api.netlify.com/api/v1/badges/a9eafce9-b879-47be-8220-f4eb728ead1a/deploy-status)](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> ![Avatar](assets/NahidaAvatar1.jpg)\n>\n> 「这是**摩诃善法大吉祥智慧主**,智慧之神**布耶尔**,须弥的**草神大人**,你敢和她对视五秒吗?」\n\n欢迎连接到属于你的私有「虚空终端」!**Nahida Bot** 不仅仅是一个冷冰冰的机器,而是一个 **Agent 为灵魂**、以 **Workspace 为家**、能长出 **Live2D 桌宠形态**,还能通过 **插件随意换装** 的 Python 智能框架哦~ 🌿\n\n文档:[Docs](https://nahida-bot.cobaltdev.top)\n\n[![QQ 群](https://img.shields.io/badge/QQ_Group-529674493-green?logo=qq)](https://qm.qq.com/q/rXP8DKCyRi) [![Netlify Status](https://api.netlify.com/api/v1/badges/a9eafce9-b879-47be-8220-f4eb728ead1a/deploy-status)](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> ![Avatar](assets/NahidaAvatar1.jpg)\n>\n> 「这是**摩诃善法大吉祥智慧主**,智慧之神**布耶尔**,须弥的**草神大人**,你敢和她对视五秒吗?」\n\n欢迎连接到属于你的私有「虚空终端」!**Nahida Bot** 不仅仅是一个冷冰冰的机器,而是一个 **Agent 为灵魂**、以 **Workspace 为家**、能长出 **Live2D 桌宠形态**,还能通过 **插件随意换装** 的 Python 智能框架哦~ 🌿\n\n文档:[Docs](https://nahida-bot.cobaltdev.top)\n\n[![QQ 群](https://img.shields.io/badge/QQ_Group-529674493-green?logo=qq)](https://qm.qq.com/q/rXP8DKCyRi) [![Netlify Status](https://api.netlify.com/api/v1/badges/a9eafce9-b879-47be-8220-f4eb728ead1a/deploy-status)](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> ![Avatar](assets/NahidaAvatar1.jpg)\n>\n> 「这是**摩诃善法大吉祥智慧主**,智慧之神**布耶尔**,须弥的**草神大人**,你敢和她对视五秒吗?」\n\n欢迎连接到属于你的私有「虚空终端」!**Nahida Bot** 不仅仅是一个冷冰冰的机器,而是一个 **Agent 为灵魂**、以 **Workspace 为家**、能长出 **Live2D 桌宠形态**,还能通过 **插件随意换装** 的 Python 智能框架哦~ 🌿\n\n文档:[Docs](https://nahida-bot.cobaltdev.top)\n\n[![QQ 群](https://img.shields.io/badge/QQ_Group-529674493-green?logo=qq)](https://qm.qq.com/q/rXP8DKCyRi) [![Netlify Status](https://api.netlify.com/api/v1/badges/a9eafce9-b879-47be-8220-f4eb728ead1a/deploy-status)](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> ![Avatar](assets/NahidaAvatar1.jpg)\n>\n> 「这是**摩诃善法大吉祥智慧主**,智慧之神**布耶尔**,须弥的**草神大人**,你敢和她对视五秒吗?」\n\n欢迎连接到属于你的私有「虚空终端」!**Nahida Bot** 不仅仅是一个冷冰冰的机器,而是一个 **Agent 为灵魂**、以 **Workspace 为家**,还能通过 **插件随意换装** 的 Python 智能框架哦~ 🌿\n\n文档:[Docs](https://nahida-bot.cobaltdev.top)\n\n[![QQ 群](https://img.shields.io/badge/QQ_Group-529674493-green?logo=qq)](https://qm.qq.com/q/rXP8DKCyRi) [![Netlify Status](https://api.netlify.com/api/v1/badges/a9eafce9-b879-47be-8220-f4eb728ead1a/deploy-status)](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> ![Avatar](assets/NahidaAvatar1.jpg)\n>\n> 「这是**摩诃善法大吉祥智慧主**,智慧之神**布耶尔**,须弥的**草神大人**,你敢和她对视五秒吗?」\n\n欢迎连接到属于你的私有「虚空终端」!**Nahida Bot** 不仅仅是一个冷冰冰的机器,而是一个 **Agent 为灵魂**、以 **Workspace 为家**,还能通过 **插件随意换装** 的 Python 智能框架哦~ 🌿\n\n文档:[Docs](https://nahida-bot.cobaltdev.top)\n\n[![QQ 群](https://img.shields.io/badge/QQ_Group-529674493-green?logo=qq)](https://qm.qq.com/q/rXP8DKCyRi) [![Netlify Status](https://api.netlify.com/api/v1/badges/a9eafce9-b879-47be-8220-f4eb728ead1a/deploy-status)](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> ![Avatar](assets/NahidaAvatar1.jpg)\n>\n> 「这是**摩诃善法大吉祥智慧主**,智慧之神**布耶尔**,须弥的**草神大人**,你敢和她对视五秒吗?」\n\n欢迎连接到属于你的私有「虚空终端」!**Nahida Bot** 不仅仅是一个冷冰冰的机器,而是一个 **Agent 为灵魂**、以 **Workspace 为家**,还能通过 **插件随意换装** 的 Python 智能框架哦~ 🌿\n\n文档:[Docs](https://nahida-bot.cobaltdev.top)\n\n[![QQ 群](https://img.shields.io/badge/QQ_Group-529674493-green?logo=qq)](https://qm.qq.com/q/rXP8DKCyRi) [![Netlify Status](https://api.netlify.com/api/v1/badges/a9eafce9-b879-47be-8220-f4eb728ead1a/deploy-status)](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> ![Avatar](assets/NahidaAvatar1.jpg)\n>\n> 「这是**摩诃善法大吉祥智慧主**,智慧之神**布耶尔**,须弥的**草神大人**,你敢和她对视五秒吗?」\n\n欢迎连接到属于你的私有「虚空终端」!**Nahida Bot** 不仅仅是一个冷冰冰的机器,而是一个 **Agent 为灵魂**、以 **Workspace 为家**,还能通过 **插件随意换装** 的 Python 智能框架哦~ 🌿\n\n文档:[Docs](https://nahida-bot.cobaltdev.top)\n\n[![QQ 群](https://img.shields.io/badge/QQ_Group-529674493-green?logo=qq)](https://qm.qq.com/q/rXP8DKCyRi) [![Netlify Status](https://api.netlify.com/api/v1/badges/a9eafce9-b879-47be-8220-f4eb728ead1a/deploy-status)](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> ![Avatar](assets/NahidaAvatar1.jpg)\n>\n> 「这是**摩诃善法大吉祥智慧主**,智慧之神**布耶尔**,须弥的**草神大人**,你敢和她对视五秒吗?」\n\n欢迎连接到属于你的私有「虚空终端」!**Nahida Bot** 不仅仅是一个冷冰冰的机器,而是一个 **Agent 为灵魂**、以 **Workspace 为家**,还能通过 **插件随意换装** 的 Python 智能框架哦~ 🌿\n\n[![QQ 群](https://img.shields.io/badge/QQ_Group-529674493-green?logo=qq)](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> ![Avatar](assets/NahidaAvatar1.jpg)\n>\n> 「这是**摩诃善法大吉祥智慧主**,智慧之神**布耶尔**,须弥的**草神大人**,你敢和她对视五秒吗?」\n\n欢迎连接到属于你的私有「虚空终端」!**Nahida Bot** 不仅仅是一个冷冰冰的机器,而是一个 **Agent 为灵魂**、以 **Workspace 为家**,还能通过 **插件随意换装** 的 Python 智能框架哦~ 🌿\n\n[![QQ 群](https://img.shields.io/badge/QQ_Group-529674493-green?logo=qq)](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> ![Avatar](assets/NahidaAvatar1.jpg)\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> ![Avatar](assets/NahidaAvatar1.jpg)\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> ![Avatar](assets/NahidaAvatar1.jpg)\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> ![Avatar](assets/NahidaAvatar1.jpg)\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> ![Avatar](assets/NahidaAvatar1.jpg)\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> ![Avatar](assets/NahidaAvatar1.jpg)\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> ![Avatar](assets/NahidaAvatar1.jpg)\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> ![Avatar](assets/NahidaAvatar1.jpg)\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> ![Avatar](assets/NahidaAvatar1.jpg)\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> ![Avatar](assets/NahidaAvatar1.jpg)\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> ![Avatar](assets/NahidaAvatar1.jpg)\n>\n> 「这是**摩诃善法大吉祥智慧主**,智慧之神**布耶尔**,须弥的**草神大人**,你敢和她对视五秒吗?」\n\n欢迎连接到属于你的私有「虚空终端」!**Nahida Bot** 不仅仅是一个冷冰冰的机器,而是一个 **Agent 为灵魂**、以 **Workspace 为家**、能长出 **Live2D 桌宠形态**,还能通过 **插件随意换装** 的 Python 智能框架哦~ 🌿\n\n文档:[Docs](https://nahida-bot.cobaltdev.top)\n\n[![QQ 群](https://img.shields.io/badge/QQ_Group-529674493-green?logo=qq)](https://qm.qq.com/q/rXP8DKCyRi) [![Netlify Status](https://api.netlify.com/api/v1/badges/a9eafce9-b879-47be-8220-f4eb728ead1a/deploy-status)](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"}}}}