shaomang/mtnode-aio/llama-local-install
Claude Code and agent skill by shaomang/mtnode-aio
- community
Checking that the SKILL.md file is still in the repository.
在用户指定目录安装 llama.cpp 本地模型后端:创建 venv、安装 Python 依赖、下载 llama-server(CUDA/CPU)、建立多模型管理服务契约(GGUF 目录/下载/部署/OpenAI 兼容代理 + API Key 鉴权)、冒烟验证。含自我修复指引。
Install
npx vskill@latest install shaomang/mtnode-aio/llama-local-installSKILL.md
llama.cpp 本地模型插件 — 安装 / 修复
当用户或 MTNode 插件要求在某目录安装 / 自我修复 llama.cpp 本地模型管理后端 时使用本 skill。
插件调用时:
- 当前工作区就是 `INSTALL_DIR`,可直接读写并执行命令
- `SCAFFOLD_REF`(或 `.scaffold-ref`)仅作参考:内置脚手架/脚本是示例实现,不是已完成的安装。请按下方目标自行准备目录;可按需从参考路径复制或改写,也可等价实现
- 不要假设插件已替你复制好脚手架
- 若任务附带 CONSOLE_LOG(插件 console 最近日志),优先根据日志定位并修复,不要盲目重装全部模型
目标
在 INSTALL_DIR 建立可运行的 llama.cpp 本地管理服务(FastAPI 管理 + llama-server 多模型编排),供 MTNode 插件启停。
完成后应满足:
INSTALL_DIR\.venv\Scripts\python.exe存在且import fastapi; from app import server成功INSTALL_DIR\bin\llama-server.exe存在(官方 llama.cpp release,CUDA 构建优先,CPU 兜底)INSTALL_DIR\models\目录存在(GGUF 模型库)INSTALL_DIR\.api-key存在(管理服务 API Key,插件与调用方以Authorization: Bearer <key>鉴权)- 不要启动
python -m app或llama-server推理进程(启停由插件负责)
目录约定
INSTALL_DIR/app/— Python 管理服务(python -m app <port>;含 server.py / models.py / catalog.py / gpu.py / __main__.py)INSTALL_DIR/.venv/— 虚拟环境INSTALL_DIR/bin/—llama-server.exe等 llama.cpp 二进制INSTALL_DIR/models/— GGUF 模型文件,按models/<modelId 的 /→__>/布局(如google/gemma-4-E4B-it→models/google__gemma-4-E4B-it/)INSTALL_DIR/.api-key— API Key 鉴权文件(服务启动时若无则自动生成;插件在服务未起时也读它作回退)INSTALL_DIR/.registry.json— 模型注册表(models: [{id, kind, ggufRepo, ggufFile, quant, chatTemplateFile, status, downloadedAt...}])INSTALL_DIR/.deployed.json— 部署实例(instances: [{modelId, servedName, port, pid, vramGb, status, startedAt, error...}])INSTALL_DIR/.want-deployed.json— 期望常驻模型 id 列表(服务重启后restore_wanted_deploys自动恢复部署)INSTALL_DIR/logs/llama-<port>.log— 各 llama-server 实例日志(部署失败排查入口)INSTALL_DIR/templates/— 脚手架附带的 chat template(gemma-4-it.jinja等)INSTALL_DIR/requirements.txt— 管理服务依赖(fastapi、uvicorn[standard]、httpx、pydantic、huggingface_hub)INSTALL_DIR/scripts/install.ps1— 参考安装脚本(国内 pip 镜像 + 下载 llama.cpp release)SCAFFOLD_REF— 内置脚手架参考路径(可复制 app/scripts/requirements/templates/manifest)
国内镜像(必须)
中国大陆网络下,以下镜像必须使用:HuggingFace 无法直连,Python 库必须走清华/中科院镜像,GitHub Releases 可能无法直连。
- pip:清华
https://pypi.tuna.tsinghua.edu.cn/simple(--trusted-host pypi.tuna.tsinghua.edu.cn)→ 失败回退阿里云https://mirrors.aliyun.com/pypi/simple/→ USTChttps://mirrors.ustc.edu.cn/pypi/simple/→ 官方https://pypi.org/simple(官方只做最后一级兜底)。 - 反制机器级 pip.ini:用
PIP_INDEX_URL/PIP_EXTRA_INDEX_URL/PIP_TRUSTED_HOST环境变量在安装子进程内覆盖(宿主cn-mirrors.js的installEnv()已统一注入),绝不改用户机器上的 pip.ini。 - 不要用 `pip --isolated`:它忽略环境变量与用户级 config,机器级
extra-index-url = https://pypi.ngc.nvidia.com(NVIDIA PyIndex 常塞,国内 DNS 直接失败)照样生效。 - 模型权重(GGUF):优先 ModelScope(魔搭) → 失败回退
HF_ENDPOINT=https://hf-mirror.com+HF_HUB_DISABLE_XET=1→ 最后一级才是官方huggingface.co(HuggingFace 直连不可靠)。 - GitHub Releases(llama.cpp 二进制 zip):直连失败按
https://ghfast.top→https://gh-proxy.com→https://ghproxy.net顺序回退代理前缀,最后才直连(cn-mirrors.js的ghProxyUrls()) - 二进制镜像:
https://registry.npmmirror.com/-/binary/(node / python-build-standalone / chrome-for-testing 一类预编译产物) - 安装示例:
``powershell .venv\Scripts\python.exe -m pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn ` (宿主已注入 PIP_*,**不要加 --isolated**;手工跑时先在当前 shell 设 PIP_INDEX_URL / PIP_EXTRA_INDEX_URL / PIP_TRUSTED_HOST`。)
脚本语言与编码(必须:零中文 + 钉死 UTF-8)
宿主用powershell.exe(Windows PowerShell 5.1)跑scripts\*.ps1。而 UTF-8 无 BOM 的 `.ps1` 在中文 Windows 上会被按 GBK(cp936) 解码 —— 中文变成乱码字节,还会吞掉紧跟的}/'/",脚本直接语法崩(本轮改前实测:breeze 10 处、sensenova 113 处、yue 42 处、tts 15 处、llama 3 处、h3 download_models 6 处 + repair_torch_kitchen 1 处语法错),控制台同时一片乱码。
scripts\*.ps1/scripts\*.cmd与安装期辅助*.py(如download_weights.py/probe_attention.py)一律纯 ASCII 英文:注释、消息、异常文本全英文;不许有中文、全角标点、——、制表线─、emoji。.ps1开头(param 块之后)必须钉死编码三行,.cmd在setlocal后加两行:
``powershell try { [Console]::OutputEncoding = New-Object System.Text.UTF8Encoding($false) } catch { } $OutputEncoding = New-Object System.Text.UTF8Encoding($false) $env:PYTHONIOENCODING = 'utf-8' ``
``bat chcp 65001 >nul set "PYTHONIOENCODING=utf-8" ``
这样脚本自身与 pip / git / python 的输出都按 UTF-8 出去,宿主(用 UTF-8 解码 stdout,并按 [llama-install] progress: 抓进度)看到的就是正常文本。
- 这条纪律已是硬守卫:
AGENTS.md的「协作约定」钉了它,test/smoke-install-scripts.js会自动扫描全部*-pack的.ps1/.cmd/.bat、*-pack/scripts/**/*.py、共享真源pack-steps/与pack-python/、以及项目scripts/下的.ps1/.cmd/.bat—— 任一字节 > 0x7F(中文、全角标点、emoji、→、制表线)或带 BOM 即硬失败。改脚本后必须跑node test/smoke-install-scripts.js(同时还钉 GBK(cp936) 与 UTF-8 双解码解析零错、进度前缀与reason=等 ASCII 契约仍在);后端运行时 Python(*-pack/app/**、*-pack/shims/**)豁免,仍是中文。 - Python 后端(
app/*.py的启动横幅与日志)本轮不做零中文,仍是中文,靠上面的 UTF-8 钉死正确显示。
安装步骤(按序)
- 准备工程文件
若缺 app/server.py / app/models.py / app/catalog.py / scripts/install.ps1 / requirements.txt / manifest.json / templates/:从 SCAFFOLD_REF 复制或按参考自行生成。保留用户已有的 .venv / bin / models / .registry.json。
- 探测 Python 3.10+(install.ps1 依次试
py -3.10/-3.11/-3.12,再python)
- 创建 venv 并安装依赖、下载 llama-server(可参考
SCAFFOLD_REF\scripts\install.ps1)
``powershell cd INSTALL_DIR powershell -ExecutionPolicy Bypass -File .\scripts\install.ps1 -InstallDir INSTALL_DIR `` 脚本会:
- 创建
.venv并用国内镜像安装requirements.txt - 从
manifest.json的llamaRelease(默认b10566)下载llama-<release>-bin-win-cuda-12.4-x64.zip,失败依次回退cuda-13.3、cpu包;GitHub 直连失败自动走ghproxy.com前缀镜像 - 解压到
bin/,递归查找llama-server.exe拍平到bin\llama-server.exe pip uninstall -y uvloop(vLLM 迁移残留会致管理服务启动即退出)- 冒烟
import fastapi; from app import server,创建models/与.install-ok
- 冒烟测试
``powershell .\.venv\Scripts\python.exe -c "import fastapi; from app import server; print('ok')" Test-Path .\bin\llama-server.exe ``
- (按需)放置/下载测试模型 GGUF
模型管理走管理 API(见下节);也可直接把 GGUF 放进 models/<id__>/——管理服务启动时会 scan_existing_models() 自动扫描注册。参考 google/gemma-4-E4B-it:
- GGUF 源:优先
unsloth/gemma-4-E4B-it-GGUF的gemma-4-E4B-it-Q8_0.gguf(显存不足回退gemma-4-E4B-it-Q4_K_M.gguf),再回退daniloreddy/...、mradermacher/...(以app/models.py的GGUF_SOURCES为准) - Gemma 4 必须有 `chat_template.jinja`(从
google/gemma-4-E4B-it拉取,或复制脚手架templates/gemma-4-it.jinja) HF_ENDPOINT=https://hf-mirror.com+HF_HUB_DISABLE_XET=1;若该目录已有.gguf则跳过- 自我修复且模型已齐全时跳过本步
- 部署时(由插件负责,勿在此步启动):
--jinja --chat-template-file .../chat_template.jinja、--temp 1.0 --top-p 0.95 --top-k 64 --reasoning off;不要硬编码-c 8192(让 llama.cpp 自动设置上下文)
- 标记完成
- 创建空文件
INSTALL_DIR\.install-ok - 写入
INSTALL_DIR\.llama-agent-result首行ok=true - 不要启动管理服务或 llama-server
插件的模型登记链(改这段代码前先读)
单一真源 = llama/provider-sync.js(零依赖,主进程与托盘进程共用);写盘走 config-providers.js 的 mergeManagedProvider(..., { pruneUnknown: true })。
- 什么进 MTNode 的模型列表:本机已下载的全部 GGUF(不是只 running)。状态四条:
running(运行中)/ starting(加载中)/ downloaded(未部署)/ failed(加载失败); 模型 id 用 servedName(末段 + 点换横线,与管理服务 _instance_for_model 同一规则)。
- 增与删:插件托管的那份由插件增删(停止 / 删除的模型会从列表消失);用户在设置里手加的
额外模型与手排序保留(托管清单记在服务商条目的 llamaManagedModels 字段里)。
- apiKey:在线以
/api/status为准;离线回退<installDir>/.api-key;两者都拿不到就不覆盖
盘上旧值(历史上这里存过另一份安装目录的旧票,导致「列表里有、选了 401」)。
- 即时生效:写盘后广播
llama:providerSynced,渲染层就地重绘已打开的设置页 / 服务商卡。 - 托盘路径:MTNode 没开着时托盘自己开控制台,
preload-tray.js的syncProvider→
llama:syncProvider → 托盘宿主合并写 config.json + 写 .provider-dirty.json;主进程每 3 秒消费 该信号(startProviderDirtyWatch)重新登记并刷新界面。
- 运行前闸门:
ensureModel()(llama:ensureModel)——后端没起就先起,只释放空闲的其它本地
后端(waitBusyMs: 0,绝不打断正在跑的任务),再 POST /api/models/deploy,轮询到 running 上限 10 分钟;失败如实返回原因,不自动换模型。主进程 api:call / api:callStream / dsh:run 三条路都在发请求前过这道闸门。
- 安装目录冲突:
/api/status的installRoot≠ 插件配置的installDir⇒ 不静默复用;
登记里的 llamaSync 会同时给 mismatch(两份目录事实不同)与 conflict(这个差异还没被用户裁决); 插件卡片据此出告警,用户选「换端口起自己的」(挑空闲端口后启动配置目录那份)或「继续用这份」 (写 reuseExternal: true,此后以端口上那份为准,conflict 变 false 而 mismatch 仍 true)。
- 接口注册:
llama:ensureModel(运行前闸门,主进程 api:call / api:callStream / dsh:run 都会先过)、
llama:deployModel / llama:stopModel(设置里模型行的两颗按钮;停止按 servedName→modelId 解析后再调 /api/models/stop,否则服务端会「200 但 stopped:false」)、llama:resolveRootChoice(mode)。 真机自验脚本:node test/_verify-llama-registry.cjs(真起后端 + 真部署一个 GGUF,手动跑)。
管理服务 API 契约(插件依赖,实现 app/ 时勿缺)
以 SCAFFOLD_REF 的 app/ 为权威实现;若自行生成需覆盖以下契约,否则插件面板/画布节点/模型下载部署不可用:
- 端口:管理
8765(envLLAMA_API_PORT);每个已部署模型在 8100 起分配独立推理端口(llamaPortBase,占用自动跳过)。插件以GET /api/health探测存活 - 鉴权:
.api-key内容作 Bearer token(X-API-Key头亦可);除/api/health免鉴权外,其余接口校验Authorization: Bearer - 端点:
GET /api/health→{"ok": true, "engine": "llama.cpp"}(免鉴权,插件存活探测)GET /api/status→{"apiBase": "http://127.0.0.1:8765/v1", "manageBase", "apiKey", "port", "installRoot", "deployed", "deployedModels", "gpu", "allocatedVramGb"}。插件登记 MTNode 模型列表时:清单以 `/api/models`(本机注册表,含已下载未部署的)为准,deployed逐条给状态(running / starting / failed),deployedModels只剩「运行中实例的 servedName」这一条兼容用途;apiKey是在线时唯一权威的 key;installRoot是本进程的脚手架根目录,用于认出「端口上这份是不是插件配置的那一份」(不一致时插件卡片出告警让用户选,不静默复用)GET /api/gpu(GPU 状态 + 已分配显存)GET /api/catalog(HF GGUF 搜索:q/kind/limit/sort/sizeBand/recentOnly,精选列表置顶,走 hf-mirror)+GET /api/catalog/detail?modelId=GET /api/models(本地注册表);POST /api/models/download(body{modelId, kind?, pipelineTag?});POST /api/models/deploy(body{modelId});POST /api/models/restore(恢复.want-deployed.json期望常驻的模型);POST /api/models/stop(body{modelId});DELETE /api/models/{modelId}(停 + 删权重目录 + 移出注册表)POST /api/shutdown(插件停止时调用:stop_all(clear_want=True)后优雅退出)- OpenAI 兼容:
GET /v1/models+/v1/{path}(chat/completions 等)→ 代理到运行中实例:按 bodymodel匹配 servedName;未指定且仅一个运行实例则用它;无运行实例503 no_running_model;实例端口失联502 engine_unreachable;SSE 流(text/event-stream)透传 - 部署参数:
llama-server -m <gguf> --host 127.0.0.1 --port <8100+> -ngl 99;Gemma 4 追加--jinja --chat-template-file <chat_template.jinja>(或--chat-template)与--temp 1.0 --top-p 0.95 --top-k 64 --reasoning off;部署后做 warmup 小请求(1+1、max_tokens: 16)确认权重加载后才置running;部署前按vramGb校验显存(不足返回insufficient_vram) - 启动扫描:服务启动时
scan_existing_models()把models/下已有 GGUF 自动注册进.registry.json(子目录名__还原为/),并为 Gemma 4 补chat_template.jinja - 失败排查:实例卡
starting/failed→ 看logs/llama-<port>.log尾部含 error 的行
自我修复模式(CONSOLE_LOG 已由插件提交给 dsh)
- 以「最近失败焦点」为准判断根因;更早日志仅参考。
- 常见修复:
- 缺
llama-server.exe→ 重跑install.ps1或手动下载 release 到bin/(CUDA 构建失败换 CPU 包) - pip 失败 → 换国内镜像重装 requirements
- import 失败 → 检查 venv 与
app/是否完整 - 管理服务启动即退出 /
uvloop报错 →pip uninstall -y uvloop(vLLM 迁移残留),并确保app/server.py使用loop="asyncio" - 模型下载失败 → 核对
GGUF_SOURCES的 repo/文件名与 hf-mirror 可达性,逐级 fallback 源重试;Gemma 4 缺chat_template.jinja则补 - 部署失败/卡
starting→ 看logs/llama-<port>.log;engine_start_timeout/engine_warmup_timeout多为显存不足(insufficient_vram或并发部署超vramGb)或 GGUF 损坏/量化与构建不匹配;先POST /api/models/stop释放再重试 503 no_running_model→ 没有运行中实例(未部署或部署失败);502 engine_unreachable→ 实例进程在但端口失联,查对应 log 与端口占用
- 已下载 GGUF 勿删;仅修 venv / bin / 脚本 / 注册表。
- 冒烟后写
.install-ok与.llama-agent-result;回复repair_ok=1。 - 不要启动
python -m app或llama-server。
约束
- 不要启动管理服务或推理进程(启停由插件负责)。
- 不要删除用户已有的
models/权重(除非损坏且任务明确要求重下)。 - 磁盘不足时先警告用户再继续(单模型 Q4 约 3–5GB,建议预留 ≥20GB)。
成功标准
INSTALL_DIR\.install-ok存在.venv\Scripts\python.exe -c "from app import server"成功bin\llama-server.exe存在.api-key存在- 写入
.llama-agent-result(ok=true);失败写ok=false+reason= - 回复:
install_ok=1、venv_ok=、llama_server=、model_gguf=(若已下载)
Security
- Security scanPassed, 95 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingskills/llama-local-install/SKILL.md
Popularity
- 7-day trend score
- 5
Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/shaomang/mtnode-aio/llama-local-install)