kina006097 commited on
Commit
afe743c
·
1 Parent(s): d270dd6

vscodeにdev containerの追加

Browse files
.devcontainer/devcontainer.json ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "Kids Playground AI API Dev",
3
+ "dockerComposeFile": "../docker-compose.yml",
4
+ "service": "api",
5
+ "workspaceFolder": "/app",
6
+ "customizations": {
7
+ "vscode": {
8
+ "extensions": [
9
+ "ms-python.python",
10
+ "ms-python.vscode-pylance",
11
+ "charliermarsh.ruff"
12
+ ]
13
+ }
14
+ }
15
+ }
docs/ai_api_development_guide.md CHANGED
@@ -160,8 +160,8 @@ AI新機能の開発においては、以下のコーディング規約と開発
160
  * **型ヒントの活用**: `mypy` を用いた型チェックを徹底し、コードの堅牢性、可読性、およびIDEによる補完の恩恵を最大化します。
161
  * **Djangoとの連携**: AI機能がDjangoアプリケーションと連携する場合、Djangoのモデル、ビュー、フォーム、URLパターンなどの既存の命名規則と構造に準拠し、シームレスな統合を図ります。
162
  * **AI/MLコードの構造**:
163
- * データ処理(前処理、特徴量エンジニアリング)、モデル定義、学習ロジック、推論ロジックは明確に分離し、それぞれが単一の責務を持つモジュールとして設計します。
164
- * 設定値やハイパーパラメータはコードから分離し、Djangoの`settings.py`、または専用のYAML/JSONファイルなどで一元的に管理します。
165
  * **ドキュメンテーション**: 関数、クラス、複雑なアルゴリズム、およびAIモデルの設計意図には、適切なDocstringを記述し、コードの意図と振る舞いを明確にします。
166
  * **エラーハンドリング**: 予期せぬエラーや例外処理は、Djangoの標準的なエラーハンドリングやPythonの例外処理メカニズムに従い、適切にログを出力し、システムの安定性を確保します。
167
  * **保守性と可読性**: コードは常に保守性と可読性を最優先に設計・実装します。複雑なロジックは小さな関数に分割し、変数名や関数名は意図が明確に伝わるように命名します。
@@ -170,12 +170,12 @@ AI新機能の開発においては、以下のコーディング規約と開発
170
  #### 2. テスト駆動開発 (TDD) とテストの考え方
171
 
172
  * **t_wada氏のTDDスタイル**: 開発は「Red → Green → Refactor」のTDDサイクルを厳守して進めます。
173
- * **Red**: 最初に失敗するテストを記述し、必要な機能の振る舞いを定義します。
174
- * **Green**: テストが成功する最小限のコードを実装します。
175
- * **Refactor**: コードの品質を向上させ、重複を排除し、設計を改善します。
176
  * **「動く仕様書」としてのテスト**: テストコードは、単なる品質保証の手段ではなく、機能の振る舞いを明確に記述した「動く仕様書」として機能するように設計します。
177
- * テストケース名(`pytest`のテスト関数名など)は、**日本語で**「〜という状況で、〜という振る舞いをすべき」というように、具体的なシナリオと期待される結果を記述します。
178
- * テストは実装の詳細ではなく、機能の**振る舞い(Behavior)**に焦点を当てます。
179
 
180
  ---
181
 
@@ -537,7 +537,7 @@ sequenceDiagram
537
  - `python src/ai_api/main.py` を実行すれば、Djangoとは無関係に単体で起動できます。
538
  - 起動したAIアプリに対し、ブラウザでUIを操作したり、`curl`コマンドでAPIを直接叩いたりすることで、単体での動作テストが可能です。
539
  - **Djangoアプリケーション:**
540
- - `SummarizeReviewsView` のテストを書く際、`unittest.mock.patch` を使って `_call_summary_api` メソッドをモック(偽のオブジェクトに差し替え)します。
541
  - これにより、AI APIへ実際にネットワーク通信を発生させることなく、「APIが成功を返した場合」「タイムアウトした場合」「エラーを返した場合」など、あらゆる状況を想定したビューのロジックを高速にテストできます。
542
 
