クライアントのPythonプログラミングからFastAPIサーバーを経由してDifyのワークフローを呼び出す

以下に、UV仮想環境を使用して、クライアントのPythonプログラミングからFastAPIサーバーを経由してDifyのワークフローを呼び出すプロジェクトを一から構築する手順を詳細に説明します。初心者にも分かりやすいように、ステップごとに丁寧に進めていきます。

---

### 目標
- **クライアント側**: Pythonスクリプトを作成し、FastAPIサーバーにリクエストを送信する。
- **サーバー側**: FastAPIを使ってAPIエンドポイントを構築し、Difyのワークフローを呼び出す。
- **環境**: UVを使って仮想環境を管理し、依存関係を整理する。

---

### 前提条件
1. **Pythonがインストール済み**: Python 3.10以上が推奨されます。確認するには、ターミナルで`python --version`を実行してください。
2. **UVがインストール済み**: UVは高速なPythonパッケージ管理ツールです。未インストールの場合は、以下のコマンドでインストールしてください：
   ```bash
   curl -LsSf https://astral.sh/uv/install.sh | sh
   ```
   インストール後、`uv --version`で確認してください。
3. **DifyのAPIキー**: Difyのワークフローを呼び出すには、DifyのAPIキーが必要です。Difyのダッシュボードから取得してください。

---

### 手順

#### ステップ1: プロジェクトディレクトリの作成
プロジェクト用のディレクトリを作成し、そこに移動します。

```bash
mkdir fastapi-dify-project
cd fastapi-dify-project
```

#### ステップ2: UV仮想環境の作成
UVを使って仮想環境を初期化します。Python 3.12を使用する例を示します（お使いのPythonバージョンに合わせて調整可能）。

```bash
uv init --python 3.12
```

これにより、以下が作成されます：
- `pyproject.toml`: プロジェクトの設定ファイル。
- 仮想環境（デフォルトで`.venv`ディレクトリに作成）。

仮想環境を有効化します：
```bash
source .venv/bin/activate  # macOS/Linux
.venv\Scripts\activate     # Windows
```

#### ステップ3: 必要な依存関係の追加
FastAPIサーバーとHTTPリクエストのために必要なパッケージをインストールします。

```bash
uv add fastapi "uvicorn[standard]" requests
```

- `fastapi`: FastAPIフレームワーク。
- `uvicorn[standard]`: FastAPIを動作させるためのASGIサーバー。
- `requests`: クライアント側でHTTPリクエストを送信するために使用。

依存関係は`pyproject.toml`に記録され、`uv.lock`ファイルが生成されます。

#### ステップ4: FastAPIサーバーの実装
プロジェクトディレクトリ内に`main.py`を作成し、以下のコードを記述します。このコードは、クライアントからのリクエストを受け取り、Difyのワークフローを呼び出すエンドポイントを定義します。

```python
from fastapi import FastAPI
import requests

app = FastAPI()

# Difyの設定（APIキーとエンドポイントURLを実際の値に置き換えてください）
DIFY_API_KEY = "your-dify-api-key"
DIFY_WORKFLOW_URL = "https://api.dify.ai/v1/workflows/run"  # 実際のURLに変更

@app.post("/run-dify-workflow")
async def run_dify_workflow(data: dict):
    """
    クライアントから受け取ったデータをDifyのワークフローに送信
    """
    headers = {
        "Authorization": f"Bearer {DIFY_API_KEY}",
        "Content-Type": "application/json"
    }
    
    try:
        # Difyのワークフローを呼び出す
        response = requests.post(DIFY_WORKFLOW_URL, json=data, headers=headers)
        response.raise_for_status()  # エラーがあれば例外を発生
        return response.json()  # Difyからのレスポンスを返す
    except requests.exceptions.RequestException as e:
        return {"error": str(e)}

# サーバーを起動するためのエントリーポイント（デバッグ用）
if __name__ == "__main__":
    import uvicorn
    uvicorn.run("main:app", host="0.0.0.0", port=8000, reload=True)
```

- **説明**:
  - `/run-dify-workflow`エンドポイントは、POSTリクエストを受け取り、`data`をDifyに送信します。
  - `DIFY_API_KEY`と`DIFY_WORKFLOW_URL`は、Difyのダッシュボードから取得した値に置き換えてください。

#### ステップ5: クライアントスクリプトの実装
プロジェクトディレクトリ内に`client.py`を作成し、以下のコードを記述します。このスクリプトはFastAPIサーバーにリクエストを送信します。

```python
import requests

# FastAPIサーバーのURL
SERVER_URL = "http://localhost:8000/run-dify-workflow"

# サンプルデータ（Difyのワークフローに渡すデータ）
payload = {
    "key1": "value1",
    "key2": "value2"
}

def call_dify_workflow():
    try:
        response = requests.post(SERVER_URL, json=payload)
        response.raise_for_status()
        print("Difyからのレスポンス:", response.json())
    except requests.exceptions.RequestException as e:
        print("エラー:", str(e))

if __name__ == "__main__":
    call_dify_workflow()
```

- **説明**:
  - `payload`はDifyのワークフローが期待するデータ形式に合わせて調整してください。
  - FastAPIサーバーが`localhost:8000`で動作していると仮定しています。

#### ステップ6: FastAPIサーバーの起動
仮想環境が有効化された状態で、以下のコマンドでサーバーを起動します。

```bash
uv run python main.py
```

- サーバーが起動すると、`http://localhost:8000`でアクセス可能になります。
- 開発モードでは`reload=True`が有効なので、コード変更時に自動で再起動します。

#### ステップ7: クライアントの実行
別のターミナルを開き、仮想環境を有効化してからクライアントスクリプトを実行します。

```bash
source .venv/bin/activate  # macOS/Linux
.venv\Scripts\activate     # Windows
uv run python client.py
```

- クライアントがFastAPIサーバーにリクエストを送信し、Difyのワークフローからのレスポンスが表示されます。

#### ステップ8: 動作確認
1. サーバーが起動していることを確認（`http://localhost:8000/docs`でSwagger UIが見られる）。
2. クライアントを実行し、期待通りのレスポンスが得られるか確認。
3. Dify側でワークフローが正しく動作しているか、Difyダッシュボードでログを確認。

---

### プロジェクト構造
最終的なディレクトリ構造は以下のようになります：

```
fastapi-dify-project/
├── .venv/           # UV仮想環境
├── main.py          # FastAPIサーバー
├── client.py        # クライアントスクリプト
├── pyproject.toml   # プロジェクト設定
└── uv.lock          # 依存関係ロックファイル
```

---

### 追加のTips
1. **エラーハンドリングの強化**: 本番環境では、例外処理をさらに詳細に記述することを推奨します。
2. **環境変数の使用**: `DIFY_API_KEY`などの機密情報は、`.env`ファイルに保存し、`python-dotenv`を使って読み込むのが安全です。
   - `uv add python-dotenv`でインストール。
   - `.env`ファイルを作成し、`main.py`で以下のように読み込み：
     ```python
     from dotenv import load_dotenv
     import os
     load_dotenv()
     DIFY_API_KEY = os.getenv("DIFY_API_KEY")
     ```
3. **本番環境へのデプロイ**: 本番では`uvicorn`を直接使うのではなく、Gunicornと組み合わせて使うことを検討してください。

---

### まとめ
これで、UV仮想環境内でFastAPIサーバーを介してDifyのワークフローを呼び出すプロジェクトが完成しました。