AI

GPT-6 Astra Ultrafast入門——AI応答速度をFirestoreで測る

OpenAI Responses APIのGPT-6 Astra Ultrafast modeを題材に、Next.js + FirestoreでAI機能の速度、コスト、採用判断を監査する実践手順を解説します。

2026年10月6日
OpenAIGPT-6 AstraResponses APIUltrafastFirestore
GPT-6 Astra Ultrafast入門——AI応答速度をFirestoreで測る

はじめに

AI機能をプロダクトに組み込むとき、モデルの賢さだけでなく「返ってくるまで何秒待たせるか」が体験を大きく左右します。

場面遅いと起きること
問い合わせ返信の下書き担当者が待てずに手入力へ戻る
PRレビュー支援CI結果よりAIレビューが遅く、確認フローから外れる
管理画面の要約画面遷移のたびに待ち時間が積み上がる

OpenAI APIのChangelogでは、2026年9月29日に GPT-6 AstraのUltrafast mode がResponses APIへ追加されたと案内されています。gpt-6-astra に service_tier: "ultrafast" を指定すると、生成トークン間の待ち時間を短くするための最速サービス層を使えます。

本記事では、架空の社内業務SaaS「TraceDeck」を題材に、Next.js App Router + Firestore + TypeScriptで「AI応答速度の計測台帳」を作ります。この記事を読み終えると、Ultrafastを雰囲気でONにするのではなく、標準応答、Ultrafast応答、利用者、用途、レイテンシをFirestoreへ残し、採用判断できる形にできます。

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

何が新しいのか

公式ドキュメントでは、Ultrafast modeはOpenAI APIの最速サービス層で、Standard modeより最大8倍速いと説明されています。2026年10月6日時点ではGPT-6 Astraで広く利用でき、リクエストごとに service_tier: "ultrafast" を指定します。

ただし、速度だけ見て全面採用するのは危険です。公式ドキュメントでは、速度に見合うコストがある場合に使うこと、エージェント用途ではWebSocketの利用が推奨されること、UltrafastはUS data residencyとglobal processingのみでEUなどの地域処理エンドポイントは対象外であることも案内されています。

大事なのは、Ultrafastを「全AI処理のデフォルト」にしないことです。TraceDeckでは、担当者が画面上で待つ処理だけを候補にし、夜間バッチや非同期レビューはStandardのままにします。

事前準備

サーバー側でOpenAI APIとFirestoreを扱うため、TraceDeckでは次のパッケージを使う想定にします。

yarn add openai firebase-admin

環境変数はホスティング環境やGitHub ActionsのSecretsに設定します。APIキーをクライアントコンポーネントへ渡さないことが前提です。

OPENAI_API_KEY=sk-...

Ultrafast modeはリクエスト単位で指定できます。つまり、モデル名を分けるというより「同じ gpt-6-astra を、用途に応じて別のサービス層で呼ぶ」と捉えると設計しやすいです。

ハンズオン1: OpenAI呼び出しを薄い関数にする

まずはResponses APIを呼ぶ関数を作ります。ここでは公式ドキュメントのTypeScript例に合わせ、model: "gpt-6-astra" と service_tier: "ultrafast" を使います。

// src/lib/ai/createTraceDeckSummary.ts
import OpenAI from "openai";

const openai = new OpenAI({
  apiKey: process.env.OPENAI_API_KEY,
});

export type AiServiceTier = "standard" | "ultrafast";

type SummaryInput = {
  ticketTitle: string;
  ticketBody: string;
  serviceTier: AiServiceTier;
};

export async function createTraceDeckSummary(input: SummaryInput) {
  const startedAt = Date.now();

  const response = await openai.responses.create({
    model: "gpt-6-astra",
    service_tier:
      input.serviceTier === "ultrafast" ? "ultrafast" : undefined,
    input:
      "次の問い合わせを、担当者が30秒で把握できるように日本語で要約してください。\n\n" +
      `タイトル: ${input.ticketTitle}\n` +
      `本文: ${input.ticketBody}`,
  });

  return {
    responseId: response.id,
    text: response.output_text,
    usage: response.usage ?? null,
    latencyMs: Date.now() - startedAt,
  };
}

standard のときは service_tier を付けず、標準の挙動に任せています。アプリ側の型は "standard" | "ultrafast" にしておくと、UI、Firestore、集計クエリで同じ値を扱えます。

ハンズオン2: Firestoreに計測台帳を残す

次に、AI呼び出しの結果を aiLatencyRuns コレクションへ保存します。速度改善の判断では、1回の体感よりも、同じ用途で何十回か測ったp50、p95、失敗率を見る方が安全です。

// src/app/api/tickets/[ticketId]/ai-summary/route.ts
import { FieldValue } from "firebase-admin/firestore";
import { NextRequest, NextResponse } from "next/server";
import { adminDb } from "@/lib/firebase/admin";
import {
  type AiServiceTier,
  createTraceDeckSummary,
} from "@/lib/ai/createTraceDeckSummary";

type Params = {
  params: Promise<{ ticketId: string }>;
};

type RequestBody = {
  title: string;
  body: string;
  serviceTier?: AiServiceTier;
};