543
  こ���設計により、両アプリケーションは互いに依存することなく、独立して開発,テスト,デプロイを進めることが可能になります。
@@ -683,9 +683,9 @@ git push -u origin main
683
  ```
684
 
685
  - [x] **中タスク0.4: Hugging Faceアカウントの登録とSpacesの準備**
686
- - [x] **担当:** 人間
687
- - [x] **内容:** Hugging Faceアカウントを登録し、AIモデルをデプロイするためのHugging Face Spaceを準備します。
688
- - [x] **指示:**
689
  1. Hugging Faceのウェブサイト (huggingface.co) にアクセスし、アカウントを登録します。
690
  2. ログイン後、「Spaces」セクションに移動し、「Create new Space」をクリックします。
691
  3. Space名、ライセンス、SDK(Gradioを選択)、公開/非公開設定などを適切に設定し、Spaceを作成します。
@@ -765,140 +765,140 @@ docker-compose up --build -d
765
  - **内容:** 環境変数設定ファイル(`.env`)とそのテンプレート(`.env.example`)を作成します。
766
  - **指示:** プロジェクトのルートディレクトリに`.env`ファイルと`.env.example`ファイルを作成してください。
767
 
768
- ### フェーズ1.5: CI/CD検証用サンプルアプリケーションの作成
769
 
770
  **目的:** CI/CDパイプラインが全体として機能することを検証するための、最もシンプルな「Hello World」的なGradioアプリケーションを作成する。
771
 
772
- - [ ] **中タスク1.5.1: Gradioサンプルコードの実装**
773
- - [ ] **小タスク1.5.1.1 (RED):** `main.py`のテストを作成
774
  - **担当:** AI
775
  - **内容:** `tests/test_main.py`を作成し、`main.py`の`greet`関数が特定の文字列を返すことを期待するテストを記述します。この時点では`main.py`や`greet`関数が存在しないため、テストは失敗します。
776
- - [ ] **小タスク1.5.1.2 (GREEN):** `main.py`にサンプルを実装
777
  - **担当:** AI
778
  - **内容:** `src/ai_api/main.py`に、簡単な`greet`関数と、それを呼び出すGradioインターフェースを実装し、テストをパスさせます。
779
- - [ ] **小タスク1.5.1.3 (REFACTOR):** リファクタリング
780
  - **担当:** AI
781
  - **内容:** コードを整理し、可読性を高めます。
782
 
783
- ### フェーズ2: CI/CDの構築とデプロイ
784
 
785
  **目的:** コードの品質を自動的に検証し、Hugging Face Spacesへ自動的にデプロイする仕組みを構築する。
786
 
787
- - [ ] **中タスク2.1: CIワークフローの構築 (GitHub Actions)**
788
- - [ ] **小タスク2.1.1 (RED):** CI設定ファイルの骨格作成
789
  - **担当:** AI
790
  - **内容:** `.github/workflows/ci.yml` を作成します。最初はトリガーだけを記述し、具体的なジョブは空にしておきます。この時点では何も実行されません。
791
- - [ ] **小タスク2.1.2 (GREEN):** CIジョブの実装
792
  - **担当:** AI
793
  - **内容:** `ci.yml` に、Pythonのセットアップ、依存関係のインストール、`ruff`によるlintチェック、`mypy`による型チェック、`pytest`によるテスト実行のステップを追加します。
794
  - **指示:** `/home/jam/kids-playground-ai-api/.github/workflows/ci.yml` を更新してください。
795
- - [ ] **小タスク2.1.3 (REFACTOR):** ワークフローの最適化
796
  - **担当:** AI
797
  - **内容:** キャッシュ機構などを導入し、CIの実行時間を短縮します。
798
- - [ ] **小タスク2.1.4: CIの動作確認**
799
  - **担当:** 人間
800
  - **内容:** この変更をGitHubにプッシュし、GitHubの「Actions」タブでワークフローが正しく実行され、全てのチェックが成功することを確認します。
801
 
802
- - [ ] **中タスク2.2: CDワークフローの構築 (GitHub Actions)**
803
- - [ ] **小タスク2.2.1: Hugging Faceアクセストークンの準備**
804
  - **担当:** 人間
805
  - **内容:** Hugging Faceの設定ページで`write`権限を持つアクセストークンを発行し、それをGitHubリポジトリのSecretsに`HF_TOKEN`として登録します。
806
- - [ ] **小タスク2.2.2 (RED):** デプロイジョブの骨格作成
807
  - **担当:** AI
808
  - **内容:** `ci.yml`に、`test`ジョブの成功後に`main`ブランチでのみ実行される`deploy-to-hf-space`ジョブを追加します。最初は簡単な`echo`コマンドのみを記述し、デプロイが実行されない状態にします。
809
- - [ ] **小タスク2.2.3 (GREEN):** デプロイジョブの実装
810
  - **担当:** AI
811
  - **内容:** `deploy-to-hf-space`ジョブに、`hugging-face/push-to-hub`アクションを追加し、Secretsに登録した`HF_TOKEN`を使ってHugging Face Spacesにコードをプッシュするように実装します。
812
- - [ ] **小タスク2.2.4: CDの動作確認**
813
  - **担当:** 人間
814
  - **内容:** CI/CDが成功したコミットを`main`ブランチにマージし、GitHubの「Actions」タブでデプロイジョブが成功することを確認します。その後、Hugging Face Spaceの公開URLにアクセスし、アプリケーションが正しくデプロイされていることを確認します。
815
 
816
- ### フェーズ3: AIアプリケーションのTDD (コアロジック → API)
817
 
818
  **目的:** クリーンアーキテクチャの原則に従い、内側のビジネスロジックから外側のAPIへと実装を進める。
819
 
820
- - [ ] **中タスク3.1: AIコアロジック `Summarizer` の実装**
821
- - [ ] **小タスク3.1.1 (RED):** `Summarizer`クラスのテスト作成
822
  - **担当:** AI
823
  - **内容:** `tests/core/test_inference.py` を作成し、「`from src.ai_api.core.inference import Summarizer` が成功すること」をテストします。このテストは、ファイルやクラスが存在しないため失敗します。
824
- - [ ] **小タスク3.1.2 (GREEN):** `Summarizer`クラスの骨格作成
825
  - **担当:** AI
826
  - **内容:** `src/ai_api/core/inference.py` と、空の`Summarizer`クラスを作成し、テストをパスさせます。
827
- - [ ] **小タスク3.1.3 (REFACTOR):** リファクタリング
828
  - **担当:** AI
829
  - **内容:** この時点では特になし。コミットの区切りとします。
830
 
831
- - [ ] **中タスク3.2: AI設定クラス `Config` の実装と注入**
832
- - [ ] **小タスク3.2.1 (RED):** `Summarizer`が設定オブジェクトを受け取るテスト作成
833
  - **担当:** AI
834
  - **内容:** `tests/core/test_inference.py`に追記します。
835
  - **内容:** `Summarizer`がコンストラクタで設定オブジェクト(モデル名など)を受け取ることを期待するテストを`tests/core/test_inference.py`に追記します。
836
- - [ ] **小タスク3.2.2 (GREEN):** 設定クラスの作成とコンストラクタ修正
837
  - **担当:** AI
838
  - **内容:** `src/ai_api/config.py`に設計通りの設定クラス(`ModelConfig`など)を作成します。`Summarizer`の`__init__`を修正し、設定オブジェクトを受け取るようにします。
839
- - [ ] **小タスク3.2.3 (REFACTOR):** リファクタリング
840
  - **担当:** AI
841
  - **内容:** コードの可読性を向上させます。 **この時点で、AIモデルを切り替えるための基本的な仕組み(設定値を外部から与える)が完成します。**
842
 
843
- - [ ] **中タスク3.3: 要約機能 `summarize` メソッドの実装**
844
- - [ ] **小タスク3.3.1 (RED):** `summarize`メソッドのユニットテスト作成
845
  - **担当:** AI
846
  - **内容:** `unittest.mock.patch`を使い、`transformers.pipeline`をモック(偽物に差し替え)します。「`summarize`メソ��ドを呼ぶと、内部で`pipeline`が特定の引数で呼ばれ、モックの返り値がそのまま返されること」をテストします。これにより、重いモデルをロードせずにロジックだけを高速にテストできます。
847
- - [ ] **小タスク3.3.2 (GREEN):** `summarize`メソッドの実装
848
  - **担当:** AI
849
  - **内容:** `Summarizer`クラスに`summarize`メソッドを実装し、内部で`transformers.pipeline`を呼び出して要約を実行するようにします。
850
- - [ ] **小タスク3.3.3 (REFACTOR):** リファクタリング
851
  - **担当:** AI
852
  - **内容:** エラーハンドリングなどを追加し、コードを整理します。
853
 
854
- - [ ] **中タスク3.4: APIエントリーポイント `main.py` の実装**
855
- - [ ] **小タスク3.4.1 (RED):** APIのインテグレーションテスト作成
856
  - **担当:** AI
857
  - **内容:** `tests/test_api.py`を作成します。テスト内でGradioアプリを別スレッドで起動し、`requests.post`で`/api/predict/`にリクエストを送信して、期待した応答が得られない(サーバーがないため)ことを確認します。
858
- - [ ] **小タスク3.4.2 (GREEN):** `main.py`の実装
859
  - **担当:** AI
860
  - **内容:** `src/ai_api/main.py`を作成します。`Summarizer`と設定クラスをインスタンス化し、DI(依存性の注入)してGradioの`Interface`を定義・起動します。
861
- - [ ] **小タスク3.4.3 (REFACTOR):** リファクタリング
862
  - **担当:** AI
863
  - **内容:** コードを整理します。
864
- - [ ] **小タスク3.4.4: 手動での動作確認**
865
  - **担当:** 人間
866
  - **内容:** `python src/ai_api/main.py` を実行し、ブラウザで表示されるGradioのUIにテキストを入力して、要約機能が単体で正しく動作することを確認します。
867
 
868
- ### フェーズ4: Djangoへの組み込み
869
 
870
  **目的:** 独立して動作するAIアプリケーションを、DjangoからAPI経由で安全に呼び出す。
871
 
872
- - [ ] **中タスク4.1: Django側のAPIクライアント実装**
873
- - [ ] **小タスク4.1.1 (RED):** APIクライアントのテスト作成
874
  - **担当:** AI
875
  - **内容:** `myapp/tests/test_clients.py`を作成します。`requests.post`がモック化されている状態でAPIクライアント関数を呼び出し、成功時・タイムアウト時・サーバーエラー時の挙動をテストします。
876
- - [ ] **小タスク4.1.2 (GREEN):** APIクライアントの実装
877
  - **担当:** AI
878
  - **内容:** `myapp/clients/ai_summary_client.py`を作成し、`requests`を使って外部APIを呼び出す関数を実装します。
879
- - [ ] **小タスク4.1.3 (REFACTOR):** リファクタリング
880
  - **担当:** AI
881
  - **内容:** 設定を`settings.py`から読み込むようにするなど、コードを整理します。
882
 
883
- - [ ] **中タスク4.2: Django Viewの実装**
884
- - [ ] **小タスク4.2.1 (RED):** ViewのURLテスト作成
885
  - **担当:** AI
886
  - **内容:** `myapp/tests/test_views.py`に、`/summarize/playground/{id}/`へのGETリクエストが404を返すテストを書きます。
887
- - [ ] **小タスク4.2.2 (GREEN):** URLとViewの骨格作成
888
  - **担当:** AI
889
  - **内容:** `myapp/urls.py`と`myapp/views/summary_views.py`を作成・編集し、テストをパスさせます。
890
- - [ ] **小タスク4.2.3 (RED):** Viewとクライアントの連携テスト作成
891
  - **担当:** AI
892
  - **内容:** `unittest.mock.patch`でAPIクライアントをモック化し、「Viewを呼び出すと、内部でAPIクライアントが特定の引数で呼ばれること」をテストします。
893
- - [ ] **小タスク4.2.4 (GREEN):** Viewロジックの実装
894
  - **担当:** AI
895
  - **内容:** View内で口コミの取得・検証ロジック、およびAPIクライアントの呼び出しを実装します。
896
- - [ ] **小タスク4.2.5 (REFACTOR):** リファクタリング
897
  - **担当:** AI
898
  - **内容:** コードを整理します。
899
 
900
- - [ ] **中タスク4.3: 統合テスト**
901
- - [ ] **小タスク4.3.1: 手動での最終確認**
902
  - **担当:** 人間
903
  - **内容:** DjangoサーバーとAIアプリ(Gradio)を両方ローカルで起動し、ブラウザから最初の要約ボタンをクリックして、全体の流れが正しく動作するかを確認します。
904
 
 
160
  * **型ヒントの活用**: `mypy` を用いた型チェックを徹底し、コードの堅牢性、可読性、およびIDEによる補完の恩恵を最大化します。
161
  * **Djangoとの連携**: AI機能がDjangoアプリケーションと連携する場合、Djangoのモデル、ビュー、フォーム、URLパターンなどの既存の命名規則と構造に準拠し、シームレスな統合を図ります。
162
  * **AI/MLコードの構造**:
163
+ - データ処理(前処理、特徴量エンジニアリング)、モデル定義、学習ロジック、推論ロジックは明確に分離し、それぞれが単一の責務を持つモジュールとして設計します。
164
+ - 設定値やハイパーパラメータはコードから分離し、Djangoの`settings.py`、または専用のYAML/JSONファイルなどで一元的に管理します。
165
  * **ドキュメンテーション**: 関数、クラス、複雑なアルゴリズム、およびAIモデルの設計意図には、適切なDocstringを記述し、コードの意図と振る舞いを明確にします。
166
  * **エラーハンドリング**: 予期せぬエラーや例外処理は、Djangoの標準的なエラーハンドリングやPythonの例外処理メカニズムに従い、適切にログを出力し、システムの安定性を確保します。
167
  * **保守性と可読性**: コードは常に保守性と可読性を最優先に設計・実装します。複雑なロジックは小さな関数に分割し、変数名や関数名は意図が明確に伝わるように命名します。
 
170
  #### 2. テスト駆動開発 (TDD) とテストの考え方
171
 
172
  * **t_wada氏のTDDスタイル**: 開発は「Red → Green → Refactor」のTDDサイクルを厳守して進めます。
173
+ - **Red**: 最初に失敗するテストを記述し、必要な機能の振る舞いを定義します。
174
+ - **Green**: テストが成功する最小限のコードを実装します。
175
+ - **Refactor**: コードの品質を向上させ、重複を排除し、設計を改善します。
176
  * **「動く仕様書」としてのテスト**: テストコードは、単なる品質保証の手段ではなく、機能の振る舞いを明確に記述した「動く仕様書」として機能するように設計します。
177
+ - テストケース名(`pytest`のテスト関数名など)は、**日本語で**「〜という状況で、〜という振る舞いをすべき」というように、具体的なシナリオと期待される結果を記述します。
178
+ - テストは実装の詳細ではなく、機能の**振る舞い(Behavior)**に焦点を当てます。
179
 
180
  ---
181
 
 
537
  - `python src/ai_api/main.py` を実行すれば、Djangoとは無関係に単体で起動できます。
538
  - 起動したAIアプリに対し、ブラウザでUIを操作したり、`curl`コマンドでAPIを直接叩いたりすることで、単体での動作テストが可能です。
539
  - **Djangoアプリケーション:**
540
+ - `SummarizeReviewsView` のテストを書く際、`unittest.mock.patch` を使って `_call_api` メソッドをモック(偽のオブジェクトに差し替え)します。
541
  - これにより、AI APIへ実際にネットワーク通信を発生させることなく、「APIが成功を返した場合」「タイムアウトした場合」「エラーを返した場合」など、あらゆる状況を想定したビューのロジックを高速にテストできます。
542
 
543
  こ���設計により、両アプリケーションは互いに依存することなく、独立して開発,テスト,デプロイを進めることが可能になります。
 
683
  ```
