以下に、UV仮想環境を使用して、クライアントのPythonプログラミングからFastAPIサーバーを経由してDifyのワークフローを呼び出すプロジェクトを一から構築する手順を詳細に説明します。初心者にも分かりやすいように、ステップごとに丁寧に進めていきます。
目標
- クライアント側: Pythonスクリプトを作成し、FastAPIサーバーにリクエストを送信する。
- サーバー側: FastAPIを使ってAPIエンドポイントを構築し、Difyのワークフローを呼び出す。
- 環境: UVを使って仮想環境を管理し、依存関係を整理する。
前提条件
-
Pythonがインストール済み: Python 3.10以上が推奨されます。確認するには、ターミナルで
python --version
を実行してください。 -
UVがインストール済み: UVは高速なPythonパッケージ管理ツールです。未インストールの場合は、以下のコマンドでインストールしてください:
インストール後、
curl -LsSf https://astral.sh/uv/install.sh | sh
uv --version
で確認してください。 - DifyのAPIキー: Difyのワークフローを呼び出すには、DifyのAPIキーが必要です。Difyのダッシュボードから取得してください。
手順
ステップ1: プロジェクトディレクトリの作成
プロジェクト用のディレクトリを作成し、そこに移動します。
mkdir fastapi-dify-project
cd fastapi-dify-project
ステップ2: UV仮想環境の作成
UVを使って仮想環境を初期化します。Python 3.12を使用する例を示します(お使いのPythonバージョンに合わせて調整可能)。
uv init --python 3.12
これにより、以下が作成されます:
-
pyproject.toml
: プロジェクトの設定ファイル。 - 仮想環境(デフォルトで
.venv
ディレクトリに作成)。
仮想環境を有効化します:
source .venv/bin/activate # macOS/Linux
.venv\Scripts\activate # Windows
ステップ3: 必要な依存関係の追加
FastAPIサーバーとHTTPリクエストのために必要なパッケージをインストールします。
uv add fastapi "uvicorn[standard]" requests
-
fastapi
: FastAPIフレームワーク。 -
uvicorn[standard]
: FastAPIを動作させるためのASGIサーバー。 -
requests
: クライアント側でHTTPリクエストを送信するために使用。
依存関係はpyproject.toml
に記録され、uv.lock
ファイルが生成されます。
ステップ4: FastAPIサーバーの実装
プロジェクトディレクトリ内にmain.py
を作成し、以下のコードを記述します。このコードは、クライアントからのリクエストを受け取り、Difyのワークフローを呼び出すエンドポイントを定義します。
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サーバーにリクエストを送信します。
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サーバーの起動
仮想環境が有効化された状態で、以下のコマンドでサーバーを起動します。
uv run python main.py
- サーバーが起動すると、
http://localhost:8000
でアクセス可能になります。 - 開発モードでは
reload=True
が有効なので、コード変更時に自動で再起動します。
ステップ7: クライアントの実行
別のターミナルを開き、仮想環境を有効化してからクライアントスクリプトを実行します。
source .venv/bin/activate # macOS/Linux
.venv\Scripts\activate # Windows
uv run python client.py
- クライアントがFastAPIサーバーにリクエストを送信し、Difyのワークフローからのレスポンスが表示されます。
ステップ8: 動作確認
- サーバーが起動していることを確認(
http://localhost:8000/docs
でSwagger UIが見られる)。 - クライアントを実行し、期待通りのレスポンスが得られるか確認。
- Dify側でワークフローが正しく動作しているか、Difyダッシュボードでログを確認。
プロジェクト構造
最終的なディレクトリ構造は以下のようになります:
fastapi-dify-project/
├── .venv/ # UV仮想環境
├── main.py # FastAPIサーバー
├── client.py # クライアントスクリプト
├── pyproject.toml # プロジェクト設定
└── uv.lock # 依存関係ロックファイル
追加のTips
- エラーハンドリングの強化: 本番環境では、例外処理をさらに詳細に記述することを推奨します。
-
環境変数の使用:
DIFY_API_KEY
などの機密情報は、.env
ファイルに保存し、python-dotenv
を使って読み込むのが安全です。-
uv add python-dotenv
でインストール。 -
.env
ファイルを作成し、main.py
で以下のように読み込み:from dotenv import load_dotenv import os load_dotenv() DIFY_API_KEY = os.getenv("DIFY_API_KEY")
-
-
本番環境へのデプロイ: 本番では
uvicorn
を直接使うのではなく、Gunicornと組み合わせて使うことを検討してください。
まとめ
これで、UV仮想環境内でFastAPIサーバーを介してDifyのワークフローを呼び出すプロジェクトが完成しました。