dsh-our-free-model 开发指南:内核接缝、inject 依赖注入与 3 个耗时的内核行为 dsh-our-free-model 开发指南内核接缝、inject 依赖注入与 3 个耗时的内核行为【免费下载链接】dsh-our-free-model在 dsh 里装上这个插件即可无需登录、注册或填 API Key就能使用包括 DeepSeek V4.1 Flash、Kimi K3 在内的前沿模型——完全免费不限量。 All you do is install this plugin in dsh: no login, no sign-up, no API key — the frontier models are just there, DeepSeek V4.1 Flash and Kimi K3 among them. Completely free, with no usage cap.项目地址: https://gitcode.com/gh_mirrors/ds/dsh-our-free-modeldsh-our-free-model 是 dsh 的免费模型插件装上即可使用 DeepSeek V4.1 Flash、Kimi K3 等前沿模型——无需登录、注册或 API Key完全免费不限量。这篇文章面向想给这个免费模型插件写代码的贡献者讲清插件坐在内核上的两个结构性决策内核接缝与inject 依赖注入并复盘 3 个真实消耗过调试时间的内核行为帮你少走弯路。整体架构一个适配器两条 provider 路由先建立全局认知。这个插件是纯挂载式不改内核、零依赖、无构建步骤同一份代码能同时跑在 dsh 0.1.5 与 0.1.7 两代内核上。目录分工如下位置职责index.jsHost 半身适配器注册、探测、存储、路由、转发端口、升级接线adapter/内核接缝全包唯一允许 import 内核模块的位置src/adapter.js结构性 LlmAdapterlistModels / resolveModel / stream 等src/messages.js消息投影到三种线协议 工具调用配对修复client.js浏览器半身设置页六个页面手写 bundle核心技巧是结构化实现鸭子类型内核从不执行 instanceof 检查因此插件不 import 具体内核类型、不锁定内核版本靠约定好的结构契约挂载。这一点对多内核版本兼容至关重要。内核接缝一行 grep 就能审计的依赖边界adapter/kernel.js 是全包唯一允许点名deepseek-ai/*模块的文件——这条生态打包规则adapter 层外不允许引用内核模块用一行 grep 即可审计。目前接缝上只承载一件事归因 User-Agent。设计上有两个值得借鉴的点窄类型声明——adapter/dsh-llm.d.ts 只声明接缝实际调用的那一个函数刻意比内核自身表面更窄类型检查就只检查这一小片。懒加载 降级——见 resolveAttributionUserAgent插件不锁定内核版本模块由宿主解析若当前 composition 供不出该模块就降级为一个字面量 User-Agent保证归因始终存在。 启示把「对内核的依赖」收敛到一个文件其余源码就变成纯消费者未来内核升级时改动面一目了然。inject 依赖注入三种服务访问方式插件与内核cordis 容器交互的核心是一张表——不同的服务访问方式不同缺失时的行为天差地别方式语义服务缺失时本插件用法inject [llm]硬依赖声明即待命整条 fiber 保持 PENDING模型车道唯一硬依赖ctx.get(name)机会式查找返回undefined不抛错connection、attachments 等可选服务ctx.inject(deps, cb)服务就绪后运行回调回调挂起等待就绪后执行webServer、credentials属性直读ctx.xxx读未声明服务的 mixin直接抛错不是 undefined禁用见下文行为 ③硬依赖声明在 index.js只有一行export const inject [llm]这是刻意的最小化llm是插件存在的全部理由其它任何服务都不许出现在顶层 inject 里——否则在无 HTTP 服务的极简 composition如 TUI中插件会因等待一个永不提供的服务而永久不激活。headless 环境宁可「有模型、没有设置页」也不能什么都没有。webServer 的正确打开方式独立 fiber 待命设置页路由挂在 webServer 上而浏览器半身总是在插件加载之后才发布 webServer。于是有两种读法两种结局❌apply时读一次ctx.get(webServer)→ 得到undefined→ 路由全部未注册 → 设置页没有数据源而 web server 正在用它自己的页面「服务」你✅ 用 ctx.inject 独立 fiber回调在 webServer 就绪前挂起自己的 fiber就绪后自动执行并注册路由且从不阻塞上面的模型车道。connection服务同理但它更微妙浏览器半身发布它也在插件之后所以插件逐请求查找而不是在 apply 时快照一次快照会让信任围栏在整个进程周期内退化为降级形态。3 个真实消耗过调试时间的内核行为以下三条来自 README.md 的开发者复盘编写 provider 插件时基本都会遇到① providerRetryPolicy() 的返回值会被「原样保存并使用」两代内核都不解析该返回值退避调度器直接读顶层的initialDelayMs / maxDelayMs / jitterRatio。如果把这些字段嵌套在backoff: {}里调度器读到undefinedundefined * 2ⁿ NaN而持久会话日志拒绝非有限数值——一个本可恢复的瞬时故障因此报废整轮对话。正确做法是返回已解析完毕的扁平策略见 providerRetryPolicy同时注意retryableCodes里刻意不含RATE_LIMIT429 的 retry-after 是递增的自动重试等于把同一回合付费三次。② 一次被中断的工具调用会永久污染该会话工具调用与结果之间被中断用户取消、进程崩溃会在持久历史里留下一条「没有对应结果的工具调用」。重放时上游返回400 invalid_request_error此后该会话的每一次请求都失败。插件的解法是在发送前统一修复配对三种线协议Chat / Messages / Responses共用同一处逻辑见 repairToolPairing。③ 未在 inject 中声明的服务属性直读抛错ctx.get() 却返回 undefined这是本轮踩过的两个坑的合流把 inject 缩减为仅剩llm后读ctx.intervaltimer 服务上的 mixin直接抛出cannot get property timer without inject——插件在所有 composition 中不再激活。修法后台循环改用普通 unref 定时器完全不碰未声明服务改用ctx.get(webServer)后得到undefined——原因不是缺服务而是加载顺序插件先于 web 半身。修法见上节ctx.inject(deps, callback)为该服务开一条独立 fiber 使其待命避免在加载瞬间做一次性判断。一句话总结硬依赖进 inject可选服务用 ctx.get 逐次读晚到服务用 ctx.inject 开 fiber 等待。验证不出网、不消耗额度的离线套件上述每个行为都有常驻断言守门改动后跑一条命令即可全量回归npm test套件守住的行为scripts/retry-safety-test.mjs退避策略可持久化、429 不再自动重试、usage 计数scripts/picker-test.mjs选择器只广播可用模型、401 信任围栏scripts/tui-test.mjs无 web server 的 composition 中插件照常启动scripts/speed-stat-test.mjs任何一次调用不被平均成虚假的 tok/s全部离线不出网、不消耗免费额度共享测试脚手架会把两条免密来源默认指向已关闭的本机端口。用量看板数据留在本机布局修复有对照统计只落在本机stats.json。早期看板有一处纯视觉问题——Token 热力图格子间距过大、无法按周对齐修复后呈现连贯的贡献图谱观感对应 issue #11布局本身已是列优先周对齐只需 gap 归零与圆角收小开发者速查清单✅ 内核 import 只进 adapter/其余源码保持纯结构消费者✅ 顶层inject只声明llm其余服务全部「可选」✅ 晚到的服务webServer 等用ctx.inject独立 fiber不在 apply 时做一次性快照✅ 重试策略返回扁平的完整对象字段别嵌套✅ 发送前跑一遍工具配对修复覆盖三种线协议✅ 每个修复配一条离线断言用 npm test 防回归掌握内核接缝与 inject 的分层思路、避开这三个内核行为的陷阱你就能在这个免费模型插件上安全地做二次开发。更多背景见 README.md 的「实现结构」与「已知边界」两节。【免费下载链接】dsh-our-free-model在 dsh 里装上这个插件即可无需登录、注册或填 API Key就能使用包括 DeepSeek V4.1 Flash、Kimi K3 在内的前沿模型——完全免费不限量。 All you do is install this plugin in dsh: no login, no sign-up, no API key — the frontier models are just there, DeepSeek V4.1 Flash and Kimi K3 among them. Completely free, with no usage cap.项目地址: https://gitcode.com/gh_mirrors/ds/dsh-our-free-model创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考