@morlay/dsh-llm-openai-compatible
DeepSeek Harness 的 OpenAI 兼容 LLM 适配器插件。与内置 llm-pi-ai /
llm-deepseek 不同,本插件的配置 schema 支持 profile 级默认采样参数
(temperature / topP / topK / presencePenalty / frequencyPenalty /
seed),请求级 GenerateOptions.temperature 优先于 profile 默认值;providers
用 dict 多路由结构(与 llm-pi-ai 一致)。
传输层复用 @ai-sdk/openai-compatible
(wire 序列化与 SSE 解析由 SDK 负责);本插件负责 harness 消息 → AI SDK prompt
转换、采样默认合并、stream part → StreamChunk 翻译、错误归一化与凭据策略。
本文件只给配置面与用法;每条规则与取舍的 home 是各自 ADR(见下)。
配置
providers 是 dict:key 就是 provider 路由键(选择器与
GenerateOptions.provider 使用),值是 profile。它标了 .volatile()——运行期可改:
值经 Loader 的引用读取,设置页(Models 页)改的就是它,不需要重挂这行插件(见
ADR-运行期改配置走volatile引用)。
配置写在这行的 config 里(bundle patch / profile patch / 设置页都落到这里):
- id: llm-openai-compatible
name: "@morlay/dsh-llm-openai-compatible"
config:
providers:
ollama:
apiKeyEnv: OLLAMA_API_KEY
baseURL: https://ollama.com/v1
displayName: Ollama Gateway
# === 采样默认参数(请求级 temperature 优先)===
temperature: 1 # 0..2
topP: 0.95 # 0..1 → wire top_p
topK: 40 # 正整数 → wire top_k(非标准,仅网关支持时发送)
presencePenalty: 0 # -2..2 → wire presence_penalty
frequencyPenalty: 0 # -2..2 → wire frequency_penalty
seed: 42 # 正整数 → wire seed
# === 推理 ===
reasoning: high # 部署默认档位(省略 = 提供方默认)
# === 模型目录 ===
defaultContextWindow: 262144
defaultMaxTokens: 32768
models:
- id: deepseek-v4-flash:0731
name: DeepSeek V4 Flash
contextWindow: 1000000
maxTokens: 65535
inputModalities: [text, image]
reasoningEfforts:
off: # off 空值 = 不发送 reasoning_effort
high: high # 档位 → wire reasoning_effort 拼写
max: max
# === 传输 ===
maxRequestImageBytes: 20971520
streamIdleTimeoutMs: 300000
timeoutMs: 600000 # 整体请求超时;缺省不设
retryPolicy:
mode: normal
maxRetries: 5
旧 $DSH_HOME/settings.yaml 的 llm-openai-compatible 段由上游启动时一次性导入到同 id 的行 config。
规则与取舍
规则细节(合并表、wire 字段落点、端点与错误映射)在各自 ADR 里维护,这里只列结论:
从 llm-pi-ai 迁移
把 llm-pi-ai.providers.<route> 的 baseURL / models / 采样字段平移到
llm-openai-compatible.providers.<route>(无 api 字段——协议固定
chat-completions),apiKeyEnv 与 retryPolicy 原样保留;reasoningEfforts
的 off 空值语义一致。
构建、测试与类型检查的命令见根 justfile 与 mise.toml。