rapid-mlx-dsh-provider

20Star19Fork0Issue19Watching

为 DeepSeek Harness 提供 Rapid-MLX 本地模型路由,自动读取服务端模型元数据(上下文窗口、推理/工具解析器),省去手写 settings.yaml 的麻烦。

语言
JavaScript
License
Apache-2.0
分支
main
apple-siliconcoding-agentdeepseek-harnessdshdsh-pluginllmlocal-llmmlx

安装

$ dsh plugin --profile web add @raullenchai/dsh-provider

在终端中运行以上命令,通过 dsh CLI 安装此插件。可在右上角切换 Profile。 第一次用 dsh?看这篇新手教程

一句话定位

为 DeepSeek Harness (DSH) 添加本地 Rapid-MLX 模型路由,直接从服务端读取模型事实(上下文窗口、是否支持推理/工具调用等),免去手动维护 settings.yaml;并附带 5 个模型管理工具和 /rapid-mlx 总览命令,让 Agent 在会话内就能查看、下载、删除本地模型。

核心能力

  • 自动发现模型元数据:注册时调用本地 Rapid-MLX 服务端的 /v1/models,把上下文窗口、推理/工具解析器、MoE/hybrid 架构、视觉能力等信息写进路由
  • 优先使用内存拟合的容量上限:上下文窗口取服务端 max_model_len(按 Apple Silicon 统一内存估算的容量),老版本服务端回退到 context_window,确保 dsh-compaction-basic 压缩时机正确
  • 让推理档位"说实话":服务端报告 reasoning_parser: null 的模型不再展示 off/low/medium/high 选择器(选了也没用)
  • 提供 5 个模型管理工具:rapid_mlx_serving(查看正在服务的模型)、rapid_mlx_cached(查看下载缓存)、rapid_mlx_pull(下载模型,可取消)、rapid_mlx_remove(删除缓存,强制 -y)、rapid_mlx_health(独立报告 API 和 CLI 健康)
  • 注册 /rapid-mlx 总览命令:一行输出服务端/CLI 健康、当前服务模型事实、缓存总占用

技术实现

  • 语言: JavaScript(ESM,纯 JS 无构建步骤)
  • 关键依赖: @deepseek-ai/dsh-llm(LlmAdapter 基类与 LlmError 契约)、@deepseek-ai/schemastery(Config schema 校验与默认值)、@deepseek-ai/dsh-tools(defineTool 注册工具)、@deepseek-ai/dsh-subprocess(跑 CLI 的 subprocess seam)
  • 架构模式: 通过 cordis.patch.yml 作为 profile bundle layer 注入;插件 inject ['llm', 'tools', 'subprocess', 'commands'] 四个服务,依赖 dsh.bundle 字段被 profile 加载;Config 用 schemastery 声明 + 环境变量回退(RAPID_MLX_BASE_URL / RAPID_MLX_CLI
  • 入口文件: lib/index.jsapply(ctx, config) 是 cordis 钩子入口)

适用场景

DSH 用户希望让 Agent 直接连本机跑的 Rapid-MLX 服务端(典型如 Apple Silicon 上的 MLX 模型)时使用本插件。最直接的痛点是:通用 openai-completions 路由让你必须手动填 baseURL、上下文窗口和推理档位,换模型还得改;而本插件从服务端拉元数据,无需维护就能跟随服务端切换模型,并让 dsh-compaction-basic 在合适的时机触发压缩。

前置依赖与兼容性

依赖最低版本说明
DeepSeek Harness^0.1.0-rc.8(peerDependencies)已对 0.1.0-rc.7 端到端验证;rc.8 与 rc.7 的 LlmAdapter 合约字节一致
Node>= 22.15.0README 与 GitHub Actions CI 均强制 22.15(dsh 用到 Node Zstd stream API)
Cordis^4.0.1peerDependency
Rapid-MLX 服务端任意能跑 OpenAI 兼容 /v1/models 的版本max_model_len 是 vLLM/SGLang 标准字段;老版本只有 context_window 也可工作
运行平台macOS (Apple Silicon)Rapid-MLX 本身依赖 Apple Silicon MLX;插件代码是纯 JS 跨平台,但实际能用必须本机有 Rapid-MLX 服务
原生模块仅依赖 Node 内置 node:os.tmpdir

