🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

NInfer 本地推理 averyjohnkucan-arch/dsh-ninfer

DeepSeek Harness
averyjohnkucan-arch15 天前有提交已提供中文文档扫描:含敏感能力

在对话界面管理本地模型与服务器配置档

30/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/21 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add averyjohnkucan-arch/dsh-ninfer
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么[目录]—
dsh 原生插件 · market
暂无时间戳·判据 →
装得上吗[实装验证]✓
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L4 · 真实安装等级说明 →
数据截至 2026/10/22·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/04·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 15 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →

可信度证据

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 102 处,展示前 81 条)
  • 发起网络请求
    client.js:9
    const response=await fetch('/api/dsh-ninfer',{credentials:'same-origin',method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(
  • 写入本地文件
    lib/runtime.js:27
    async init(){await mkdir(this.root,{recursive:true,mode:0o700});try{this.memoryBudgets=JSON.parse(await readFile(join(this.root,'memory-budgets.json')
  • 读取本地文件
    lib/runtime.js:27
    async init(){await mkdir(this.root,{recursive:true,mode:0o700});try{this.memoryBudgets=JSON.parse(await readFile(join(this.root,'memory-budgets.json')
  • 写入本地文件
    lib/runtime.js:28
    persist(){const snapshot=JSON.stringify({version:2,profiles:this.profiles},null,2)+'\n';this.writeQueue=this.writeQueue.catch(()=>{}).then(async()=>{c
  • 写入本地文件
    lib/runtime.js:28
    persist(){const snapshot=JSON.stringify({version:2,profiles:this.profiles},null,2)+'\n';this.writeQueue=this.writeQueue.catch(()=>{}).then(async()=>{c
  • 读取本地文件
    lib/runtime.js:32
    async list(){return {engine:this.engine,sharedScheduler:!!this.scheduler,customRuntime:this.runtimeCustom===true,runtimeKind:this.runtimeCustom===unde
  • 读取本地文件
    lib/runtime.js:33
    async browse(path=homedir()){if(!isAbsolute(path))throw new Error('Use an absolute host path.');const entries=await readdir(path,{withFileTypes:true})
  • 读取本地文件
    lib/runtime.js:33
    async browse(path=homedir()){if(!isAbsolute(path))throw new Error('Use an absolute host path.');const entries=await readdir(path,{withFileTypes:true})
  • 读取本地文件
    lib/runtime.js:35
    async source(p){const source=p.sourceDir||join(this.root,'engine','source');await access(join(source,this.engine==='strata'?'serve/server.py':'CMakeLi
  • 发起网络请求
    lib/runtime.js:51
    let old=this.running.get(id);if(old?.external){try{const response=await fetch(old.url+'/v1/models',{headers:this.serverHeaders(p),signal:AbortSignal.t
  • 读取本地文件
    lib/runtime.js:52
    if(!p.modelPath)throw new Error('Choose a model file first.');await access(p.modelPath);
  • 发起网络请求
    lib/runtime.js:58
    try{response=await fetch(url+'/v1/models',{headers:this.serverHeaders(p),signal:AbortSignal.timeout(2000)});}catch(e){if(e.name!=='TypeError'&&e.name!
  • 写入本地文件
    lib/runtime.js:96
    await writeFile(wrapper,'#!/bin/sh\nexport GGML_VK_VISIBLE_DEVICES='+quote(p.visionGpuIndex)+'\nexec '+quote(vexe)+' \"$@\"\n',{mode:0o700});
  • 写入本地文件
    lib/runtime.js:100
    const cfgPath=join(this.root,`run-${p.id}.json`);await writeFile(cfgPath,JSON.stringify(cfg,null,2),{mode:0o600});
  • 执行外部命令来自配置/变量
    lib/runtime.js:103
    const state={profile:p,url,fingerprint:profileFingerprint(p),log:'',ready:false,child:spawn(command,args,{cwd,env,detached:process.platform!=='win32',
  • 写入本地文件
    lib/runtime.js:112
    await writeFile(tmp,JSON.stringify(this.memoryBudgets),{mode:0o600});await rename(tmp,join(this.root,'memory-budgets.json'));
  • 删除本地文件递归
    lib/runtime.js:138
    case 'purge-cache':{this.purging=true;let release;try{if(this.starting.size||[...this.running.values()].some(state=>state.active>0))throw new Error('W
  • 发起网络请求
    lib/runtime.js:139
    case 'attach':{const p=this.find(payload.id);const url=`http://127.0.0.1:${p.port}`;const response=await fetch(url+'/v1/models',{headers:this.serverHe
  • 发起网络请求
    lib/speed-test.js:101
    const response = await fetch(state.url + path, {
  • 读取本地文件
    lib/recommended-models.mjs:10
    async catalog(){return JSON.parse(await readFile(this.catalogUrl,'utf8'));}
  • 写入本地文件
    lib/recommended-models.mjs:25
    await mkdir(directory,{recursive:true});
  • 写入本地文件
    lib/recommended-models.mjs:34
    await rename(temp,join(directory,'download-receipt.json'));
  • 读取本地文件
    lib/recommended-models.mjs:42
    const root=await realpath(directory),path=resolve(root,target);
  • 读取本地文件
    lib/recommended-models.mjs:44
    for(const part of [path,dirname(path)]){try{if((await lstat(part)).isSymbolicLink())throw Error('Model destination cannot be a symlink.');}catch(e){if
  • 写入本地文件
    lib/recommended-models.mjs:46
    for(const part of parts){cursor=join(cursor,part);await mkdir(cursor,{recursive:true});if((await lstat(cursor)).isSymbolicLink())throw Error('Model de
  • 读取本地文件
    lib/recommended-models.mjs:46
    for(const part of parts){cursor=join(cursor,part);await mkdir(cursor,{recursive:true});if((await lstat(cursor)).isSymbolicLink())throw Error('Model de
  • 读取本地文件
    lib/recommended-models.mjs:51
    if(git)git.update('blob '+(await lstat(path)).size+'\0');
  • 读取本地文件
    lib/recommended-models.mjs:52
    for await(const block of createReadStream(path,{signal})){sha.update(block);git?.update(block);}
  • 写入本地文件
    lib/recommended-models.mjs:66
    if(response.status===416&&file.size===offset){await this.digest(part,file,signal);await rename(part,path);job.received+=offset;return path;}
  • 写入本地文件
    lib/recommended-models.mjs:74
    await rename(part,path);return path;
  • 写入本地文件
    lib/kv-cache.js:9
    async function atomic(path,value){const temp=path+'.'+randomUUID()+'.tmp';try{const f=await open(temp,'wx',0o600);try{await f.writeFile(JSON.stringify
  • 删除本地文件
    lib/kv-cache.js:9
    async function atomic(path,value){const temp=path+'.'+randomUUID()+'.tmp';try{const f=await open(temp,'wx',0o600);try{await f.writeFile(JSON.stringify
  • 读取本地文件
    lib/kv-cache.js:19
    const path=join(item.dir,'index.json');let data;try{data=JSON.parse(await readFile(path,'utf8'));}catch(e){if(e.code==='ENOENT')return;throw e;}
  • 读取本地文件
    lib/kv-cache.js:26
    const root=join(this.root,area);let dirs;try{dirs=await readdir(root,{withFileTypes:true});}catch(e){if(e.code==='ENOENT')continue;throw e;}
  • 读取本地文件
    lib/kv-cache.js:28
    if(area==='chats')leaves=[parent];else {const subs=await readdir(parent,{withFileTypes:true});leaves=subs.filter(x=>x.isDirectory()&&/^[a-f0-9]{64}$/.
  • 读取本地文件
    lib/kv-cache.js:29
    for(const dir of leaves){let data;try{data=JSON.parse(await readFile(join(dir,'index.json'),'utf8'));}catch(e){if(e.code==='ENOENT'||e instanceof Synt
  • 删除本地文件
    lib/kv-cache.js:40
    if(entry.area==='chats'){entry.data.models=entry.data.models.filter(x=>x.file!==entry.item.file);await atomic(path,entry.data);}else await rm(path,{fo
  • 删除本地文件
    lib/kv-cache.js:41
    await rm(join(entry.dir,entry.item.file),{force:true});total-=entry.item.bytes;
  • 读取本地文件
    lib/kv-cache.js:47
    if(shard)for(const file of await readdir(dirname(profile.modelPath)))if(file.startsWith(shard[1]+'-')&&file.endsWith('-of-'+shard[2]+'.gguf'))paths.ad
  • 读取本地文件
    lib/kv-cache.js:48
    const files=[];const describe=async(path,depth=0)=>{const s=await stat(path);files.push({path,size:s.size,mtimeMs:s.mtimeMs,ctimeMs:s.ctimeMs});if(s.i
  • 写入本地文件
    lib/kv-cache.js:54
    async work(identity){const path=join(this.root,'work',identity);await mkdir(path,{recursive:true,mode:0o700});return path;}
  • 写入本地文件
    lib/kv-cache.js:55
    async manifest(sessionId){const dir=join(this.root,'chats',hash(String(sessionId)));await mkdir(dir,{recursive:true,mode:0o700});let data={version:1,m
  • 发起网络请求
    lib/kv-cache.js:66
    async slot(state,action,filename,headers,receipt){const response=await this.request(state.url+'/slots/'+(action==='save'?receipt?.slot??0:0)+'?action=
  • 发起网络请求
    lib/kv-cache.js:78
    const response=await this.request(state.url+'/slots',{headers,signal:AbortSignal.timeout(5000)});
  • 写入本地文件
    lib/kv-cache.js:81
    try{await copyFile(join(c.dir,c.file),target,constants.COPYFILE_FICLONE);await this.slot(state,'restore',filename,headers);await this.touch(c);state.k
  • 删除本地文件
    lib/kv-cache.js:82
    finally{await rm(target,{force:true});}
  • 写入本地文件
    lib/kv-cache.js:91
    await chmod(source,0o600);await syncFile(source);await rename(source,target);await syncDir(dir);
  • 写入本地文件
    lib/kv-cache.js:91
    await chmod(source,0o600);await syncFile(source);await rename(source,target);await syncDir(dir);
  • 删除本地文件
    lib/kv-cache.js:96
    for(const file of await readdir(dir))if(/^checkpoint-[a-f0-9-]+ kv$/.test(file)&&!models.some(m=>m.file===file))await rm(join(dir,file),{force:true})
  • 删除本地文件
    lib/kv-cache.js:99
    }finally{await rm(source,{force:true});}
  • 读取本地文件
    lib/engine-status.js:7
    const receipt = JSON.parse(await readFile(join(directory, 'dsh-runtime.json'), 'utf8'));
  • 读取本地文件
    lib/engine-status.js:15
    'compat/usr/lib/x86_64-linux-gnu/libcudart.so.13']) await access(join(directory, name));
  • 读取本地文件
    lib/engine-status.js:19
    const info = await stat(join(directory, file.name));
  • 读取本地文件
    lib/engine-status.js:32
    const receipt = JSON.parse(await readFile(join(directory, 'dsh-runtime.json'), 'utf8'));
  • 读取本地文件
    lib/engine-status.js:39
    await Promise.all(required.map(name => access(join(directory, name))));
  • 读取本地文件
    lib/engine-environment.js:9
    await access(join(directory, 'bundled-loader'));
  • 读取本地文件
    lib/engine-environment.js:18
    await access(compat);
  • 写入本地文件
    lib/config-transfer.js:113
    await mkdir(join(runtime.root, "imports"), { recursive: true });
  • 写入本地文件
    lib/config-transfer.js:122
    await mkdir(dirname(path), { recursive: true });
  • 删除本地文件递归
    lib/config-transfer.js:173
    await rm(directory, { recursive: true, force: true });
  • 执行外部命令来自配置/变量
    lib/process.js:6
    const child=spawn(command,args,{cwd,env:{...process.env,...env},stdio:['ignore','pipe','pipe'],detached:process.platform!=='win32'});
  • 发起网络请求
    lib/process.js:28
    try { const r=await fetch(url+'/v1/models',{signal:AbortSignal.timeout(1500)}); if(r.ok) return; } catch(e) { if(signal?.aborted) throw e; }
  • 读取本地文件
    lib/base-checkpoint.js:16
    const item=JSON.parse(await readFile(index,'utf8'));
  • 读取本地文件
    lib/base-checkpoint.js:18
    const info=await stat(join(dir,item.file));
  • 发起网络请求
    lib/base-checkpoint.js:33
    const response=await cache.request(state.url+'/v1/chat/completions',{method:'POST',headers:{...headers,'Content-Type':'application/json'},body:JSON.st
  • 写入本地文件
    lib/base-checkpoint.js:40
    await mkdir(dir,{recursive:true,mode:0o700});
  • 读取本地文件
    lib/base-checkpoint.js:42
    const saved=await cache.slot(state,'save',file,headers,receipt),info=await stat(source);
  • 写入本地文件
    lib/base-checkpoint.js:45
    await chmod(source,0o600);await sync(source);await rename(source,target);await sync(dir);
  • 写入本地文件
    lib/base-checkpoint.js:45
    await chmod(source,0o600);await sync(source);await rename(source,target);await sync(dir);
  • 写入本地文件
    lib/base-checkpoint.js:49
    await rename(temp,index);await sync(dir);
  • 删除本地文件
    lib/base-checkpoint.js:52
    }finally{await rm(source,{force:true});await rm(temp,{force:true});}
  • 读取本地文件
    lib/portable.js:14
    const before = await stat(path);
  • 读取本地文件
    lib/portable.js:27
    for await (const block of createReadStream(path, {
  • 读取本地文件
    lib/portable.js:40
    const after = await stat(path);
  • 读取本地文件
    lib/portable.js:63
    const info = await stat(entry.path);
  • 读取本地文件
    lib/portable.js:65
    if ((await stat(entry.path)).size !== info.size)
  • 读取本地文件
    lib/portable.js:144
    if (!(await stat(root)).isDirectory())
  • 读取本地文件
    lib/import-config.js:8
    if(value.startsWith('/opt/prod/')){const target=root+value.slice('/opt/prod'.length);try{await access(target);return target;}catch(e){if(e.code!=='ENO
  • 读取本地文件
    lib/import-config.js:9
    if(value==='/usr/local/cuda-13.1/lib64'||value==='/usr/local/cuda/lib64'){try{await access(value);return value;}catch(e){if(e.code!=='ENOENT')throw e;
  • 读取本地文件
    lib/import-config.js:17
    const raw=await readFile(path,'utf8');const original=JSON.parse(raw);if(!Array.isArray(original.args)||!original.exe)throw new Error('Choose a Strata
  • 读取本地文件
    lib/import-config.js:28
    const required=[normalized.executable,normalized.sourceDir,normalized.modelPath,normalized.packPath,normalized.tokenizerPath,normalized.mtpPath,normal
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

社区实装还没有人打卡 · 装过的第一个就是你
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-llm@deepseek-ai/dsh-tools@deepseek-ai/dsh-llm-pi-ai@deepseek-ai/schemastery@deepseek-ai/dsh-sandbox
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

为 DeepSeek Harness 提供本地推理服务商和模型管理。

README

由 DeepSeek 最新模型翻译生成
适用于 DeepSeek Harness 的 NInfer 在 DSH 内管理本地 NInfer 模型和可编辑的服务器配置档。内含随附的 Qwen3.8 27B 262k 参考配置。 在 DSH 中安装 需要 DeepSeek Harness 0.2.1-rc.2,并运行其 Web 配置档。 1. 打开 Plugins → Add plugin → GitHub。 2. 粘贴 https://github.com/averyjohnkucan-arch/dsh-ninfer。 3. 安装并启用插件。刷新浏览器;如果管理器要求,就重启 DSH。 4. 打开 Settings → Models → NInfer。 插件是可直接安装的 Cordis 包。它不会给 DSH 打补丁,不替换 DSH 的 UI,不安装第二个 DSH,也不需要编译插件。它的包使用 DSH 自带的 peer 依赖,因此安装时不会下载另一套服务商依赖栈,也不会要求运行服务商依赖的构建脚本。 模型 点 Add model,再点 Select model files。浏览宿主机的模型目录,选中多个文件,或者点 Select all model files here。切换目录时,已选内容会保留。Inspect and assign 会读取文件头,分配主模型、按顺序排列的分片、视觉投影器和 MTP。
展开完整文档(README 剩余 1 节)
适用于 DeepSeek Harness 的 NInfer

在 DSH 内管理本地 NInfer 模型和可编辑的服务器配置档。内含随附的 Qwen3.8 27B 262k 参考配置。

在 DSH 中安装

需要 DeepSeek Harness 0.2.1-rc.2,并运行其 Web 配置档。

1. 打开 Plugins → Add plugin → GitHub。
2. 粘贴 https://github.com/averyjohnkucan-arch/dsh-ninfer。
3. 安装并启用插件。刷新浏览器;如果管理器要求,就重启 DSH。
4. 打开 Settings → Models → NInfer。

插件是可直接安装的 Cordis 包。它不会给 DSH 打补丁,不替换 DSH 的 UI,不安装第二个 DSH,也不需要编译插件。它的包使用 DSH 自带的 peer 依赖,因此安装时不会下载另一套服务商依赖栈,也不会要求运行服务商依赖的构建脚本。

模型

点 Add model,再点 Select model files。浏览宿主机的模型目录,选中多个文件,或者点 Select all model files here。切换目录时,已选内容会保留。Inspect and assign 会读取文件头,分配主模型、按顺序排列的分片、视觉投影器和 MTP。它会报告缺失的分片、混入不同主模型的文件集,以及不支持的 MTP 格式。

编辑配置档并保存。Start 会先准备好缺失的运行时/模型包,再启动服务器。运行时安装和模型准备都会显示进度,并且可以取消。已安装的引擎和已准备好的包,可以在 Runtime and imported model data 下选择。保存后,模型会出现在 DSH 的对话模型选择器里。

Edit 重新打开已保存的配置档。Remove profile 删除已保存的配置,并停止它拥有的进程;已下载的模型文件会保留。Attach running server 会显式连接一个已在运行的服务器,该服务器需对外公布配置档中的模型 ID。停止或禁用挂接只会断开连接,绝不会终止外部进程。启动设置不会应用到外部服务器。

固定版本可执行文件的帮助里列出的所有推理参数,在 All engine CLI options 下都有对应控件。留空表示使用引擎默认值;布尔项的 Omit flag 表示不传这个参数,并不代表引擎默认启用的功能一定被关闭。完整的 JSON 编辑器支持用数组表示重复参数,用 {"argv":["first","second"]} 表示多值参数。附加 argv 是数组,绝不是 shell 字符串。环境变量和完整的服务器配置也可以编辑。

更新、禁用与移除

通过 DSH 的插件管理器,分别更新每个仓库。关掉开关,就会移除它的卡片、服务商注册和工具,并停止它拥有的服务器。移除包即可卸载它的代码。已保存的配置档和运行时数据仍留在 ~/.dsh/dsh-ninfer/(或 $DSH_HOME/dsh-ninfer/),重装后会自动恢复。想彻底重置,就单独删除这个插件拥有的数据目录。两个插件互不依赖。

集成

包中声明了 dsh.bundle.patch 和 dsh.client;补丁只插入自己的 Cordis 行。客户端通过文档中给出的 settings.models.footer 槽位注册 React UI,并使用 DSH 主题 token 和 locale 服务。Host 通过 ctx.llm.registerAdapter 注册 LlmAdapter,把 wire 转换、图片和重放交给 DSH 公开的 PiAiAdapter,并单独持有一条 ctx.webServer.register 路由。一个临时 bearer 能力通过 webserver/index-inject 提供,用来保护它的 JSON 操作。没有 iframe,没有 DOM 注入,也不替换内置服务商卡片。

注册和进程生命周期由 ctx.effect/ctx.on 管理。面向智能体的 ninfer_models 工具使用与卡片相同的操作,以及 DSH 的 approveEscalation 机制;host 管理类调用需要 Full 访问权限,或每次调用单独审批。UI 操作需要所有者页面能力。这个初始版本面向本地 Web 配置档;远程委托访问和仅 Electron 的配置档尚未验证。

开发

pnpm install --ignore-scripts
pnpm test
pnpm run check

需要 Node 22.19+。开发用的服务商依赖可能报告跳过可选安装脚本;发布后的插件没有安装脚本,直接使用 DSH 已安装的 peer 包。两个仓库各自包含代码和测试,可以分开开发。

NInfer 运行时

引擎:iamwavecut/ninfer-all,测试所用源码版本 5ed86dff9fe3a5a0776f40a7aea86cf381da990d。

运行时安装器从固定的公开 OCI 镜像下载测试过的 Linux x86_64 Blackwell sm120a 可执行文件。下载后先校验镜像清单摘要和运行时层摘要,再在预期的架构路径下解压常规文件。其他 GPU/平台需要在卡片里选择一个兼容的现有 ninfer-serve 可执行文件。主机仍需提供对应的 CUDA 和多媒体共享库;缺库失败会显示在操作日志里。模型权重从不包含在内,也不会静默下载。

镜像清单:sha256:1f59c4a8285c7c0f9ccb6e5645d112db39956718df9065837ce2a6a3832c6aa9。
运行时层:sha256:53b3ce944aa9ddbe64b46380affd2e3f45e28ba93b316f2f85ec7f664e0fc9ff。

NInfer 使用 .ninfer 产物。本插件不实现 GGUF 到 NInfer 的转换。NInfer 的服务端参数、校准操作、环境变量以及可选的临时电源配置档保持都已暴露。校准由用户触发,并保存其配置档路径。本插件不做自动调优。

附带的 Qwen3.8 27B 参考配置档

初始配置档保留所有者提供的设置:

--max-context 262144 --kv-capacity 262144 --max-concurrency 1
--kv-dtype rk4v4 --spec dflash2 --draft-tokens 7 --lm-head-draft
--embedding-q4 --gdn-state-fp16 --prefill-cublas --prefill-chunk 512
--ngram-draft-tokens 0
它使用模型 ID qwen3.8-27b、端口 8188、纯文本输入、性能电源配置档保持,以及随附的环境/校准路径。所有者的绝对路径是可编辑的参考;其他安装必须选择自己下载的产物和运行时库。

模型:neroued/Qwen3.8-27B-NInfer,修订版本 1cbd84e7221e51186bd7f093a149912d2489625b,随附 SHA-256 81f924d440c27261d820c19a9f8d45794c5aee410f8a68bd358133fa8c0375da。

报告的基准数字来自所有者此前的运行,不声称是新的插件基准。导入此配置档时没有重新运行任何模型推理或校准。重新安装插件会保留已编辑的配置档;只有在配置档存储不存在时才创建种子。

当 Start 或聊天在已保存端口上发现现有服务器时,只有当 /v1/models 公布与已保存模型 ID 完全一致的模型时,才会自动复用它。插件从不接管该进程:Stop 只是断开连接,已保存的启动更改需要你自行重启外部服务器。模型不同、响应无效,或认证服务器没有匹配的凭据,都会被拒绝。Strata 调优需要插件拥有的服务器,绝不复用外部进程。

按模型的推理设置

编辑模型配置档,添加/删除推理级别,为每个级别设置显示名称,并设置精确的 reasoning_effort 后端值。选择默认级别,或选择 Engine default 让请求不指定。支持自定义名称和值;可用性按配置档声明,不假设每个模型都具备。引擎/模板必须接受配置的后端值。

Qwen3.8 配置档初始为 Low → low、Medium → medium 和 XHigh → xhigh,默认 Medium。对话模型选择器通过 DSH 现有的适配器推理元数据使用这些配置档自有设置。无需 DSH 核心补丁。级别列表为空会隐藏该配置档的推理选择器。

Model Scheduler 集成

可选安装 dsh-model-scheduler,以获得共享 GPU 准入、排队聊天切换、手动加载/卸载和可配置的 30 秒空闲超时。此服务商仍可独立使用。调度策略位于那个独立的 Cordis 服务中;无需 Harness 核心更改。报告 GPU 释放前,会停止拥有的引擎进程组。外部服务器只是断开连接,绝不杀死。

DFlash2 缓存限制

调优后的 DFlash2 配置档保持不变。NInfer 明确拒绝 DFlash/DFlash2 的磁盘会话持久化;因此此插件不添加任何不受支持的检查点标志或替代 MTP 配置档。服务器运行时,其原生内存复用仍然可用。卸载或重启引擎需要重建其缓存。
预览分享卡片长什么样 ↓averyjohnkucan-arch/dsh-ninfer
分享 · DeepSeek Harness Hub
averyjohnkucan-arch/dsh-ninfer

在对话界面管理本地模型与服务器配置档

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部