
Ollama v0.15 で Claude Code をローカル実行できるか試してみた
はじめに
こんにちは、クラスメソッド製造ビジネステクノロジー部の森茂です。
2026 年 1 月 23 日にリリースされた Ollama v0.15 で ollama launch claude コマンドが追加されました。これにより、Claude Code をローカルモデルで動かすセットアップがとても簡単になっています。「これでついにローカル LLM で Claude Code が使えるのでは?」と期待して検証してみたのですが、結論から言うと、現時点では実用的ではありませんでした。
この記事では、実際に試した結果と、なぜうまくいかなかったのかを共有します。同じことを試そうとしている方の時間を節約できれば幸いです。
Ollama の Claude Code 対応
v0.14.0 で Anthropic API 互換モード追加
2026 年 1 月 12 日にリリースされた Ollama v0.14.0 で、Anthropic API と互換性のある /v1/messages エンドポイントが追加されました。環境変数を設定すれば Claude Code がローカルの Ollama に接続できます。
# 従来の方法(v0.14.0以降)
export ANTHROPIC_BASE_URL=http://localhost:11434
export ANTHROPIC_API_KEY=ollama
export ANTHROPIC_MODEL=qwen2.5-coder:1.5b
v0.15 で ollama launch コマンド追加
v0.15 では ollama launch claude コマンドが追加され、環境変数の設定が不要になりました。
# v0.15以降の簡単な方法
ollama launch claude
# モデルを指定する場合
ollama launch claude --model qwen2.5-coder:1.5b
実行すると「Launching Claude Code with {model}...」と表示され、環境変数が自動設定された状態で Claude Code が起動します。モデルを指定しない場合は、利用可能なモデルから自動選択されます。
期待したこと
- API 料金ゼロでコードエージェントが使える
- センシティブなコードを外部に送信しない環境を構築できる
- オフライン環境でも開発できる
検証環境
- MacBook Pro(M4 32GB)
- macOS 26.2
- Ollama v0.15.1(2026 年 1 月 25 日に検証)
- Claude Code v2.1.15
- 検証モデル:
- qwen2.5-coder:1.5b(986 MB)
- gemma3:4b(3.3 GB)
- llama3.1:8b(4.9 GB)
- qwen2.5-coder:14b(9.0 GB)
検証結果
API エンドポイント自体は動作する
まず、Ollama の Anthropic API 互換エンドポイントは正常に動作しました。
const response = await fetch('http://localhost:11434/v1/messages', {
method: 'POST',
headers: { 'Content-Type': 'application/json', 'x-api-key': 'ollama' },
body: JSON.stringify({
model: 'qwen2.5-coder:1.5b',
max_tokens: 100,
messages: [{ role: 'user', content: 'Say hello in TypeScript' }],
}),
});
// → 正常にレスポンスが返る
Ollama 単体でのコード生成も問題ありません。
ollama run qwen2.5-coder:1.5b --verbose
# → 78 tokens/sec で動作、コード生成も良好
Claude Code との連携で問題発生
しかし、Claude Code と接続すると様々な問題が発生しました。

