dsh-aichat-bridge:把 DSH 会话暴露成 OpenAI 接口,接游戏 AIChat

前言

DeepSeek Harness(DSH)适合带文件工具、带会话记录的 agent 轮次;游戏里的 AI 聊天 Mod(例如 Chill With You 的 AIChat)则往往自带完整人设、回复格式和记忆,但通常只能发一次 HTTP 请求,读不到你本机资料目录。若直接把 Mod 接到通用云端 API,人设和本地文件两件事很难同时满足;若只用 DSH 默认「编码助手」人设,又会和 Mod 的角色设定冲突。

下面介绍社区插件 dsh-aichat-bridge(维护者 Naiqey-Star):在本机把固定 DSH 会话包装成 OpenAI Chat Completions 兼容 的 HTTP 服务,让人设仍由 Mod 的 system 消息决定,模型与只读文件访问交给 DSH 处理。

这是什么

dsh-aichat-bridge 是 DSH 的 bundle 插件(npm 包名 dsh-aichat-bridge),分类上属于社区目录里的「联网工具」。它不做外网转发:服务挂在 DSH 已监听的回环地址上,并可选再监听固定本地端口,供游戏客户端稳定连接。

一句话:游戏 Mod POST 一条兼容 OpenAI 的对话请求 → 插件用 Mod 的 system 整段替换 DSH 系统提示词 → 在同一 sessionId 里跑完一轮 agent → 把 assistant 文本包成 chat.completion 返回。

它怎么工作

数据流可以概括为:

游戏 AIChat ──POST /aichat/v1/chat/completions──▶ DSH 插件(本机 127.0.0.1)
                                                   │
                                                   ├─ 把 system 消息作为该会话的完整系统提示词
                                                   ├─ 打开(或新建)固定 sessionId 的会话
                                                   ├─ 投递一条 user 消息,等这一轮跑完
                                                   ├─ 模型可调用 read_file 读取 readRoots 内的文件
                                                   └─ 把最后的 assistant 文本包成 chat.completion 返回

几个行为细节(均来自仓库说明):

  • 一次 HTTP 请求对应一个完整 agent 轮次;轮次结束后会话仍保持活动,会出现在 DSH 侧边栏,可与游戏共用同一上下文。
  • 系统提示词以 complete: true 整段替换,DSH 默认编码助手框架不会混入;工具说明由桥接自行补充一小段。
  • 文件读取不依赖 DSH 内置文件工具的预设作用域,而是由插件注册 read_file,路径限制在配置的 readRoots(及 allowAllDrives / denyPaths 规则)内。
  • 插件会用 workspaceRegistry 把会话 attach 到路径匹配的工作区;/health 里 workspaces[].attached 可查看是否挂上。未正确设置 cwd 时,会话可能落在 _no-cwd,侧边栏看不到——配置里应填写与当前工作区一致的项目目录。

核心功能

OpenAI 兼容 HTTP 接口

方法 路径 说明
GET {path}/health 健康信息,不需要口令
GET {path}/v1/models 返回配置里的模型名
POST {path}/v1/chat/completions 主接口,body 为 OpenAI Chat Completions 格式

默认路径前缀 {path} 为 /aichat,即例如 GET http://127.0.0.1:<端口>/aichat/health。

固定本地端口(可选)

DSH 桌面端每次启动的 Web 端口可能变化;客户端若写死「当前 DSH 端口」,重启后可能连到正在退出的旧实例(表现为 502 Bad Gateway)。插件默认另监听回环端口 47821:

http://127.0.0.1:47821/aichat/v1/chat/completions

将 listenPort 设为 0 可关闭独立端口,仅使用 DSH 自身 Web 端口上的 /aichat/... 路由。

只读文件工具

模型在轮次内可调用 read_file;默认不开放任何目录,需在配置中显式列出 readRoots,或通过 allowAllDrives: true 做全盘只读并配合 denyPaths 排除敏感路径。单文件默认上限 200000 字节(maxReadBytes)。桥接不申请人工审批:能力刻意收窄为只读,避免工具调用卡在审批直到超时。

与 AIChat(Chill With You)对接