684
 
685
  - [x] **中タスク0.4: Hugging Faceアカウントの登録とSpacesの準備**
686
+ - **担当:** 人間
687
+ - **内容:** Hugging Faceアカウントを登録し、AIモデルをデプロイするためのHugging Face Spaceを準備します。
688
+ - **指示:**
689
  1. Hugging Faceのウェブサイト (huggingface.co) にアクセスし、アカウントを登録します。
690
  2. ログイン後、「Spaces」セクションに移動し、「Create new Space」をクリックします。
691
  3. Space名、ライセンス、SDK(Gradioを選択)、公開/非公開設定などを適切に設定し、Spaceを作成します。
 
765
  - **内容:** 環境変数設定ファイル(`.env`)とそのテンプレート(`.env.example`)を作成します。
766
  - **指示:** プロジェクトのルートディレクトリに`.env`ファイルと`.env.example`ファイルを作成してください。
767
 
768
+ ### フェーズ2: CI/CD検証用サンプルアプリケーションの作成
769
 
770
  **目的:** CI/CDパイプラインが全体として機能することを検証するための、最もシンプルな「Hello World」的なGradioアプリケーションを作成する。
771
 
772
+ - [ ] **中タスク2.1: Gradioサンプルコードの実装**
773
+ - [ ] **小タスク2.1.1 (RED):** `main.py`のテストを作成
774
  - **担当:** AI
