AI業務活用 2026.05.07
Claude・Copilot・複数AIを連携させるコーディング自動化【実装手順】
なぜ複数のAIツールを組み合わせるのか
1つのAIツールですべての開発作業をカバーしようとすると、必ずどこかで非効率が生まれます。GitHub CopilotはVS Codeのエディタ補完に特化していて遅延が少ない反面、複雑なリファクタリングや設計判断は苦手です。Claude Code Sonnet 4.5はアーキテクチャ設計や大規模コード変更に優れますが、1行ずつの補完には過剰コストです。
2026年5月のCode w/ Claude 2026カンファレンスで、SnowflakeのClaude Codeプラグインが発表されました。Claude CodeがSQL関連のプロンプトを検出すると、自動でCortex Codeに処理を委譲する仕組みです。これは「エージェントエンジニアリング」の実例です:AIが自分でタスクを判断して最適なツールに引き継ぐ方式です。
この記事では、Claude Code + GitHub Copilot + Claude APIを組み合わせて開発効率を最大化する実装方法を解説します。
ツール比較:何が得意か
| ツール | 最得意タスク | 応答速度 | 月額コスト |
|---|---|---|---|
| GitHub Copilot | 1行補完・コード補完 | <0.5秒 | $10/月 |
| Claude Code (Sonnet) | 設計・リファクタリング | 3-10秒 | $20/月 (Pro) |
| Claude API (Haiku) | バッチ処理・繰り返し | 1-2秒 | 従量課金 ~$5/月 |
| Claude API (Opus) | 複雑な推論・戦略立案 | 5-20秒 | 従量課金 ~$30/月 |
タスク自動振り分けの実装
# task_router.py
# タスクの種類に応じて最適なAIツールを選択して実行する
import anthropic
import subprocess
from dataclasses import dataclass
from enum import Enum
client = anthropic.Anthropic()
class TaskType(Enum):
QUICK_FIX = "quick_fix" # 軽微な修正・補完
REFACTOR = "refactor" # リファクタリング
ARCHITECTURE = "architecture" # 設計・アーキテクチャ
BATCH = "batch" # 繰り返し処理
@dataclass
class RoutingResult:
tool: str
model: str
reason: str
estimated_cost_usd: float
def classify_task(task: str) -> TaskType:
"""タスクの内容から種類を判定する"""
task_lower = task.lower()
if any(kw in task_lower for kw in ["変数名", "コメント", "インポート", "typo", "空白"]):
return TaskType.QUICK_FIX
elif any(kw in task_lower for kw in ["設計", "アーキテクチャ", "データベース設計", "api設計"]):
return TaskType.ARCHITECTURE
elif any(kw in task_lower for kw in ["全ファイル", "一括", "すべての", "バッチ"]):
return TaskType.BATCH
else:
return TaskType.REFACTOR
def route_task(task: str, code_context: str = "") -> RoutingResult:
"""タスクを分析して最適なモデルと実行方法を返す"""
task_type = classify_task(task)
routing_map = {
TaskType.QUICK_FIX: RoutingResult(
tool="copilot",
model="github-copilot",
reason="短時間の補完はCopilotが最速",
estimated_cost_usd=0.0 # 月額固定
),
TaskType.REFACTOR: RoutingResult(
tool="claude-api",
model="claude-sonnet-4-5",
reason="リファクタリングはSonnetの品質が最適",
estimated_cost_usd=0.002 # 目安
),
TaskType.ARCHITECTURE: RoutingResult(
tool="claude-api",
model="claude-opus-5",
reason="設計判断には最高品質のOpusを使用",
estimated_cost_usd=0.01 # 目安
),
TaskType.BATCH: RoutingResult(
tool="claude-api",
model="claude-haiku-4-5-20251001",
reason="大量処理はHaikuでコスト最小化",
estimated_cost_usd=0.0003 # 目安
),
}
result = routing_map[task_type]
print(f"タスク種別: {task_type.value}")
print(f"割り当て: {result.tool} ({result.model})")
print(f"理由: {result.reason}")
print(f"推定コスト: ~${result.estimated_cost_usd:.4f}")
return result
def execute_with_claude(task: str, code: str, model: str) -> str:
"""Claude APIでタスクを実行する"""
pricing = {
"claude-haiku-4-5-20251001": (0.80, 4.00),
"claude-sonnet-4-5": (3.00, 15.00),
"claude-opus-5": (15.00, 75.00),
}
input_price, output_price = pricing.get(model, (3.00, 15.00))
response = client.messages.create(
model=model,
max_tokens=2048,
messages=[{
"role": "user",
"content": f"{task}\n\n```python\n{code}\n```"
}]
)
cost = (response.usage.input_tokens * input_price + response.usage.output_tokens * output_price) / 1_000_000
print(f"実行コスト: ${cost:.5f}")
return response.content[0].text
# 使用例
tasks = [
("変数名をスネークケースに統一して", "def calcUserAge(birthYear): return 2026 - birthYear"),
("このクラスをリファクタリングして", "class UserManager:\n users = []\n def add(self, u): self.users.append(u)"),
("マイクロサービス設計の提案をして", "モノリシックなEC APIをスケールさせたい"),
]
for task, code in tasks:
print(f"\n=== タスク: {task[:30]}... ===")
routing = route_task(task, code)
if routing.tool == "claude-api":
result = execute_with_claude(task, code, routing.model)
print(f"結果(先頭200文字): {result[:200]}")
else:
print("→ Copilot(VS Codeエディタで補完)")
Claude CodeとCopilotの連携ワークフロー
実務で効果的な5ステップワークフローを紹介します。
Step 1 (設計フェーズ): Claude Code で要件整理・設計書作成
claude "ECサイトのカート機能の設計を提案して。技術はNext.js + Prismaです"
→ アーキテクチャ提案・ER図・API設計が出力される
Step 2 (スキャフォールド): Claude Code でファイル雛形生成
claude "先ほどの設計に従ってファイル構造を作成して"
→ app/cart/, lib/cart.ts, prisma/schema追加が自動実行される
Step 3 (実装フェーズ): VS Code + Copilot で詳細実装
- Copilotが関数の中身・型定義を補完
- 繰り返しパターンはCopilotが最速
Step 4 (レビューフェーズ): Claude API でコード品質確認
→ review_code() 関数でSonnetがレビュー(下記参照)
Step 5 (テスト自動生成): Claude Code でテスト作成
claude "実装したカート機能のテストを書いて"
→ Vitestのテストファイルが自動生成される
バッチコードレビューの自動化
# batch_code_review.py
# ディレクトリ内のPythonファイルを一括レビューする
import anthropic
import json
from pathlib import Path
client = anthropic.Anthropic()
REVIEW_PROMPT = """以下のPythonコードをレビューしてください。
評価項目(JSON形式で出力):
{
"score": 1〜10,
"issues": ["問題点1", "問題点2"],
"suggestions": ["改善案1", "改善案2"]
}
コード:
"""
def review_file(file_path: Path) -> dict:
"""1ファイルをレビューする(Sonnet使用)"""
code = file_path.read_text()[:3000] # 最大3000文字
response = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=512,
messages=[{"role": "user", "content": REVIEW_PROMPT + code}]
)
cost = (response.usage.input_tokens * 3.00 + response.usage.output_tokens * 15.00) / 1_000_000
try:
review = json.loads(response.content[0].text)
except json.JSONDecodeError:
review = {"score": 0, "issues": ["レビュー解析失敗"], "suggestions": []}
review["file"] = str(file_path)
review["cost_usd"] = round(cost, 5)
return review
def batch_review_directory(directory: str = ".", pattern: str = "*.py") -> list[dict]:
"""ディレクトリ内の全Pythonファイルをバッチレビューする"""
files = list(Path(directory).glob(pattern))
print(f"{len(files)}件のファイルをレビュー中...")
results = []
total_cost = 0.0
for file in files:
if file.name.startswith("_"):
continue
result = review_file(file)
results.append(result)
total_cost += result["cost_usd"]
print(f" {file.name}: スコア {result['score']}/10 (${result['cost_usd']:.5f})")
# スコア順にソート
results.sort(key=lambda r: r.get("score", 0))
print(f"\n合計コスト: ${total_cost:.4f}")
print(f"要改善ファイル(スコア7未満): {len([r for r in results if r.get('score', 10) < 7])}")
return results
# 実行例: src/ディレクトリをレビュー
# results = batch_review_directory("src", "*.py")
Copilotからの移行タイミング
Copilot単体では限界があります。以下のシグナルが出たらClaude Codeへの移行・併用を検討してください。
Copilot限界サイン → Claude Code が解決する方法
───────────────────────────────────────────────
「ファイルをまたいだ修正が苦手」 → Claude Code は複数ファイルを同時に編集できる
「文脈を理解した説明ができない」 → Claude Code はコードベース全体を把握して説明する
「テスト自動生成が的外れ」 → Claude Code は既存テストを参照してスタイルを合わせる
「依存関係の整理が難しい」 → Claude Code は package.json/imports を自動整理する
「リファクタリング後の影響範囲不明」→ Claude Code は影響ファイルを列挙して一括更新する
コスト最適化:月額を抑える実践設定
Claude Codeを使いすぎるとコストが膨らみます。以下の設定で月額を管理しましょう。
# .claude/settings.json に追加する設定
{
"model": "claude-haiku-4-5-20251001",
"maxTokensPerSession": 50000,
"hooks": {
"PreToolUse": [
{
"matcher": "Write",
"hooks": [
{
"type": "command",
"command": "python3 .claude/cost_guard.py"
}
]
}
]
}
}
# .claude/cost_guard.py
# 1日の使用量が上限を超えたらClaude Codeをブロックする
import json
import sys
from pathlib import Path
from datetime import date
DAILY_LIMIT_USD = 2.00 # 1日の上限額
LOG_FILE = Path(".claude/daily_cost.json")
def check_daily_cost() -> None:
today = str(date.today())
log = json.loads(LOG_FILE.read_text()) if LOG_FILE.exists() else {}
today_cost = log.get(today, 0.0)
if today_cost >= DAILY_LIMIT_USD:
print(f"日次コスト上限到達: ${today_cost:.2f} / ${DAILY_LIMIT_USD:.2f}")
print("明日まで待つか、上限額を.claude/cost_guard.pyで変更してください")
sys.exit(1) # exit code 1でClaude Codeの実行をブロック
print(f"本日のコスト: ${today_cost:.3f} / ${DAILY_LIMIT_USD:.2f} (OK)")
check_daily_cost()