Claude Code 接 llama.cpp 本地模型:能跑,但 32K 上下文先被吃掉一半

llama-server 自带 Anthropic 兼容接口,Claude Code 改个地址就能连本地模型。我们在 6GB 笔记本上跑通了;但它的系统提示词约 1.6 万 token,小上下文模型上会出现“Prompt is too long”。

原理

llama-server 提供 POST /v1/messages,也就是 Anthropic Messages 兼容接口;要用工具调用,必须加 --jinja。Claude Code 通过环境变量 ANTHROPIC_BASE_URL 改请求地址。

我们实际用的启动方式

服务端(WSL2,RTX 3060 Laptop 6GB,llama.cpp 9655061):

llama-server -m LFM2.5-24B-A2B-QAD-Q4_0.gguf --alias lfm25 \
  --host 127.0.0.1 --port 8080 \
  -c 32768 -ngl 99 -ncmoe 36 -fa on -ctk q8_0 -ctv q8_0 -np 1 \
  --jinja --metrics --no-webui -t 10

客户端:把模型名设成服务端的 --alias。Base URL 指向 http://127.0.0.1:8080,token 填假值,不连云端。我们实测用的配置(settings.json,用 CLAUDE_CONFIG_DIR 指到单独目录):

{
  "model": "lfm25",
  "env": {
    "ANTHROPIC_BASE_URL": "http://127.0.0.1:8080",
    "ANTHROPIC_AUTH_TOKEN": "local-fake",
    "ANTHROPIC_API_KEY": "",
    "ANTHROPIC_MODEL": "lfm25",
    "ANTHROPIC_SMALL_FAST_MODEL": "lfm25",
    "ANTHROPIC_DEFAULT_HAIKU_MODEL": "lfm25",
    "ANTHROPIC_DEFAULT_SONNET_MODEL": "lfm25",
    "ANTHROPIC_DEFAULT_OPUS_MODEL": "lfm25",
    "CLAUDE_CODE_MAX_CONTEXT_TOKENS": "32768",
    "CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "1",
    "DISABLE_TELEMETRY": "1"
  }
}

HAIKU/SONNET/OPUS 和 SMALL_FAST 都要指到本地模型,否则 Claude Code 的后台小任务仍会去找云端模型名。CLAUDE_CODE_MAX_CONTEXT_TOKENS 要和服务端 -c 一致。

claude -p --model lfm25 --dangerously-skip-permissions "修好 calc.py 里的 bug,让 pytest 通过"

--dangerously-skip-permissions 会跳过所有权限确认,只在一次性的测试目录里用。

要预期的问题

  1. 上下文:第一次请求,llama-server 日志里的提示词就有约 15,800 tokens,读完用了 48.8 秒。32K 上下文只剩一半。
  2. 压缩失败:LFM 修 bug,3 次里有 2 次报:
   Prompt is too long · automatic compaction failed: summarization produced empty response
  1. 假完成:换成 Qwen3.6-35B,它在两道题上回复“已完成”,但目录里没有文件。一定要自己检查产物。

上下文还能往上开,代价是显存和速度,我们没测更大的值。如果只是想用本地模型写代码,同样的条件下 pi 12 项全过,每次请求的提示词约 1.4k。

相关

常见问题

Claude Code 能用本地模型吗? 能。llama-server 提供 Anthropic 兼容的 /v1/messages,设置 ANTHROPIC_BASE_URL 指向它即可;需要加 --jinja 才能调用工具。

为什么报 Prompt is too long? Claude Code 首次请求约 15,800 tokens,32K 上下文被占一半,多轮后压缩失败。

参考资料