775
  - **内容:** `tests/test_main.py`を作成し、`main.py`の`greet`関数が特定の文字列を返すことを期待するテストを記述します。この時点では`main.py`や`greet`関数が存在しないため、テストは失敗します。
776
+ - [ ] **小タスク2.1.2 (GREEN):** `main.py`にサンプルを実装
777
  - **担当:** AI
778
  - **内容:** `src/ai_api/main.py`に、簡単な`greet`関数と、それを呼び出すGradioインターフェースを実装し、テストをパスさせます。
779
+ - [ ] **小タスク2.1.3 (REFACTOR):** リファクタリング
780
  - **担当:** AI
781
  - **内容:** コードを整理し、可読性を高めます。
782
 
783
+ ### フェーズ3: CI/CDの構築とデプロイ
784
 
785
  **目的:** コードの品質を自動的に検証し、Hugging Face Spacesへ自動的にデプロイする仕組みを構築する。
786
 
787
+ - [ ] **中タスク3.1: CIワークフローの構築 (GitHub Actions)**
788
+ - [ ] **小タスク3.1.1 (RED):** CI設定ファイルの骨格作成
789
  - **担当:** AI
790
  - **内容:** `.github/workflows/ci.yml` を作成します。最初はトリガーだけを記述し、具体的なジョブは空にしておきます。この時点では何も実行されません。
