本地 AI 工作流

如何用本地 AI 模型运行 Claude Code,同时不破坏 llama.cpp KV Cache(持续更新)

本地后端(例如 llama.cpp、llama-server 和 LM Studio)在提示词开头保持稳定时最快。如果 Claude Code 不断加入变化的 metadata 或 git context,后端可能无法命中 KV cache,于是又要重新 prefill 大段 system prompt。下面这套设置的目标,就是让提示词前缀更稳定。

TL;DR:直接用这个版本。

1. 启动 llama-server

/path/to/llama-server \
  --model /path/to/your-model.gguf \
  --jinja \
  --reasoning auto \
  --threads 12 \
  --n-gpu-layers 99 \
  --flash-attn on \
  --mlock \
  --cache-type-k q8_0 \
  --cache-type-v q8_0 \
  --cache-ram 24576 \
  --ctx-checkpoints 128 \
  --checkpoint-every-n-tokens 1024 \
  --slot-prompt-similarity 0.01 \
  --host 127.0.0.1 \
  --port 8080 \
  --parallel 1 \
  --cont-batching \
  --metrics \
  --slots

如果你使用 TurboQuant build,可以把 value cache 改成:

--cache-type-v turbo4

2. 启动 Claude Code

ANTHROPIC_BASE_URL=http://127.0.0.1:8080 \
ANTHROPIC_API_KEY=no-key \
ANTHROPIC_MODEL=your-model.gguf \
CLAUDE_CODE_ATTRIBUTION_HEADER=0 \
CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1 \
DISABLE_TELEMETRY=1 \
DISABLE_ERROR_REPORTING=1 \
claude --bare \
  --model your-model.gguf \
  --dangerously-skip-permissions \
  --exclude-dynamic-system-prompt-sections \
  --settings '{"includeGitInstructions":false}' \
  --allowedTools "WebFetch,Read,Edit,Write,Bash(curl:*)"

核心思路:减少动态 prompt 变化,前缀复用就会更稳定,重复 prefill 更少,本地 Claude Code 实验也会更快。

本地测试结果

为了验证这套设置,我们在一台 Apple M3 Max MacBook Pro 上,用 Qwen3.6 27B 模型跑了实验。我们让 Claude Code 多轮生成一个单文件 HTML 五子棋(Gomoku)游戏,然后检查 llama-server 的 timing output、prompt-eval tokens 和生成速度,确认 cache 行为是否正常。

MacBook 上本地 llama-server 和 Claude Code 设置,使用 Qwen3.6 27B 模型
这次五子棋测试使用的本地 llama-server + Claude Code 设置。

Claude Code 可以正常跑在本地 endpoint 上,而且 timing logs 显示:多轮请求里的 cache 问题已经被修复。

Claude Code 正在生成单文件 HTML 五子棋游戏
本地模型测试中,Claude Code 正在生成单文件五子棋游戏。
First request:
prompt eval time = 271184.95 ms / 34947 tokens

Next request:
selected slot by LCP similarity, sim_best = 0.989
restored context checkpoint
prompt eval time = 5136.44 ms / 441 tokens

Cache 证明:重复 prompt-eval 工作量从第一次请求的 34,947 tokens,降到下一次请求的 441 tokens;同时 llama-server 显示已经 restored the context checkpoint

Perfect! 我们也检查了记录侧。即使 Claude Code 指向本地第三方 provider,而不是 Anthropic,DataMoat 仍然捕获到了 work trail、token breakdown 和 thinking tokens,包括 Claude Code UI 里看不到的细节。

DataMoat 捕获 Claude Code 运行记录和 token 信息
本地 provider 测试中的运行记录和 token breakdown。

接着,我们测试 tool calling:让 Claude Code 打开 Chrome 并截一张图。

Claude Code tool-calling 测试,打开 Chrome 并截屏
在 cached 本地模型会话里,tool calling 也正常工作。
DataMoat 显示已捕获并加密的截图 artifact
截图 artifact 被 DataMoat 捕获并加密,即使 Claude Code UI 本身没有显示这个图片文件。

Amazing! 这说明在这套测试环境里,普通 coding turns 和 tool-calling turns 都能走通 cache 路径。

感谢阅读。我们会随着 llama-server、本地模型和 Claude Code 的变化持续更新这套设置。如果这些笔记有用,可以收藏或分享。