开源免费的WPS AI 软件 察元AI文档助手:# 链路 001:Ribbon 控制项到内置助手 ID
总体链路图下图在全系列各篇保持一致仅通过高亮样式标示本篇所覆盖的环节箭头表示主成功路径点线为异常或可选路径。阅读任意一篇时都应能回到本图定位避免在单文件里「钻太深」而失去上下游语境。plainstructuredmultimodal1 入口: Ribbon/对话框 → assistantId2 startAssistantTask 占位任务3 launchInfo 与 resolveDocumentInput4 resolveModel 与模型清单5 提示词拼装与 launchGuard6 分流 plain / structured / multimodal7a chatCompletion 文本链路 plain7b chatCompletion 结构化批次8a applyDocumentAction8b executionPlan → applyDocumentProcessingPlan7c generateMultimodalAsset9 评测持久化与任务完成态异常路径 normalizeError → 安全弹窗本篇在总体链路中的位置对应图中节点 N1把宿主控件语义收敛为 assistantId尚未触及模型与网络。 高亮节点N1。若本篇同时引用 chatApi 与任务运行器通常意味着该逻辑处于「编排层与网络层交界」修改时要同时考虑任务取消与 UI 快照。深度说明工程视角从工程维护角度看本篇讨论的对象应当被视为「可替换实现」只要对外的任务状态、HTTP 契约与文档写回语义保持不变内部可以重构函数拆分或调整日志字段。阅读时建议始终抓住三个锚点一是数据从哪来PluginStorage、localStorage、COM 选区还是全文二是数据何时离开本机进入 fetch 之前是否已完成脱敏与快照三是失败时用户可见的文本由谁归一chatApi 与助手错误弹窗两条路径。就「链路 001Ribbon 控制项到内置助手 ID」而言源码位置可概括为入口位于 assistantTaskRunner.js 的 getRibbonAssistantIdByControlId 与 ribbon.js 各 OnAction 分支。这与摘要中的判断一致功能区按钮并不直接携带「模型」语义而是映射为 assistantTaskRunner 中的助手 id 字符串。理解该映射是追踪后续 resolveModel、提示词与 chatCompletion 调用的起点。关键词「Ribbon、OnAction、assistantId」提示你在仓库内做全文检索时应优先锁定这些符号而不是仅依赖界面文案。与网络请求相关的修改务必在本地用开发者工具或代理核对请求体中的 model 字段是否与设置页保存的 modelId 一致Authorization 是否只取 apiKey 列表的第一段部分网关对多密钥格式敏感stream 为 true 时宿主是否稳定消费 SSE。若你引入新的 provider应对照 getChatApiConfigByProvider 的 URL 拼接分支补充单元测试或手测用例避免「路径已含 v1 却又重复拼接」类错误。与文档写回相关的修改应优先在无界面的纯函数层复现例如仅调用 applyDocumentAction 或 applyDocumentProcessingPlan 的入参快照观察 Range 坐标是否在 CRLF 归一化前后发生漂移。WPS 与 Word 在选区、批注锚点上的差异会放大这类问题因此本篇若在讲坐标或分段请同时阅读 documentPositionUtils 与 chunk 相关教程篇目。阅读顺序上本篇之后建议继续看映射得到 assistantId 后Ribbon 侧调用 executeAssistantFromRibbon见 002。若在总体图中定位对应图中节点 N1把宿主控件语义收敛为 assistantId尚未触及模型与网络。 遇到与教程系列术语不一致时以源码标识符为准教程侧重导航与概念本系列侧重调用次序与失败面。最后说明写作立场本系列不对任何云厂商或模型服务做优劣评价也不暗示「必须开通」某类账号所述配置项仅反映当前仓库为打通 OpenAI 兼容协议而需要的最小字段集合。若组织策略禁止外联应在网关或 hosts 层拦截而不是在加载项内写死假地址。与教程系列文档的对照下列文档来自docs/chayuan-tutorial-series侧重「如何阅读仓库」与界面侧概念与本链路系列互补不重复推销功能仅帮助建立目录与模块边界。chayuan-tutorial-series/01-chayuan-gailan-yu-dingwei.md与本篇链路相邻的工程说明可对照变量命名与文件职责。chayuan-tutorial-series/12-yuanma-fenceng-yu-AI-bianma-zai-ben-xiangmu.md与本篇链路相邻的工程说明可对照变量命名与文件职责。摘要功能区按钮并不直接携带「模型」语义而是映射为 assistantTaskRunner 中的助手 id 字符串。理解该映射是追踪后续 resolveModel、提示词与 chatCompletion 调用的起点。关键词Ribbon;OnAction;assistantId链路位置源码索引入口位于 assistantTaskRunner.js 的 getRibbonAssistantIdByControlId 与 ribbon.js 各 OnAction 分支。正文1. 控制项 id 到助手 id内置按钮如 btnSpellGrammar、btnDocumentDeclassifyCheck 等与固定 id 对应翻译按钮使用 btnTranslate_ 前缀自定义助手使用 btnCustomAssistant_ 前缀剥离。维护时建议把本节涉及的符号在 IDE 里「查找引用」确认是否还有对话框专用服务、拼写检查服务或评测脚本以拷贝粘贴方式重复了相似逻辑。若发现重复优先抽到 chatApi 之上的薄封装而不是在业务层再次拼接 URL 或 Authorization以降低安全审查时的遗漏面。// src/utils/assistantTaskRunner.js 第1459-1480行exportfunctiongetRibbonAssistantIdByControlId(controlId){constmap{btnSpellGrammar:spell-check,btnGenerateSummary:summary,btnRewrite:analysis.rewrite,btnExpand:analysis.expand,btnAbbreviate:analysis.abbreviate,btnParagraphNumberingCheck:analysis.paragraph-numbering-check,btnCommentExplain:analysis.comment-explain,btnHyperlinkExplain:analysis.hyperlink-explain,btnCorrectSpellGrammar:analysis.correct-spell,btnExtractKeywords:analysis.extract-keywords,btnAiTraceCheck:analysis.ai-trace-check,btnDocumentDeclassifyCheck:analysis.security-check,btnTextToImage:text-to-image,btnTextToAudio:text-to-audio,btnTextToVideo:text-to-video}if(map[controlId])returnmap[controlId]if(controlIdcontrolId.startsWith(btnTranslate_))returntranslateif(controlIdcontrolId.startsWith(btnCustomAssistant_))returncontrolId.replace(btnCustomAssistant_,)returnnull上下游衔接映射得到 assistantId 后Ribbon 侧调用 executeAssistantFromRibbon见 002。