部署与配置

August 25, 2026 · View on GitHub

面向部署方与运维:把插件装进托管服务、接自己的配置站、锁定 Skill 版本、 改工作台的叫法。只想在本机用一下的读者不需要这一页,README 就够了。

插件加载在 Host 平面,不是 Agent Preset

README 里的 dsh plugin add 会把插件写进 profile 的 bundles,也就是 Host 组合——这是它 唯一能工作的位置。托管部署自己拼装 profile 时同理,在 cordis.patch.ymlinsert

- insert:
    - id: aws-wechat-article
      name: '@aiworkskills/aws-wechat-article'

不要写进 Agent Preset 的 agent.cordis.yml 插件注册的是进程级 Cordis 服务 (wechatArticleConfigurationwechatProductLibrarywechatSkillSource),Harness 会拒绝挂载并报:

preset service must sit behind an `isolate` realm or move to the host composition

这条报错不会指出该放哪,照着「装插件」的直觉放进 Preset 很容易撞上。

换一个目录布局

README 里的安装命令把两个仓库放在固定位置,是为了让复制粘贴就能跑通。这个布局不是必须的。

构建客户端界面时需要读取 Harness 源码里的构建预设(这部分没有随 npm 发布),默认按 ../../deepseek-harness 查找。仓库放在别处时,用 DSH_SOURCE_ROOT 指明位置即可:

DSH_SOURCE_ROOT=/path/to/deepseek-harness pnpm build

容器构建、CI 以及把插件放进自有工作区的情况都适用。路径无效时构建会直接说明缺少什么, 而不是抛出一串类型错误。

使用预置的 Skill 检出

默认情况下,公众号 Skill 由插件 git clone 到 DSH_HOME 下,每个 DSH_HOME 各持一份。 单机单用户时这样最省事。

托管部署不适用这个默认值:那里每个用户都有独立的 DSH_HOME,于是每来一个新用户就要 重新 clone 一次 GitHub —— 既要求运行环境能访问外网,也让不同用户可能拿到不同版本的 Skill。这类部署预置一份共享检出,并用 skillSourceDir 指向它:

- id: aws-wechat-article
  name: '@aiworkskills/aws-wechat-article'
  config:
    skillSourceDir: /opt/wechat-article-skills

Skill 版本随之固定,启动不再依赖网络。内网隔离环境、企业代理后,以及需要锁定 Skill 版本的场景同理。目录需要是一份完整的 Git 检出(保留 .git,「更新 Skill」才可用)。

换一个配置站

configurationUrl 指定工作台内嵌的配置站,默认 https://aiworkskills.cn/config

- id: aws-wechat-article
  name: '@aiworkskills/aws-wechat-article'
  config:
    configurationUrl: https://config.example.com/wechat

这一个值同时决定三件事:iframe 打开哪里、postMessage 只信任哪个来源、导入 .aws 配置包时允许来自哪个域(该域及其子域)。

早期版本里浏览器端把站点地址写死了,于是这个配置项只对 Host 侧生效——自建配置站的人 改了它,iframe 仍然指向原站,导入还会被一个自己从未配置过的域名拒绝。现在浏览器端从 Host 读取,三处一致。

缩略图

工作台里的缩略图是二十几个像素见方,而喂给它们的原本是全尺寸原图 —— 一篇文章 六张配图就是 3 MB。现在 ?thumb=1 会返回一张 96px 的 JPEG(实测 654 KB → 1.5 KB, 省 99.8%),在内存里按字节封顶缓存,缓存键含源文件 mtime,因而无需显式失效。

生成依赖 Python 与 Pillow(与图片入库工具同一个 pythonCommand)。拿不到就发 原图 —— 缩略图是优化不是能力,没装 Pillow 的部署只是慢一点,不会少一块界面。

config:
  thumbnailCacheBytes: 8388608   # 可选,默认 8 MiB

换一个工作台的名字

左边栏那一行默认叫「公众号」。把工作台嵌进更大的产品里时,账号身份往往已经由外面那一层 承载了,这一行于是该命名一件

- id: aws-wechat-article
  name: '@aiworkskills/aws-wechat-article'
  config:
    workbenchLabel: 创作素材

留空即插件自己的名字。取不到时也照常显示默认名——这一项是称呼,不是能力。

托管部署:把工作台锁在一个工作集上

给每个工作集单独起 Runtime 的托管部署(例如一个用户名下的多个公众号各占一个工作区), 把该工作集的标识配成 workspaceId。插件会把它作为 workspace 参数拼进配置站地址:

- id: aws-wechat-article
  name: '@aiworkskills/aws-wechat-article'
  config:
    # 标识由部署方的网关决定,从环境变量注入即可;插件不认识任何具体网关的变量名。
    workspaceId: !!js process.env.YOUR_GATEWAY_WORKSPACE_ID || ''
https://config.example.com/wechat?embed=dsh&protocol=1&parentOrigin=…&workspace=<工作集 id>

对配置站而言这是一条约束:当前工作区属于这个工作集。配置站据此把自己锁在该工作集上, 而不是让用户在 iframe 里切到别的账号——否则用户切过去再点「应用配置」,另一个账号的设置 连同发布凭据就会被导入这个工作区。

本机单工作区安装不配这一项,也就不带这个参数,配置站行为与以往完全一致:在那里切换 账号正是选择「要配哪一个」的方式,去掉反而会把这条路堵死。

插件只陈述事实,怎么处置由配置站决定。