AIコーディング 2026.04.29

Claude Code 2026年4月版:モデル切り替え・Skills機能・外部LLM連携の完全ガイド

タグ:Claude Code / 生成AI活用 / 開発効率化

Claude Code 2026年4月の主要アップデート

2026年4月、Claude Codeは30以上のリリースを行いました。主要な改善点:

  • Skills機能の安定化(スラッシュコマンドが全ユーザーに開放)
  • --model フラグでのリアルタイムモデル切り替え
  • MCP経由での外部LLM連携強化
  • バッチ処理時のコンテキスト管理改善

モデル切り替えの実践

コマンドラインでのモデル指定

# デフォルト(Sonnet)
claude -p "コードをレビューして"

# Haikuで軽量タスク(コスト削減)
claude --model claude-haiku-4-5-20251001 \
  -p "このファイルの関数名を一覧してcsvで出力して"

# 最高精度が必要なタスク
claude --model claude-opus-4-5 \
  -p "このアーキテクチャの設計レビューをして。セキュリティリスクを特に詳しく"

対話モードでのモデル変更

# Claude Codeを起動
claude

# セッション中にモデルを変更
> /model claude-haiku-4-5-20251001

# 現在のモデルを確認
> /status

タスク別の推奨モデル

タスク推奨モデル理由
大量ファイルの分類・命名Haiku単純パターン処理
バグ修正・リファクタリングSonnetバランス
アーキテクチャ設計レビューOpus最高精度
テスト生成(定型)Haikuコスト効率
並行処理コードのレビューOpus微妙なバグを見落とさない

Skills機能の設定手順

Skills機能はプロジェクト固有のスラッシュコマンドを定義できます。

プロジェクト固有のスキルを作成

mkdir -p .claude/commands
# .claude/commands/review.md
---
description: コードのセキュリティ・品質・パフォーマンスレビュー
---

以下のファイルをレビューしてください:$ARGUMENTS

## レビュー観点

### セキュリティ
- SQLインジェクション・XSS・CSRF の可能性
- 認証・認可のチェック漏れ
- シークレットのハードコード

### コード品質
- エラーハンドリングの漏れ
- 型安全性(anyの使用)
- 重複コード・リファクタリング機会

### パフォーマンス
- N+1クエリ
- 不要なループ・再計算
- メモリリーク

各問題を以下の形式で報告してください:
[重要度: HIGH/MEDIUM/LOW] ファイル名:行番号 - 問題の説明
# .claude/commands/test-gen.md
---
description: テストファイルを自動生成する
---

$ARGUMENTS を分析して、以下のテストを pytestで生成してください:

1. 正常系テスト(全てのPublicメソッド)
2. 異常系テスト(型エラー・境界値・空文字)
3. エッジケーステスト

既存のテストファイルがある場合は確認してから追記してください。
テストファイルは tests/ ディレクトリに tests_[元ファイル名].py として保存。

スキルを使う

# プロジェクト内でClaude Codeを起動
claude

# スラッシュコマンドで実行
> /review src/auth/login.py
> /test-gen src/services/user_service.py

10Kテスト自動生成でバグ45%削減

実際の開発チームが Claude Code 2.0 で実施したプロセス:

# Step 1: 既存のテストパターンを学習させる
claude -p "tests/ ディレクトリのテストを全て読んで、
このプロジェクトのテスト記述スタイルと使っているフィクスチャを把握して。
その後 src/ の未テストのファイルに対してテストを生成して。
各テストファイルは tests/ に同じ構造で保存すること" \
--allowedTools "Read,Write,Bash(pytest*)"
# Step 2: 生成されたテストの品質確認
pytest --cov=src --cov-report=html tests/
# coverage report を確認して、カバレッジが低い部分を追加依頼

# Step 3: 型チェック
mypy src/ tests/

重要な注意点:

# ✅ Claude Codeが生成したテストの良い例
def test_get_user_returns_none_for_invalid_id():
    result = get_user_by_id("invalid-uuid-format")
    assert result is None

def test_get_user_raises_for_negative_id():
    with pytest.raises(ValueError, match="ID must be positive"):
        get_user_by_id(-1)

# ⚠️ 生成されたテストでよくある問題
def test_login_success():
    # モックが実際のAPIを呼ばない設定になっているか確認
    # Claude Codeはモックを忘れることがある
    user = login("test@example.com", "password")
    assert user is not None  # これだけでは不十分

外部LLM連携(Gemini・Grok)の実装

MCP経由での外部モデル連携

// claude_desktop_config.json
{
  "mcpServers": {
    "gemini-bridge": {
      "command": "python",
      "args": ["/path/to/gemini_mcp_server.py"],
      "env": {
        "GOOGLE_API_KEY": "${GOOGLE_API_KEY}"
      }
    }
  }
}
# gemini_mcp_server.py(Gemini連携MCPサーバーの骨格)
import google.generativeai as genai
import os
from mcp.server import Server
from mcp.types import Tool, TextContent
import mcp.server.stdio as stdio_server
import asyncio

genai.configure(api_key=os.environ["GOOGLE_API_KEY"])
app = Server("gemini-bridge")

@app.list_tools()
async def list_tools():
    return [Tool(
        name="gemini_generate",
        description="Google Geminiモデルでテキストを生成する",
        inputSchema={
            "type": "object",
            "properties": {
                "prompt": {"type": "string"},
                "model": {"type": "string", "default": "gemini-1.5-pro"}
            },
            "required": ["prompt"]
        }
    )]

@app.call_tool()
async def call_tool(name: str, arguments: dict):
    if name == "gemini_generate":
        model = genai.GenerativeModel(arguments.get("model", "gemini-1.5-pro"))
        response = model.generate_content(arguments["prompt"])
        return [TextContent(type="text", text=response.text)]

async def main():
    async with stdio_server.stdio_server() as (r, w):
        await app.run(r, w, None)

asyncio.run(main())

Go言語デッドロックの教訓

Claude Code 3.0が提案したコードでデッドロックが発生した実例です:

// ❌ Claude Codeが生成した危険なコード(デッドロックあり)
var mu sync.Mutex

func processA() {
    mu.Lock()
    defer mu.Unlock()
    processB()  // processB も mu.Lock() を呼ぶ → デッドロック
}

func processB() {
    mu.Lock()
    defer mu.Unlock()
    // 処理
}
// ✅ 修正版(ロックの粒度を分ける)
var muA sync.Mutex
var muB sync.Mutex

func processA() {
    muA.Lock()
    defer muA.Unlock()
    // processB は muB のみをロック
    processB()
}

func processB() {
    muB.Lock()
    defer muB.Unlock()
    // 処理
}

教訓:goroutineや共有リソースが絡むコードはAIの提案でも必ず人間がレビューしてください。Claude Codeはシングルスレッドの文脈で正しいコードを書く傾向があり、並行処理の微妙な問題を見落とすことがあります。


あわせて読みたい

参考ソース