feat(ai): 重构聊天助手,完善并行分析、连续上下文、模型配置与桌面体验 - #144
Open
xiaoshengbao wants to merge 5 commits into
Open
xiaoshengbao wants to merge 5 commits into
xiaoshengbao wants to merge 5 commits into
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
改动目标与交付范围
本 PR 将聊天 AI 助手迁移到 DeepAgents 执行图,并配套调整任务规划、连续对话、长上下文、资料来源、模型配置、流式界面和本地检索。用户可以围绕聊天资料持续追问,查看答案依据与实际执行进度;较长的分析在停止、版本修订或上下文整理后,可以使用已保存的原文、发现和检查点继续。
这是一批累积更新,包含执行引擎迁移及后续修复。以下说明以
39fec6a的实际生产调用链为准;仓库保留的早期验收文档、旧执行器和过渡实现另行标明。差异规模
相对原仓库
main的共同祖先:5 个提交、281 个文件,新增 30,529 行、删除 3,379 行。按文件用途分组如下,每个文件只计入一组:1. 执行引擎:接入官方 DeepAgents 图
AgentService的生产继承关系调整为DeepAgentRuntime + DeepProjection + AgentTimeline。服务层负责账号、对话、任务生命周期与可见状态;模型循环、工具调用和子图使用官方create_deep_agent。deepagents==0.7.13,通过uv.lock锁定依赖;DeepChatModel将已有供应商客户端接入执行图,统一模型调度、计量和异常处理。agent_continuous.py、agent_events.py、agent_report.py、旧子任务执行器及部分校验实现仍存在于这批差异中,用于历史实现保留、共享能力或回归;不能据其存在认定新任务仍运行旧主循环。主要入口:
ai/agent_service.py、ai/deep_runtime.py、ai/deep_model.py、ai/deep_projection.py。本说明中ai/指src/wechat_decrypt_tool/ai/。2. 对话、查询范围与消息读取
scope_handle由服务端绑定账号、运行和输入版本。跨账号、跨运行、过期句柄,以及越过指定聊天、日期或发送者范围的读取会被拒绝。主要入口:
deep_tools.py、agent_reading.py、messages.py、recent_bounds.py、agent_workspace.py。3. 主模型先取证、再规划并行工作
新任务使用
subtask_plan_version=2:plan_parallel_work同时要求填写主线工作、分支范围、具体任务说明、预期交付和依赖;主线不能只有“等待”或“汇总”。task入口启动,立即返回任务句柄;主模型继续分析并用record_main_analysis保存有来源的主线成果,再按需要等待结果。read_results分页读取事实,使用finish_parallel_work确认结果已读、关系已整合及失败缺口;跨分支最终判断仍由主模型承担。calculate_values提供十进制计算,金额等计算建立在已确认的事件和方向之上,不让子分支各自猜测跨分支总额。主要入口:
deep_planning.py、deep_dispatch.py、deep_partition.py、deep_subtasks.py、deep_calculation.py。4. 连续上下文与可恢复压缩
当前策略由
SawtoothSummarization执行,持久化分段整理复用DurableSummarization:context:seed,不将数据库中最新一行检查点直接当成完整历史。deep_context.py和较早的上下文修复文档保留了过渡机制;当前行为以deep_sawtooth.py、deep_conversation.py及 连续上下文说明 为准。归档可还原原文,不代表摘要语义必然无遗漏。5. 模型选择、思考参数和供应商适配
selected_model,按轮保存配置快照;切换模型清除不适用的显式思考参数,恢复默认会删除覆盖值。运行中补充和停止后继续使用原快照,新轮采用新选择。reasoning=true或能力未知时显示说明,不生成通用档位。reasoning_content透传;内部思考字段不作为回答正文显示。reasoning_effortoutput_config.effort或预算形式的thinkingthinking.typeenable_thinking/thinking_budgetreasoningextra_body.google.thinking_config参数映射以已确认能力和校验结果为前提。模型、辅助摘要、媒体及重试请求统一调度和记录用量;上游未提供用量时保留未知,不据保守字节估算补造账单。
主要入口:
model_selection.py、model_reasoning.py、model_catalog.py、providers.py、reasoning_client.py、model_scheduler.py。6. 来源引用、人物身份与媒体资料
主要入口:
agent_references.py、media.py、AgentAnswer.vue、AgentSourceInspector.vue、AgentImageViewer.vue、agentMarkdown.js。7. 前端对话、执行过程与断线恢复
@assistant-ui/vue适配切换为按需引入的 AI Elements Vue 组件和vue-stick-to-bottom,按后端消息 ID 保持节点生命周期;保留上游固定提交及 Apache-2.0 许可文件。主要入口:
ChatAgentPanel.vue、AssistantThread.vue、AgentRun.vue、AgentSubtasks.vue、AgentContextCompaction.vue、useAiApi.js、agentTimeline.js、routers/ai_agent.py。8. 本地检索与实时消息读取
source/msg_source中的原始 @ 身份;旧库缺少该字段时兼容读取。相关消息和联系人 SQLite 读取改为mode=ro。主要入口:
local_search/progressive.py、local_search/index.py、local_search/service.py、chat_realtime_reader.py、chat_export_service.py、chat_helpers.py。9. 桌面启动、构建及外围修复
loadURL挂起也能被中断并进入明确失败处理;同源首次使用页跳转继续保留。@reference;更新依赖及锁文件。WDA_REQUIRE_NSIS_TEST=1。主要入口:
desktop/src/main.cjs、desktop/src/renderer-startup.cjs、desktop/scripts/ai-packaging.cjs、frontend/nuxt.config.ts、.github/workflows/。10. API、持久化与旧版本兼容
GET /api/ai/settingsselected_model,模型目录在后台刷新PUT /api/ai/selected-modelGET /api/ai/profiles/{id}/model-capabilitiesthinking_mode、thinking_budget,保留reasoning_effort兼容POST /api/ai/agent/runs/{id}/restartcontinuelegacy_restart_required,明确指向重新运行;不混用旧检查点GET .../runs/{id}/subtasks/subtasks/{task_id}GET .../runs/{id}/context-compactions/{job_id}GET .../threadsunassigned过滤,隐藏内部子任务对话agent_global,由服务端解析全账号聊天范围context_budgetwindow_percent、trigger_capacity、retain_capacity、context_revision、compaction,保留旧字段engine=deepagents、engine_version=3、checkpoint_schema=2。检查点存放在独立的deepagents_checkpoints.sqlite3,命名空间包含账号、AI 对话、运行和输入版本。compaction_policy时保留旧值,旧上下文策略字段保留兼容,但不继续作为新策略的独立触发器。11. 验证结果与覆盖边界
39fec6a提交前重新执行ed8a35d..39fec6a中改动的 18 个后端测试文件frontend/tests/*.test.mjs,使用 Node 24git diff --checkmain;不代表运行时集成已验证上述后端 343 项是本次重新执行的相关集合,不是整个仓库全部后端测试数。首次使用本机 Node 18 遇到测试通配符及模块兼容问题,之后用 Node 24 完成前端验证。后端输出两条 LangChain v3 流协议实验性警告。
CI 首轮反馈与修复(
016efd4)首轮 macOS 检查 在后端回归阶段得到 714 通过、4 失败,后续前端及冻结构建因此跳过。四项均已在 Windows 本地复现,修复仅涉及测试与 pytest 配置:
include_images关键字参数pytest入口时,仓库根目录不在模块搜索路径,无法导入toolspyproject.toml配置pythonpath = [".", "src"],统一直接 pytest 与模块入口thinkingthinking.type=enabled且 high 保留,确保辅助请求不会关闭用户的显式思考配置修复前四项全部失败,修复后四项全部通过;随后使用直接
pytest入口运行媒体、数量范围、MiMo 回归、思考参数、模型媒体选择和锯齿压缩等 7 个文件,107 项通过(58.46 秒)。没有修改生产执行逻辑或放宽压缩保护。新提交另经 Gitleaks 检查,0 告警。新一轮跨平台 CI 已触发,完整结果以检查页为准。Windows CI 超时修复(
5f71a3a)上一轮跨平台检查 的 macOS 全部通过;Windows 后端为 717 项通过、1 项失败。唯一失败是
test_multiple_plans_share_parent_slots_and_queue_is_bounded:真实 SQLite 读写在 Windows runner 上较慢,触发整段并发执行的 45 秒期限。TimeoutError;该夹具仅用于诊断,未提交。ok: true,覆盖 DeepAgents 执行图、SQLite 向量扩展、ONNX Runtime 与文档/图片媒体读取。首次启动因本机 C 盘无剩余空间导致解压失败,改用 D 盘临时目录后通过;未为此修改仓库配置。新一轮完整跨平台检查 已在提交
5f71a3a上全部通过,PR 的 5 项检查均为成功。ok: trueok: true两平台后端仅有相同的 2 条 LangChain 实验性接口警告,无失败。其余 3 项 SNS 媒体跨平台检查和 Windows 安装器 Unicode 路径检查也全部通过。Windows 该测试的实际耗时超过旧 45 秒限制,进一步支持本次超时诊断。
重点回归对应关系
test_ai_deepagents.py、test_ai_deep_contracts.py、test_ai_deep_reliability.pytest_ai_planned_work.py、test_ai_parallel_analysis.pytest_ai_answer_checkpoint.py、test_ai_followup_scope.py、test_ai_sawtooth.pytest_ai_context_recovery.py、test_ai_deep_context.py、test_ai_compaction_records.pytest_ai_model_selection.py、test_ai_reasoning_selection.py、test_ai_selected_model_media.pytest_ai_providers.py、test_model_catalog.py、test_ai_deep_mimo_regressions.pychat-agent.test.js、agent-timeline.test.js、agent-references.test.js、agent-tool-errors.test.jsagent-model-config.test.js、agent-model-selection.test.js、agent-subtasks.test.js、agent-compaction.test.js历史证据与尚未覆盖的部分
ai-planned-work-cost-2026-09-14.json的固定单页模拟对比显示,分支模型调用由 3 次降至 1 次、输入文本估算由 23,355 降至 3,346 Token。该对比只衡量分支固定开销,未包含主线规划整合,也不是供应商账单或整任务性能保证。ai-context-recovery-live-verification-2026-09-14.json记录了恢复修复阶段一次真实任务完成的状态与用量;后续连续上下文策略还有调整,不能把该历史样本当作新策略所有场景的真实验收。12. 密钥与敏感配置检查
针对本次推送执行了独立检查,未向外部服务上传待检查源码或凭据:
origin/main..main的 4 个新增提交,包含本 PR 的 3 个提交及独立动画提交,并展开合并提交差异;历史扫描 0 告警。覆盖已提交后又在后续版本删除的新增内容。main的 1,296 个已跟踪文件导出完整快照扫描,得到 41 处告警;逐项核对来自 13 个与原仓库相同 blob 的文件,属于固定测试/模拟密钥和样例校验哈希,不是此次新增的真实服务凭据。api_key、token、password、Authorization 和私钥相关字段,核对命中的模拟测试值与普通配置值;未发现真实 API Key、访问 Token 或私钥。.env、私钥文件、私钥证书包、SQLite 数据库或真实wechat_db_config.json。本地tmp/、运行备份和数据目录未推送。因此本次未删除功能代码或重写提交历史。代码中的密钥配置字段、读取逻辑和固定测试夹具继续保留;扫描未检出真实凭据不等于对任意未知格式提供绝对保证。扫描报告只留在本地,未在 PR 中回显匹配值。
建议审阅顺序
agent_service.py→deep_runtime.py→deep_tools.py。deep_planning.py→deep_dispatch.py/deep_partition.py→ 相关确定性回归。deep_conversation.py→deep_sawtooth.py→deep_context.py/deep_backend.py/deep_checkpoints.py。media.py→agent_references.py。routers/ai_agent.py/routers/ai.py→ 时间线合并 → 对话、模型、子任务和压缩组件。local_search/、实时读取、桌面启动、Tailwind 和工作流;最后核对测试、验收工具及对应版本的文档。当前行为的补充说明:任务规划、连续上下文、模型与思考参数。早期 DeepAgents 迁移记录 和 上下文故障修复记录 用于解释演进背景,具体压缩及委派策略以上述最终实现为准。