Claude Opus 5.5移行入門——AIレビューを測ってから切り替える
AnthropicのClaude Opus 5.5を題材に、Next.js + Firestore + GitHub ActionsでAIレビュー機能を評価し、段階的に移行する実践手順を解説します。

はじめに
AIレビューや調査エージェントを本番運用していると、新モデルの発表はうれしい一方で、すぐ切り替えてよいか迷います。
- レビュー品質は本当に上がるのか
- コストは下がっても出力が変わりすぎないか
- tool useやthinkingまわりで既存実装が壊れないか
- 拒否や安全側の挙動をアプリ側で扱えるか
Anthropicは2026年9月22日にClaude Opus 5.5を発表しました。公式発表では、Claude 5.5ファミリー最初のモデルで、Opus 5より入力・出力単価が下がり、典型的なワークロードで40%低コスト、出力は30%以上高速と説明されています。Claude Platform DocsではClaude APIのモデルIDが claude-opus-5-5 であること、1M token context window、128K max outputを持つことも確認できます。
本記事では、架空の問い合わせ管理SaaS「SupportBoard」を題材に、Next.js App Router + Firestore + GitHub Actions + TypeScriptで、既存のAIレビュー機能をClaude Opus 5.5へ段階移行する手順を作ります。
参考にした一次情報は次の通りです。
- Claude Opus 5.5
- Models overview - Claude Platform Docs
- Migrating to Claude Opus 5.5
- Get started with Claude
何が変わったのか
Opus 5.5は「高性能だから即置換」ではなく、「長いコーディング・知識作業を、より測りやすいコストで任せられる候補」と捉えるのが現実的です。
| 観点 | 公式情報から確認できること | SupportBoardで見る指標 |
|---|---|---|
| モデルID | Claude APIでは claude-opus-5-5 | 設定値の差し替え漏れ |
| 価格 | Opus 5より入力・出力単価が低い | 1レビューあたりの推定token費用 |
| 速度 | Opus 5より出力が30%以上高速 | GitHub Actionsの実行時間 |
| 移行差分 | thinking無効化不可、forced tool use非対応など | APIエラー率と停止理由 |
| 安全側の挙動 | refusal categoryが広がる | レビュー不能時のUI表示 |
特に移行ガイドで重要なのは、Opus 5.5では thinking を無効化できないこと、tool_choice の any や特定tool強制がサポートされないことです。既存実装が「必ずこのツールを呼ばせる」設計なら、プロンプトで条件を明示しつつ auto とstrict tool useへ寄せる必要があります。
ハンズオン1: モデル設定を1箇所に集約する
まず、SupportBoardのAIレビュー機能でモデル名を直書きしないようにします。環境変数で切り替えられるようにし、Firestoreにも実行時のモデル名を残します。
// src/lib/ai/claudeConfig.ts
export type ClaudeReviewModel = "claude-opus-5" | "claude-opus-5-5";
export function getClaudeReviewModel(): ClaudeReviewModel {
const model = process.env.CLAUDE_REVIEW_MODEL ?? "claude-opus-5";
if (model === "claude-opus-5" || model === "claude-opus-5-5") {
return model;
}
throw new Error(`Unsupported Claude review model: ${model}`);
}
モデルIDは公式Docsで確認できる値だけに絞ります。日付サフィックスやクラウドプロバイダ別IDはプラットフォームによって異なるため、この記事ではClaude APIのIDだけを扱います。
ハンズオン2: AIレビューを呼び出す
次に、公式TypeScript SDKである @anthropic-ai/sdk を使ってレビューを実行します。SDKはnpmで存在を確認済みです。
// src/lib/ai/runClaudeReview.ts
import Anthropic from "@anthropic-ai/sdk";
import { getClaudeReviewModel } from "./claudeConfig";
const anthropic = new Anthropic({
apiKey: process.env.ANTHROPIC_API_KEY,
});
export async function runClaudeReview(input: {
pullRequestTitle: string;
diffSummary: string;
}) {
const model = getClaudeReviewModel();
const message = await anthropic.messages.create({
model,
max_tokens: 1200,
messages: [
{
role: "user",
content: [
"あなたはNext.js + Firestoreのコードレビュー担当です。",
"重大度順に、バグ・セキュリティ・テスト不足だけを指摘してください。",
`PR title: ${input.pullRequestTitle}`,
`Diff summary:\n${input.diffSummary}`,
].join("\n\n"),
},
],
});
const text = message.content
.filter((block) => block.type === "text")
.map((block) => block.text)
.join("\n");
return {
model,
text,
stopReason: message.stop_reason,
usage: message.usage,
};
}
Opus 5.5ではthinking blockが返る可能性があるため、表示用テキストは type === "text" のblockだけを拾います。tool resultを返すような長い会話ではthinking blockを保持する必要がありますが、単発レビューなら「表示するもの」と「監査するメタデータ」を分けるだけでも移行リスクを下げられます。
ハンズオン3: Firestoreに評価台帳を作る
モデルを切り替える前に、実行結果をFirestoreへ保存します。レビュー本文だけでなく、モデル名、停止理由、token usage、実行時間を残しておくと、あとから「品質が上がったのか、ただ長くなったのか」を確認できます。
// src/app/actions/saveAiReviewEvaluation.ts
"use server";
import { FieldValue } from "firebase-admin/firestore";
import { db } from "@/lib/firebaseAdmin";
export async function saveAiReviewEvaluation(input: {
repository: string;
pullRequestNumber: number;
model: string;
stopReason: string | null;
inputTokens?: number;
outputTokens?: number;
durationMs: number;
reviewerScore: 1 | 2 | 3 | 4 | 5;
notes: string;
}) {
await db.collection("aiReviewEvaluations").add({
provider: "anthropic",
task: "pull_request_review",
...input,
createdAt: FieldValue.serverTimestamp(),
});
}
reviewerScore は人間のレビュー担当が5段階で入力する想定です。AIの出力だけで自動採点すると、もっとも大事な「実務でレビューに使えたか」が抜けやすくなります。
ハンズオン4: GitHub Actionsで10%だけ試す
いきなり全PRをOpus 5.5へ切り替えるのではなく、ラベル付きPRだけで評価します。CIでモデル名を注入すれば、アプリコードを戻さずに比較できます。
name: AI review evaluation
on:
pull_request:
types: [opened, synchronize, labeled]
jobs:
claude-review:
if: contains(github.event.pull_request.labels.*.name, 'ai-review-opus-55')
runs-on: ubuntu-latest
env:
CLAUDE_REVIEW_MODEL: claude-opus-5-5
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: yarn
- run: yarn install --frozen-lockfile
- run: yarn build
- run: yarn tsx scripts/run-ai-review.ts
この例では、ai-review-opus-55 ラベルが付いたPRだけを対象にします。20〜30本のPRを同時に見る場合は、3〜4本ずつラベルを付け、レビュー担当者の採点をFirestoreに残してから次のバッチに進めます。
移行チェックリスト
Opus 5.5へ移す前に、次の項目を確認します。
| チェック | 見る場所 | 対応 |
|---|---|---|
thinking を無効化していないか | API呼び出し | 削除し、必要ならeffort設定を検討 |
tool_choice: "any" や特定tool強制がないか | tool use実装 | auto とstrict tool useへ寄せる |
| thinking blockをUIにそのまま出していないか | レンダリング処理 | text blockだけを表示する |
| refusalを通常エラー扱いしていないか | Server Action / API route | ユーザー向けメッセージへ分岐 |
| モデル名が複数箇所に散らばっていないか | rg "claude-opus" | 設定ヘルパーへ集約 |
公式移行ガイドには、computer use toolの変更や、会話履歴内のthinking blockの扱いも記載されています。ブラウザ操作エージェントやtool loopを持つアプリでは、単純なモデルID差し替えだけで済ませず、移行ガイドのbreaking changesを1つずつ潰すのが安全です。
まとめ
Claude Opus 5.5は、コーディングや長い知識作業に強い新しい選択肢です。ただし、AIレビューのようにチームの開発フローへ入る機能では、モデル名を変える前に「測る仕組み」を作る方が失敗しにくいです。
- Claude APIのモデルIDは
claude-opus-5-5 - Opus 5より低コスト・高速化が公式に案内されている
thinking無効化不可、forced tool use非対応などの移行差分がある- Next.js側ではモデル設定を集約し、Firestoreに評価台帳を残す
- GitHub Actionsではラベル付きPRから小さく試す
新モデルへの移行は、置換作業ではなく運用品質の更新です。品質、費用、停止理由、レビュー担当者の評価を同じ台帳で見られるようにしてから、SupportBoard全体の既定モデルへ昇格させましょう。