export async function POST(request: NextRequest, { params }: Params) {
  const { ticketId } = await params;
  const body = (await request.json()) as RequestBody;
  const serviceTier = body.serviceTier === "ultrafast" ? "ultrafast" : "standard";

  if (!body.title || !body.body || body.body.length > 20_000) {
    return NextResponse.json(
      { error: "title and body are required" },
      { status: 400 },
    );
  }

  const runRef = await adminDb.collection("aiLatencyRuns").add({
    provider: "openai",
    model: "gpt-6-astra",
    serviceTier,
    useCase: "ticket_summary",
    targetId: ticketId,
    status: "running",
    responseId: null,
    latencyMs: null,
    usage: null,
    createdAt: FieldValue.serverTimestamp(),
    updatedAt: FieldValue.serverTimestamp(),
  });

  try {
    const result = await createTraceDeckSummary({
      ticketTitle: body.title,
      ticketBody: body.body,
      serviceTier,
    });

    await runRef.update({
      status: "completed",
      responseId: result.responseId,
      latencyMs: result.latencyMs,
      usage: result.usage,
      updatedAt: FieldValue.serverTimestamp(),
    });

    return NextResponse.json({
      runId: runRef.id,
      summary: result.text,
      latencyMs: result.latencyMs,
    });
  } catch (error) {
    await runRef.update({
      status: "failed",
      errorMessage: error instanceof Error ? error.message : "unknown error",
      updatedAt: FieldValue.serverTimestamp(),
    });

    return NextResponse.json({ error: "AI summary failed" }, { status: 502 });
  }
}

ここで保存している usage は、後からコストを見積もるための材料です。Ultrafastは速度に価値がある場面で使うものなので、「速かった」だけでなく「その速さに見合う用途だったか」まで残します。

ハンズオン3: GitHub Actionsで定点観測する

本番利用前に、代表的なプロンプトで毎日数回だけ定点観測するのも有効です。GitHub ActionsからNext.jsの内部APIを叩く場合は、専用の検証環境と短命の認証を使い、本番ユーザーデータを送らないようにします。

name: AI latency smoke test

on:
  schedule:
    - cron: "0 21 * * *"
  workflow_dispatch:

jobs:
  smoke-test:
    runs-on: ubuntu-latest
    steps:
      - name: Measure standard summary
        run: |
          curl -sS -X POST "$TRACEDECK_BASE_URL/api/tickets/demo/ai-summary" \
            -H "Authorization: Bearer $TRACEDECK_SMOKE_TOKEN" \
            -H "Content-Type: application/json" \
            -d '{"title":"請求書CSVの取り込み相談","body":"取引先別にCSV列名が異なるため、取り込み前に注意点を要約したいです。","serviceTier":"standard"}'

      - name: Measure ultrafast summary
        run: |
          curl -sS -X POST "$TRACEDECK_BASE_URL/api/tickets/demo/ai-summary" \
            -H "Authorization: Bearer $TRACEDECK_SMOKE_TOKEN" \
            -H "Content-Type: application/json" \
            -d '{"title":"請求書CSVの取り込み相談","body":"取引先別にCSV列名が異なるため、取り込み前に注意点を要約したいです。","serviceTier":"ultrafast"}'

このワークフローは精密なベンチマークではありません。ネットワーク、リージョン、入力長、混雑状況で結果は変わります。目的は「急に遅くなった」「失敗率が上がった」「Ultrafastとの差が用途に対して小さい」といった変化を早めに見つけることです。

採用判断のテーブルを作る

Firestoreに台帳があると、管理画面では次のような判断テーブルを作れます。

用途推奨tier判断基準
画面上の問い合わせ要約ultrafast候補担当者が待つため、p95短縮の価値が高い
PRレビューの夜間実行standard非同期でよく、速度よりコストと安定性を優先
チャット型の操作補助ultrafast + WebSocket候補複数ターンで遅延が積み上がりやすい
月次レポート生成standardバッチ処理なので即時性が低い

特にチャット型やツール呼び出しが連続するエージェントでは、公式ドキュメントがWebSocketを強く推奨しています。単発の responses.create で効果を見たあと、会話型UIでは接続方式も含めて設計し直すのが現実的です。

注意点

Ultrafast modeは便利ですが、次の点は先にチームで合意しておくと運用しやすくなります。

  • service_tier をユーザー入力から無制限に指定させない
  • 用途ごとに利用可否をサーバー側で判定する
  • Firestoreへ入力本文を丸ごと保存せず、必要なメタデータ中心にする
  • EUなどの地域処理要件があるプロジェクトでは公式のdata residency条件を確認する
  • Pricingページを確認し、速度改善とコストの差を同じ指標で見る

AIの速度改善は、体感が良いぶん、採用判断が感覚的になりやすい領域です。だからこそ、latencyMs、usage、serviceTier、useCase を同じ台帳に残しておく価値があります。

まとめ

GPT-6 AstraのUltrafast modeは、即時性がユーザー体験に直結するAI機能で強力な選択肢になります。一方で、すべての処理を速いtierへ寄せるのではなく、用途、コスト、地域要件、接続方式を分けて考える必要があります。

TraceDeckのようにNext.jsのサーバー側で呼び出しを集約し、Firestoreに計測台帳を残しておけば、AI機能の改善を「速そう」ではなく「この用途ではp95が下がり、失敗率も許容内だった」と説明できます。まずは1つの画面操作に絞ってStandardとUltrafastを並べて測り、採用範囲を少しずつ広げるのがおすすめです。