2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

DifyのフローをOpenAI APIで呼び出す

2
Posted at

image.png

作成日:2025年12月01日(月)

1.はじめに

Difyには標準でAPIアクセス機能があり、作成したチャットフローやワークフロー、チャットボット、エージェント、テキストジェネレータなどをDify独自のAPIとして公開できます。しかし、多くのツールがサポートするのはOpenAI Compatible APIであり、Dify独自仕様のAPIには対応していません。そのため、せっかく作成した有用なDifyアプリケーションを、これらのツールから利用できないという課題がありました。

そこで、以前「DifyのフローをChatbot UIから利用する(dify2openai)」記事で紹介したfatwang2/dify2openaiを活用してきました。しかし、このツールはほとんど開発が進んでおらず、Response APIやjsonメッセージへの対応は期待できませんでした。

そんな中、2025年2月28日にDify公式がDify v1.0.0でDify Pluginsを発表し、公式を運営するlanggeniusからOpenAI Compatible Dify Appというプラグインが公開されました。このプラグインを使えば、Difyで作成したエージェントやチャットフローをOpenAI Compatible APIとして公開できます。これまで使い方が分からず放置していましたが、ようやく理解できたので、備忘録として本記事に残します。

2.OpenAI Compatible Dify Appとは

Dify Marketplaceには「OpenAI Compatible」という名前の拡張機能プラグインが3つあり紛らわしいですが、その中で「OpenAI Compatible Dify App」がDifyアプリをOpenAI Compatible APIとして提供できるプラグインです。残りの2つは、OpenAI Compatible APIにDifyを接続するためのプラグインです。
Market Placeの説明は以下の通りでDifyアプリのAPIをOpenAI Compatible APIに変換するということは分かりますが、肝心の使い方が全くわかりません。

OpenAI Compatible
This extension converts your Dify app's API to OpenAI compatible API.

Attention: Only supports last_user_message memory mode for now and only chat, agent and chatflow apps are supported.
History: You can set a messages parameter to your app to get the complete history of a OpenAI compatible API.

