😉

DifyをAPI経由で実行する - Google Colabを使って

2024/08/19に公開

はじめに

Difyでは構築した生成AIアプリをチャットボットで公開することや、Webサイトにチャットボットを埋め込むことができます。もう1つの手段としてAPI公開して、外部のシステムから実行することができます。今回はその方法を見ていきましょう。

ちなみに、DifyをAPI経由で実行を応用すると下記記事のようなこともできるようになるので、ぜひ興味ある方はご覧いただけると幸いです。
https://zenn.dev/acntechjp/articles/44bfffa7ba920d

全体像

Google ColabからAPIでDifyをキックして、Difyは受け取った問い合わせをLLMへ送り、受信した回答をGoogle Colabへ返信します。

Difyの設定

まずはDifyの設定を見ていきましょう。

ノードの構成

ミニマムこれでいけます。

開始の設定

変数に「talk」を追加しています。これはColabで呼び出すときに使います。会話のインプットになるもので、Colabから例えば「東京都と京都府の違いを200文字で教えて」といった情報を受け取ります。

LLMの設定

LLMは「GPT-4o mini」を使います。SYSTEMに「開始」で受け取った「talk」を設定しています。LLMへ送信するプロンプトになります。

終了の設定

LLMの回答を出力します。

APIキー発行

「公開する」の「APIリファレンスにアクセス」をクリックします。

「APIキー」をクリックします。

「+新しいシークレットキーを作成」をクリックしてAPIキーを発行してコピーして手元に持っておきます。

Google Colabの設定

sseclient-pyのインストール

!pip install sseclient-py

インポート

import requests
import json
import sseclient

Function定義(DifyのWorkflow実行)

def run_dify_workflow(api_key, workflow_inputs, user_id, response_mode='streaming'):
    url = 'https://api.dify.ai/v1/workflows/run'
    headers = {
        'Authorization': f'Bearer {api_key}',
        'Content-Type': 'application/json'
    }
    
    payload = {
        'inputs': workflow_inputs,
        'response_mode': response_mode,
        'user': user_id
    }
    
    if response_mode == 'blocking':
        response = requests.post(url, headers=headers, json=payload)
        return response.json()
    elif response_mode == 'streaming':
        response = requests.post(url, headers=headers, json=payload, stream=True)
        client = sseclient.SSEClient(response)
        return client.events()

Function定義(Difyの出力結果をデコード)

def print_human_readable(data):
    if isinstance(data, dict):
        for key, value in data.items():
            if isinstance(value, str):
                print(f"{key}: {value}")
            elif isinstance(value, dict):
                print(f"{key}:")
                print_human_readable(value)
            else:
                print(f"{key}: {value}")
    elif isinstance(data, str):
        print(data)
    else:
        print(json.dumps(data, ensure_ascii=False, indent=2))

メイン処理

変数「api_key」にはDifyで取得したAPIキーを張り付けましょう。
「ブロッキングモード」と「ストリーミングモード」の2種類があるのですが、この記事では「ブロッキングモード」を採用しています。
「ストリーミングモード」だとChatGPTみたく文字が生成されるたびにデータが連携されます。「ブロッキングモード」だとLLMがすべての文字列を生成し終わった後にまとめてデータが連携されます。

# 使用例
api_key = 'XXX'
workflow_inputs = {'talk': '東京都と京都府の文化の違いを200文字で教えて'}  # ワークフローの入力パラメータ
user_id = 'user123'

# ブロッキングモードの例
result = run_dify_workflow(api_key, workflow_inputs, user_id, 'blocking')
print_human_readable(result)

# ストリーミングモードの例
#for event in run_dify_workflow(api_key, workflow_inputs, user_id, response_mode='streaming'):
#    print_human_readable(json.loads(event.data))

動かしてみよう

Google Colabでプログラムを実行

下記のように実行できました。
赤ポチがDifyから返答があった文字列となります。

Dify上はどうなっているか

ログ画面があり、下記のように実行履歴を見ることができます。

詳細を深堀りして確認することもできます。


さいごに

いかがでしたか。DifyをAPIでキックすることができると、Difyの活用の幅がさらに広がると思います。この記事を参考に皆さんよりDifyを活用するキッカケになると嬉しく思います!

Accenture Japan (有志)

Discussion