Creative AI Studio を勉強しながら読むためのコードベース案内です。
このドキュメントの目的は、実装の正しさをすべて説明することではなく、
「どこから読むと理解しやすいか」と「何を直す時にどこを見るべきか」を明確にすることです。
このプロジェクトは、ローカル実行の Creative AI Studio です。
- API は FastAPI です
- Web UI は React + Vite です
- 実行単位は
Jobです - 実際の生成ロジックは media type ごとの
Generatorに分かれています - 生成結果は
Assetとして再利用可能な形で保存されます
つまり、理解の軸は次の 5 つです。
- リクエストを受ける場所
- ジョブを作る場所
- ジョブを実行する場所
- 結果を保存する場所
- UI が結果を読み出す場所
| ディレクトリ | 主な役割 | 最初に読むファイル |
|---|---|---|
apps/api/ |
HTTP API の入口 | apps/api/main.py |
apps/web/ |
Studio UI | apps/web/src/App.tsx |
bootstrap/ |
サービスの組み立て | bootstrap/factories.py |
core/jobs/ |
job 作成、状態更新、runner | core/jobs/service.py, core/jobs/runner.py |
core/schemas/ |
共通スキーマ | core/schemas/generation.py |
core/models/ |
manifest、resolver、runtime cache | core/models/service.py, core/models/registry.py, core/models/resolver.py |
core/assets/ |
生成物の保存と再利用 | core/assets/__init__.py |
core/projects/ |
project 単位の grouping | core/projects/__init__.py |
core/feedback/ |
human feedback 保存 | core/feedback/__init__.py |
generators/ |
image / audio / video の生成処理 | generators/base.py と各 generator |
models/manifests/ |
利用可能モデル定義 | 各 JSON manifest |
scripts/ |
開発補助と検証 | scripts/run_api_dev.sh, scripts/verify_local_stack.py |
tests/ |
API、job pipeline、model system の確認 | tests/test_job_pipeline.py など |
apps/api/main.py を見ると、次が分かります。
- FastAPI アプリをどこで作っているか
- job runner がどのタイミングで起動するか
- どの router が登録されているか
/outputsが static mount されていること
ここで「このアプリに何の機能があるか」を先に把握します。
bootstrap/factories.py は依存関係の中心です。
ここで分かること:
ModelServiceGeneratorRegistryJobRepositoryJobServiceJobRunnerAssetRepositoryProjectRepositoryFeedbackRepository
このファイルを読むと、アプリがどう配線されているかが一度に見えます。
core/jobs/service.py と core/jobs/runner.py が基幹です。
JobService.create_job()が job を作成して queue に入れますJobRunner.run_forever()が queue を消費しますJobRunner.process_job()が generator を選び、実行し、結果を保存します- 成功時は
AssetRepository.sync_job()が呼ばれ、生成物が asset 化されます
この 2 ファイルが分かると、API と generator の責務分離が理解できます。
core/schemas/generation.py は共通言語です。
GenerationRequestGenerationResultMediaTypeGenerationStatus
ルート、ジョブ、ジェネレータがどのデータを受け渡しているかをここで確認します。
generators/base.py で抽象ライフサイクルを確認してから、各 generator に進むのが読みやすいです。
generators/image/generator.pygenerators/audio/generator.pygenerators/video/generator.py
共通の形は次です。
validate_requestpreparegeneratecleanup
POST /generate/image の流れは次です。
-
apps/api/routes/generate.pyGenerateImageRequestを受けてGenerationRequestに変換します。 -
core/jobs/service.pyJobService.create_job()で job を作成します。 -
core/jobs/runner.pyJobRunnerが queue から job を取り出します。 -
generators/registry.pymedia_type="image"から image generator を引きます。 -
generators/image/generator.py実際の画像生成を行います。 -
core/assets/__init__.py成功した job から asset を同期します。 -
apps/web/src/App.tsx/jobs/{id}や/galleryを読んで UI を更新します。
asset workflow を理解したい場合はこの順番です。
apps/api/routes/gallery.pycore/assets/__init__.pyapps/api/routes/projects.pyapps/api/routes/feedback.py
ここでは次の概念が重要です。
- gallery は「成功した生成結果の見え方」です
- asset は「再利用・export の単位」です
- project は「job と asset の grouping」です
- feedback は「human 評価の保存と集計」です
Web 側は今のところ apps/web/src/App.tsx に責務が集まっています。
最初に見るポイント:
- 初期 state
- API fetch 関数
- polling の流れ
- gallery / metrics / project の状態管理
フォーム自体は apps/web/src/components/PromptForm.tsx にあります。
この構成なので、
- UI 文言やレイアウト調整は
PromptForm.tsxとstyles.css - API 応答の扱い変更は
App.tsx
という見分け方ができます。
| 種類 | 保存先 |
|---|---|
| Job | data/jobs.db |
| Project | data/projects/*.json |
| Feedback | data/feedback/*.json |
| Asset | data/assets/*.json |
| 出力ファイル | outputs/images, outputs/audio, outputs/videos |
| model manifest | models/manifests/**/*.json |
ここは理解しておくと、デバッグ時に「どこを見れば良いか」が明確になります。
apps/api/routes/に route を追加- 必要なら
bootstrap/factories.pyの service を使う apps/api/main.pyに router を登録tests/に API テストを追加docs/api-contract.mdを更新
core/schemas/generation.pyのMediaTypegenerators/に generator 実装generators/registry.pyとbootstrap/factories.pymodels/manifests/apps/web/src/App.tsxとPromptForm.tsx
core/models/registry.pycore/models/resolver.pycore/models/service.py- manifest JSON
core/assets/__init__.pyapps/api/routes/gallery.py- 必要なら
apps/api/routes/projects.py
JobとAssetを同じものとして読まないことGET /modelsは manifest を読むだけで、推論 runtime を起動しないことgenerate/*とPOST /jobsは入口が違うだけで、最終的には job 基盤に載ることProjectRepositoryとFeedbackRepositoryは JSON 永続化、JobRepositoryは SQLite 永続化であること
tests/test_job_pipeline.pytests/test_api_extensions.pytests/test_model_system.pyscripts/verify_local_stack.py
実装だけ読むより、テストと検証スクリプトを合わせて読む方が「何を壊してはいけないか」が見えやすくなります。