开源免费的WPS AI 软件 察元AI文档助手:链路 043:拼写检查 executeSpellCheckRequest 调用 chatCompletion
链路 043拼写检查 executeSpellCheckRequest 调用 chatCompletion总体链路图下图在全系列各篇保持一致仅通过高亮样式标示本篇所覆盖的环节箭头表示主成功路径点线为异常或可选路径。阅读任意一篇时都应能回到本图定位避免在单文件里「钻太深」而失去上下游语境。plainstructuredmultimodal1 入口: Ribbon/对话框 → assistantId2 startAssistantTask 占位任务3 launchInfo 与 resolveDocumentInput4 resolveModel 与模型清单5 提示词拼装与 launchGuard6 分流 plain / structured / multimodal7a chatCompletion 文本链路 plain7b chatCompletion 结构化批次8a applyDocumentAction8b executionPlan → applyDocumentProcessingPlan7c generateMultimodalAsset9 评测持久化与任务完成态异常路径 normalizeError → 安全弹窗本篇在总体链路中的位置对应图中 N8a/N8b 的旁路业务服务直连 chatApi与助手运行器并行存在。 高亮节点N8a、N8b。若本篇同时引用 chatApi 与任务运行器通常意味着该逻辑处于「编排层与网络层交界」修改时要同时考虑任务取消与 UI 快照。深度说明工程视角从工程维护角度看本篇讨论的对象应当被视为「可替换实现」只要对外的任务状态、HTTP 契约与文档写回语义保持不变内部可以重构函数拆分或调整日志字段。阅读时建议始终抓住三个锚点一是数据从哪来PluginStorage、localStorage、COM 选区还是全文二是数据何时离开本机进入 fetch 之前是否已完成脱敏与快照三是失败时用户可见的文本由谁归一chatApi 与助手错误弹窗两条路径。就「链路 043拼写检查 executeSpellCheckRequest 调用 chatCompletion」而言源码位置可概括为spellCheckService.js executeSpellCheckRequest。这与摘要中的判断一致拼写服务将模型请求对象 spread 进 chatCompletion并构造 ribbonModelId 为 providerId|modelId。空响应且曾设 stream:true 时会降级再请求一次不支持 response_format 时删除该字段重试。关键词「spell-check、fallback、response_format」提示你在仓库内做全文检索时应优先锁定这些符号而不是仅依赖界面文案。与网络请求相关的修改务必在本地用开发者工具或代理核对请求体中的 model 字段是否与设置页保存的 modelId 一致Authorization 是否只取 apiKey 列表的第一段部分网关对多密钥格式敏感stream 为 true 时宿主是否稳定消费 SSE。若你引入新的 provider应对照 getChatApiConfigByProvider 的 URL 拼接分支补充单元测试或手测用例避免「路径已含 v1 却又重复拼接」类错误。与文档写回相关的修改应优先在无界面的纯函数层复现例如仅调用 applyDocumentAction 或 applyDocumentProcessingPlan 的入参快照观察 Range 坐标是否在 CRLF 归一化前后发生漂移。WPS 与 Word 在选区、批注锚点上的差异会放大这类问题因此本篇若在讲坐标或分段请同时阅读 documentPositionUtils 与 chunk 相关教程篇目。阅读顺序上本篇之后建议继续看解析 raw 后进入坐标映射与批注写回其他函数不在此篇展开。若在总体图中定位对应图中 N8a/N8b 的旁路业务服务直连 chatApi与助手运行器并行存在。 遇到与教程系列术语不一致时以源码标识符为准教程侧重导航与概念本系列侧重调用次序与失败面。最后说明写作立场本系列不对任何云厂商或模型服务做优劣评价也不暗示「必须开通」某类账号所述配置项仅反映当前仓库为打通 OpenAI 兼容协议而需要的最小字段集合。若组织策略禁止外联应在网关或 hosts 层拦截而不是在加载项内写死假地址。与教程系列文档的对照下列文档来自docs/chayuan-tutorial-series侧重「如何阅读仓库」与界面侧概念与本链路系列互补不重复推销功能仅帮助建立目录与模块边界。chayuan-tutorial-series/15-pinxie-jiancha-fuwu-yu-duochuang-kongzhi.md与本篇链路相邻的工程说明可对照变量命名与文件职责。chayuan-tutorial-series/17-chatApi-cuowu-guiyihua-yu-wangguan.md与本篇链路相邻的工程说明可对照变量命名与文件职责。摘要拼写服务将模型请求对象 spread 进 chatCompletion并构造 ribbonModelId 为 providerId|modelId。空响应且曾设 stream:true 时会降级再请求一次不支持 response_format 时删除该字段重试。关键词spell-check;fallback;response_format链路位置源码索引spellCheckService.js executeSpellCheckRequest。正文1. 主请求与流式降级chatCompletion 包装与 fallbackRequest。维护时建议把本节涉及的符号在 IDE 里「查找引用」确认是否还有对话框专用服务、拼写检查服务或评测脚本以拷贝粘贴方式重复了相似逻辑。若发现重复优先抽到 chatApi 之上的薄封装而不是在业务层再次拼接 URL 或 Authorization以降低安全审查时的遗漏面。// src/utils/spellCheckService.js 第730-751行asyncfunctionexecuteSpellCheckRequest(request,runStatenull){throwIfCancelled(runState)try{constrawawaitchatCompletion({ribbonModelId:request.providerIdrequest.modelId?${request.providerId}|${request.modelId}:undefined,signal:runState?.abortController?.signal,...request})throwIfCancelled(runState)if(String(raw||).trim()){return{raw:String(raw),effectiveRequest:request,strategyTrace:[]}}if(request.streamtrue){constfallbackRequest{...request,stream:false}constfallbackRawawaitchatCompletion({ribbonModelId:fallbackRequest.providerIdfallbackRequest.modelId?${fallbackRequest.providerId}|${fallbackRequest.modelId}:undefined,signal:runState?.abortController?.signal,...fallbackRequest})throwIfCancelled(runState)return{raw:String(fallbackRaw||),effectiveRequest:fallbackRequest,strategyTrace:[drop_stream]}}2. response_format 不支持时重试delete fallbackRequest.response_format 后再 chatCompletion。维护时建议把本节涉及的符号在 IDE 里「查找引用」确认是否还有对话框专用服务、拼写检查服务或评测脚本以拷贝粘贴方式重复了相似逻辑。若发现重复优先抽到 chatApi 之上的薄封装而不是在业务层再次拼接 URL 或 Authorization以降低安全审查时的遗漏面。// src/utils/spellCheckService.js 第757-768行constmsgString(error?.message||error||)constunsupportedStructured/response_format|unsupported|Unrecognized request argument|unknown parameter/i.test(msg)if(unsupportedStructuredrequest.response_format){constfallbackRequest{...request}deletefallbackRequest.response_formatconstfallbackRawawaitchatCompletion({ribbonModelId:fallbackRequest.providerIdfallbackRequest.modelId?${fallbackRequest.providerId}|${fallbackRequest.modelId}:undefined,signal:runState?.abortController?.signal,...fallbackRequest})throwIfCancelled(runState)return{raw:String(fallbackRaw||),effectiveRequest:fallbackRequest,strategyTrace:[drop_response_format]}上下游衔接解析 raw 后进入坐标映射与批注写回其他函数不在此篇展开。