T
traeai
登录
返回首页
KDnuggets

Local Agentic Programming on the Cheap: Claude Code + Ollama + Gemma4

8.5Score

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 调用和成本。

结构提纲

按章节快速跳转。

  1. 文章介绍了如何使用 OllamaGemma 4Claude Code 构建本地代理编程系统。

  2. Gemma 4 在 τ2-benchLiveCodeBench v6 上表现优异,且采用 Apache 2.0 许可。

  3. 使用第三方 API 会导致成本增加和法律风险,本地运行 Gemma 4 是解决方案。

  4. 文章详细介绍了如何配置 Ollama、Modelfile 和 settings.json 以实现本地代理系统。

思维导图

用一张图看清主题之间的关系。

查看大纲文本(无障碍 / 无 JS 友好)
  • 本地代理编程系统
    • Gemma 4
      • 26B MoE 模型
      • Apache 2.0 许可
      • τ2-bench 79% 分数
    • Ollama
      • 本地运行 Gemma 4
    • Claude Code
      • 集成到代理系统

金句 / Highlights

值得收藏与分享的关键句。

#AI#编程#Ollama#Gemma#Claude Code
打开原文

低成本本地智能代理编程: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

code
# 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 上运行。验证其是否正常运行:

code
curl http://localhost:11434
# 预期响应: Ollama 正在运行

步骤 2:拉取 Gemma 4

code
# 26B MoE -- 推荐用于此设置(约 18 GB 下载)
ollama pull gemma4:26b

# 等待期间,确认下载是否正在进展
ollama ps
# 显示当前正在下载或运行的模型

# 可选:在支持的硬件上,也拉取 31B 以进行比较
ollama pull gemma4:31b

# 确认拉取完成
ollama list
# 应显示 gemma4:26b 及其大小和修改日期

步骤 3:安装 Claude Code

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,将正确的上下文大小和其他推理参数烘焙到一个命名的模型变体中。创建这个文件:

code
# ~/.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 """你是一名高级软件工程师,以编码代理的身份工作。

在处理代码时:
- 编辑文件前先阅读文件。不要假设文件内容。
- 每次只进行一个专注的更改,并在继续之前验证它。
- 当工具调用失败时,仔细检查错误后再重试。
  不要使用相同的参数重试。首先进行诊断。
- 优先选择精确的编辑,而不是对整个文件进行重写。
- 每次进行有意义的更改后运行测试,而不是在一批更改后运行测试。
- 如果你对代码库结构不确定,多读一些文件,而不是猜测。

要精确且有条理。当你能够直接执行时,避免解释你即将做什么。

构建变体:

code
# 如果目录不存在,请创建 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 会话。除非你经常在本地模型和云模型之间切换,否则这是正确的选择。

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

对于希望将本地推理与全局设置隔离的项目 —— 例如私有仓库、敏感代码库或有特定模型需求的项目 —— 请使用项目级别的设置文件:

code
# 在你的项目根目录中
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 读取文件、写入补丁和执行命令的方式。无法正确格式化工具调用的模型,在执行基本代理任务时会陷入循环并失败。

前提条件:

code
pip install httpx   # 用于验证脚本的异步 HTTP 客户端

完整的验证脚本:

code
#!/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

python
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()

如何运行:

code
pip install httpx
python verify_local_setup.py

# Agentic 任务流程

验证通过后,这里是一个真实的 agentic 会话示例。任务是:对一个没有测试的现有 Python 模块进行分析,编写测试套件,运行测试,并修复任何失败的测试。

code
# 导航到项目目录
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 工具调用的跟踪如下所示:

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

AI 可能会生成不准确的信息,请核实重要内容

Local Agentic Programming on the Cheap: Claude Code + Ollama + Gemma4 | KDnuggets | traeai