任意の製品例

5 クレジット画像生成ワークフロー

非同期の有料タスクを認証、権限、冪等クレジット、永続 worker、非公開 storage、失敗補償まで追います。

コミット b16b416 で確認済みです。

画像生成は production-shaped な有料 workflow の最小例です。ローカル provider は商用 model を呼ばず SVG を作ります。価値は周囲の chain にあり、受理された 1 request は組織共有の 5 credit を消費します。

ENABLE_DEMO_FEATURES=true
ENABLE_IMAGE_GENERATION_MOCK=true
IMAGE_GENERATION_MOCK_FAILURES=0

pnpm dev:all を実行し、demo account で login して /ja/tasks/image-generation を開きます。UI は 1 idempotency key を保持して tenant-scoped task を poll します。

  1. API は same-origin、rate limit、auth、tasks.image_generation、月間上限を確認します。
  2. (user_uuid, type, idempotency_key) が task を識別し、fingerprint が別 prompt での key 再利用を拒否します。
  3. task_image:<task uuid> が 5-credit spend を識別し、並行 replay は既存 debit を返します。
  4. task_image_generation:<task uuid> が durable job を重複排除し、task/spend/dispatch 間の crash を replay で修復します。
  5. Worker は安定 UUID で provider を呼び、private Garage/S3 object を書いて検証し、file を activate します。
  6. Task read は organization 内で file を解決して短時間 signed URL を返します。
pending_payment → queued → running → succeeded
                           ↘ refunding → failed

Provider は 5 回、job は 8 回試行し、残り 3 回を compensation 用に確保します。Terminal failure は refunding に入り、deterministic refund を追加してから failed になります。Replay は provider も refund も重複しません。

IMAGE_GENERATION_MOCK_FAILURES=5 で failure path を確認できます。実 DB test は 1 spend/1 refund、Playwright は replay、正確な 5-credit 差、worker、Garage、signed download を証明します。

実際の生成サービスは src/services/ai/image.ts に実装し、冪等キー、AbortSignal、タスク、クレジット、ジョブ、ストレージ、エラーの契約を保ちます。認証情報と SDK 型はアダプター内に置きます。

アダプターを置き換えるだけでは本番の生成は有効になりません。ページ、API ルート、タスクサービスはそれぞれ isImageGenerationMockEnabled() を確認し、この値は本番で常に false です。これらのデモ用受付条件を明示的な本番機能設定へ変更し、既存の同一オリジン、認証、権限、利用上限、クレジット確認を保ってください。

現在の GeneratedImage 型が許可するのは image/svg+xml、拡張子 svg、生成元 mock だけです。実際の出力形式、拡張子、生成元の識別子、対応するファイル情報を定義して検証してからバイト列を受け入れます。本番での受付、再試行、非公開配信、補償をテストしてください。

関連: クレジット台帳、非公開ストレージ、永続ジョブ、テストと CI。