791
+ - [ ] **小タスク3.1.2 (GREEN):** CIジョブの実装
792
  - **担当:** AI
793
  - **内容:** `ci.yml` に、Pythonのセットアップ、依存関係のインストール、`ruff`によるlintチェック、`mypy`による型チェック、`pytest`によるテスト実行のステップを追加します。
794
  - **指示:** `/home/jam/kids-playground-ai-api/.github/workflows/ci.yml` を更新してください。
795
+ - [ ] **小タスク3.1.3 (REFACTOR):** ワークフローの最適化
796
  - **担当:** AI
797
  - **内容:** キャッシュ機構などを導入し、CIの実行時間を短縮します。
798
+ - [ ] **小タスク3.1.4: CIの動作確認**
799
  - **担当:** 人間
800
  - **内容:** この変更をGitHubにプッシュし、GitHubの「Actions」タブでワークフローが正しく実行され、全てのチェックが成功することを確認します。
801
 
802
+ - [ ] **中タスク3.2: CDワークフローの構築 (GitHub Actions)**
803
+ - [ ] **小タスク3.2.1: Hugging Faceアクセストークンの準備**
804
  - **担当:** 人間
805
  - **内容:** Hugging Faceの設定ページで`write`権限を持つアクセストークンを発行し、それをGitHubリポジトリのSecretsに`HF_TOKEN`として登録します。
