dsh-llm-bailian-kimi
Bailian (DashScope) Kimi LLM adapter plugin for DeepSeek Harness — kimi-k3 with image input, thinking and tool calling. No build step.
- Stars
- 0
- Language
- JavaScript
- Created
- Aug 19, 2026
- Updated
- Aug 19, 2026
Introduction
dsh-llm-bailian-kimi
DeepSeek Harness 的 LLM 适配器插件, 用于接入阿里云百炼(DashScope)上的 Kimi 模型。
只解决一件事:在 DSH 里用百炼的 kimi/kimi-k3,并且能发图片。
- ✅ 图片输入(多模态)
- ✅ 流式输出 + 思考链(
reasoning_content) - ✅ Function Calling
- ✅ token / 缓存命中统计
- ✅ 纯 ESM JavaScript,无构建步骤——
dsh plugin add一步装完,不会触发 pnpm 的allowBuilds拦截
安装
dsh plugin --profile web add github:sologuy/dsh-llm-bailian-kimi
然后在 $DSH_HOME/.credentials.yaml 里放百炼 API Key:
DASHSCOPE_API_KEY: sk-xxxxxxxx
重启 DSH 即可在模型选择器里看到「阿里云百炼」分组。
不重启热挂载
如果不想重启正在跑的实例,改用 $DSH_HOME/cordis.patch.yml(DSH 会 watch 该文件并事务性重新应用):
- insert:
- id: llm-bailian
name: dsh-llm-bailian
需要插件能按包名被解析到,即位于 $DSH_HOME/profiles/node_modules/ 下。
⚠️ 热挂载能换"挂不挂",换不了已 import 进内存的代码。 改了插件源码、或改了包名但文件路径不变时,Node 的 ESM 模块缓存会继续返回旧模块, 必须重启 DSH 进程才生效。会话都持久化在磁盘上,重启不会丢。
配置
插件开箱即用(默认只带 kimi/kimi-k3)。要改模型目录或端点,在 $DSH_HOME/settings.yaml 加 llm-bailian-kimi: 段——该段热加载,改完存盘即在下一次请求生效:
llm-bailian-kimi:
apiKeyEnv: DASHSCOPE_API_KEY
baseURL: https://dashscope.aliyuncs.com/compatible-mode/v1
reasoningEffort: max # high | max
models:
- id: kimi/kimi-k3
name: Kimi K3 · 百炼
description: 1M 上下文 · 支持图片
contextWindow: 1000000
input: [text, image] # ← 声明 image 才能发图
| 字段 | 默认值 | 说明 |
|---|---|---|
apiKeyEnv | DASHSCOPE_API_KEY | 凭证引用名,按请求解析 |
baseURL | 百炼 OpenAI 兼容端点 | 换 workspace 端点时改这里 |
reasoningEffort | max | 调用方未指定时的兜底档位 |
maxTokens | 65536 | 单请求输出上限默认值 |
defaultContextWindow | 1000000 | 目录里没写 contextWindow 的模型用它 |
headers | {} | 附加请求头(如 workspace 路由) |
streamIdleTimeoutMs | 300000 | 流空闲超时 |
模型条目的 input 不声明 image 就是纯文本模型——这是对端点的声明而非探测,声明了但端点不支持会在请求时被服务端拒绝。
范围:这不是通用百炼适配器
插件注册的路由是 bailian-kimi,不是 bailian —— 名字是刻意收窄的,因为它的思考参数派发
(thinking: {type: 'enabled'} + reasoning_effort)是 Kimi 方言,换个模型就未必成立。实测:
| 百炼模型 | 本插件的思考派发 |
|---|---|
kimi/kimi-k3 | ✅ |
qwen3.8-max | ✅(顺带能用,但未做完整验证) |
deepseek-v3.2 | ❌ 400 'reasoning_effort' must be one of: 'none','minimal','low','medium','high' |
而且 off 档位被刻意拿掉了(见下方坑 3),这对能关思考的模型是错的。
要接百炼上的其他模型,建议另开 dsh-llm-bailian-qwen / -glm 之类的兄弟插件,
各自占一个路由名。两个插件抢同一个路由会直接 DUPLICATE_ADAPTER,整个注册失败。
为什么需要这个插件
DSH 自带两个适配器,接百炼时都过不去:
| 适配器 | 阻塞点 |
|---|---|
dsh-llm-deepseek | 对图片直接抛 UNSUPPORTED_CONTENT,根本不发图 |
dsh-llm-pi-ai | 对未知 baseURL 自动推断 supportsDeveloperRole: true,把系统提示发成 role: 'developer',百炼返回 400 role 'developer' is not allowed。而 DSH 的 PiAiCompatProfile 只暴露 thinkingFormat / supportsReasoningEffort 两个开关,配置层够不到这个字段 |
这个插件本质上是在绕过 upstream 缺失的一个配置字段。 如果
PiAiCompatProfile补上supportsDeveloperRole(约 3~5 行),接百炼就退化成一段settings.yaml配置,本插件即可退役。欢迎去 upstream 推动这个改动。
顺带说明:百炼官方文档写"图片仅支持公网 URL,不支持 Base64",但实测 base64 完全可用,含 7MB 大图(见 probe/RESULTS.md)。所以本插件不需要 OSS 签名 URL 那一套。这属于未文档化行为,未来若收紧,只需改 lib/serialize.js 的 imagePart() 一个函数。
百炼特有的三个坑(实现时已处理)
- 系统提示必须用
role: 'system',developer会被 400 拒绝。 - 工具调用续片的
id/name是 JSONnull,不是空串也不是缺字段。判断必须写typeof x === 'string' && x.length > 0;写!== undefined会被null击穿, 首片的有效值被续片覆盖,工具调用随即失败。 - 绝不能发
thinking: {type: 'disabled'}。kimi-k3不允许关思考,会返回一条 极具误导性的400 invalid temperature: only 0.6 is allowed for this model。 因此本插件只提供high/max两档,不提供off。
另有一条 Node 侧注意事项:using 显式资源管理语法 Node 22 原生 ESM 尚不支持,本插件用显式
[Symbol.dispose]();且不要加 export default——Cordis 以模块命名空间读取
name/inject/Config/apply,多一个默认导出会让它改用裸函数,从而丢掉 Config schema 的默认值。
验证
probe/ 下是可复现的实测脚本,对着你自己的百炼 Key 跑:
export DASHSCOPE_API_KEY=sk-xxxx
python3 probe/mkimg.py # 生成三档测试图(含随机数字,排除幻觉)
python3 probe/t_image.py # base64 图片输入
python3 probe/t_wire.py # wire 兼容性边界(9 项)
python3 probe/t_stream_tool.py # 流式 + 工具调用分片形态
实测结果记录在 probe/RESULTS.md。
兼容性
针对 DSH 0.1.0-rc.6 开发与验证。契约以运行时
node_modules/@deepseek-ai/dsh-llm/lib/types/*.d.ts 为准。
License
MIT