問題 1:曖昧な指示を誤解する(qwen2.5-coder:1.5b)
❯ FizzBuzzを書いて
⏺ Fizzbuzzの10個目は15です。
「コードを書いて」という指示に対して、計算結果を返してしまいました。「FizzBuzz のコードを TypeScript で書いて」と明確に指示すると成功しましたが、Claude Code の自然な使い方とは異なります。
なお、「React でシンプルなカウンターコンポーネントを TypeScript で書いて」のような明確な指示では、正しいコードを生成できました。
❯ ReactでシンプルなカウンターコンポーネントをTypeScriptで書いて
⏺ import React from 'react';
const Counter: React.FC = () => {
const [count, setCount] = React.useState(0);
return (
<div>
<p>Count: {count}</p>
<button onClick={() => setCount(count + 1)}>Increment</button>
<button onClick={() => setCount(count - 1)}>Decrement</button>
</div>
);
};
export default Counter;
このCounterコンポーネントは以下のように機能します:
1. 現在のカウントを表示します
2. 動画をクリックするとカウントが増加します ← ?
3. マジックボタンをクリックするとカウントが減少します ← ?
このコンポーネントはTypeScriptで実装され、ReactのuseStateとuseEffect
Hooksを使用しています。 ← useEffectは使っていない
コード自体は正しいですが、説明文で「動画」「マジックボタン」「useEffect を使用」など、実際のコードと矛盾するハルシネーションが発生しています。コードは書けても、説明の信頼性には注意が必要です。
問題 2:ネイティブツール非サポートで API エラー(gemma3:4b)
❯ ReactでシンプルなカウンターコンポーネントをTypeScriptで書いて
⏺ API Error: 400 {"error":{"message":"gemma3:4b does not support tools"}}
Claude Code はファイル操作などのツールを使おうとしますが、gemma3:4b はネイティブなツール呼び出し(function calling)をサポートしていないためエラーになりました。カスタムプロンプトテンプレートで対応できる可能性はありますが、Claude Code ではそのまま使えません。
問題 3:システムプロンプトに混乱(llama3.1:8b)
llama3.1:8b はツール呼び出しをサポートしていますが、別の問題が発生しました。
複雑な CLAUDE.md(キャラクター設定など)がある環境では、「カウンター」を依頼したのに「TodoList」を生成したり、CLAUDE.md の設定内容を説明し始めるケースがありました。
CLAUDE.md を外した状態では、コード生成自体はできました。
❯ ReactでシンプルなカウンターコンポーネントをTypeScriptで書いて
⏺ import React from 'react';
interface CounterProps {
initialCount: number;
}
const Counter = ({ initialCount }: CounterProps) => {
const [count, setCount] = React.useState(initialCount);
return (
カウント: {count}
<button onClick={() => setCount(count + 1)}>+1
);
};
export default Counter;
✻ Cooked for 34s
Props 定義を含む構造的なコードが生成されましたが、JSX が不完全(タグが閉じられていない)で、処理に 34 秒かかりました。8B モデルでも CLAUDE.md がシンプルなら動作する可能性はありますが、出力品質と速度に課題があります。
問題 4:ツール呼び出しが JSON テキストで出力される
ツール呼び出しが実行されず、JSON がそのまま出力されるケースもありました。
❯ ReactでシンプルなカウンターコンポーネントをTypeScriptで書いて
⏺ {
"name": "TodoWrite",
"arguments": {
"componentName": "Counter",
"language": "TypeScript"
}
}
実際にファイルが作成されるわけではなく、ツール呼び出しの JSON が表示されるだけでした。しかも「TodoWrite」は Claude Code のタスク管理用ツールであり、コード生成には使いません。小型モデルは Claude Code のツール定義を「認識」はしているものの、正しいツールを選択して実行することができていません。
同じプロンプトでもコードが出力されることもあり、結果が不安定で再現性がありません。
追加検証:14B モデルでも改善せず(qwen2.5-coder:14b)
「大きいモデルなら動くのでは?」と期待して 14B モデルでも検証しました。
❯ ReactでシンプルなカウンターコンポーネントをTypeScriptで書いて
⏺ {
"name": "TodoWrite",
"arguments": {
"todoList": [
{ "task": "Create a new React component file named `Counter.tsx`" },
{ "task": "Define the initial state for the counter..." },
...
]
}
}
✻ Cogitated for 57s
14B でも同じ問題が発生しました。コードを書く代わりにタスクリストを作成しようとし、ツール呼び出しが JSON テキストとして出力されています。処理時間も 57 秒と遅く、モデルサイズを大きくしても Claude Code との連携問題は解決しませんでした。
検証結果まとめ
| モデル | サイズ | ツールサポート | 結果 |
|---|---|---|---|
| qwen2.5-coder:1.5b | 986 MB | ⚠️ 一部 | 結果不安定、JSON 出力、説明にハルシネーション |
| gemma3:4b | 3.3 GB | ❌ なし | API エラー |
| llama3.1:8b | 4.9 GB | ✅ あり | 生成可能だが不完全、34 秒と低速 |
| qwen2.5-coder:14b | 9.0 GB | ⚠️ 一部 | JSON 出力、ツール選択ミス、57 秒と低速 |
現時点での結論
Claude Code + ローカルモデルは、現時点では実用的ではありません。
| 期待 | 現実 |
|---|---|
| Claude Code がローカルで動く | ⚠️ 接続はできるが、まともに動かない |
| API 料金ゼロ | ✅ 達成可能(動けば) |
| プライバシー保護 | ✅ 達成可能(動けば) |
| Claude 4.5 Sonnet と同等の精度 | ❌ 8B 以下では無理 |
うまくいかない理由
- Claude Code は複雑なシステムプロンプトとツール呼び出しを前提とした設計です。ツール定義だけで約 11,000 トークン相当を使用するため、8B 以下の小型モデルではこの膨大なコンテキストを正しく処理できません
- 多くのローカルモデルはツール呼び出し(function calling)をサポートしていない、またはサポートが不完全です
将来への期待
短期的に期待できること
- 30B〜70B クラスのモデルで改善する可能性はあるが、14B でも問題が解決しなかったため期待薄(要検証)
- Continue.dev など、よりシンプルなシステムプロンプト(6.5K程度)を使うツールなら実用的かもしれない
中長期的に期待できること
- Claude Code のローカルモデル向け最適化
- 小型モデルのツール呼び出し能力向上
それでもローカル LLM を使いたい場合
Claude Code との連携は難しいですが、Ollama 単体でのコード生成は十分実用的です。
# シンプルなコード生成
ollama run qwen2.5-coder:1.5b "TypeScriptでemail validationの関数を書いて"
# 実測値(M4)
# - Generation: 78 tokens/sec
# - 品質: 型アノテーション付きの実用的なコード
ターミナルから直接質問する使い方や、自作スクリプトから API を呼び出す使い方なら、ローカルモデルは十分活用できます。
まとめ
Ollama v0.14.0 の Anthropic API 互換モードは技術的に動作しますが、Claude Code のフル機能をローカルモデルで再現するのは現時点では困難です。
「ローカルで Claude Code 相当の体験を得たい」という目的であれば、以下を検討した方が良いかもしれません。
- NVIDIA DGX Spark など GPU 環境で 30B〜70B モデルを動かす(要検証)
- Continue.dev でシンプルなコード補完に限定して使う
- Ollama 単体でターミナルから使う
この記事が、同じ検証をしようとしている方の参考になれば幸いです。