806
+ - [ ] **小タスク3.2.2 (RED):** デプロイジョブの骨格作成
807
  - **担当:** AI
808
  - **内容:** `ci.yml`に、`test`ジョブの成功後に`main`ブランチでのみ実行される`deploy-to-hf-space`ジョブを追加します。最初は簡単な`echo`コマンドのみを記述し、デプロイが実行されない状態にします。
809
+ - [ ] **小タスク3.2.3 (GREEN):** デプロイジョブの実装
810
  - **担当:** AI
811
  - **内容:** `deploy-to-hf-space`ジョブに、`hugging-face/push-to-hub`アクションを追加し、Secretsに登録した`HF_TOKEN`を使ってHugging Face Spacesにコードをプッシュするように実装します。
812
+ - [ ] **小タスク3.2.4: CDの動作確認**
813
  - **担当:** 人間
814
  - **内容:** CI/CDが成功したコミットを`main`ブランチにマージし、GitHubの「Actions」タブでデプロイジョブが成功することを確認します。その後、Hugging Face Spaceの公開URLにアクセスし、アプリケーションが正しくデプロイされていることを確認します。
815
 
816
+ ### フェーズ4: AIアプリケーションのTDD (コアロジック → API)
817
 
818
  **目的:** クリーンアーキテクチャの原則に従い、内側のビジネスロジックから外側のAPIへと実装を進める。