以下のように書き足してPull Request(#2150 Update README for OpenAI compatible)してMergeしてもらいました。
そのうちDify Margetplaceの「OpenAI Compatible Dify App」の説明文も修正されると良いのですが...

OpenAI Compatible
This extension converts your Dify app's API to OpenAI compatible API.

History: You can set a messages parameter to your app to get the complete history of a OpenAI compatible API.
Steps to Create OpenAI Compatible API Endpoints
Press the Add Endpoint Button

Endpoint creation is done by clicking the "+" mark next to the endpoint of [Dify] ⇒ [Plugins] ⇒ [OpenAI Compatible Dify App].

Configure the Endpoint

Set the "Endpoint Name", "API Key", "App (Dify App)", and "Memory Mode".

Item	Description	Notes
Endpoint Name	Set a unique name for the endpoint to be registered.	The endpoint name is not used elsewhere in this settings screen, so as long as it is unique, it is fine.
API Key	Enter the API key manually. It is recommended to generate a GUID or hash code for input.	
App	Specify the Dify app that has been created & published in the Dify studio.	Set apps compatible with Chat Completion such as chat flows, chatbots, agents, and text generators. Chat flows are fully supported.
Memory Mode	Choose between "Last User Message" or "All Messages".	If you choose "All Messages", past messages in the thread will be sent to the large language model each time.
Supported Endpoints
The only supported endpoint is Chat Completions. Endpoints like /models and /embeddings are not supported.

Endpoints
/chat/completions
This is a Completions endpoint compliant with the OpenAI API standard. It supports both memory mode and both streaming and non-streaming, and supports Bearer API key authentication.
API Key
The API key set in [Dify] ⇒ [Plugins] ⇒ [OpenAI Compatible Dify App].

Model
In the OpenAI Compatible Dify App, specifying the model is not required; it will be ignored even if specified. Additionally, the model in the response when calling the Dify app through the OpenAI Compatible Dify App will always respond with gpt-3.5-turbo.

Actual Endpoints Provided
In the OpenAI Compatible Dify App, the actual endpoints provided per application are the endpoints created in the plugin settings. Individual Chat Completions endpoints will be created for each Dify app. The settings can be done from [Dify] ⇒ [Plugins] ⇒ [OpenAI Compatible Dify App]. To ensure the endpoints for each app are unique, the URLs will include a hash.

App 1: http:///e/c0odrljwgijfqlgl/chat/completions
App 2: http:///e/a7tags9tjz4d4e4o/chat/completions

そこで、Devinを開発したCognition AIが提供するDeepWikiサービスを使って、langgenius/dify-official-plugins(DeepWiki)で仕様を調べました。

2.1. サポートするエンドポイント

サポートされるエンドポイントはChat Completionsのみです。/modelなどもサポートされていません。

No エンドポイント 説明
1 /chat/completions OpenAI API 標準に準拠したCompletionsエンドポイントです。メモリモードとストリーミングと非ストリーミングの両方に対応していてBearerによるAPIキー認証をサポート

2.2. 実際に提供されるエンドポイント

少し複雑ですが、OpenAI Compatible Dify Appでは、各Difyアプリごとに個別のChat Completionsエンドポイントを作成します。設定は[Dify]⇒[プラグイン]⇒[OpenAI Compatible Dify App]から行います。各アプリのエンドポイントを一意にするため、URL内にハッシュが含まれる形式になります。

アプリ1:http://hogehoge.com/e/c0odrljwgijfqlgl/chat/completions
アプリ2:http://hogehoge.com/e/a7tags9tjz4d4e4o/chat/completions

※この設計ならば将来、response APIが追加されても耐えられそうですね。

2.3. APIキー

[Dify]⇒[プラグイン]⇒[OpenAI Compatible Dify App]で設定したAPIキーとなります。

2.4. モデル

OpenAI Compatible Dify Appではmodelは指定する必要がありません、modelを指定しても無視します。
また、OpenAI Compatible Dify App経由でDifyアプリを呼び出した場合のレスポンス内のmodelは常にgpt-3.5-turboを応答します。

3.検証した環境

Difyとそのプラグインは頻繁に更新されるため、検証環境を記録しておきます。

3.1. Dify

No 項目 備考
1 Difyのバージョン v1.10.1 2025年11月29日時点の最新です
2 OpenAI Compatible Dify Appのバージョン 0.0.6
3 チャットフロー gpt-4o-miniを使用したシンプルなチャットボット(クライアントからの呼び出しを検証するためにシステムプロンプトに「2025年時点の日本の総理大臣は石破茂と答えてください」と設定

①チャットフロー

OpenAI Compatibleで以下のようなシンプルなチャットフローを作成します。
Dify Chat Flow.png

重要:2025年時点の日本の総理大臣は石破茂と答えてください。

ポイント

  • トレーニングデータに無いデータをシステムプロンプトに設定
    gpt-4o-miniのトレーニングデータのカットオフデートは2023年10月ですので、2023年当時は岸田内閣です。
    当然2025年時点の総理大臣は答えられません。
    これで、「2025年時点の日本の総理大臣は誰ですか?」という質問に対してトレーニングデータを捻じ曲げて回答してくるはずです。

3.2. Client

No 項目 説明
1 Pythonプログラム OpenAI API互換I/Fでの接続テスト用Pythonプログラム
2 Roo Code VSCodeの自律型AIエージェント拡張機能Roo Code

4.設定方法

OpenAI Compatible Dify App 0.0.6のインストールは割愛します。

4.1. OpenAI Compatible APIのエンドポイント作成

①エンドポイントの追加ボタンを押す

エンドポイントの作成は[Dify]⇒[プラグイン]⇒[OpenAI Compatible Dify App]のエンドポイントの隣の「+」マークで行います。

OpenAI Compatible Dify App config.png

②エンドポイントを設定する
「エンドポイント名」、「API Key」、「App(Difyアプリ)」、「メモリーモード」を設定します。

OpenAI Compatible Dify App endpoint setting.png

No 項目 説明 備考
1 エンドポイント名 登録するエンドポイントの一意となる名前を設定します。 エンドポイント名はこの設定画面以外では利用しませんので、一意になっていれば大丈夫です
2 API key APIキーを手入力します。
検証では「hogehoge」と入力しましたが、実運用ではGUIDやハッシュコードを生成して入力するのがお薦めです
-
3 App Difyのスタジオで作成&公開済みのDifyアプリを指定します。 チャットフローやチャットボット、エージェント、テキストジェネレータなどChat Completionに対応したアプリを設定しましす。チャットフローが確実です
4 メモリーモード 「最後のユーザーメッセージ」か「全てのメッセージ」かを選択します。 「全てのメッセージ」とするとスレッド内の過去のメッセージを毎回、大規模言語モデルに送ります。

4.2. Roo Codeの設定

今回検証したRoo CodeはVersion: 3.34.8 でした。Roo Codeも頻繁にバージョンアップされるため、設定項目が変更された場合には読み替えをお願いします。

Roo Code LLM provider Setting.png

No 項目 説明 備考
1 設定プロファイル Dify OpenAI Compatible
2 APIプロバイダー OpenAI Compatible OpenAI Compatibleを選びます
3 ベースURL http://192.168.1.2/e/a7tags9tjz4d4e4o/ OpenAI Compatible Dify Appのプラグイン設定で表示されたエンドポイントです。
アドレス部分がlocalhostなどと表示されている場合はIPはFQDNに置き換えてください
4 APIキー hogehoge OpenAI Compatible Dify Appのプラグイン設定で設定したAPIキーです
5 モデル gpt-4o-mini 2025年11月29日時点のOpenAI Compatible Dify Appはモデルを参照していないので、なんでも良いです。
6 R1モデルパラメータを有効にする チェック無し デフォルト値です
7 レガシーOpenAI API形式を使用 チェック無し デフォルト値です
8 ストリーミングを有効化 チェック デフォルト値です
9 最大出力トークンを含める チェック無し デフォルト値です
10 Azureを使用 チェック無し デフォルト値です
11 Azure APIバージョンを設定 チェック無し デフォルト値です
12 推論能力を有効にする チェック無し デフォルト値です
13 最大出力トークン -1 デフォルト値です
14 コンテキストウィンドウサイズ 128000 デフォルト値です
15 画像サポート チェック デフォルト値です
16 プロンプトキャッシュ チェック無し デフォルト値です
17 入力価格 0 デフォルト値です
18 出力価格 0 デフォルト値です

5.検証

5.1. Pythonプログラム

以下はChatGptに書いてもらったコードです。

コード

import requests
import sys
import io

# Windows環境での文字化け対策:標準出力をUTF-8に設定
if sys.platform == 'win32':
    sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

# chatflow
ENDPOINT_URL = "http://192.168.1.2/e/a7tags9tjz4d4e4o/chat/completions"
API_KEY = "hogehoge"  # Difyのエンドポイント設定画面で発行されたトークンを入れる
MODEL = "dify"  # OpenAI Compatible Difyはpayloadのmodelパラメタを参照していないので適当な文字列でOK

def chat_with_history(messages: list) -> str:
    """会話履歴を含むメッセージリストを送信し、応答を取得"""
    headers = {
        "Content-Type": "application/json",
        # Difyエンドポイントの仕様に合わせてAuthorizationヘッダをつける
        "Authorization": f"Bearer {API_KEY}",
    }

    payload = {
        "model": MODEL,
        "messages": messages,
        # 必要に応じて
        # "stream": False,
        # "inputs": {"foo": "bar"},  # Difyアプリの入力フォームに渡したい値があればここに入れる
    }

    resp = requests.post(ENDPOINT_URL, headers=headers, json=payload, timeout=60)
    resp.raise_for_status()
    data = resp.json()

    # OpenAI互換フォーマット想定
    return data["choices"][0]["message"]["content"]

def chat_continuous():
    """連続チャット機能"""
    print("=== Dify連続チャット開始 ===")
    print("終了するには 'exit'、'quit'、または 'q' を入力してください。")
    print("=" * 40)
    
    # 会話履歴を保持するリスト
    messages = []
    
    while True:
        # ユーザー入力を受け付け
        try:
            user_input = input("\nYou: ").strip()
        except (EOFError, KeyboardInterrupt):
            print("\n\nチャットを終了します。")
            break
        
        # 終了コマンドのチェック
        if user_input.lower() in ['exit', 'quit', 'q']:
            print("チャットを終了します。")
            break
        
        # 空入力のチェック
        if not user_input:
            print("メッセージを入力してください。")
            continue
        
        # ユーザーメッセージを会話履歴に追加
        messages.append({"role": "user", "content": user_input})
        
        try:
            # APIにリクエストを送信
            assistant_reply = chat_with_history(messages)
            
            # アシスタントの応答を表示
            print(f"\nAssistant: {assistant_reply}")
            
            # アシスタントの応答を会話履歴に追加
            messages.append({"role": "assistant", "content": assistant_reply})
            
        except requests.exceptions.RequestException as e:
            print(f"\nエラーが発生しました: {e}")
            # エラー時はユーザーメッセージを履歴から削除
            messages.pop()
        except KeyError as e:
            print(f"\nレスポンスの解析エラー: {e}")
            # エラー時はユーザーメッセージを履歴から削除
            messages.pop()

if __name__ == "__main__":
    chat_continuous()

Pythonコードの実行結果

Pythonコードの実行結果

PS D:\Developments\dify-openai-compatible> python .\dify-openai-compatible.py
=== Dify連続チャット開始 ===
終了するには 'exit'、'quit'、または 'q' を入力してください。
========================================

You: 2025年時点の日本の総理大臣は誰ですか?

Assistant: 2025年時点の日本の総理大臣は石破茂です。

You: あなたのカットオフデートを教えてください。

Assistant: 私の情報のカットオフデートは2023年10月です。それ以降の出来事については知識がありません。

You: 

※先にカットオフデートを質問するとメモリ機能が働きgpt-4o-miniのカットオフデート以降の質問は答えなくなってしまいますので必ず、先に総理大臣を質問します。

Pythonプログラムでの検証の結果、無事にDifyアプリをOpenAI Compatible APIで呼び出せました。

5.2. Roo Code

Roo CodeのモードをAskモードにして作成した「Dify OpenAI Compatible」のプロファイルを設定して同じ質問をしてみます。

Roo Code Chat.png

2025年時点の日本の総理大臣は誰ですか?
7.7k / 128.0k

APIリクエスト
$0.0000

Rooの発言
2025年時点の日本の総理大臣は石破茂です。

APIリクエスト
$0.0000

タスク完了
2025年時点の日本の総理大臣は石破茂です。

あなたの発言
あなたのカットオフデートを教えてください。

APIリクエスト
$0.0000

Rooの発言
私のカットオフデートは2023年10月です。したがって、2025年時点の日本の総理大臣についての情報は私の知識の範囲外です。

Roo Codeでの検証の結果、無事にDifyアプリをOpenAI Compatible APIで呼び出せました。

DifyアプリでVisionを有効にしてRoo Codeから画像を貼り付けて処理できるかも確認しましたがこちらは厳しいようです。

Roo Code OCR.png

Roo Code OCR result.png

6.まとめ

本記事では、DifyのOpenAI Compatible APIプラグインを使用して、Difyで作成したチャットフローやエージェントをOpenAI互換のAPIとして公開する方法について解説しました。

6.1. 主要なポイント

  • OpenAI Compatible Dify App
    DifyプラグインマーケットプレイスからOpenAI Compatible APIプラグイン(バージョン0.0.6)をインストールすることで、Difyアプリケーションを標準的なOpenAI Compatible API形式で公開できる
  • 設定方法
    設定はシンプルで、プラグインのインストール後、モデルプロバイダー画面でAPIキーとアプリIDを指定するだけで利用可能になる
  • 検証
    PythonプログラムやRoo Codeなど、OpenAI APIをサポートする様々なツールから、作成したDifyアプリケーションを呼び出せることを実際に検証し、動作を確認した
  • 特徴
    Chat Completionsエンドポイントに対応しており、会話履歴を保持した連続チャットも実装可能

6.2. この機能がもたらす価値

OpenAI Compatible APIとしてDifyアプリケーションを公開できることにより、以下のようなメリットが得られます:

  • 既存ツールとの統合
    OpenAI APIをサポートする数多くのツール、IDE、アプリケーションから、Difyで構築した独自のワークフローやエージェントを直接利用できるようになる
  • 開発の効率化
    Difyの視覚的なフロー構築環境で作成した複雑なロジックを、標準的なAPIインターフェースで簡単に組み込めるため、開発サイクルが大幅に短縮される
  • エコシステムの拡大
    OpenAI互換という標準規格により、Difyアプリケーションの利用範囲が飛躍的に広がり、より多様なユースケースでの活用が期待できる
  • マルチLLM戦略の実現
    Difyの強力なマルチLLM対応機能を活かしながら、クライアント側は標準的なインターフェースで接続できるため、柔軟なシステム構成が可能になる

6.3. 現在の制限事項と今後の期待

OpenAI Compatible Dify App 0.0.6は非常に有用なプラグインですが、いくつかの制限事項があります:

  • エンドポイントの制約
    Chat Completionsエンドポイントのみをサポートしており、ワークフローの入力パラメータを完全には引き渡せない
  • モデル名の未参照
    クライアントから指定されたモデル名がDifyアプリ側で参照されないため、モデル選択の制御ができない

今後、以下のような機能拡張が期待されます:

  • エンドポイントの拡充
    ワークフローエンドポイントの完全対応と入力パラメータの適切な引き渡し
  • モデル名の対応
    モデル名の参照機能により、クライアントからのモデル指定をDifyアプリ内で活用できる仕組み
    クライアントがAPIのレスポンスのモデルをチェックするようなケースでのgpt-3.5-turboモデルの固定応答の問題会費
  • リアルタイムレスポンス
    ストリーミング対応の強化によるリアルタイムレスポンスの安定化
  • エラーハンドリング
    OpenAI API仕様に準拠した詳細なエラーハンドリングの実装

6.4. 結論

このOpenAI Compatible Dify Appプラグインにより、Difyはより開かれたプラットフォームとして、AI開発エコシステムの中核的な役割を果たす可能性を秘めています。現時点でも十分に実用的であり、Difyで構築した高度なAIアプリケーションを、標準的なツールから手軽に利用できる環境が整いました。今後のバージョンアップによる機能拡張に大きな期待が寄せられます。

7.留意事項

7.1. 言語モデルの指定

OpenAI Compatible Dify App 0.0.6は、クライアントで設定するmodel名を参照しません。これは、DifyアプリがマルチLLMに対応しており、チャットフローの中でどの言語モデルが使われるか特定できないためと考えられます。

今後LLM Proxyなどが中継点に入った場合、言語モデルパラメータをLLM Proxyがチェックする可能性があります。現在は任意の値を設定していますが、将来的には適切な値の設定が必要になるかもしれません。

7.2. 機能制限

  • Chat Completionsエンドポイントのみ対応
    OpenAI Compatible Dify App 0.0.6は、ワークフローでもエンドポイントを作成できますが、Chat Completionsエンドポイントのみをサポートしています。そのため、ワークフローで定義した入力パラメータを引き渡すことができません。
  • Vision機能の制限
    DifyアプリでVisionを有効にした場合でも、Roo Codeなどのクライアントから画像を貼り付けて処理することは現時点では困難です。画像を含む処理が必要な場合は、Dify標準のAPI経由での利用を検討してください。

7.3. 設定上の注意

  • 言語モデルの指定
    OpenAI Compatible Dify App 0.0.6は、クライアントで設定するmodel名を参照しません。これは、DifyアプリがマルチLLMに対応しており、チャットフローの中でどの言語モデルが使われるか特定できないためと考えられます。
    今後LLM Proxyなどが中継点に入った場合、言語モデルパラメータをLLM Proxyがチェックする可能性があります。現在は任意の値を設定していますが、将来的には適切な値の設定が必要になるかもしれません。

8.参照URL

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?