Antigravity に Claude のモデルを繋ぎ、最初のレスポンスが返ってきたとき、正直に言えば少し戸惑いました。同じ「Claude」でも、Opus 4 と Sonnet 4 では返答の質感が明らかに違う。それは絵筆の号数が変わるような話ではなく、まるで異なる素材で制作しているような感覚でした。
2014年から個人でアプリを開発してきた経験の中で、ツールの選択が作品の仕上がりを大きく左右することを何度も体感しています。累計5,000万ダウンロードを達成したアプリ群でも、最初は非力なサーバーで動かし、成長に合わせてスケールしていった。Claude のモデル選択もそれと同じ感覚だと、今は思っています。
ここではAntigravity 環境で Claude Opus 4・Sonnet 4・Haiku 4.5 を使い分ける判断基準と、本番環境で動かすための実装パターンをお伝えします。
Antigravity × Claude 統合の現在地
2026年5月時点で、Antigravity(Google が提供する AI コーディング IDE)は複数の外部 AI モデルとの連携をサポートしています。Gemini ファミリーが標準的な選択肢である一方、Anthropic の Claude モデルを MCP(Model Context Protocol)または API 統合経由で呼び出す開発者が増えています。
理由は単純です。タスクによって最適なモデルが異なるからです。
Gemini 2.5 Pro がコードベース全体の把握に優れている場面で、Claude Opus 4 は複雑な設計判断や倫理的な考慮を要するタスクで真価を発揮します。Sonnet 4 は高速かつコスト効率に優れており、反復的なコード生成に向いています。
私自身、壁紙アプリや引き寄せ系アプリの保守自動化ワークフローで、Antigravity 上に Claude を組み込んでいます。その経験から得た知見を整理しました。
3モデルの特性と使い分け基準
Claude Opus 4 — 深い思考が必要な場面に
Opus 4 は Anthropic 最高性能のモデルです。コンテキスト理解の深さ、複数ステップの推論、コードレビューの精度で他モデルを上回ります。
向いているタスク:
- 複雑なアーキテクチャ設計の相談
- セキュリティ上のリスク分析
- 長文ドキュメントの構造化と要約
- 微妙なバグの原因特定(症状から逆算する推論)
コスト感:
- 入力: $15 / 1M tokens
- 出力: $75 / 1M tokens
- 1回のリクエストで平均 2,000〜5,000 tokens 消費することが多い
月あたりのコストが高くなりやすいため、「これは Opus でなければ解決できないか」を問いかける習慣をつけることをお勧めします。
Claude Sonnet 4 — 日常的なコーディング作業の主力に
Sonnet 4 は速度・コスト・品質のバランスが最も取れたモデルです。私が Antigravity のデイリーワークフローで最も頻繁に使っているのがこのモデルです。
向いているタスク:
- コード生成・補完
- ユニットテスト作成
- リファクタリング提案
- API 仕様の実装
コスト感:
- 入力: $3 / 1M tokens
- 出力: $15 / 1M tokens
- Opus 4 の約 1/5 のコストで 80% 以上の品質を出せる場面が多い
Claude Haiku 4.5 — 高頻度・低レイテンシが必要な場面に
Haiku 4.5 は最軽量・最高速のモデルです。チャットインターフェースのリアルタイム応答や、大量の小さなタスクを並列処理する場面で活躍します。
向いているタスク:
- コード補完のサジェスト(インライン)
- ログの要約・分類
- 大量テキストの前処理
- ユーザーインターフェースへのリアルタイム応答
コスト感:
- 入力: $0.80 / 1M tokens
- 出力: $4 / 1M tokens
- Sonnet 4 の約 1/4 のコストで超高速応答
Antigravity への Claude 統合 — 実装パターン3選
パターン1: MCP サーバー経由の統合
最もシンプルな統合方法は、Antigravity の MCP 設定に Anthropic API を追加することです。
// .antigravity/mcp_settings.json
{
"mcpServers": {
"claude-integration": {
"command": "node",
"args": ["/path/to/claude-mcp-server/dist/index.js"],
"env": {
"ANTHROPIC_API_KEY": "${ANTHROPIC_API_KEY}",
"DEFAULT_MODEL": "claude-sonnet-4-6",
"FALLBACK_MODEL": "claude-haiku-4-5-20251001"
}
}
}
}次に、MCP サーバーのコア実装です。エラー時のフォールバックと、コストを意識したモデル選択ロジックを含めています。
// claude-mcp-server/src/index.ts
import Anthropic from "@anthropic-ai/sdk";
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
const client = new Anthropic({
apiKey: process.env.ANTHROPIC_API_KEY,
});
// タスクの複雑度からモデルを自動選択する関数
function selectModel(taskComplexity: "low" | "medium" | "high"): string {
const modelMap = {
low: "claude-haiku-4-5-20251001",
medium: "claude-sonnet-4-6",
high: "claude-opus-4-6",
};
return modelMap[taskComplexity];
}
// トークン数からコストを推定する関数(事前チェック用)
function estimateCost(
model: string,
inputTokens: number,
outputTokens: number
): number {
const pricing: Record<string, { input: number; output: number }> = {
"claude-opus-4-6": { input: 15, output: 75 },
"claude-sonnet-4-6": { input: 3, output: 15 },
"claude-haiku-4-5-20251001": { input: 0.8, output: 4 },
};
const p = pricing[model] || pricing["claude-sonnet-4-6"];
return (inputTokens * p.input + outputTokens * p.output) / 1_000_000;
}
// Claude へのリクエスト(ストリーミング対応)
async function callClaude(params: {
messages: Anthropic.MessageParam[];
system?: string;
taskComplexity?: "low" | "medium" | "high";
maxTokens?: number;
}): Promise<{ content: string; usage: Anthropic.Usage }> {
const model = selectModel(params.taskComplexity ?? "medium");
const maxTokens = params.maxTokens ?? 4096;
try {
const response = await client.messages.create({
model,
max_tokens: maxTokens,
system:
params.system ??
"あなたは熟練したソフトウェアエンジニアです。正確で実用的なコードを提供してください。",
messages: params.messages,
});
const textContent = response.content.find((c) => c.type === "text");
if (!textContent || textContent.type !== "text") {
throw new Error("No text content in response");
}
// コスト記録(ログ出力)
const cost = estimateCost(
model,
response.usage.input_tokens,
response.usage.output_tokens
);
console.error(
`[Claude] model=${model} cost=$${cost.toFixed(4)} tokens=${response.usage.input_tokens}+${response.usage.output_tokens}`
);
return { content: textContent.text, usage: response.usage };
} catch (error) {
// Opus 4 が失敗したら Sonnet 4 にフォールバック
if (model === "claude-opus-4-6") {
console.error("[Claude] Opus 4 failed, falling back to Sonnet 4");
return callClaude({ ...params, taskComplexity: "medium" });
}
throw error;
}
}パターン2: ツールコールを使った構造化出力
AI エージェントが外部 API を呼び出したり、構造化データを返す場面では、Claude のツールコール機能が効果的です。
// structured-output-with-tools.ts
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic();
// コードレビューツールの定義
const codeReviewTool: Anthropic.Tool = {
name: "submit_code_review",
description: "コードレビューの結果を構造化された形式で返す",
input_schema: {
type: "object" as const,
properties: {
severity: {
type: "string",
enum: ["critical", "warning", "info"],
description: "問題の深刻度",
},
category: {
type: "string",
enum: [
"security",
"performance",
"maintainability",
"logic",
"style",
],
description: "問題のカテゴリ",
},
issues: {
type: "array",
items: {
type: "object",
properties: {
line: { type: "number" },
description: { type: "string" },
suggestion: { type: "string" },
},
required: ["line", "description", "suggestion"],
},
description: "検出された問題のリスト",
},
overall_score: {
type: "number",
minimum: 0,
maximum: 100,
description: "コード品質スコア(0-100)",
},
},
required: ["severity", "category", "issues", "overall_score"],
},
};
async function reviewCode(code: string, language: string) {
const response = await client.messages.create({
// Opus 4 を使用(コードレビューは高精度が求められる)
model: "claude-opus-4-6",
max_tokens: 2048,
tools: [codeReviewTool],
tool_choice: { type: "tool", name: "submit_code_review" },
messages: [
{
role: "user",
content: `以下の${language}コードをレビューしてください:\n\n\`\`\`${language}\n${code}\n\`\`\``,
},
],
});
// ツールコールの結果を抽出
const toolUse = response.content.find((c) => c.type === "tool_use");
if (!toolUse || toolUse.type !== "tool_use") {
throw new Error("Expected tool use response");
}
return toolUse.input as {
severity: string;
category: string;
issues: Array<{ line: number; description: string; suggestion: string }>;
overall_score: number;
};
}
// 使用例
async function main() {
const sampleCode = `
async function fetchUserData(userId) {
const result = await db.query('SELECT * FROM users WHERE id = ' + userId);
return result;
}
`;
const review = await reviewCode(sampleCode, "javascript");
console.log(`品質スコア: ${review.overall_score}/100`);
console.log(`重大度: ${review.severity}`);
review.issues.forEach((issue) => {
console.log(`行${issue.line}: ${issue.description}`);
console.log(` → ${issue.suggestion}`);
});
}実際に実行すると、上記のコードは SQLインジェクション脆弱性(行2)を severity: critical で検出します。ツールコールを使うことで、AI の応答を型安全に扱えるのが大きなメリットです。
パターン3: ストリーミング応答とリアルタイム UI
ユーザーインターフェースで Claude の応答をリアルタイムに表示するには、ストリーミング API を使います。
// streaming-claude-in-antigravity.ts
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic();
async function* streamClaudeResponse(
userMessage: string,
conversationHistory: Anthropic.MessageParam[] = []
): AsyncGenerator<string> {
const messages: Anthropic.MessageParam[] = [
...conversationHistory,
{ role: "user", content: userMessage },
];
// ストリーミングで Sonnet 4 を呼び出す
const stream = await client.messages.stream({
model: "claude-sonnet-4-6",
max_tokens: 1024,
messages,
system:
"あなたは Antigravity IDE の開発をサポートするアシスタントです。簡潔で実用的な回答を提供してください。",
});
let inputTokens = 0;
let outputTokens = 0;
for await (const chunk of stream) {
if (
chunk.type === "content_block_delta" &&
chunk.delta.type === "text_delta"
) {
yield chunk.delta.text;
} else if (chunk.type === "message_start") {
inputTokens = chunk.message.usage.input_tokens;
} else if (chunk.type === "message_delta") {
outputTokens = chunk.usage.output_tokens;
}
}
// コストログ
const cost =
(inputTokens * 3 + outputTokens * 15) / 1_000_000;
console.error(`[Streaming] tokens=${inputTokens}+${outputTokens} cost=$${cost.toFixed(4)}`);
}
// Antigravity エージェントスクリプトでの使用例
async function runInteractiveSession() {
const history: Anthropic.MessageParam[] = [];
const userInput = "このTypeScriptコードのパフォーマンスを改善するには?";
process.stdout.write("Claude: ");
let fullResponse = "";
for await (const chunk of streamClaudeResponse(userInput, history)) {
process.stdout.write(chunk);
fullResponse += chunk;
}
console.log();
// 会話履歴を更新
history.push({ role: "user", content: userInput });
history.push({ role: "assistant", content: fullResponse });
}コスト最適化: 個人開発者の視点から
12年間、AdMob での広告収益で生計を立ててきた経験から、コスト管理の重要性は骨身に染みています。AI API のコストも同じ感覚で管理しています。
モデルルーティングの実践
1つのワークフロー内で複数のモデルを組み合わせることで、コストを大幅に削減できます。
// cost-aware-model-router.ts
interface TaskConfig {
systemPrompt: string;
userMessage: string;
// タスクの特性を指定
requiresDeepReasoning: boolean;
isRepetitive: boolean;
latencyRequirement: "realtime" | "normal" | "batch";
}
function chooseModel(config: TaskConfig): string {
// リアルタイム応答が必要 → Haiku
if (config.latencyRequirement === "realtime") {
return "claude-haiku-4-5-20251001";
}
// 深い推論が必要 → Opus 4
if (config.requiresDeepReasoning && !config.isRepetitive) {
return "claude-opus-4-6";
}
// バッチ処理の反復タスク → Haiku でコスト削減
if (config.isRepetitive && config.latencyRequirement === "batch") {
return "claude-haiku-4-5-20251001";
}
// それ以外 → Sonnet 4 がデフォルト
return "claude-sonnet-4-6";
}
// 月次コスト予測
function estimateMonthlyBudget(dailyTasks: {
deepAnalysis: number; // Opus 4 タスク数
codeGeneration: number; // Sonnet 4 タスク数
quickQueries: number; // Haiku タスク数
}): number {
// 平均トークン数を仮定
const avgTokensOpus = 3000;
const avgTokensSonnet = 1500;
const avgTokensHaiku = 500;
const dailyCost =
(dailyTasks.deepAnalysis * avgTokensOpus * (15 + 75)) / 1_000_000 +
(dailyTasks.codeGeneration * avgTokensSonnet * (3 + 15)) / 1_000_000 +
(dailyTasks.quickQueries * avgTokensHaiku * (0.8 + 4)) / 1_000_000;
return dailyCost * 30;
}
// 実際の使用量例
const monthlyBudget = estimateMonthlyBudget({
deepAnalysis: 5, // 1日5回の設計相談
codeGeneration: 50, // 1日50回のコード生成
quickQueries: 200, // 1日200回のインライン補完
});
console.log(`月次予測コスト: $${monthlyBudget.toFixed(2)}`);
// → 約 $12〜18 / 月(個人開発の範囲内)レート制限とリトライ戦略
本番環境では、API のレート制限(Rate Limit)への対応が必要です。
// rate-limit-retry.ts
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic();
async function callWithRetry(
params: Anthropic.MessageCreateParamsNonStreaming,
maxRetries = 3
): Promise<Anthropic.Message> {
let lastError: Error | null = null;
for (let attempt = 0; attempt < maxRetries; attempt++) {
try {
return await client.messages.create(params);
} catch (error) {
if (error instanceof Anthropic.RateLimitError) {
// レート制限: エクスポネンシャルバックオフで待機
const waitMs = Math.pow(2, attempt) * 1000 + Math.random() * 500;
console.warn(`Rate limited. Retrying in ${waitMs}ms... (attempt ${attempt + 1}/${maxRetries})`);
await new Promise((resolve) => setTimeout(resolve, waitMs));
lastError = error;
continue;
}
if (error instanceof Anthropic.APIError && error.status === 529) {
// API過負荷: より長い待機
const waitMs = 5000 + Math.random() * 3000;
console.warn(`API overloaded. Retrying in ${waitMs}ms...`);
await new Promise((resolve) => setTimeout(resolve, waitMs));
lastError = error;
continue;
}
// その他のエラーは即座に throw
throw error;
}
}
throw lastError ?? new Error("Max retries exceeded");
}Antigravity で Claude を使う際の実践的な注意点
コンテキストウィンドウの管理: Antigravity のエージェントは長い会話履歴を持ちやすいため、会話が長くなるほどコストが増加します。不要な履歴を定期的にクリアするか、要約して圧縮する仕組みを入れることをお勧めします。
システムプロンプトの設計: Antigravity 上で Claude を使う場合、「あなたは Antigravity IDE 上で動作するエージェントです」という文脈をシステムプロンプトに明示すると、より適切なコード提案が返ってきます。
日本語での利用: Claude Sonnet 4 / Opus 4 は日本語の理解・生成品質が高く、日本語でのコメント付きコードや日本語のドキュメント生成に適しています。Haiku 4.5 は日本語でも速度は出ますが、複雑な日本語表現はやや苦手です。
2026年5月時点での私の選択
現在の私のワークフローを正直にお伝えすると:
- 壁紙アプリの画像分類・タグ付け: Haiku 4.5(大量処理のためコスト優先)
- 新機能のアーキテクチャ相談: Opus 4(設計ミスのコストを考えると安い)
- コード生成・リファクタリング: Sonnet 4(バランスが最も取れている)
- アプリ説明文の多言語最適化: Sonnet 4(品質と速度の両立)
この使い分けで、月間 API コストを $15〜25 の範囲に収めながら、個人開発の生産性を大幅に向上できています。
モデルの選択はツールの選択です。油絵具と水彩絵具を使い分けるように、タスクの性質に合わせて選ぶ習慣が身につくと、AI 開発の効率は一段階上がります。
Antigravity の設定画面から API キーを登録し、上記のサンプルコードを自分のプロジェクトに合わせて調整してみてください。最初の1週間は意識的にコストログを確認しながら、自分のワークフローに最適なモデルの組み合わせを探っていくのが良いと思います。