819
 
820
+ - [ ] **中タスク4.1: AIコアロジック `Summarizer` の実装**
821
+ - [ ] **小タスク4.1.1 (RED):** `Summarizer`クラスのテスト作成
822
  - **担当:** AI
823
  - **内容:** `tests/core/test_inference.py` を作成し、「`from src.ai_api.core.inference import Summarizer` が成功すること」をテストします。このテストは、ファイルやクラスが存在しないため失敗します。
824
+ - [ ] **小タスク4.1.2 (GREEN):** `Summarizer`クラスの骨格作成
825
  - **担当:** AI
826
  - **内容:** `src/ai_api/core/inference.py` と、空の`Summarizer`クラスを作成し、テストをパスさせます。
827
+ - [ ] **小タスク4.1.3 (REFACTOR):** リファクタリング
828
  - **担当:** AI
829
  - **内容:** この時点では特になし。コミットの区切りとします。
830
 
831
+ - [ ] **中タスク4.2: AI設定クラス `Config` の実装と注入**
832
+ - [ ] **小タスク4.2.1 (RED):** `Summarizer`が設定オブジェクトを受け取るテスト作成
833
  - **担当:** AI
834
  - **内容:** `tests/core/test_inference.py`に追記します。
835
  - **内容:** `Summarizer`がコンストラクタで設定オブジェクト(モデル名など)を受け取ることを期待するテストを`tests/core/test_inference.py`に追記します。
836
+ - [ ] **小タスク4.2.2 (GREEN):** 設定クラスの作成とコンストラクタ修正
837
  - **担当:** AI
838
  - **内容:** `src/ai_api/config.py`に設計通りの設定クラス(`ModelConfig`など)を作成します。`Summarizer`の`__init__`を修正し、設定オブジェクトを受け取るようにします。
839
+ - [ ] **小タスク4.2.3 (REFACTOR):** リファクタリング
840
  - **担当:** AI
841
  - **内容:** コードの可読性を向上させます。 **この時点で、AIモデルを切り替えるための基本的な仕組み(設定値を外部から与える)が完成します。**
842
 
843
+ - [ ] **中タスク4.3: 要約機能 `summarize` メソッドの実装**
844
+ - [ ] **小タスク4.3.1 (RED):** `summarize`メソッドのユニットテスト作成
845
  - **担当:** AI
846
  - **内容:** `unittest.mock.patch`を使い、`transformers.pipeline`をモック(偽物に差し替え)します。「`summarize`メソ��ドを呼ぶと、内部で`pipeline`が特定の引数で呼ばれ、モックの返り値がそのまま返されること」をテストします。これにより、重いモデルをロードせずにロジックだけを高速にテストできます。
847
+ - [ ] **小タスク4.3.2 (GREEN):** `summarize`メソッドの実装
848
  - **担当:** AI
849
  - **内容:** `Summarizer`クラスに`summarize`メソッドを実装し、内部で`transformers.pipeline`を呼び出して要約を実行するようにします。
850
+ - [ ] **小タスク4.3.3 (REFACTOR):** リファクタリング
851
  - **担当:** AI
852
  - **内容:** エラーハンドリングなどを追加し、コードを整理します。
853
 
854
+ - [ ] **中タスク4.4: APIエントリーポイント `main.py` の実装**
855
+ - [ ] **小タスク4.4.1 (RED):** APIのインテグレーションテスト作成
856
  - **担当:** AI
