AI

Claude Opus 5.5移行入門——AIレビューを測ってから切り替える

AnthropicのClaude Opus 5.5を題材に、Next.js + Firestore + GitHub ActionsでAIレビュー機能を評価し、段階的に移行する実践手順を解説します。

2026年9月23日
Claude Opus 5.5AnthropicNext.jsFirestoreGitHub Actions
Claude Opus 5.5移行入門——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へ段階移行する手順を作ります。

参考にした一次情報は次の通りです。

何が変わったのか

Opus 5.5は「高性能だから即置換」ではなく、「長いコーディング・知識作業を、より測りやすいコストで任せられる候補」と捉えるのが現実的です。

観点公式情報から確認できることSupportBoardで見る指標
モデルIDClaude 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_choiceany や特定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全体の既定モデルへ昇格させましょう。