はじめに
DifyからAzure OpenAIのEndpointを直接使えなくなり、Difyがある環境ではProxyが、Azure OpenAIはAPI Management経由で使用する構成に変更されました。
構成が変わり、認証情報やシステム情報をリクエストヘッダに追加する必要があります。
プラグイン(モデルプロバイダー)の開発
forward proxyでのヘッダ書き換え(断念)
途中にforward proxyを構築してリクエストヘッダを書き換える構成を検討しましたが、以下の理由で断念しました。
forward proxyのCONNECT操作に対応していない(400応答)
- Nginx
- tinyproxy
受信したPOSTリクエストのヘッダ書き換えができない(forward proxyのCONNECT操作のヘッダ書き換えになってしまう)
- squid
Difyプラグインの開発
基本的にはDifyプラグイン開発のドキュメントに沿って進めます。
環境
- Ubuntu 22.04
- Python 3.12
- Homebrew 4.6.3
- Dify 1.6.0
- Dify CLI v0.2.0
- Azure OpenAI 0.0.26 (モデルプロバイダーのベース)
以下を参考にしてPython 3.12をインストールします。
以下を参考にしてHomebrewをインストールします。
開発ツール(Dify plugin CLI)をインストールします。
brew tap langgenius/dify
brew install dify
ドキュメントでは新規プラグインを作成する手順ですが、公式のプラグイン(azure_openai)をベースに改修します。
git clone https://github.com/langgenius/dify-official-plugins
cd dify-official-plugins/models/auzre_openai
ChatGPTに改修箇所を聞いたところ、以下のとおり教えてくれました。
(質問)
Difyのモデルプロバイダーを改修して、POSTデータにヘッダーを追加したいです。 ソースコードは以下です。
https://github.com/langgenius/dify-official-plugins/tree/main/models/azure_openai
改修箇所を教えてください。
(回答)
(1) provider の YAML にフォーム項目を追加し、(2) 送信リクエストのヘッダーを組み立てる共通処理(common.py)へその項目を反映させれば OK です。
YAMLファイルを修正します。(フォーム項目を追加します)
+ - name: header
+ type: text-input
+ label:
+ en_US: header
+ ja_JP: ヘッダ
+ required: false
+ placeholder:
+ en_US: header value (optional)
+ ja_JP: ヘッダ値(未設定なら送信しない)
共通処理(common.py)を修正します。(リクエストヘッダーを追加します)
+from typing import Dict
- credentials_kwargs = {
+ credentials_kwargs: Dict[str, object] = {
+ header = credentials.get("header")
+ if header:
+ credentials_kwargs["default_headers"] = {
+ "header": str(header),
+ }
修正済のファイルはこちらです。
デバッグ
必要なPythonモジュールをインストールします。
python3.12 -m pip install dify_plugin Pillow openai numpy
デバッグKeyを.envファイルに設定します。
INSTALL_METHOD=remote
REMOTE_INSTALL_HOST=localhost
REMOTE_INSTALL_PORT=5003
REMOTE_INSTALL_KEY=(デバッグKey)
プラグインを開発モードで起動します。
python3.12 -m main
Difyにデバッグモードでプラグインが追加されます。
動作の正常性を確認できたらパッケージを作成します。
cd ..
dify plugin package azure_openai
azure_openai.difypkgが作成されます。
作成されたパッケージをDifyからインストール(ローカルパッケージファイルを指定)するとエラーが表示されます。
PluginDaemonBadRequestError: plugin verification has been enabled, and the plugin you want to install has a bad signature
署名検証の失敗が原因で、Difyの設定を変更して署名検証を無効化します。
FORCE_VERIFYING_SIGNATURE=true
↓
FORCE_VERIFYING_SIGNATURE=false
Difyを再起動すれば設定変更が反映されて正常にプラグインをインストールできます。
(参考)mitmproxyでデバッグ
プラグインの改修でPOSTデータのヘッダーが追加されていることを確認したい場合、mitmproxyで確認することができます。
mitmproxyをdockerで構築します。
services:
mitmweb:
image: "mitmproxy/mitmproxy"
ports:
- "8080:8080/tcp"
- "8081:8081/tcp"
volumes:
- "./certs:/home/mitmproxy/.mitmproxy"
command: "mitmweb --web-host 0.0.0.0 --set block_global=false --set web_password='mitm' --mode upstream:(Proxyのアドレス)"
docker compose up -d
mitmproxyのSSL証明書を指定して、プラグインを開発モードで起動します。
SSL_CERT_FILE=mitmproxy/certs/mitmproxy-ca-cert.pem python3.12 -m main





