[Dify LLM] PythonでDifyのworkflowに入力して出力を取得する

import requests
import json
import os

from dotenv import load_dotenv
load_dotenv()

API_KEY = os.environ.get("DIFY_API_KEY")
APP_ID = os.environ.get("APP_ID")

BASE_URL = "https://api.dify.ai/v1" 
CHAT_ENDPOINT = f"{BASE_URL}/chat-messages"

user_input = "おはようございます。"

payload = {
    # ユーザーからのメインの質問(ワークフローの {{query}} に対応)
    "query": user_input,
    
    # ワークフロー内の他の入力ノードに渡す変数(オプション)
    "inputs": {
        # 例: ワークフロー内の変数名が 'context' の場合、ここで値を渡せる
        "context": "Null" 
    },
    
    # ユーザーIDは必須(セッション管理用)。適当なUUIDなどを指定
    "user": "user_python_script_001", 
    
    # ストリーミングを無効にする
    "response_mode": "blocking", 
}

headers = {
    "Authorization": f"Bearer {API_KEY}",
    "Content-Type": "application/json"
}

try:
    # --- API呼び出し ---
    response = requests.post(
        CHAT_ENDPOINT,
        headers=headers,
        data=json.dumps(payload)
    )
    
    response.raise_for_status() # HTTPエラーが発生した場合に例外を発生させる
    data = response.json()

    # --- 出力の取得 ---
    if data and 'answer' in data:
        print("✅ ワークフローの出力 (回答):")
        print(data['answer'])
    else:
        print("⚠️ ワークフローからの回答が見つかりません。")
        print(data)

except requests.exceptions.HTTPError as errh:
    print(f"HTTP エラーが発生しました: {errh}")
    print(response.text)
except requests.exceptions.RequestException as err:
    print(f"リクエスト中にエラーが発生しました: {err}")

$ python3 dify-llm.py
✅ ワークフローの出力 (回答):
おはようございます。今日は何のお手伝いができますか?

アプリ(iOS/Android)から直接Difyを呼び出すのではなく、バックエンドサーバー(Python)を経由させて、そのサーバーでTTS(Text-to-Speech、音声合成)処理を行ってからアプリに返す構成の方が、より一般的で推奨されている。

なるほど、Dify APIの理解度が一気に高まった。