Polaris/integrations/deepseek-harness

196Star26Fork6Issue1Watching

把 Polaris 平台的工具与技能目录接入 DeepSeek Harness,并把技能里声明的允许工具策略落到当前 DSH 回合中执行。

机审证据安装命令仓库已核验dsh-plugin Topic许可证READMEAI 百科
语言
Python
License
Apache-2.0
分支
main
ai-agentsai-scientistauto-researchdsh-pluginpolaris-agent

安装

$ dsh plugin --profile web add github:ZJU-REAL/Polaris/integrations/deepseek-harness

在终端中运行以上命令,通过 dsh CLI 安装此插件。可在右上角切换 Profile。 第一次用 dsh?看这篇新手教程

对话式安装

帮我安装 DeepSeek Harness 插件 ZJU-REAL/Polaris/integrations/deepseek-harness:先查看仓库 https://github.com/ZJU-REAL/Polaris.git 确认安全性,然后执行安装命令并验证插件加载成功。

把这段指令粘贴给 DSH Web GUI 里的助手,由它代你完成安装与验证。

一句话定位

这是一个把 Polaris 平台接入 DeepSeek Harness(DSH)的连接器插件。它一边把 Polaris 后端的 MCP 工具列表拉进 DSH,一边把 Polaris 上的助手技能以原生技能(而非 MCP 工具)的形式注入 DSH,并把每个技能声明的"允许工具"策略落到当前 DSH 回合里强制执行。

核心能力

  • 通过 DSH 官方的 MCP 客户端连接 Polaris /mcp,把 Polaris 的工具(如 search_papers)以 mcp__polaris__* 命名空间注入 DSH 工具目录
  • 作为原生技能提供者,定期拉取 Polaris 技能目录,把 Polaris 助手技能注册到 DSH 的原生技能系统中
  • 注册 polaris_skill_resource 工具,按需读取技能声明的附件内容(只有被技能显式列出的路径才可读)
  • 根据当前回合加载的 Polaris 技能,在工具层隐藏其 allowed-tools 白名单之外的 Polaris 工具,并对回合内后发现的工具执行守卫拦截
  • 同一回合加载多个技能时,自动把它们的允许工具列表取交集,只收紧不放开
  • 令牌失效(401/403)或被降权时,自动清空缓存并把 DSH 技能发现标记为无效,做到失败即关闭

技术实现

  • 语言: TypeScript(ESM,tsconfig.json 构建输出到 dist/)
  • 关键依赖: @deepseek-ai/dsh-mcp-client(官方 MCP 桥)、@deepseek-ai/schemastery(配置 schema)、zod(运行时数据结构校验)、@deepseek-ai/cordis(宿主注入)
  • 架构模式: 双适配器 bundle。cordis.patch.yml 在启动时往宿主里插入两个 service:polaris-mcp(走官方 MCP 客户端)和 polaris-skills(本插件的原生 provider)。本插件再通过 Cordis 钩子(tools/post-executeagent/pre-steptools/changeagent/disposedagent/erroragent/turn-stopping)追踪回合状态
  • 入口文件: integrations/deepseek-harness/src/index.ts(apply(ctx, config) 是插件激活入口)

适用场景

已经部署了 Polaris 实例、并希望 DSH 既能调用 Polaris 暴露的 MCP 工具、又能利用 Polaris 上的助手技能统一管理团队提示词与触发规则的用户。它把技能当成 DSH 原生一等公民处理,避免技能被错位成 MCP 工具造成的重复注册问题;同时通过 allowed-tools 策略让单个技能可以声明自己的工具白名单,在保留 Polaris 工具的同时防止越权。

前置依赖与兼容性

依赖最低版本说明
DeepSeek Harness0.1.0-rc.6插件 peerDependencies 声明 cordisdsh-agentdsh-sessiondsh-skilldsh-tools 均为 ^0.1.0-rc.6
Node.js>=20engines.node 字段;本地构建 bundle 时需要
平台跨平台未声明 os / cpu 限制
原生模块依赖均为纯 JS/TS 包,没有 node-gyp 模块
Polaris 后端数据库迁移 8ff89f7fcdeb否则 /api/integrations/deepseek-harness/v1/skills* 接口不可用

安装方式

dsh plugin --profile web add github:ZJU-REAL/Polaris/integrations/deepseek-harness

配置项

环境变量由 cordis.patch.yml 在插件注入时读取,补丁行里也接受同名配置字段覆盖。

