🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

灵犀服务商 xfyang728/dsh-router-wpslingxi

Cordis
xfyang72810 天前有提交已提供中文文档扫描:含敏感能力

接入 WPS 灵犀模型,在云端沙箱跑代码并回传产出文件

29.8/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/24 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add xfyang728/dsh-router-wpslingxi
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么
dsh 原生插件 · model
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 10 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件发起外部网络请求
查看扫描证据(共 23 处,展示前 22 条)
  • 发起网络请求
    src/api/cowork.ts:86
    resp = await fetch(COWORK_SESSIONS_URL, {
  • 发起网络请求
    src/api/cowork.ts:252
    const resp = await fetch(sandboxFilesUrl(sessionId, path), {
  • 发起网络请求
    src/api/cowork.ts:279
    const resp = await fetch(SANDBOX_PREVIEW_URL, {
  • 发起网络请求
    src/api/cowork.ts:297
    const resp = await fetch(url, { signal: AbortSignal.timeout(timeoutMs) })
  • 发起网络请求
    src/api/index.ts:91
    return fetch(`${AIGC}/identity`, {
  • 发起网络请求
    src/api/index.ts:115
    return fetch(PLANS_URL, {
  • 发起网络请求
    src/api/index.ts:124
    return fetch(url, {
  • 发起网络请求
    src/api/index.ts:151
    resp = await fetch(SESSIONS_URL, {
  • 发起网络请求
    src/api/index.ts:226
    return fetch(`${SESSIONS_URL}/${encodeURIComponent(sessionId)}/completions`, {
  • 发起网络请求
    src/api/index.ts:260
    return fetch(`${SESSIONS_URL}/${encodeURIComponent(sessionId)}/expert_completion`, {
  • 读取本地文件
    src/api/sandbox-artifacts.test.ts:96
    assert.equal(readFileSync(join(dest, 'a.py'), 'utf8'), 'print')
  • 读取本地文件
    src/api/sandbox-artifacts.test.ts:97
    assert.equal(readFileSync(join(dest, 'b.txt'), 'utf8'), 'abc')
  • 读取本地文件
    src/api/sandbox-artifacts.test.ts:98
    assert.deepEqual(readdirSync(dest).sort(), ['a.py', 'b.txt'])
  • 删除本地文件递归
    src/api/sandbox-artifacts.test.ts:100
    rmSync(dest, { recursive: true, force: true })
  • 读取本地文件
    src/api/sandbox-artifacts.test.ts:111
    assert.throws(() => readdirSync(dest))
  • 删除本地文件递归
    src/api/sandbox-artifacts.test.ts:133
    rmSync(dest, { recursive: true, force: true })
  • 读取本地文件
    src/api/sandbox-artifacts.test.ts:158
    assert.deepEqual(readdirSync(dest), ['win.py'])
  • 删除本地文件递归
    src/api/sandbox-artifacts.test.ts:160
    rmSync(dest, { recursive: true, force: true })
  • 读取本地文件
    src/api/sandbox-artifacts.test.ts:185
    assert.deepEqual(readdirSync(dest), ['evil.py'])
  • 删除本地文件递归
    src/api/sandbox-artifacts.test.ts:187
    rmSync(dest, { recursive: true, force: true })
  • 删除本地文件递归
    src/api/sandbox-artifacts.test.ts:212
    rmSync(base, { recursive: true, force: true })
  • 删除本地文件递归
    src/api/sandbox-artifacts.test.ts:248
    rmSync(dest, { recursive: true, force: true })
扫描于 2026/10/31(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

DSH 插件:为 dsh-router 提供 WPS 灵犀服务商,走 cowork WebSocket 通道,支持推理、真实沙箱代码执行、产物回取。

README

由 DeepSeek 最新模型翻译生成
dsh-router-wpslingxi DSH 插件:为 dsh-router 提供 WPS 灵犀(lingxi)服务商。 仿照 dsh-router-traework 的独立服务商插件结构(自含契约,不依赖 dsh-router 包)。 凭证说明:本插件用你自己的 wps_sid cookie 调上游,凭证只存在 DSH 本地凭证库(~/.dsh/profiles/<profile>/data/auths/credentials.sqlite),不进代码、不进仓库。 下面的调试记录里出现的 cookie 值都是本地抓包原文,不要提交(已在 .gitignore 里挡掉)。 能力(真机实测) | 能力 | 状态 | | 思考过程(reasoning) | ✅ c_reasoning → reasoning_content | | 工具调用 | ✅ c_execute_code / c_read_file / c_write_file / c_edit_file / c_list_files / c_install_package / c_websearch / c_urlfetch | | 真沙箱执行 | ✅ 代码真的跑,full_content.output 是真实 stdout |
展开完整文档(README 剩余 1 节)
dsh-router-wpslingxi

DSH 插件:为 dsh-router 提供 WPS 灵犀(lingxi)服务商。

仿照 dsh-router-traework 的独立服务商插件结构(自含契约,不依赖 dsh-router 包)。

凭证说明:本插件用你自己的 wps_sid cookie 调上游,凭证只存在 DSH 本地凭证库(~/.dsh/profiles/<profile>/data/auths/credentials.sqlite),不进代码、不进仓库。
下面的调试记录里出现的 cookie 值都是本地抓包原文,不要提交(已在 .gitignore 里挡掉)。

能力(真机实测)

| 能力 | 状态 |
| 思考过程(reasoning) | ✅ c_reasoning → reasoning_content |
| 工具调用 | ✅ c_execute_code / c_read_file / c_write_file / c_edit_file / c_list_files / c_install_package / c_websearch / c_urlfetch |
| 真沙箱执行 | ✅ 代码真的跑,full_content.output 是真实 stdout |
| 模型选择 | ✅ agent_input.expect_model(11 个模型 key 实测可路由) |
| 思考强度 | ✅ agent_input.reasoning_effort(low / high / max) |
| 积分 | ✅ run.end 上报 session_credit_consumed |
| 产出文件回传本机 | ✅ 沙箱里生成的文件自动拉回会话工作目录 |

产出文件回传(沙箱 → 你的电脑)

灵犀的 c_execute_code 跑在云端沙箱(/home/lingxi/workspace),文件不会自己出现在你机器上 ——界面里的「脚本已保存:/home/lingxi/workspace/quicksort/quicksort.py」指的是沙箱内路径。插件把这段补上了:

1. 发问时在用户消息末尾追加「产出目录」约定,让智能体把文件实际写入 /home/lingxi/workspace/output;
2. 本轮 run.end 之后,列该目录 → 取预签名直链 → 下载 → 落到会话工作目录(cwd);
3. 在回答末尾追加一段回传摘要:

📁 沙箱产出已回传到本机:D:\your\project
- merge_sort.py (1608 字节)

实测:问「用 Python 实现归并排序,把脚本保存下来并运行验证」,本机目录里真的出现 merge_sort.py(1608 字节)。

为什么必须显式约定路径:实测提示词只说「脚本要保存成文件方便我拿走」时,智能体不会落盘 —— /home/lingxi/workspace/output、/home/lingxi/workspace、/tmp 全是空的,它只在回答里贴代码。
给了绝对路径才会真写文件。

回传是尽力而为的:列不到目录、取不到直链、下载失败都只记日志,不影响已经交给你的正文。

相关端点

GET /api/aioffice/v1/sandbox/sessions/{sessionId}/files?path=<绝对路径>
→ {"data":{"items":[{name,size,type,key,files?}]}} # 目录项把子文件嵌在 items[].files
POST /api/aioffice/v1/sandbox/file/preview {key, session_id}
→ {"data":{"url":"https://...oss....?Signature=...","ext":".txt"}} # 预签名直链,不带 cookie 也能下
GET <上面那个 url> → 原始字节

反方向(本机 → 沙箱)也有:POST /api/aioffice/v1/cowork/sessions/{id}/files(multipart path + file),但它把内容落到 /home/lingxi/workspace/.lxenc/<base64>,对智能体是隐形的,所以插件不做上传。

工作方式:走 cowork WebSocket 通道

凭证仍是 wps_sid cookie(登录 lingxi.wps.cn 后从 DevTools → Application → Cookies 复制)。面板「添加 API key」粘贴即可。

注意 host 是 lingxi.kdocs.cn(不是 lingxi.wps.cn)—— 同一个 cookie 两边都认,实测 200。

1) POST /api/aioffice/v1/cowork/sessions {"{}"} → data.session_id
2) wss /api/aioffice/v1/cowork/sessions/{id}/sandbox/completions/ws (Cookie 走握手头,Origin 必须 https://lingxi.kdocs.cn)
3) 发 {"event":"user.input","data":{"agent_input":{...},"headers":{...}}}

为什么必须走它(三条通道实测对比)

| 通道 | 思考 | 工具调用 | 会被劫持成 deep research |
| aigc /completions | ✗ | ✗ | ✗ |
| aigc /expert_completion(SSE) | ✗ | ✗ | ✔ 会(跑 plan/research agent 流水线) |
| aioffice /cowork/.../ws | ✔ | ✔ 真执行 | ✗ |
只有 cowork 这条同时给出「思考 + 工具调用 + 真执行」。

帧协议

服务端回一串 JSON 文本帧,{"event":"...","data":{...}};语义靠 data.type 区分(这是与 SSE 通道最大的差别):

run.start {id, group_id}
component.start {type, id, parent_id, group_id, payload?}
component.content {type, id, delta} 增量
component.end {type, id, full_content} 完整内容
turn.start/turn.end {type, id, agent_time}
run.end {id, credit_consumed, session_credit_consumed}

组件类型:

| type | 映射 |
| c_reasoning | → reasoning_content |
| c_text | → content |
| c_execute_code 等工具 | → 渲染成 Markdown 正文(带代码 + 真实 output) |
| c_recommend | 忽略 |

c_execute_code 的形状:

// component.start: {"payload":{"brief":"实现快速排序并运行示例数组"}} // component.content: delta 逐段吐代码 // component.end: {"full_content":{"arguments":{"code":"...","brief":"..."}, // "output":"排序前: [...]\n排序后: [1, 3, ...]\n"}}

output 是沙箱真实 stdout。插件把工具调用渲染成:

🔧 执行代码:实现快速排序并运行示例数组 python ...代码...

输出:

排序前: [38, 27, 43, 3, 9, 82, 10, 55, 1, 64]
排序后: [1, 3, 9, 10, 27, 38, 43, 55, 64, 82]

控制面:agent_input

{
"text": "用户问题",
"files": [], "refs": [],
"expect_model": "qwen3.8_flash",
"reasoning_effort": "low",
"current_mode": "agent",
"permission_mode": "default",
"browser_plugin_enabled": false,
"file_ids": [], "upload_ids": []
}

模型列表来自 GET /api/aioffice/v1/sessions/plans 的 data.models(deepseek-v4-flash-0731、deepseek-v4-pro-0813、qwen3.8_flash、kimi-k3、GLM-5.3 …;plans 里的 plan_pro/plan_max 是「模式」不是模型)。

积分:GET /api/public/v1/credits/balance?credit_type=total,累加 data.bonus_credits[].balance + data.purchased_credits[].balance(没有 total_balance 字段)。

语义状态映射

| 上游信号 | AccountState |
| 401 / 403 | session_dead |
| 429 | rate_limit |
| 402 | quota |
| 404 | unavailable |
| HTTP 0(连不上) | transport |
| WebSocket 报错 | transport(走 onLateFailure) |
| 模型不在列表 | no_such_model(跳过供应商,不惩罚账号) |
| 请求体解析失败 / 空消息 | bad_request(不惩罚账号) |

onLateFailure 必须调用时读(核心先跑 factory 再挂回调)。

安装

pnpm install && pnpm build

作为 DSH 插件安装(cordis.patch.yml 单行 insert,dsh bundle 机制自动挂载)。

Windows 上跨盘无法用 link: 安装(pnpm 会把路径拼坏),用 pnpm pack 出 tgz 后在 profile 目录 pnpm add <tgz>。改源码后需 bump 版本号再重新 pack,否则 pnpm 复用旧缓存。

测试

pnpm test # node --test(全部离线,WS 用注入的假实现)
pnpm typecheck
pnpm build

实现注意事项(踩过的坑)

- pull 绝不能「空手返回」:ReadableStream 只在上一次 pull 解决且队列空时才再次调用 pull。若 pull 消费了一帧却没有 enqueue 任何东西就返回(例如只碰到 run.start / component.start),读侧的 read() 会永远挂着 —— 表现为「只拿到第一条 role delta 后永久卡死」。必须循环到「产出数据」或「收尾」才返回。
- stream 回调里的 this 是 underlying source,不是供应商实例:写 this.env.log(...) 会让 this.env 是 undefined → 第一次 pull 抛 TypeError → 消费者永久等不到 done,且控制台一行日志都没有。一律用闭包捕获(const log = this.env.log)。
- 控制器只能 close 一次:统一走带 closed 标志的 finish(controller)。
- WS 是推模型,ReadableStream 是拉模型:中间必须有队列 + wake() 唤醒,不能 busy-loop。
- c_execute_code 的代码正文不要逐帧推:component.content 阶段是半截代码,等 component.end 拿完整 arguments.code + output 一次性渲染。

License

MIT
预览分享卡片长什么样 ↓xfyang728/dsh-router-wpslingxi
分享 · DeepSeek Harness Hub
xfyang728/dsh-router-wpslingxi

接入 WPS 灵犀模型,在云端沙箱跑代码并回传产出文件

回到顶部