Local Agentic Programming on the Cheap: Claude Code + Ollama + Gemma4
TL;DR · AI 摘要
Gemma 4 26B MoE 在多代理编程任务中表现优异,结合 Ollama 和 Claude Code 可构建本地高效代理系统。
核心要点
- Gemma 4 26B MoE 在 τ2-bench 上得分 79%,显著优于 Gemma 3 27B 的 6.6%。
- Gemma 4 采用 Apache 2.0 许可,允许商业使用,降低法律风险。
- Ollama 可本地运行 Gemma 4,减少 API 调用和成本。
结构提纲
按章节快速跳转。
- §引言
文章介绍了如何使用 Ollama、Gemma 4 和 Claude Code 构建本地代理编程系统。
Gemma 4 在 τ2-bench 和 LiveCodeBench v6 上表现优异,且采用 Apache 2.0 许可。
使用第三方 API 会导致成本增加和法律风险,本地运行 Gemma 4 是解决方案。
文章详细介绍了如何配置 Ollama、Modelfile 和 settings.json 以实现本地代理系统。
思维导图
用一张图看清主题之间的关系。
查看大纲文本(无障碍 / 无 JS 友好)
- 本地代理编程系统
- Gemma 4
- 26B MoE 模型
- Apache 2.0 许可
- τ2-bench 79% 分数
- Ollama
- 本地运行 Gemma 4
- Claude Code
- 集成到代理系统
金句 / Highlights
值得收藏与分享的关键句。
Gemma 4 26B MoE 在 τ2-bench 上得分 79%,显著优于 Gemma 3 27B 的 6.6%。
Gemma 4 采用 Apache 2.0 许可,允许商业使用,降低法律风险。
Ollama 可本地运行 Gemma 4,减少 API 调用和成本。
低成本本地智能代理编程:Claude Code + Ollama + Gemma4 - KDnuggets
publ: 2026年6月10日
- 博客热门文章
- 主题 AI 职业建议 计算机视觉 数据工程 数据科学 语言模型 机器学习 MLOps NLP 编程 Python SQL
- 数据集
- 活动
- 资源 快速参考 推荐 技术简报
- 广告
加入新闻通讯
#header end
/ad_wrapper
低成本本地智能代理编程:Claude Code + Ollama + Gemma4
本文使用 Ollama、Gemma 4 和 Claude Code 构建了一个完整的本地智能代理编程堆栈。
作者:
Shittu Olumide,技术内容专家,2026年6月10日,编程
<div class="addthis_native_toolbox"></div>
# 引言
想象一下:一个多智能体工作流,它读取文件、编写补丁、运行测试,并在四个服务之间进行迭代,仅在下午就完成了400次API调用。通知来了。你又超过了软限制。每个token都花费金钱,每个提示都会将你的专有代码发送到第三方服务器,而速率限制会中断长时间运行的会话——唯一的解决方案是支付更多。
Gemma 4 26B MoE 在每次前向传递中仅激活其260亿个参数中的38亿个。它在LiveCodeBench v6中得分77.1%,在τ2-bench智能代理工具使用中得分86.4%——这是一个专门测试当模型必须调用工具、执行步骤并在多步骤工作流中处理错误时会发生什么的基准。上一代Gemma 3 27B在同样的基准测试中得分6.6%。这不是一个小的升级。这是模型无法可靠调用工具和能够运行Claude Code智能代理循环而不频繁错误地形成其函数调用参数之间的区别。
本文构建了完整的堆栈:Ollama在本地提供Gemma 4,防止智能代理会话中上下文窗口失败的Modelfile,将Claude Code连接到本地端点的settings.json,一个在使用真实代码之前确认一切正常工作的验证脚本,以及一个诚实的概述,说明哪些部分会出错以及如何修复它。目标读者是已经了解大型语言模型(LLMs)是什么以及智能代理循环成本的工程师。不会对基础知识进行过多解释。
# 为什么选择Gemma 4?
Gemma 4于2026年4月2日发布,采用Apache 2.0许可证,是Google DeepMind迄今为止最强大的开放权重模型家族。推出了四个版本:E2B(2B有效)、E4B(4B有效)、26B MoE和31B Dense。26B MoE使用128个小专家,每个token激活8个专家加一个共享专家,以显著更低的计算成本提供接近31B的质量。
之前的Gemma版本使用了带有商业使用限制的自定义Google许可证,这些限制足够模糊,以至于企业法律团队经常将其标记为障碍。Gemma 4采用Apache 2.0许可证,这是Gemma家族的首次。如果你的团队希望将此模型嵌入到内部工具中、在其上构建产品或在生产流水线中运行而无需法律审查的开销,这一变化在操作上非常重要。
#### // 对于编码代理重要的数字
基准测试
Gemma 3 27B
Gemma 4 26B MoE
Gemma 4 31B Dense
τ2-bench(智能代理工具使用)
6.6%
~79%
86.4%
LiveCodeBench v6
29.1%
77.1%
80.0%
GPQA Diamond
42.4%
82.3%
84.3%
AIME 2026(数学)
20.8%
88.3%
89.2%
Arena AI ELO
1365
1441
1452
#### // 硬件需求
在拉取一个 18 GB 的模型之前,请先了解你实际在处理的是什么。Gemma 4 系列是为从边缘设备到工作站的广泛设备设计的,四种变体反映了这一范围。
| 变体 | Ollama 标签 | 激活参数 | Q4 的 VRAM | 上下文窗口 | |--------------|------------------|----------|------------|------------| | Edge 4B | gemma4:e4b | 4B | ~6 GB | 128K | | 26B MoE | gemma4:26b | 3.8B | ~16–18 GB | 256K | | 31B Dense | gemma4:31b | 31B | ~24–32 GB | 256K |
#### // 安装 Ollama、Gemma 4 和 Claude Code
步骤 1:安装 Ollama
# macOS 和 Linux -- 一键安装
curl -fsSL https://ollama.com/install.sh | sh
# 验证版本 -- 必须为 0.14.0+ 才能支持 Anthropic Messages API
# Anthropic 兼容端点是在 2026 年 1 月添加的
ollama version
# 预期输出: ollama 版本是 0.22.x 或更高(截至 2026 年 5 月)
# Windows: 从 https://ollama.com 下载原生安装程序
# 如果你希望在 Windows 上实现 GPU 传递,建议使用 WSL2安装完成后,Ollama 会作为后台服务在端口 11434 上运行。验证其是否正常运行:
curl http://localhost:11434
# 预期响应: Ollama 正在运行步骤 2:拉取 Gemma 4
# 26B MoE -- 推荐用于此设置(约 18 GB 下载)
ollama pull gemma4:26b
# 等待期间,确认下载是否正在进展
ollama ps
# 显示当前正在下载或运行的模型
# 可选:在支持的硬件上,也拉取 31B 以进行比较
ollama pull gemma4:31b
# 确认拉取完成
ollama list
# 应显示 gemma4:26b 及其大小和修改日期步骤 3:安装 Claude Code
# 先决条件:Node.js 18 或更高版本
node --version # 确认你使用的是 18+
# 全局安装 Claude Code CLI
npm install -g @anthropic-ai/claude-code
# 验证安装
claude --version在 Ollama 运行且 Gemma 4 已拉取后,自然的下一步是导出环境变量并立即启动 Claude Code。
# Modelfile
Ollama 对 Gemma 4 的默认上下文窗口是 4K 个标记。Gemma 4 的实际上下文窗口是 128K–256K。这个 4K 默认值并不是一个建议,而是 Ollama 默认使用的值,除非你覆盖它。在 Claude Code 的代理会话中,该会话读取源文件、保留对话历史记录,并在多个回合中维护工具调用结果,4K 标记会在几秒钟内耗尽。
如果没有上下文覆盖,Claude Code 在编辑过程中会丢失文件内容,忘记早期的指令,并产生碎片化的更改。具体来说:当代理尝试重构一个 200 行的服务类时,它会干净地忘记后半部分的存在。代理不会引发错误。它只是默默地基于文件的不完整视图工作,并产生部分正确的输出,这会破坏后续操作。
解决方法是创建一个 Modelfile,将正确的上下文大小和其他推理参数烘焙到一个命名的模型变体中。创建这个文件:
# ~/.ollama/Modelfiles/gemma4-claude
# Gemma 4 26B MoE 变体,针对 Claude Code 代理会话进行了优化。
# 将上下文窗口、温度和系统提示嵌入模型中
# 使每个 Claude Code 会话都以正确的配置开始。
#
# 构建方法如下:
# mkdir -p ~/.ollama/Modelfiles
# ollama create gemma4-claude -f ~/.ollama/Modelfiles/gemma4-claude
FROM gemma4:26b
# 上下文窗口 -- 65536 个标记(64K)是经过测试的安全下限,适用于真实
# 的代码库,不会在 16-18 GB 显存系统上触发交换操作。
# 如果你的系统有 24 GB 或更大的显存,可以增加到 131072(128K)。
# 除非你已经对负载下的内存使用情况进行了分析,否则不要超过 131072 -- Ollama 会提前分配完整的 KV 缓存。
PARAMETER num_ctx 65536
# 温度 -- 0.2 是特意设置得较低,用于代理编码任务。
# 更高的温度会引入工具调用参数格式的变异性,导致 Claude Code 的工具验证器拒绝调用。
# 对于创意任务,你可以将这个值设得更高。对于代理循环:保持较低值。
PARAMETER temperature 0.2
# top_p -- 核心采样阈值。0.9 有助于保持生成的专注度
# 同时避免在长时间代理会话中 top_p=1.0 可能导致的重复循环问题。
PARAMETER top_p 0.9
# repeat_penalty -- 对重复标记进行惩罚。
# 1.15 有助于防止 Gemma 4 无限重复相同的失败工具调用,几乎使用相同的参数进行重试的情况。
PARAMETER repeat_penalty 1.15
# num_predict -- 每次响应的最大标记数。4096 对于大多数代码补丁已经足够。
# 如果你经常在单次生成中生成大文件,可以增加到 8192。
PARAMETER num_predict 4096
# 系统提示 -- 强化编码代理行为和显式
# 工具使用纪律。Gemma 4 从被提醒要承诺工具调用而不是描述它将做什么中获益。
SYSTEM """你是一名高级软件工程师,以编码代理的身份工作。
在处理代码时:
- 编辑文件前先阅读文件。不要假设文件内容。
- 每次只进行一个专注的更改,并在继续之前验证它。
- 当工具调用失败时,仔细检查错误后再重试。
不要使用相同的参数重试。首先进行诊断。
- 优先选择精确的编辑,而不是对整个文件进行重写。
- 每次进行有意义的更改后运行测试,而不是在一批更改后运行测试。
- 如果你对代码库结构不确定,多读一些文件,而不是猜测。
要精确且有条理。当你能够直接执行时,避免解释你即将做什么。构建变体:
# 如果目录不存在,请创建 Modelfiles 目录
mkdir -p ~/.ollama/Modelfiles
# 将上面的 Modelfile 内容保存到此路径,然后构建:
ollama create gemma4-claude -f ~/.ollama/Modelfiles/gemma4-claude
# 验证变体是否已创建
ollama list
# 应该显示 gemma4-claude 与 gemma4:26b 一起出现
# 快速测试 -- 验证它是否加载并响应
ollama run gemma4-claude "二分查找的时间复杂度是什么,为什么?"
# 预期在几秒钟内得到一个清晰、简洁的技术响应# 将 Claude Code 连接到本地模型
构建好模型变体后,配置层将 Claude Code 连接到 Ollama。这两个环境变量是这一过程的核心,但还有三个额外的变量可以防止最常见的失败模式。
Ollama 的 Anthropic 兼容端点位于 http://localhost:11434,而不是 http://localhost:11434/v1。/v1 路径是 Ollama 的 OpenAI 兼容层。Claude Code 使用的是 Anthropic Messages API 协议,该协议映射到根端点。使用 /v1 路径会导致认证错误或意外行为。
#### // 全局设置 — ~/.claude/settings.json
此配置适用于所有项目中的每个 Claude Code 会话。除非你经常在本地模型和云模型之间切换,否则这是正确的选择。
{
"env": {
"ANTHROPIC_BASE_URL": "http://localhost:11434",
"ANTHROPIC_AUTH_TOKEN": "ollama",
"ANTHROPIC_API_KEY": "",
"ANTHROPIC_MODEL": "gemma4-claude",
"ANTHROPIC_DEFAULT_SONNET_MODEL": "gemma4-claude",
"ANTHROPIC_DEFAULT_HAIKU_MODEL": "gemma4-claude",
"ANTHROPIC_DEFAULT_OPUS_MODEL": "gemma4-claude",
"CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS": "1"
}
}每个变量的重要性:
- ANTHROPIC_BASE_URL 将所有 Claude Code API 调用从 Anthropic 的服务器重定向到你的本地 Ollama 实例。
- ANTHROPIC_AUTH_TOKEN 必须设置为任意非空字符串;Ollama 忽略该值,但 Claude Code 需要该头信息存在。
- ANTHROPIC_API_KEY: "" 明确清空该密钥,这样 Claude Code 就不会在 shell 环境中设置真实 Anthropic API 密钥时回退到真实 API。如果没有这个设置,配置错误的 ANTHROPIC_BASE_URL 可能会静默地切换到付费 API。
- ANTHROPIC_MODEL 是 Claude Code 在请求中发送的主要模型名称。将其设置为你的自定义 Modelfile 变体,使用 gemma4-claude 而不是 gemma4:26b。原始模型标签不包含上下文窗口覆盖。
- ANTHROPIC_DEFAULT_SONNET_MODEL、ANTHROPIC_DEFAULT_HAIKU_MODEL 和 ANTHROPIC_DEFAULT_OPUS_MODEL:Claude Code 内部根据不同的任务类型将请求路由到不同的模型层级。将这三个都设置为同一个本地模型,可以确保无论 Claude Code 内部选择哪个层级,所有请求都会发送到你的 Ollama 实例。
- CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS: "1" 会移除 Claude Code 添加到请求中的 Anthropic 特定 Beta 头信息。本地推理服务器不识别这些头信息,并会拒绝包含它们的请求。设置此变量可以避免该错误,而不会影响 Claude Code 的任何核心功能。
#### // 每个项目配置 — .claude/settings.json
对于希望将本地推理与全局设置隔离的项目 —— 例如私有仓库、敏感代码库或有特定模型需求的项目 —— 请使用项目级别的设置文件:
# 在你的项目根目录中
mkdir -p .claude
cat > .claude/settings.json << 'EOF'
{
"env": {
"ANTHROPIC_BASE_URL": "http://localhost:11434",
"ANTHROPIC_AUTH_TOKEN": "ollama",
"ANTHROPIC_API_KEY": "",
"ANTHROPIC_MODEL": "gemma4-claude",
"ANTHROPIC_DEFAULT_SONNET_MODEL": "gemma4-claude",
"ANTHROPIC_DEFAULT_HAIKU_MODEL": "gemma4-claude",
"ANTHROPIC_DEFAULT_OPUS_MODEL": "gemma4-claude",
"CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS": "1"
}
}
EOF当项目级别的 .claude/settings.json 存在时,Claude Code 会读取该文件,并覆盖该项目的全局设置。如果设置文件包含任何环境特定的内容,请将其添加到你的 .gitignore 文件中;如果希望整个团队在该项目上运行本地推理,请提交该文件。
#### // 验证设置
在将 Claude Code 应用于实际代码库之前,请确认以下三点:Ollama 正确运行,模型能够以 Anthropic Messages 格式响应 API 调用,并且工具调用功能正常工作。第三点至关重要:工具调用是 Claude Code 读取文件、写入补丁和执行命令的方式。无法正确格式化工具调用的模型,在执行基本代理任务时会陷入循环并失败。
前提条件:
pip install httpx # 用于验证脚本的异步 HTTP 客户端完整的验证脚本:
#!/usr/bin/env python3
"""
verify_local_setup.py
在使用前验证完整的 Claude Code + Ollama + Gemma 4 堆栈。
依次运行三个检查:
1. Ollama 健康状态和模型可用性
2. 基本的 Anthropic Messages API 调用
3. 工具调用往返测试
前提条件:
pip install httpx
如何运行:
python verify_local_setup.py
在正常设置下预期的输出:
[通过] Ollama 正在 localhost:11434 上运行
[通过] 模型 'gemma4-claude' 可用
[通过] Anthropic Messages API 调用成功
[通过] 工具调用:模型生成了有效的 tool_use 块
所有检查通过 -- Claude Code + Ollama + Gemma 4 已准备就绪。
"""
import httpx
import json
import sys
# ── 配置 ─────────────────────────────────────────────────────────────
OLLAMA_BASE_URL = "http://localhost:11434"
MODEL_NAME = "gemma4-claude" # 必须与你的 Modelfile 变体名称匹配
TIMEOUT = 120.0 # 秒 -- 第一次调用时生成可能较慢
def check_ollama_health() -> bool:
"""
检查 1:验证 Ollama 是否正在运行并响应。
访问根端点,当健康时返回 'Ollama is running'。
"""
print("\n检查 1: Ollama 健康状态")
try:
response = httpx.get(OLLAMA_BASE_URL, timeout=5.0)
if "Ollama is running" in response.text:
print(f" [通过] Ollama 正在 {OLLAMA_BASE_URL} 上运行")
return True
else:
print(f" [失败] 不预期的响应: {response.text[:100]}")
return False
except httpx.ConnectError:
print(f" [失败] 无法连接到 {OLLAMA_BASE_URL}")
print(" Ollama 是否正在运行?尝试: ollama serve")
return False
def check_model_available() -> bool:
"""
检查 2:验证特定模型变体是否在 Ollama 中可用。
使用 /api/tags 端点,该端点列出所有已拉取的模型。
"""
print("\n检查 2: 模型可用性")
try:
response = httpx.get(f"{OLLAMA_BASE_URL}/api/tags", timeout=5.0)
data = response.json()
models = [m["name"] for m in data.get("models", [])]
# 规范化:Ollama 可能会添加 ":latest" 如果未指定
normalized = [m.split(":")[0] for m in models]
if MODEL_NAME in models or MODEL_NAME in normalized:
print(f" [通过] 模型 '{MODEL_NAME}' 可用")
return True
else:
print(f" [失败] 模型 '{MODEL_NAME}' 未找到")
print(f" 可用模型: {', '.join(models) or 'none'}")
print(f" 运行: ollama create {MODEL_NAME} -f ~/.ollama/Modelfiles/gemma4-claude")
return False
except Exception as e:
print(f" [失败] 检查模型列表时出错: {e}")
return False
def check_messages_api() -> bool:
"""
检查 3:向本地端点发送基本的 Anthropic Messages API 调用。
验证请求格式、模型路由和基本生成是否正常工作。
使用与 Claude Code 相同的 /v1/messages 路径和请求模式。
注意:Claude Code 使用 http://localhost:11434(根),而不是 /v1。
Anthropic 兼容的 API 在 /api/chat 或根 -- Ollama 路由它。
"""
print("\n检查 3: Anthropic Messages API 调用")
payload = {
"model": MODEL_NAME,
"max_tokens": 100,
"messages": [
{
"role": "user",print(f" [FAIL] HTTP {response.status_code}: {response.text[:200]}") return False
data = response.json()
Anthropic Messages API response structure:
{ "content": [{"type": "tool_call", "tool_call": { ... }}], "stop_reason": "..." }
content_blocks = data.get("content", []) tool_call_blocks = [b for b in content_blocks if b.get("type") == "tool_call"]
if not tool_call_blocks: print(f" [FAIL] No tool_call content in response: {json.dumps(data, indent=2)}") return False
tool_call = tool_call_blocks[0].get("tool_call", {}) tool_name = tool_call.get("name", "") tool_input = tool_call.get("input", {})
if tool_name != "read_file": print(f" [FAIL] Unexpected tool called: {tool_name} (expected: read_file)") return False
path = tool_input.get("path", "") if not path: print(f" [FAIL] Missing 'path' parameter in tool call: {json.dumps(tool_call, indent=2)}") return False
print(f" [PASS] Tool calling verification successful") print(f" Called tool: {tool_name} with input: {json.dumps(tool_input, indent=2)}") return True
except Exception as e: print(f" [FAIL] Request failed: {e}") return False
print(f" [FAIL] HTTP {response.status_code}: {response.text[:200]}")
return False
data = response.json()
content_blocks = data.get("content", [])
tool_blocks = [b for b in content_blocks if b.get("type") == "tool_use"]
if not tool_blocks:
print(" [FAIL] 模型未生成 tool_use 块")
print(" 这意味着工具调用功能未正常工作。")
print(" Agentic Claude Code 会话在文件操作时会失败。")
print(f" 完整响应: {json.dumps(data, indent=2)}")
return False
tool_call = tool_blocks[0]
tool_name = tool_call.get("name", "")
tool_input = tool_call.get("input", {})
print(f" [PASS] 工具调用: 模型生成了一个有效的 tool_use 块")
print(f" 调用的工具: {tool_name}")
print(f" 参数: {json.dumps(tool_input)}")
# 合理性检查: 是否调用了正确的工具并传入了正确的参数?
if tool_name == "read_file" and "path" in tool_input:
print(f" 工具名称和参数是正确的。")
else:
print(f" 警告: 工具名称不符合预期或缺少 'path' 参数。")
print(f" 模型调用了一个工具,但不是预期的那个。")
return True
except Exception as e:
print(f" [FAIL] 请求失败: {e}")
return False
def main():
print("=" * 60)
print("Claude Code + Ollama + Gemma 4 设置验证")
print("=" * 60)
checks = [
check_ollama_health,
check_model_available,
check_messages_api,
check_tool_calling,
]
results = [check() for check in checks]
print("\n" + "=" * 60)
passed = sum(results)
total = len(results)
if all(results):
print(f"所有 {total} 项检查都通过了。")
print("Claude Code + Ollama + Gemma 4 已准备就绪。")
print(f"\n启动命令: claude")
sys.exit(0)
else:
failed_checks = [i + 1 for i, r in enumerate(results) if not r]
print(f"{passed}/{total} 项检查通过。失败项: {failed_checks}")
print("在本地使用 Claude Code 之前,请解决上述失败问题。")
sys.exit(1)
if __name__ == "__main__":
main()如何运行:
pip install httpx
python verify_local_setup.py# Agentic 任务流程
验证通过后,这里是一个真实的 agentic 会话示例。任务是:对一个没有测试的现有 Python 模块进行分析,编写测试套件,运行测试,并修复任何失败的测试。
# 导航到项目目录
cd ~/projects/my-service
# 确认 Claude Code 能够看到本地配置
claude --version
# 确保它不会提示输入 Anthropic API 密钥 —— 如果提示了,
# 说明 settings.json 没有被正确读取
# 启动一个 agentic 会话
claude
# 在 Claude Code 中,给代理一个具体的任务:
# > 分析 src/user_service.py 中的 UserService 类。
# > 编写一个覆盖所有公共方法的 pytest 测试套件。
# > 运行测试并修复任何失败。
# > 目标是实现一个没有跳过的干净的 pytest 运行。在此会话期间,Claude Code 工具调用的跟踪如下所示:
→ read_file("src/user_service.py")
正在读取 247 行...
→ list_files("src/")
找到: user_service.py, models.py, db.py, exceptions.py
→ read_file("src/models.py")
正在读取 89 行...
→ write_file("tests/test_user_service.py", [测试内容])
已写入 312 行
→ bash("python -m pytest tests/test_user_service.py -v 2>&1")
正在运行 14 个测试...
失败: tests/test_user_service.py::test_update_email_invalid
AssertionError: 预期 ValidationError,但得到 None
→ read_file("src/user_service.py") [对 update_email 方法的针对性重读]
...
→ write_file("tests/test_user_service.py", [修正后的测试])
修正了 test_update_email_invalid 的断言
→ bash("python -m pytest tests/test_user_service.py -v 2>&1")
14 个通过,耗时 1.23 秒Gemma 4 可靠地处理这种模式 —— 在编辑之前读取文件,在更改之后运行测试,并通过错误输出诊断失败,而不是盲目重试。在涉及多个文件的复杂架构决策方面,云模型仍然具有优势。对于上述任务(分析、测试生成和针对性修复),本地设置完全能够胜任。
需要注意的是:如果你看到代理生成“无效工具参数”错误,并且反复使用相同的参数重试,说明温度设置过高,或模型没有使用 gemma4-claude Modelfile 变体。温度和上下文窗口覆盖已被烘焙到该变体中;原始 gemma4:26b 标签不包含这些设置。
#### // 什么会出错以及如何修复
- 工具参数格式错误症状:Claude Code 反复报告“无效工具参数”。代理道歉并使用相同或几乎相同的参数重试,然后进入循环。原因:这在 Ollama GitHub 问题中已有记录。模型生成的工具调用 JSON 与 Claude Code 期望的模式不匹配。最常见的原因包括字段名称错误、缺少必填字段,或在期望标量值的地方使用了嵌套对象。修复方法:确认你运行的是 gemma4-claude(Modelfile 变体),而不是直接运行 gemma4:26b。Modelfile 中的温度设置为 0.2 和系统提示显著减少了此类问题。如果问题仍然存在,请将 Modelfile 中的温度降低到 0.1 并重新构建。
- 上下文窗口交换到磁盘的症状:经过几次交互后,生成速度显著下降。使用
ollama ps可以看到 GPU 使用率下降。操作系统正在将 KV 缓存交换到磁盘。解决方法:
选项 1:在 Modelfile 中减少上下文窗口
编辑 `~/.ollama/Modelfiles/gemma4-claude`
将以下内容:
PARAMETER num_ctx 65536
更改为:
PARAMETER num_ctx 32768
然后重新构建:
ollama create gemma4-claude -f ~/.ollama/Modelfiles/gemma4-claude
选项 2:启用 KV 缓存量化以减少内存占用
export OLLAMA_KV_CACHE_TYPE=q8_0
这会量化 KV 缓存本身,略微牺牲质量以减少内存占用
设置后重启 Ollama:
pkill ollama && ollama serve
- 代理交互之间模型卸载的症状:在每个 Claude Code 消息的开始处,会出现明显的冷启动延迟。Ollama 在空闲超时后卸载了模型,并在每次请求时重新加载。解决方法:
在工作会话期间无限期保持模型加载
export OLLAMA_KEEP_ALIVE=-1
或者在 shell 配置文件中设置以实现永久效果
echo 'export OLLAMA_KEEP_ALIVE=-1' >> ~/.zshrc
或者使用 Ollama API 来固定模型
curl http://localhost:11434/api/generate \ -d '{"model": "gemma4-claude", "keep_alive": -1}'
这会将模型固定,直到你明确卸载它或重启 Ollama
- Beta 标头被拒绝的错误症状:启动或会话中途时,Claude Code 会产生 "Unexpected value(s) for the anthropic-beta header" 的错误。解决方法:
确认 CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS: "1" 在你的 settings.json 中。如果你是通过 shell 导出设置而不是使用 settings.json,请确保它在运行 Claude 的同一 shell 会话中被导出: echo $CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS
必须输出:1
总结
本文中描述的堆栈不是一个概念验证。它是一个正在运行的生产配置,自 2026 年 1 月 Ollama 添加对 Anthropic Messages API 的支持以来,工程师们每天都在使用它。Modelfile 并不是可选的;它是工具之间差异的关键,一个工具能够正常工作,而另一个工具在多文件任务中可能会静默地生成不完整的输出。验证脚本会在会话中途出现令人困惑的代理失败之前捕获配置问题。
本文中构建的设置是一个私有、零每令牌成本的编码代理,它能够处理大多数日常工程任务——代码分析、测试生成、定向重构和调试——在现代硬件上生成速度是可使用的。
此设置并不是复杂架构推理、大规模代码库或 SWE-bench 类任务的替代方案,这些任务需要大规模的深度仓库理解。
Shittu Olumide 是一位软件工程师和技术作家,热衷于利用前沿技术来创作引人入胜的叙述,他注重细节,并擅长将复杂概念简化。你也可以在 Twitter 上找到 Shittu。
关于此主题的更多信息
- 使用 n8n、MCP 和 Ollama 实现强大的本地 AI 自动化
- 使用 Ollama 调整本地语言模型设置
- 5 本便宜的书籍掌握数据科学
- 以低成本启动你的自由职业数据科学业务
- 5 本便宜的书籍掌握机器学习
- Qwen Code 利用 Qwen3 作为 CLI 代理编程工具
<hr class="grey-line"><br> <div><h3>我们推荐的前 5 门免费课程</h3><br> </div>
Mailchimp for WordPress v4.13.0 - https://wordpress.org/plugins/mailchimp-for-wp/
/ Mailchimp for WordPress 插件
你可以从此处开始编辑。
如果评论已关闭。
<= 上一篇帖子
下一篇帖子 =>
#content end
<script type="text/javascript">kda_sid_write(kda_sid_n);</script>
最新帖子
- 将 Claude Code 与本地模型配对 3 个 NumPy 技巧提升数值性能 从零开始构建特征存储:一个最小可行实现 为你的创业点子获取资金的 7 种最佳方式 低成本实现本地智能代理编程:Claude Code + Ollama + Gemma4 5 个有用的 Python 脚本自动化无聊的 PDF 任务
热门帖子
- Anthropic 的 Claude 技能完整指南
- 低成本实现本地智能代理编程:Claude Code + Ollama + Gemma4
- 5 个有用的 Python 脚本自动化无聊的 PDF 任务
- AI 工程师必须知道的 5 个 Python 概念
- 为你的创业点子获取资金的 7 种最佳方式
- 用于 Python Web 开发的 10 个 GitHub 仓库
- 将 Claude Code 与本地模型配对
- 5 篇有趣论文清晰解释了大语言模型
- 智能代理时代对数据科学的意义
- 用于现代数据库系统和工具的 10 个 GitHub 仓库
#content_wrapper end
© 2026
Guiding Tech Media
|
关于
联系
广告
隐私
服务条款
发布于 2026 年 6 月 10 日,作者 Olumide Shittu
blank
不,谢谢!
/.main_wrapper
<script defer type="text/javascript" src="https://s7.addthis.com/js/300/addthis_widget.js#pubid=gpsaddthis"></script>
noptimize
/noptimize