安装方式

dsh plugin --profile web add @raullenchai/dsh-provider

配置项

配置类型说明默认值
baseURLstring本地 Rapid-MLX OpenAI 兼容 API 的根地址。可通过环境变量 RAPID_MLX_BASE_URL 覆盖http://localhost:8000/v1
cliCommandstring用于下载/删除/查询缓存的 rapid-mlx 可执行文件名(PATH 解析)或绝对路径。可通过环境变量 RAPID_MLX_CLI 覆盖rapid-mlx

常见问题

Q: 安装后需要在 settings.yaml 里写模型配置吗?

A: 不需要写上下文窗口、推理档位、视觉能力这些字段了。只需要把 agent-default-modelprovider 设为 rapid-mlxmodel 设为服务端实际跑的模型名(短别名或 Hugging Face repo id 都行)。其他元数据由插件从服务端拉。

Q: max_model_lencontext_window 有什么区别?

A: context_window 是模型训练时定的"理论最大上下文";max_model_len 是服务端按当前机器的统一内存(权重 + KV 缓存)估算的"实际能塞下的上限"。插件优先用后者喂给压缩模块,避免压缩时机晚于机器实际能承载的长度。

Q: 能在非 Apple Silicon 机器上跑吗?

A: 插件代码是纯 JS、跨平台。但实际可用必须本机能运行 Rapid-MLX(MLX 后端限制 Apple Silicon)。在 Intel Mac 或 Linux 上安装插件本身没问题,只是没有可用的服务端连。

Q: 服务端响应慢或 502,插件会怎样?

A: stream() 路径下:HTTP 非 2xx 抛 LlmError(401/403 → 凭证错误码、429 → QUOTA、413 → 上下文超限、5xx → PROVIDER_ERROR)。/v1/models 拉取失败时静默返回空列表,让 DSH 走"未知模型"的分支而不是中断整个会话。

Q: 工具调用和思考链支持吗?

A: 支持。流式输出里 tool-call 增量按 argumentsDelta 拼接,完整 ToolCallBlockblock-end 一次性给出;reasoning_content 单独走 reasoning 通道,不混入正文文本。但图片内容会抛 UNSUPPORTED,不会悄悄丢弃。

Q: 怎么卸载?

A: dsh plugin --profile web remove @raullenchai/dsh-provider。移除后 rapid-mlx 路由和 5 个工具、 /rapid-mlx 命令一并下线,不影响你已有的 settings.yaml 内容。

Q: dsh 升级到新版本会不会坏?

A: 截至 rc.8,LlmAdapter 合约与 rc.7 字节一致,插件向上兼容。dsh 是开发者预览,演进很快,建议关注 cordis.patch.yml 的 inject 字段(当前 ['llm', 'tools', 'subprocess', 'commands'])和 Config schema 是否需要新增。

上手难度

入门 — 本地有现成的 Rapid-MLX 服务端跑着的话,dsh plugin add 一行即可使用,settings.yaml 只改 provider 和 model 两行。

已知问题与限制

  • recommended_sampling(每模型推荐采样参数)只读取,未自动应用
  • tool_call_parser 只读取,未用于"模型不支持工具调用时快速失败",目前仍可能进入循环
  • is_hybrid / is_moe / capabilities 只读取,尚未在路由层据此改变行为
  • 真正的内存感知容量仍未接入:resolveModel() 目前返回服务端报告的 max_model_len,这本身已经是"按机器估算的"值,但更精细的"当前可用容量"需要 Rapid-MLX 侧先暴露 usable-capacity 字段
  • 图片输入目前直接抛 LlmError('UNSUPPORTED'),不静默丢弃;如果需要看图,请改用通用 openai-completions provider
  • 路由名固定为 rapid-mlx,如果你的 settings.yaml 已在 llm-pi-ai.providers 下声明过同名 provider,registerAdapter 的 provider 排他性会导致冲突——需二选一或重命名