dsh-manage-api:在 DSH 里托管 ManageAPI 守护进程与用量回写

前言

在 DeepSeek Harness(DSH)里做多站点 LLM 路由时,ManageAPI 负责选站、比价、探针和记账,但 daemon 要自己起停、网关 Key 要另填客户端、真实流量往往回写不到路由层。下面介绍插件 dsh-manage-api(维护者 ZYH1207,分类:客户端):它是 ManageAPI 的 DSH 插件端,把守护进程生命周期、原生设置面板、真实用量回写和预算熔断接到 Cordis 宿主里,而不是再套一层独立 Web 壳。

这是什么

dsh-manage-api 当前版本 0.12.1(MIT 许可证,Node >=20),仓库 ZYH1207/dsh-manage-api,目录页 skillhub.cn/plugins/ZYH1207/dsh-manage-api。运行时本体来自 ZYH1207/ManageAPI,可通过 config.runtimeDir 指向本机目录,或安装可选 peer 依赖 manage-api(^0.3.0)。

插件不重复实现选站与记账:写操作一律走 daemon HTTP,宿主进程不写 db.json。DSH 社区插件目录是独立站点,与 DeepSeek / 幻方无官方从属关系。

核心功能

界面与入口

  • 主面板:左侧栏 ManageAPI 图标(与「插件」「任务板」同级),中央主视图整页打开;可通过 mainPanel: false 仅保留设置分区。
  • 设置页:设置 → ManageAPI,含概览 / 比价 / 决策 / 探针 / 用量等常驻分区。
  • 会话内:助手消息下方的会话成本 chip(⇄ N tok / M 次);命令 /manage 系列。

面板 UI 复用 ManageAPI 网页版样式(作用域化内联,非 iframe),明暗主题跟随宿主。

守护进程与代理

  • attach-or-spawn:探测 /api/health 通则 attach,否则按配置自启;DSH 退出时托管自有实例一并停止。
  • 同源只读代理:webServer.register('/api/manage-api/*'),仅 loopback + Origin 校验。
  • 写操作白名单:POST /api/manage-api/write → lib/write-proxy.js 转发 daemon,不直连 4319 全管理面。

路由、模型与网关

  • 站点 / Key 管理、比价改价、决策手动排序、基准价与免费池写操作、网关开关、忽略模型、模型接入(写 DSH 的 manage-api provider 与默认模型)等,与 README 能力表一致。
  • 模型列表动态化(llm.registerModelDiscovery)因命名空间归属 llm-pi-ai 未对第三方开放;改用 manageapi_models 工具、/manage models、设置页比价子页查看全量模型。
  • 接入页不再展示网关 Key / adminToken(host 侧 sanitizeState());DSH 仍通过本机 provider 走 daemon /v1。

观测、回写与熔断

  • 请求观测:llm/stream tee,取 usage / finish / ttft。
  • 非 ManageAPI 渠道真实用量:POST /api/ingest/usage(ingestExternalUsage)。
  • 系统提示注入站点 / 比价 / 用量上下文(promptContext,约 30s 缓存)。
  • 工具:manageapi_status / manageapi_models / manageapi_usage;预算熔断作用于工具调用(tools.guard + 设置页横幅)。

安装与启用

从 GitHub 安装(官方 README 原文):

dsh plugin --profile desktop add "github:ZYH1207/dsh-manage-api"

本地链接开发示例:

dsh plugin --profile desktop add "link:D:/AgentWorkPlace/DSH/dsh-manage-api"

装好后重启 DSH 或在插件页重载,打开 设置 → ManageAPI。开发期还可把 "dsh-manage-api" 加入 profile 的 package.json 里 dsh.profile.bundles。

配置项在 cordis.patch.yml 的 config 段,例如:

config:
  port: 4319
  autoStart: true
  runtimeDir: ""
  waitMs: 10000
  ingestExternalUsage: true
  promptContext: true
  mainPanel: true
  budget:
    sessionTokens: 0
    dailyTokens: 0

budget 为 0 表示不设限;超限后拒绝工具调用,模型请求仍由宿主直接发出。

运行时解析顺序:runtimeDir → npm 包 manage-api → 包内 runtime/ → 同仓开发目录。

典型用法

会话里使用 /manage(结果不进消息历史、不发给模型):

/manage            概览:站点数 / 供给数 / 最划算的站 / 今日用量 / 预算
/manage models     模型比价(★ = 该模型最便宜的站)
/manage models glm 只看匹配的模型
/manage usage      今日全渠道用量 + 本进程观测到的会话
/manage budget     本会话 / 今日预算与是否已熔断

模型接入:接入页从未忽略模型中选一项,写入 DSH provider 并设为默认。接入免费模型:免费页开关打开后,免费池模型以 free/模型名 接入。

面板显示 daemon「未运行」但本机 4319 有旧进程时,可关旧进程让插件 spawn(mode: owned),或使用设置页「启动托管」/「重启托管」。

适用场景与注意

适合已在用或打算用 ManageAPI 做站点比价与智能路由、又希望全程留在 DSH 里的开发者。插件以当前 DSH 进程权限运行,安装前应阅读仓库源码与 MIT 许可证;路由仅允许 loopback,写操作要求 application/json。

排障可参考 README:例如面板 401 / 非 JSON 多与 webServer 注册时机有关(已改为依赖注入);DSH 能看到模型但调不通,常见原因是 daemon 未跑且 provider 指向 127.0.0.1:4319。

结尾

经过上面的步骤,dsh-manage-api 把 ManageAPI 的 daemon、面板与 DSH 的 provider / 工具 / 预算守在一套插件里。进一步了解见 目录页 与 GitHub 仓库。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