配置类型说明默认值
POLARIS_BASE_URL环境变量 / 字符串Polaris 服务根地址,自动去掉末尾斜杠并拼接 /mcphttp://127.0.0.1:8000
POLARIS_DSH_TOKEN环境变量 / 字符串集成令牌明文,通过 /api/integration-tokens 创建,作用域至少需要 skills:readmcp:read
POLARIS_DSH_TOOL_PROFILE环境变量 / 字符串后端 MCP profile;dsh-readonly-v1 只读,dsh-full-v1 额外暴露 remember(且仅在账号开启 Buddy 记忆时)dsh-readonly-v1
baseUrl字段(覆盖 env)POLARIS_BASE_URL,用于绕过环境变量直接传必填
token字段(覆盖 env)POLARIS_DSH_TOKEN,被 schemastery 标记为 secret 字段必填
serverName字符串MCP 命名空间,必须与官方客户端 row 一致polaris
refreshIntervalMs数字,≥1000技能目录轮询间隔30000
requestTimeoutMs数字,≥1Polaris 单次发现请求超时10000
failOnStartupError布尔启动时若技能发现失败是否中断 DSH 启动false
allowedToolsMode枚举技能 allowed-tools 策略执行强度:enforce 隐藏并拦截违规工具;advisory 仅日志告警;off 完全关闭策略enforce
userSkillRank数字DSH 对用户作用域 Polaris 技能的候选排名340
builtinSkillRank数字DSH 对内置作用域 Polaris 技能的候选排名360

常见问题

Q: 安装后必须设置什么环境变量?

A: 至少 POLARIS_BASE_URLPOLARIS_DSH_TOKEN,否则插件会在构造客户端时因令牌为空直接抛错。如果走 dsh-full-v1 profile,后端账号还需要开通 Buddy 记忆,否则 remember 工具不会出现在发现列表里。

Q: 集成令牌的权限怎么给?

A: 用当前登录 JWT 调 POST /api/integration-tokens,选择 scopes。skills:read 用于发现和读取技能,mcp:read 用于连接 /mcp,mcp:write 用于打开写工具 profile。令牌明文只在创建响应里出现一次,Polaris 后端只存 SHA-256 摘要,所以丢失后必须重建。已创建令牌的 scopes 不能编辑,只能吊销重建。

Q: 怎么验证插件已经生效?

A: 在 DSH profile 启动前运行 dsh --profile web --dump-config,配置里应同时出现 polaris-mcppolaris-skills 两行;启动后 DSH 的工具目录里应出现形如 mcp__polaris__search_papers 的工具,且 Polaris 后端的 skill_load 不会作为 MCP 工具出现(它由 DSH 原生 skill 工具承载)。

Q: 技能里的 allowed-tools 怎么写才对?

A: 必须是 Polaris 原始工具名(如 search_papers),不能写成 mcp__polaris__search_papers 这种 DSH 命名空间形式;多个 Polaris 技能在同一回合加载时,它们的允许列表会自动取交集,不会扩大工具集合,也不会限制非 Polaris 的 DSH 工具;allowed-tools: null 表示不施加额外限制。

Q: 令牌被吊销或账号降为只读会怎样?

A: 技能发现遇到 401 或 403 会立即清空已缓存的技能目录并把 DSH 的发现标记为失效,下一次请求若仍未恢复则直接拒绝;后端把账号降为只读后,即使令牌声明了写 scope,在 /mcp 上也会在下次请求时被拒,不只是浏览器会话受影响。

Q: allowedToolsMode 三种模式怎么选?

A: 默认 enforce 会从工具目录里隐藏违规 Polaris 工具,并在回合内对新发现的工具同步拦截;advisory 仅写日志不拦截,适合上线前排查;off 完全关闭策略,会把策略控制器整个关掉,适合在 Polaris 后端没声明任何策略时减少事件循环开销。

上手难度

进阶 — 需要先在 Polaris 后端准备数据库迁移和集成令牌,理解 DSH profile、cordis patch 与环境变量三者的关系,并能区分 enforce/advisory/off 三种策略强度才能避免误拦截。

已知问题与限制

  • Polaris 后端必须应用迁移 8ff89f7fcdeb,否则技能相关接口不可用
  • 集成令牌的 scopes 创建后不能编辑,只能 DELETE /api/integration-tokens/{id} 重建;serverName 必须与官方 MCP 客户端 row 一致,否则策略匹配会失败
  • 技能附件路径在客户端会拒绝空段、"."".." 段(src/client.ts:84),防止未声明路径绕过校验重定向请求
  • 当 Polaris 账号为只读时,即使令牌声明了 mcp:write 也会在 /mcp 上被拒绝;dsh-full-v1 中唯一写工具 remember 只在账号开启 Buddy 记忆后才会出现在发现与调用列表里
  • 源码中没有 TODO / FIXME / HACK 注释,暂无显式标注的 bug

收录徽章

Listed on deepseek-plugin.org
[![Listed on deepseek-plugin.org](https://img.shields.io/badge/listed_on-deepseek--plugin.org-007EC6)](https://deepseek-plugin.org/plugins/ZJU-REAL/Polaris/integrations/deepseek-harness)

把这段 markdown 粘贴到你的 GitHub README,链接回本插件详情页。徽章只声明已被本站收录,不代表安全认证。

返回插件目录