857
  - **内容:** `tests/test_api.py`を作成します。テスト内でGradioアプリを別スレッドで起動し、`requests.post`で`/api/predict/`にリクエストを送信して、期待した応答が得られない(サーバーがないため)ことを確認します。
858
+ - [ ] **小タスク4.4.2 (GREEN):** `main.py`の実装
859
  - **担当:** AI
860
  - **内容:** `src/ai_api/main.py`を作成します。`Summarizer`と設定クラスをインスタンス化し、DI(依存性の注入)してGradioの`Interface`を定義・起動します。
861
+ - [ ] **小タスク4.4.3 (REFACTOR):** リファクタリング
862
  - **担当:** AI
863
  - **内容:** コードを整理します。
864
+ - [ ] **小タスク4.4.4: 手動での動作確認**
865
  - **担当:** 人間
866
  - **内容:** `python src/ai_api/main.py` を実行し、ブラウザで表示されるGradioのUIにテキストを入力して、要約機能が単体で正しく動作することを確認します。
867
 
868
+ ### フェーズ5: Djangoへの組み込み
869
 
870
  **目的:** 独立して動作するAIアプリケーションを、DjangoからAPI経由で安全に呼び出す。
871
 
872
+ - [ ] **中タスク5.1: Django側のAPIクライアント実装**
873
+ - [ ] **小タスク5.1.1 (RED):** APIクライアントのテスト作成
874
  - **担当:** AI
875
  - **内容:** `myapp/tests/test_clients.py`を作成します。`requests.post`がモック化されている状態でAPIクライアント関数を呼び出し、成功時・タイムアウト時・サーバーエラー時の挙動をテストします。
876
+ - [ ] **小タスク5.1.2 (GREEN):** APIクライアントの実装
877
  - **担当:** AI
878
  - **内容:** `myapp/clients/ai_summary_client.py`を作成し、`requests`を使って外部APIを呼び出す関数を実装します。
879
+ - [ ] **小タスク5.1.3 (REFACTOR):** リファクタリング
880
  - **担当:** AI
881
  - **内容:** 設定を`settings.py`から読み込むようにするなど、コードを整理します。
882
 
883
+ - [ ] **中タスク5.2: Django Viewの実装**
884
+ - [ ] **小タスク5.2.1 (RED):** ViewのURLテスト作成
885
  - **担当:** AI
886
  - **内容:** `myapp/tests/test_views.py`に、`/summarize/playground/{id}/`へのGETリクエストが404を返すテストを書きます。
887
+ - [ ] **小タスク5.2.2 (GREEN):** URLとViewの骨格作成
888
  - **担当:** AI
889
  - **内容:** `myapp/urls.py`と`myapp/views/summary_views.py`を作成・編集し、テストをパスさせます。
890
+ - [ ] **小タスク5.2.3 (RED):** Viewとクライアントの連携テスト作成
891
  - **担当:** AI
892
  - **内容:** `unittest.mock.patch`でAPIクライアントをモック化し、「Viewを呼び出すと、内部でAPIクライアントが特定の引数で呼ばれること」をテストします。
893
+ - [ ] **小タスク5.2.4 (GREEN):** Viewロ���ックの実装
894
  - **担当:** AI
895
  - **内容:** View内で口コミの取得・検証ロジック、およびAPIクライアントの呼び出しを実装します。
896
+ - [ ] **小タスク5.2.5 (REFACTOR):** リファクタリング
897
  - **担当:** AI
898
  - **内容:** コードを整理します。
899
 
900
+ - [ ] **中タスク5.3: 統合テスト**
901
+ - [ ] **小タスク5.3.1: 手動での最終確認**
902
  - **担当:** 人間
903
  - **内容:** DjangoサーバーとAIアプリ(Gradio)を両方ローカルで起動し、ブラウザから最初の要約ボタンをクリックして、全体の流れが正しく動作するかを確認します。
904
 
tests/test_main.py ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+
2
+ from src.ai_api.main import greet
3
+
4
+ def test_greet():
5
+ """
6
+ greet関数が期待される挨拶文を返すことをテストする。
7
+ """
8
+ assert greet("World") == "Hello, World!"