工程文档(Engineering)

August 14, 2026 · View on GitHub

dsh-koboldcpp —— DeepSeek Harness 第三方工具插件。在线大模型通过 koboldcpp_run / koboldcpp_vision 工具把重复、耗 token 的文本与视觉劳动交给本机 KoboldCpp(llama.cpp)完成。

1. 项目定位

  • 类型:DeepSeek Harness 工具插件(tool plugin),遵循 docs/cookbook/adding-a-tool.md 契约。
  • 不做什么:不替换 harness 的模型提供方(provider);不改写任何 deepseek-harness 文件;不自建监听服务。
  • 做什么
    1. 在线模型(主模型)按需调用 koboldcpp_run(文本)与 koboldcpp_vision(多模态/OCR)。
    2. 首次调用时自动拉起本机 KoboldCpp(exePath + kcppsPath --port),等待模型加载。
    3. stopBehaviorexit/idle/never)管理服务器生命周期;外部已运行的 KoboldCpp 只复用、绝不终止。

2. 环境要求

要求
Node.js≥ 20(开发/测试用 24.x)
DeepSeek Harnessnpx @deepseek-ai/dsh web 或源码检出(npm 包版本 ≥ 0.1.0-rc.2)
KoboldCpp官方 Releases 的 koboldcpp[-nocuda].exe(NVIDIA 用含 CUDA 的版本,AMD 用 nocuda/Vulkan)
模型GGUF 文件;视觉场景另需 mmproj 投影器(在 kcpps 中配置)

3. 目录结构

DSHKOBOLDCPP/
├─ package.json            # npm 包定义;peerDependencies 只含运行时依赖
├─ tsconfig.json           # 类型检查(allowImportingTsExtensions + rewriteRelativeImportExtensions)
├─ tsconfig.build.json     # 构建(src → lib/)
├─ vitest.config.ts        # 测试配置(node 环境)
├─ README.md               # 用户安装/配置/使用(对外;精简版 API 见 docs/api.md)
├─ docs/                   # 本文档集(engineering / glossary / api / solutions)
├─ src/
│  ├─ index.ts             # 插件入口:Config、resolveOptions、apply、两个工具、settings 段
│  ├─ launch.ts            # KoboldCppServer 进程生命周期
│  ├─ koboldcpp.ts         # 非流式 chat-completions 客户端(文本+多模态)与错误映射
│  ├─ images.ts            # 图像准备:文件/URL/会话附件 → data URL
│  └─ prompts.ts           # 视觉报告模板与 fidelity 规则
└─ tests/                  # 各模块单测 + integration + loader + real-driver(见 §7)

4. 常用命令

npm install        # 安装依赖(含 harness 包 devDependencies)
npm run typecheck  # tsc -p tsconfig.json --noEmit
npm test           # vitest run(45 个测试)
npm run build      # tsc -p tsconfig.build.json → lib/

发布前:npm run prepublishOnly(typecheck + test + build 依次执行)。

5. 插件契约要点(DeepSeek Harness 规范)

契约实现
name'koboldcpp-tool'(kebab-case)
inject['tools'](依赖 ctx.tools
Configschemastery schema,与 llm-koboldcpp: settings 段同形(详见 docs/api.md)
apply(ctx, config)注册工具、设置段、进程管理;配置变更(settings)热重注册工具
工具注册ctx.tools.register(defineTool({...}));fiber 卸载自动注销(幂等)
卸载ctx.effect(() => async () => { await server.dispose() })(async disposer 被 fiber 等待)
并发不声明 isConcurrencySafe → 注册表默认 exclusive(串行),适配 KoboldCpp 单序列 KV cache
错误工具抛错 → isError + 可读消息;客户端抛 LlmError(稳定 code)

6. 源码约定

  • 相对导入使用 .ts 扩展名import './koboldcpp.ts'),构建时由 rewriteRelativeImportExtensions 重写为 .js,保证 Node type-stripping 可直接运行源码(Loader 场景)。
  • 禁止 parameter propertiesconstructor(private x)):Node strip-only 模式不支持;用显式字段声明。
  • 工具执行必须 forward exec.signal(与 AbortSignal.timeout 合并)。
  • 模型可见描述为英文;代码注释为中文或英文均可,术语遵循 docs/glossary.md。
  • 新增/修改行为必须同步更新 docs/api.md 与 tests。

7. 测试分层(对应 harness testing.md)

文件覆盖
单元koboldcpp.spec.ts / prompts.spec.ts客户端、模板、图像助手
工具tool.spec.tsschema、执行、canonical value、卸载、失败隔离
集成integration.spec.ts插件 + ToolRuntime 组合,自动拉起 fake 服务器与停服
REAL-compositionloader.spec.tsdsh-app-boot → Loader → cordis.yml(规范硬性要求)
真实行为real-driver.mjs(手动)真实 koboldcpp 三场景:autostart / reuse / notrunning —— 运行方法与判据见 docs/solutions.md §8

8. 与 harness 集成(安装/配置/卸载)

安装:harness 项目内 npm install dsh-koboldcpp;源码方式可用 name: '../DSHKOBOLDCPP'(包根即 Cordis 插件模块)。

配置:profile 的 cordis.patch.yml 增加一行 insert(详见 README「Configure」)。

卸载:删除该条目即可。运行中卸载(HMR/设置变更)会:注销两个工具、按 stopBehavior 停掉插件自启的服务器、释放 settings 段。外部服务器与 harness 其他组件不受影响(有测试证明)。

9. 已知限制与对策

见 docs/solutions.md §10(本处不再重复)。