前言¶
在 DeepSeek Harness(DSH)里跑智能体时,云端模型够用,但本地 llama.cpp、ComfyUI、脚本往往各自占显存、各自启停。显存一紧就容易 OOM,多会话同时推进还会互相抢卡。DSH 已有记忆、上下文等插件,并不替你统一管「这张卡上现在还能塞什么、这一步该谁先跑」。metagalaxy-crystal 维护的 dsh-local-orchestrator 定位为工作流类插件:在消费级单卡(README 实测环境为 RTX 5060 Laptop 8GB / 32GB RAM)上,给 agent 提供资源调度运行时,而不是再造一套 agent 框架。
这是什么¶
插件仓库:metagalaxy-crystal/dsh-local-orchestrator。当前 package.json 版本为 0.14.1,许可证 MIT,运行环境要求 Node.js >= 20。
一句话:把 LLM、生成式工作流(ComfyUI)、一次性脚本收进一张显存预算表,用 十个单步工具 + 任务状态机 把「决策」留在 DSH 会话、「执行」放在插件里,并支持跨会话暂停与恢复。
官方明确其不是新的 agent 框架:不实现 LLM 循环、不做工具调用协议、不管会话与记忆。它主要回答:卡上还剩多少、这一步该谁先跑、跑完如何记账、异常时如何收尾。记忆、RAG、浏览器等仍由 DSH 其他插件与会话模型负责;本地探测、注册、加载卸载与显存预算由本插件负责。
社区目录页:SkillHub 插件页(独立站点,与 DeepSeek / 幻方无官方从属关系)。
三个核心物件¶
| 物件 | 作用 |
|---|---|
预算表(lib/budget.js) |
LLM / 工作流 / 脚本 / MCP 共用一本账,按科目合计占用,判断新负载是否放得下 |
单步工具(lib/steps.js、lib/tools.js) |
一次工具调用只推进一步;local_step 与后台 worker 共用同一套 StepRunner |
任务状态机(lib/tasks.js) |
状态如 queued → running → waiting_decision → done;落盘、可恢复,暂停可真正打断 |
设计原则:决策权在宿主(DSH 会话模型),执行权在插件,状态是双方唯一的契约。
提供的工具与界面¶
lib/tools.js 暴露 10 个工具,命名空间大致为:local_resources、local_assets、local_chat、local_service、local_delegate、local_generate、local_audio、local_task、local_step、local_env。
重启 DSH 后,Web 端会出现 「本地调度」 页签,含总览、任务池、任务、输入输出、用量、资产、设置等子页。总览可看显存三段条(已用 / 可调度 / 保留);资产页可登记模型并查看配套组件与缺文件提示;任务池展示步骤树与租约;用量页统计 token 与上下文占用。
底层对接 runtimes/ 下的 llama.cpp、ComfyUI 与通用进程,并通过 hardware.js 读取 CPU、内存与 nvidia-smi 显存。
安装与启用¶
官方 README 给出的安装步骤如下(路径可按你的环境替换):
git clone https://github.com/metagalaxy-crystal/dsh-local-orchestrator.git
cd dsh-local-orchestrator
dsh plugin add .
说明:dsh plugin add . 表示把当前克隆目录注册为 DSH 插件;若你使用的 DSH 版本文档要求其他方式,以本地 DSH 说明为准。安装完成后重启 DSH,确认会话顶部出现「本地调度」页签。
本插件以当前 DSH 进程权限 在本机启停模型进程、读写配置与任务状态。安装前请自行审阅仓库源码与 MIT 许可证,确认路径、端口与自动卸载策略符合你的安全预期。
一次性环境配置¶
模型与运行时集中在同一根目录时,可用一条 setup 命令派生并写入 models / llama.cpp / ComfyUI / scripts / output 等路径:
npm run setup -- --base D:\models
也可在对话里用 local_env 的 JSON 动作逐项配置,例如:
{"action":"set-base","dir":"D:\\models"}
{"action":"doctor"}
{"action":"vendor-llama"}
{"action":"link-comfy","dir":"D:\\models\\ComfyUI"}
doctor 全为 [ok] 再继续;出现 [x] 时按该行给出的 fix 执行,避免从日志猜测。全绿之前可先不登记资产。
登记本地资产¶
三种入口:
- 资产页「从目录导入」(模型都在同一根目录时最快);
- 资产页「+ 添加资产」;
- 对话 JSON,例如:
{"action":"add","asset":{"id":"my-qwen","kind":"llm","gguf":"text/my-qwen/model.gguf","ctx":8192}}
{"action":"list"}
list 可查看每个资产的配套组件与「缺文件」警告。
典型用法¶
下面示例均摘自 README,可按你的资产 ID 与路径替换。
本地对话(自动加载,用完可自动卸载):
local_chat {"prompt":"用一句话解释什么是显存预算"}
local_chat {"asset":"qwen36","prompt":"看这张图里有什么","imagePath":"D:\\x.png"}
出图 / 视频 / 音乐(经 ComfyUI 等工作流):
local_generate {"prompt":"一只橘猫在窗台上,写实照片","kind":"image"}
local_generate {"asset":"minimax-h3-t2v","prompt":"夜景城市航拍","kind":"video"}
local_generate {"prompt":"轻松的钢琴配乐","kind":"music"}
多步任务(可暂停、可恢复):
local_task {"action":"create","goal":"给新品写三条文案并评估","steps":[
{"goal":"写三条文案","kind":"llm"},
{"goal":"按“是否具体、是否有卖点”评估上一步","kind":"evaluate","dependsOn":[0]}
]}
local_step {"action":"run","taskId":"task-xxx"}
local_task {"action":"pause","taskId":"task-xxx"}
语音与转写:
local_audio {"action":"tts","text":"你好,这是本地合成。"}
local_audio {"action":"asr","audioPath":"D:\\x.wav"}
查看状态与排障:
local_resources {"verbose":true}
local_env {"action":"doctor"}
local_resources 可汇总算力、资产、24h 用量与最近事件;doctor 对 llama.cpp、ComfyUI、模型路径等问题给出逐项结论与可执行修复建议。
调度策略要点(8GB 默认取向)¶
README 列举的默认策略面向约 8GB 显存调优,理解这些有助于预判行为:
- GPU 槽互斥:同一时刻只有一个吃显存的资产(LLM / ComfyUI / 语音等),切换时先停后起。
- 显存预算:在预留比例与固定预留之后计算可调度显存;放不下时按未固定、低优先级、最久未用等规则淘汰。
- CPU 槽并发:embed、rerank、零显存 MCP 等可并行,不占 GPU 槽。
- 实测学习:加载后回写真实显存占用到资产画像。
- 自动调参:可读 GGUF 元数据,在可用显存内选
ctx、ngl、KV 量化等(scheduler.autoTune)。 - 空闲回收与任务结束释放:如
idleUnloadSec、releaseAfterTaskSec(默认 30 秒)等;pinned: true的资产不受普通空闲卸载规则约束。
核显、虚拟显示器等边界条件在 README 中有单独说明;独显调度以 nvidia-smi 可见部分为准。
可复现的基准数字¶
无需加载模型即可在本机跑基准(结果与具体 GPU 型号无关的部分):
node scripts/bench.mjs
README 记载的当前指标包括:任务恢复率 100%(20/20,含崩溃中 5 个);跨会话公平性为最大连续独占 1 步;单步开销约 2.6 ms/步(含任务落盘)。工具调用台账校验:
npm run verify
显存估算误差(README 称 <6%)需真机;详细设计见仓库内 docs/OVERVIEW.md 与架构文档。
适用场景与局限¶
较适合:单机 NVIDIA 显卡、已用 llama.cpp 跑 GGUF、用 ComfyUI 出图/视频,希望 agent 按任务自动加载/卸载,把简单、批量、隐私、离线的活交给本地算力。
不适合指望它替代:记忆、RAG、浏览器、完整 agent 循环——这些仍依赖 DSH 生态其他能力与你会话里的模型。
任务池边界(README 摘要):决策环在宿主;执行环在插件且 local_step 一次一步;后台 worker 在需要判断或失败时会 schedule 唤醒所属会话,不打扰其他会话。
结尾¶
dsh-local-orchestrator 把本地 LLM、ComfyUI 与脚本纳入统一显存账本,并用可恢复的任务状态机对接 DSH 工具调用,适合在显存紧张的单品工作站上做 agent 侧「用起来、用得省、用得稳」。