指南:內(nèi)核接縫、inject 依賴注入與 3 個耗時的內(nèi)核行為)
dsh-our-free-model 開發(fā)指南內(nèi)核接縫、inject 依賴注入與 3 個耗時的內(nèi)核行為【免費(fèi)下載鏈接】dsh-our-free-model在 dsh 里裝上這個插件即可無需登錄、注冊或填 API Key就能使用包括 DeepSeek V4.1 Flash、Kimi K3 在內(nèi)的前沿模型——完全免費(fèi)不限量。 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.項(xiàng)目地址: https://gitcode.com/gh_mirrors/ds/dsh-our-free-modeldsh-our-free-model 是 dsh 的免費(fèi)模型插件裝上即可使用 DeepSeek V4.1 Flash、Kimi K3 等前沿模型——無需登錄、注冊或 API Key完全免費(fèi)不限量。這篇文章面向想給這個免費(fèi)模型插件寫代碼的貢獻(xiàn)者講清插件坐在內(nèi)核上的兩個結(jié)構(gòu)性決策內(nèi)核接縫與inject 依賴注入并復(fù)盤 3 個真實(shí)消耗過調(diào)試時間的內(nèi)核行為幫你少走彎路。整體架構(gòu)一個適配器兩條 provider 路由先建立全局認(rèn)知。這個插件是純掛載式不改內(nèi)核、零依賴、無構(gòu)建步驟同一份代碼能同時跑在 dsh 0.1.5 與 0.1.7 兩代內(nèi)核上。目錄分工如下位置職責(zé)index.jsHost 半身適配器注冊、探測、存儲、路由、轉(zhuǎn)發(fā)端口、升級接線adapter/內(nèi)核接縫全包唯一允許 import 內(nèi)核模塊的位置src/adapter.js結(jié)構(gòu)性 LlmAdapterlistModels / resolveModel / stream 等src/messages.js消息投影到三種線協(xié)議 工具調(diào)用配對修復(fù)client.js瀏覽器半身設(shè)置頁六個頁面手寫 bundle核心技巧是結(jié)構(gòu)化實(shí)現(xiàn)鴨子類型內(nèi)核從不執(zhí)行 instanceof 檢查因此插件不 import 具體內(nèi)核類型、不鎖定內(nèi)核版本靠約定好的結(jié)構(gòu)契約掛載。這一點(diǎn)對多內(nèi)核版本兼容至關(guān)重要。內(nèi)核接縫一行 grep 就能審計(jì)的依賴邊界adapter/kernel.js 是全包唯一允許點(diǎn)名deepseek-ai/*模塊的文件——這條生態(tài)打包規(guī)則adapter 層外不允許引用內(nèi)核模塊用一行 grep 即可審計(jì)。目前接縫上只承載一件事歸因 User-Agent。設(shè)計(jì)上有兩個值得借鑒的點(diǎn)窄類型聲明——adapter/dsh-llm.d.ts 只聲明接縫實(shí)際調(diào)用的那一個函數(shù)刻意比內(nèi)核自身表面更窄類型檢查就只檢查這一小片。懶加載 降級——見 resolveAttributionUserAgent插件不鎖定內(nèi)核版本模塊由宿主解析若當(dāng)前 composition 供不出該模塊就降級為一個字面量 User-Agent保證歸因始終存在。 啟示把「對內(nèi)核的依賴」收斂到一個文件其余源碼就變成純消費(fèi)者未來內(nèi)核升級時改動面一目了然。inject 依賴注入三種服務(wù)訪問方式插件與內(nèi)核cordis 容器交互的核心是一張表——不同的服務(wù)訪問方式不同缺失時的行為天差地別方式語義服務(wù)缺失時本插件用法inject [llm]硬依賴聲明即待命整條 fiber 保持 PENDING模型車道唯一硬依賴ctx.get(name)機(jī)會式查找返回undefined不拋錯connection、attachments 等可選服務(wù)ctx.inject(deps, cb)服務(wù)就緒后運(yùn)行回調(diào)回調(diào)掛起等待就緒后執(zhí)行webServer、credentials屬性直讀ctx.xxx讀未聲明服務(wù)的 mixin直接拋錯不是 undefined禁用見下文行為 ③硬依賴聲明在 index.js只有一行export const inject [llm]這是刻意的最小化llm是插件存在的全部理由其它任何服務(wù)都不許出現(xiàn)在頂層 inject 里——否則在無 HTTP 服務(wù)的極簡 composition如 TUI中插件會因等待一個永不提供的服務(wù)而永久不激活。headless 環(huán)境寧可「有模型、沒有設(shè)置頁」也不能什么都沒有。webServer 的正確打開方式獨(dú)立 fiber 待命設(shè)置頁路由掛在 webServer 上而瀏覽器半身總是在插件加載之后才發(fā)布 webServer。于是有兩種讀法兩種結(jié)局?apply時讀一次ctx.get(webServer)→ 得到undefined→ 路由全部未注冊 → 設(shè)置頁沒有數(shù)據(jù)源而 web server 正在用它自己的頁面「服務(wù)」你? 用 ctx.inject 獨(dú)立 fiber回調(diào)在 webServer 就緒前掛起自己的 fiber就緒后自動執(zhí)行并注冊路由且從不阻塞上面的模型車道。connection服務(wù)同理但它更微妙瀏覽器半身發(fā)布它也在插件之后所以插件逐請求查找而不是在 apply 時快照一次快照會讓信任圍欄在整個進(jìn)程周期內(nèi)退化為降級形態(tài)。3 個真實(shí)消耗過調(diào)試時間的內(nèi)核行為以下三條來自 README.md 的開發(fā)者復(fù)盤編寫 provider 插件時基本都會遇到① providerRetryPolicy() 的返回值會被「原樣保存并使用」兩代內(nèi)核都不解析該返回值退避調(diào)度器直接讀頂層的initialDelayMs / maxDelayMs / jitterRatio。如果把這些字段嵌套在backoff: {}里調(diào)度器讀到undefinedundefined * 2? NaN而持久會話日志拒絕非有限數(shù)值——一個本可恢復(fù)的瞬時故障因此報廢整輪對話。正確做法是返回已解析完畢的扁平策略見 providerRetryPolicy同時注意retryableCodes里刻意不含RATE_LIMIT429 的 retry-after 是遞增的自動重試等于把同一回合付費(fèi)三次。② 一次被中斷的工具調(diào)用會永久污染該會話工具調(diào)用與結(jié)果之間被中斷用戶取消、進(jìn)程崩潰會在持久歷史里留下一條「沒有對應(yīng)結(jié)果的工具調(diào)用」。重放時上游返回400 invalid_request_error此后該會話的每一次請求都失敗。插件的解法是在發(fā)送前統(tǒng)一修復(fù)配對三種線協(xié)議Chat / Messages / Responses共用同一處邏輯見 repairToolPairing。③ 未在 inject 中聲明的服務(wù)屬性直讀拋錯ctx.get() 卻返回 undefined這是本輪踩過的兩個坑的合流把 inject 縮減為僅剩llm后讀ctx.intervaltimer 服務(wù)上的 mixin直接拋出cannot get property timer without inject——插件在所有 composition 中不再激活。修法后臺循環(huán)改用普通 unref 定時器完全不碰未聲明服務(wù)改用ctx.get(webServer)后得到undefined——原因不是缺服務(wù)而是加載順序插件先于 web 半身。修法見上節(jié)ctx.inject(deps, callback)為該服務(wù)開一條獨(dú)立 fiber 使其待命避免在加載瞬間做一次性判斷。一句話總結(jié)硬依賴進(jìn) inject可選服務(wù)用 ctx.get 逐次讀晚到服務(wù)用 ctx.inject 開 fiber 等待。驗(yàn)證不出網(wǎng)、不消耗額度的離線套件上述每個行為都有常駐斷言守門改動后跑一條命令即可全量回歸npm test套件守住的行為scripts/retry-safety-test.mjs退避策略可持久化、429 不再自動重試、usage 計(jì)數(shù)scripts/picker-test.mjs選擇器只廣播可用模型、401 信任圍欄scripts/tui-test.mjs無 web server 的 composition 中插件照常啟動scripts/speed-stat-test.mjs任何一次調(diào)用不被平均成虛假的 tok/s全部離線不出網(wǎng)、不消耗免費(fèi)額度共享測試腳手架會把兩條免密來源默認(rèn)指向已關(guān)閉的本機(jī)端口。用量看板數(shù)據(jù)留在本機(jī)布局修復(fù)有對照統(tǒng)計(jì)只落在本機(jī)stats.json。早期看板有一處純視覺問題——Token 熱力圖格子間距過大、無法按周對齊修復(fù)后呈現(xiàn)連貫的貢獻(xiàn)圖譜觀感對應(yīng) issue #11布局本身已是列優(yōu)先周對齊只需 gap 歸零與圓角收小開發(fā)者速查清單? 內(nèi)核 import 只進(jìn) adapter/其余源碼保持純結(jié)構(gòu)消費(fèi)者? 頂層inject只聲明llm其余服務(wù)全部「可選」? 晚到的服務(wù)webServer 等用ctx.inject獨(dú)立 fiber不在 apply 時做一次性快照? 重試策略返回扁平的完整對象字段別嵌套? 發(fā)送前跑一遍工具配對修復(fù)覆蓋三種線協(xié)議? 每個修復(fù)配一條離線斷言用 npm test 防回歸掌握內(nèi)核接縫與 inject 的分層思路、避開這三個內(nèi)核行為的陷阱你就能在這個免費(fèi)模型插件上安全地做二次開發(fā)。更多背景見 README.md 的「實(shí)現(xiàn)結(jié)構(gòu)」與「已知邊界」兩節(jié)?!久赓M(fèi)下載鏈接】dsh-our-free-model在 dsh 里裝上這個插件即可無需登錄、注冊或填 API Key就能使用包括 DeepSeek V4.1 Flash、Kimi K3 在內(nèi)的前沿模型——完全免費(fèi)不限量。 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.項(xiàng)目地址: https://gitcode.com/gh_mirrors/ds/dsh-our-free-model創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考