本项目还在快速迭代,有可能会有break changes
这是一个基于 Vue 3 + Vite 构建的 WPS 文字加载项项目,核心目标是在 WPS 文档编辑场景中接入大模型能力,为用户提供写作、改写、文档问答、全文总结、排版建议、图片生成和历史会话管理等 AI 辅助能力。
项目通过 public/ribbon.xml 注册 WPS Ribbon 入口,并在 src/components/ribbon.js 中统一处理按钮回调、任务窗格、对话框和右键菜单逻辑。
插件在 WPS 顶部 Ribbon 中新增“文策 AI”标签页,提供以下功能入口:
- 帮我写:根据用户输入的写作需求、风格和长度生成正文内容,并支持插入到文档末尾。
- 帮我改:针对选中文本提供续写、扩写、重写、缩写、润色、更正式、党政风转换和 AI 纠错。
- 伴写:以任务窗格形式进行连续对话,可选择读取当前文档作为上下文。
- 文档问答:围绕当前文档进行问答,也可叠加外部知识库检索结果。
- 全文总结:读取当前文档全文,生成结构化总结并支持写回文档。
- AI 排版:提供通用排版、论文排版和公文排版建议,并支持应用基础排版规则。
- 文档生成 PPT:根据当前文档生成 PPT 页面结构、大纲和演讲备注。
- AI 生成图片:调用兼容 OpenAI 图片生成接口生成图片,并尝试插入文档。
- AI 总结生图:先基于文档总结生成图片提示词,再调用图片生成接口。
- 历史会话:查看本地保存的写作、问答、改写、排版和图片生成记录。
- 设置:配置大模型接口地址、API Key、模型名称,以及 Dify 或自定义 RAG 知识库。
插件在 WPS 文本右键菜单中新增“文策 AI”入口。当用户选中文本后,可以直接执行:
- 润色
- 重写
- 扩写
- 缩写
- 续写
- 更正式
- 党政风
右键菜单会检测当前是否存在选区,没有选中文本时相关按钮不可用。
项目封装了 OpenAI 兼容接口调用:
- 文本对话接口:
/v1/chat/completions - 图片生成接口:
/v1/images/generations - 支持普通调用和 SSE 流式输出
- 支持自定义 Base URL、API Key 和模型名称
- 设置页内置连接测试能力
因此可以接入 OpenAI、DeepSeek、通义千问、智谱、Moonshot,或企业内部兼容 OpenAI 协议的大模型服务。
文档问答支持叠加外部知识库检索结果,设置页默认提供 Dify 知识库配置,同时保留原有自定义 RAG 服务模式。
默认知识库类型为“Dify 知识库”,需要配置:
| 配置项 | 说明 |
|---|---|
| Dify API 地址 | 默认 https://api.dify.ai/v1;私有化部署时填写自己的 Dify API 根地址。 |
| Dify API Key | 用于调用 Dify Knowledge Base API 的 Key。 |
| 检索片段数 | 对应检索接口的 top_k,当前限制为 1-20,默认 5。 |
启用后,伴写知识库面板会先调用 Dify 官方知识库列表接口,让用户选择当前使用的知识库:
GET /datasets?page=1&limit=100&include_all=true
Authorization: Bearer <Dify API Key>
选择知识库后,检索会调用 Dify 官方知识库检索接口:
POST /datasets/{dataset_id}/retrieve
Authorization: Bearer <Dify API Key>
Content-Type: application/json
请求体核心字段:
{
"query": "用户问题",
"retrieval_model": {
"search_method": "semantic_search",
"reranking_enable": false,
"top_k": 5,
"score_threshold_enabled": false
}
}返回结果会读取 records[].segment.content,拼接为“知识库参考”上下文,再交给大模型生成最终回答。
注意:当前加载项是前端应用,Dify API Key 会保存在浏览器或 WPS WebView 的 localStorage 中。个人本地使用问题不大;如果用于团队或生产环境,建议增加后端代理,由服务端保存 Key 并转发检索请求。
如果选择“自定义 RAG 服务”,需要填写知识库服务地址。文档问答会请求:
POST /query
Content-Type: application/json
请求体:
{
"question": "用户问题",
"top_k": 5
}当前兼容以下返回格式:
{ "context": "..." }{ "results": [{ "content": "..." }, { "text": "..." }] }
src/components/js/wpsDoc.js 对 WPS JSAPI 做了统一封装,当前支持:
- 获取当前选区文本
- 获取当前文档全文
- 获取当前文档名称
- 替换当前选区
- 在选区后插入续写内容
- 在文档末尾追加内容
- 替换整篇文档文本
- 插入 AI 生成图片
- 应用通用、论文、公文基础排版规则
- 检测当前是否存在文本选区
普通浏览器环境只能预览 Vue 页面,完整文档读写能力必须在 WPS 宿主环境中验证。
- Vue 3
- Vue Router
- Vite
- Axios
- WPS JSAPI
- wpsjs Vite 插件
- OpenAI 兼容大模型接口
.
├── manifest.xml # WPS 加载项清单
├── public/
│ ├── ribbon.xml # WPS Ribbon 与右键菜单定义
│ └── images/ # Ribbon 图标资源
├── src/
│ ├── App.vue # 根组件,暴露 window.ribbon
│ ├── main.js # Vue 入口
│ ├── router/index.js # Hash 路由配置
│ └── components/
│ ├── ribbon.js # WPS Ribbon 回调核心逻辑
│ ├── ai/
│ │ ├── AiTaskPane.vue # AI 写作、伴写、文档问答任务窗格
│ │ ├── AiDialog.vue # 改写、总结、排版、图片等对话框
│ │ ├── AiSettings.vue # 大模型与知识库配置
│ │ └── HistoryPane.vue # 历史会话
│ └── js/
│ ├── ai.js # 大模型与图片生成 API 封装
│ ├── aiConfig.js # AI 配置管理
│ ├── aiHistory.js # 本地历史会话管理
│ ├── wpsDoc.js # WPS 文档操作封装
│ └── util.js # WPS 加载项 URL 与枚举工具
├── vite.config.js # Vite 与 WPS 清单复制配置
└── package.json
安装依赖:
npm install启动开发服务:
npm run dev默认开发端口为 3889,对应命令为:
vite --port 3889生产构建:
npm run build代码检查与格式化:
npm run lint
npm run format注意:npm run lint 当前带有 --fix 参数,会直接修改代码。
本项目是 WPS JS 加载项,不是普通浏览器插件,也不是直接双击 manifest.xml 安装。WPS 客户端会读取本机的 publish.xml,再根据其中配置的插件地址加载:
ribbon.xml:顶部 Ribbon 菜单和右键菜单定义。index.html:插件前端入口页面。
官方加载流程中,在线模式会请求“插件地址 + /ribbon.xml”和“插件地址 + /index.html”。因此开发调试时使用本地 Vite 服务地址,正式交付时应使用部署后的 HTTPS/HTTP 地址。
先在项目目录启动开发服务:
cd /Users/kratos/work/lzs/wps
npm install
npm run dev默认端口是 3889,对应插件地址为:
http://127.0.0.1:3889/
如果 WPS 和开发服务不在同一台电脑上,不能使用 127.0.0.1,需要改为开发机的局域网 IP,例如:
http://192.168.1.20:3889/
安装前建议先验证以下地址能正常访问:
curl http://127.0.0.1:3889/
curl http://127.0.0.1:3889/ribbon.xml如果第二个地址不能返回 XML,WPS 无法生成插件菜单。
本项目是 WPS 文字插件,type 应设置为 wps。开发调试时可使用下面的配置:
<?xml version="1.0" encoding="UTF-8"?>
<jsplugins>
<jspluginonline
name="HelloWps"
install="http://127.0.0.1:3889/"
url="http://127.0.0.1:3889/"
type="wps"
debug="true"/>
</jsplugins>字段说明:
| 字段 | 说明 |
|---|---|
name |
插件名称,需要保持唯一。当前 manifest.xml 中为 HelloWps,后续可统一改为“文策 AI”。 |
install |
插件安装地址,开发调试时和 url 保持一致即可。 |
url |
插件资源地址,WPS 会请求该地址下的 ribbon.xml 和 index.html。 |
type |
插件所属 WPS 组件:wps 表示文字,et 表示表格,wpp 表示演示。 |
debug |
开发调试建议设置为 true,正式环境可以去掉或置空。 |
如果同一台电脑已有其他 WPS JS 加载项,不要直接覆盖原有 publish.xml。应先备份,再把本插件的 <jspluginonline ... /> 合并到原有 <jsplugins> 节点内。
macOS 版 WPS 常用加载项目录为:
~/Library/Containers/com.kingsoft.wpsoffice.mac/Data/.kingsoft/wps/jsaddons/
在终端执行:
mkdir -p "$HOME/Library/Containers/com.kingsoft.wpsoffice.mac/Data/.kingsoft/wps/jsaddons"
cp "$HOME/Library/Containers/com.kingsoft.wpsoffice.mac/Data/.kingsoft/wps/jsaddons/publish.xml" \
"$HOME/Library/Containers/com.kingsoft.wpsoffice.mac/Data/.kingsoft/wps/jsaddons/publish.xml.bak.$(date +%Y%m%d%H%M%S)" 2>/dev/null || true
cat > "$HOME/Library/Containers/com.kingsoft.wpsoffice.mac/Data/.kingsoft/wps/jsaddons/publish.xml" <<'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<jsplugins>
<jspluginonline
name="HelloWps"
install="http://127.0.0.1:3889/"
url="http://127.0.0.1:3889/"
type="wps"
debug="true"/>
</jsplugins>
EOF然后彻底退出 WPS,再重新打开 WPS 文字。正常情况下,顶部 Ribbon 会出现本插件定义的“文策 AI”标签页。
如果你的 WPS 是国际版或企业定制版,目录可能不同。可优先检查这些候选目录:
ls -ld "$HOME/Library/Containers/com.kingsoft.wpsoffice.mac/Data/.kingsoft/wps/jsaddons"
ls -ld "$HOME/Library/Containers/com.kingsoft.wpsoffice.mac.global/Data/.kingsoft/wps/jsaddons"如果第一个目录不存在、第二个目录存在,则把上面命令中的 com.kingsoft.wpsoffice.mac 替换为 com.kingsoft.wpsoffice.mac.global。
Windows 版 WPS 的官方加载项目录为:
%APPDATA%\kingsoft\wps\jsaddons
通常展开后类似:
C:\Users\<用户名>\AppData\Roaming\kingsoft\wps\jsaddons
先启动开发服务:
Set-Location D:\path\to\wps
npm install
npm run dev另开一个 PowerShell 窗口,执行:
$dir = Join-Path $env:APPDATA "kingsoft\wps\jsaddons"
New-Item -ItemType Directory -Force -Path $dir | Out-Null
$publish = Join-Path $dir "publish.xml"
if (Test-Path $publish) {
Copy-Item $publish "$publish.bak.$(Get-Date -Format yyyyMMddHHmmss)"
}
@'
<?xml version="1.0" encoding="UTF-8"?>
<jsplugins>
<jspluginonline
name="HelloWps"
install="http://127.0.0.1:3889/"
url="http://127.0.0.1:3889/"
type="wps"
debug="true"/>
</jsplugins>
'@ | Set-Content -Path $publish -Encoding UTF8然后彻底退出 WPS,再重新打开 WPS 文字。
如果使用 CMD,可执行:
mkdir "%APPDATA%\kingsoft\wps\jsaddons"
copy "%APPDATA%\kingsoft\wps\jsaddons\publish.xml" "%APPDATA%\kingsoft\wps\jsaddons\publish.xml.bak" 2>nul
notepad "%APPDATA%\kingsoft\wps\jsaddons\publish.xml"在记事本中写入:
<?xml version="1.0" encoding="UTF-8"?>
<jsplugins>
<jspluginonline
name="HelloWps"
install="http://127.0.0.1:3889/"
url="http://127.0.0.1:3889/"
type="wps"
debug="true"/>
</jsplugins>保存后重启 WPS 文字。
如果 Windows 版 WPS 没有显示加载项,需确认当前 WPS 安装包支持 JS 加载项。部分企业版或定制版需要在 WPS 安装目录的 cfgs/oem.ini 中启用:
[Support]
JsApiPlugin=true
JsApiShowWebDebugger=true修改安装目录下配置文件通常需要管理员权限。个人版新版 WPS 一般不需要手动配置。
正式交付不建议让用户连接开发机的 127.0.0.1:3889。推荐流程:
npm install
npm run build然后把 dist/ 目录部署到一个可访问的 Web 服务,例如:
https://example.com/wps-addin/
确认这些地址可访问:
https://example.com/wps-addin/index.html
https://example.com/wps-addin/ribbon.xml
再把 publish.xml 改为:
<?xml version="1.0" encoding="UTF-8"?>
<jsplugins>
<jspluginonline
name="HelloWps"
install="https://example.com/wps-addin/"
url="https://example.com/wps-addin/"
type="wps"/>
</jsplugins>如果公司内网部署,应确保用户电脑可以访问该地址,且 WPS 客户端没有被代理、防火墙或证书策略拦截。
安装后按以下顺序排查:
- 重启 WPS 文字,而不是只关闭当前文档。
- 检查
publish.xml是否在正确目录。 - 检查
url是否能访问到index.html和ribbon.xml。 - 检查
type是否为wps。 - 检查
public/ribbon.xml中回调名称是否能在window.ribbon上找到。 - 在普通浏览器打开
http://127.0.0.1:3889/,确认页面资源没有 404。
常用检查命令:
curl http://127.0.0.1:3889/
curl http://127.0.0.1:3889/ribbon.xmlmacOS 查看配置:
cat "$HOME/Library/Containers/com.kingsoft.wpsoffice.mac/Data/.kingsoft/wps/jsaddons/publish.xml"Windows PowerShell 查看配置:
Get-Content "$env:APPDATA\kingsoft\wps\jsaddons\publish.xml"如果 publish.xml 里只有本插件,直接删除即可。
macOS:
rm "$HOME/Library/Containers/com.kingsoft.wpsoffice.mac/Data/.kingsoft/wps/jsaddons/publish.xml"Windows PowerShell:
Remove-Item "$env:APPDATA\kingsoft\wps\jsaddons\publish.xml"如果 publish.xml 中还有其他插件,不要删除整个文件,只删除本项目对应的:
<jspluginonline
name="HelloWps"
install="http://127.0.0.1:3889/"
url="http://127.0.0.1:3889/"
type="wps"
debug="true"/>然后重启 WPS。
- WPS 官方文档:WPS 加载项开发说明,说明在线模式会请求插件地址下的
ribbon.xml和index.html,并给出 Windows 路径%appdata%/kingsoft/wps/jsaddons。 - WPS 官方文档:WPS 加载项可用性,说明部分环境需要通过
oem.ini启用JsApiPlugin。 - 第三方安装示例:SallyBot WPS 插件安装文档,提供 macOS 和 Windows 的
publish.xml写入示例。
在 WPS 中打开插件后,进入 Ribbon 的“文策 AI”标签页,点击“设置”,填写:
- 接口地址 Base URL:例如
https://api.openai.com或企业内部模型网关地址。 - API Key:模型服务访问密钥。
- 模型名称:例如
gpt-4o、deepseek-chat、qwen-plus等。 - 知识库服务地址:可选。配置后文档问答会请求该服务的
POST /query接口。
知识库接口当前约定:
POST /query
Content-Type: application/json
{
"question": "用户问题",
"top_k": 5
}插件会兼容以下返回格式:
results: [{ content: string }]results: [{ text: string }]context: string
插件使用 Hash 路由,便于在 WPS 加载项环境中以相对路径运行:
#/:默认页#/dialog:原始示例对话框#/taskpane:原始示例任务窗格#/ai-pane?mode=write:帮我写任务窗格#/ai-pane?mode=companion:伴写任务窗格#/ai-pane?mode=qa:文档问答任务窗格#/ai-dialog?mode=rewrite:AI 改写、总结、排版、图片等功能对话框#/ai-settings:AI 设置页#/ai-history:历史会话页
WPS 回调入口由 src/App.vue 挂载后暴露:
window.ribbon = ribbonpublic/ribbon.xml 中的回调名称需要与 window.ribbon 上导出的方法一致,例如:
ribbon.OnAddinLoadribbon.OnActionribbon.GetImageribbon.OnGetEnabledribbon.OnGetVisibleribbon.OnGetLabel
构建时,vite.config.js 使用 wpsjs/vite_plugins 的 copyFile 将 manifest.xml 复制到产物目录。
- WPS JSAPI 依赖 WPS 宿主环境,浏览器中无法完整验证文档读取、写入、排版和任务窗格能力。
- 大模型配置存储在浏览器
localStorage中,当前适合本地或单机插件场景;企业级交付建议接入统一配置、加密存储或服务端托管。 - 图片插入依赖 WPS 宿主对远程 URL 或 base64 图片的支持;失败时插件会尝试把图片地址写入文档。
wpsjs和wps-jsapi-declare当前使用latest,如需稳定构建,建议锁定明确版本。
- 完善
manifest.xml的插件名称和描述,使其与“文策 AI”品牌一致。 - 增加模型配置加密或后端代理,避免 API Key 长期明文存储在本地。
- 为 WPS 文档读写能力增加宿主版本兼容性测试。
- 为知识库接口增加错误提示、召回来源展示和引用定位。
- 根据企业模板扩展论文、公文、报告等排版规则。