README 给出了 Mod 侧开关(与插件 token、URL 对应即可):

  1. 安装插件并确认 /aichat/health 正常。
  2. AIChat 配置 → 0. 后端:UseDshBridge = True;DshBridgeUrl 指向你的 completions 地址(若用固定端口则为 http://127.0.0.1:47821/aichat/v1/chat/completions;README 示例里也曾写过 DSH 实际端口);DshBridgeToken 与插件 token 一致或均为空;DshBridgeModel = dsh-bridge。
  3. 关闭 UseDshBridge 即回到 Mod 原有 API 流程。

安装与启用

推荐通过 bundle 安装到指定 profile:

dsh plugin --profile <你的 profile> add dsh-aichat-bridge

在该 profile 的 cordis.patch.yml 中插入插件行(也可改包内 cordis.patch.yml 后重装)。示例配置:

- insert:
    - id: aichat-bridge
      name: dsh-aichat-bridge
      config:
        sessionId: aichat-bridge
        provider: deepseek-account
        model: deepseek-flash
        readRoots:
          - D:/我的资料
        token: ""

重启 DSH(或让 Loader 热加载)后,日志中应出现类似:

[aichat-bridge] serving /aichat/v1/chat/completions on session "aichat-bridge" (...)

手工验证:

curl http://127.0.0.1:<DSH 端口>/aichat/health

本地开发若不想依赖 node_modules 持久拷贝,可在补丁里用 file:// 绝对路径指向 lib/index.js(详见仓库 README「本地开发」一节)。

运行环境:package.json 要求 Node >=20;许可证 MIT。

典型用法

请求体示例(system 为人设与格式说明,user 为本轮内容):

{
  "model": "dsh-bridge",
  "messages": [
    { "role": "system", "content": "[情绪]|||语音文本|||字幕文本 格式说明 + 角色人设" },
    { "role": "user", "content": "读一下 D:\\我的资料\\设定.txt,把里面的暗号念给我听" }
  ]
}

响应为标准 chat.completion,取 choices[0].message.content 作为角色回复;usage 在桥接侧为占位 0,真实用量在 DSH 界面查看。

开放多个资料目录时,可在 readRoots 中列出绝对路径;若需全盘只读,使用 allowAllDrives: true 并设置 denyPaths 排除如 .ssh、.dsh 等目录(README 有完整 YAML 示例)。开放范围越大,本机可读文本暴露给模型的面越大,按需最小授权即可。

配置要点

字段 默认 说明
path /aichat DSH Web 上的路径前缀
token "" Bearer 口令;空则不校验,建议设置
sessionId aichat-bridge 固定会话 id
provider / model deepseek-account / deepseek-flash 轮次模型路由
readRoots [] 允许 read_file 的绝对目录
listenPort 47821 固定回环端口;0 仅用 DSH 端口
cwd 空 会话项目目录;空则可能进 _no-cwd
timeoutMs 180000 单轮超时,超时返回 504

完整字段见仓库 README「配置」表。

适用场景与注意

适合谁: 已在用 DSH、并希望 Chill With You AIChat(或其它能发 OpenAI 兼容 POST 的客户端)把对话落到本机 agent,同时让人设由 Mod 控制、并只读访问你指定的资料目录。

权限与安全: 插件随当前 DSH 进程在本机运行;read_file 仅在配置允许的路径内只读解析(含 realpath 边界)。安装前请自行查看 GitHub 源码 与 MIT 许可证。建议设置 token,避免本机其它进程误用回环服务。

已知限制(仓库原文): 同一会话同时只能有一个外部写者(冲突时 409 SESSION_IN_USE);不支持流式(stream: true 仍返回一次性 JSON);不合并 Mod 塞进 user 的多轮历史,桥接按「一请求一轮」处理;DSH 仍可能注入工作目录相关上下文,插件侧无法完全屏蔽。

DeepSeek Harness 生态强调「一切皆插件」;SkillHub 插件目录 为社区站点,与 DeepSeek / 幻方无官方从属关系。

结尾

dsh-aichat-bridge 解决的是「Mod 人设 + DSH 文件与会话」的拼接问题:OpenAI 兼容入口、固定会话、可选固定端口、可配置的只读读盘。需要细节、契约测试与变更记录时,以仓库为准。

  • 目录页:https://www.skillhub.cn/plugins/Naiqey-Star/dsh-aichat-bridge
  • GitHub:https://github.com/Naiqey-Star/dsh-aichat-bridge
羽毛球分组比赛记分
小程序二维码

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

小夜