MENU

【Dify】Code InterpreterのPythonモジュール制限を解除する方法

当ページのリンクには広告が含まれています。

Difyの強力な機能の一つである「Code Interpreter(コードインタープリター)」。しかし、デフォルトのSandbox環境ではセキュリティ上の理由から、使用できるPythonモジュールに厳しい制限がかけられています。

「Pandasを使ってデータ分析をさせたい」「外部ライブラリを活用したい」と思っても、制限に阻まれて諦めていた方も多いのではないでしょうか。

この記事では、Difyのシステム内部にある制限機能を「ダミーモジュール」に差し替えることで、任意のPythonライブラリを使用可能にする裏技的カスタマイズ方法を解説します。

※標準対応モジュールについて
Difyが標準で許可しているモジュール一覧は、公式GitHubのpython3_transformer.pyで確認できます。

目次

前提条件と注意事項

⚠️ 重要なセキュリティ警告

このカスタマイズは、Difyが本来持っているセキュリティ機構(Seccompなど)を無効化するものです。

  • 本番環境での利用は非推奨です: 悪意のあるコードが実行されるリスクが高まります。開発環境や、完全に閉じたネットワーク内での検証利用に留めてください。
  • 代替案の検討: 本番環境で高度な処理が必要な場合は、Code Interpreterの制限を解除するのではなく、処理自体を別のAPIコンテナ化し、Difyから「HTTP Request」ブロックで呼び出す構成を強く推奨します。

検証環境

  • Dify v0.6.11(ローカルDocker環境)
  • OS: Linux (Ubuntu/CentOS等)
  • 必須ツール: Docker, gcc, make

制限解除の手順(ダミーモジュールの作成)

制限を行っているプログラムを、何もしない「ダミー」に置き換えることで制限を回避します。

1. ダミーモジュールのソースコード作成

作業用ディレクトリで、以下のC言語ソースコード dummy_python.c を作成します。

#include <stdint.h> 
#include <stdbool.h> 
#include <stdio.h>

// DifySeccomp関数のプロトタイプ宣言 
void DifySeccomp(uint32_t arg1, uint32_t arg2, bool arg3);

// DifySeccomp関数の実装(何もしない関数として定義) 
void DifySeccomp(uint32_t arg1, uint32_t arg2, bool arg3) { 
    // 動作確認用にログを出力 
    printf("DifySeccomp called with arg1: %u, arg2: %u, arg3: %s\n", arg1, arg2, arg3 ? "true" : "false"); 
}

2. Makefileの作成

コンパイル用の Makefile を同じディレクトリに作成します。

# 出力ファイル名とソースファイル名 TARGET = python.so SOURCE = dummy_python.c

コンパイラとコンパイルオプション
CC = gcc CFLAGS = -Wall -Werror -fpic

リンクオプション
LDFLAGS = -shared

'make'を実行した場合に最初に呼ばれるターゲット
all: $(TARGET)

共有ライブラリをビルド
$(TARGET): $(SOURCE) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^

'make clean'で不要なファイルを削除
clean: rm -f $(TARGET)

3. コンパイルの実行

ターミナルで以下のコマンドを実行し、共有ライブラリ python.so を生成します。

$ make

4. 動作テスト(オプション)

作成したモジュールが正しく動作するか確認したい場合は、以下のPythonスクリプト test_dummy.py を作成して実行します。

# test_dummy.py import ctypes

ダミーモジュールのロード
dummy = ctypes.CDLL('./python.so')

引数と戻り値の型定義
dummy.argtypes = [ctypes.c_uint32, ctypes.c_uint32, ctypes.c_bool] dummy.DifySeccomp.restype = None

関数呼び出しテスト
dummy.DifySeccomp(65537, 1000, 1)

実行コマンド:

$ python3 test_dummy.py > DifySeccomp called with arg1: 65537, arg2: 1000, arg3: true

上記のような出力が表示されれば、ダミーモジュールは正常です。

Dify環境への適用

1. 所有権の変更

コンテナ内にコピーする前に、ファイルの所有者をrootに変更しておきます。

$ sudo chown root:root python.so

2. 必要なPythonライブラリの追加

DifyのSandboxコンテナが読み込む python-requirements.txt に、使いたいライブラリ(今回はpandas)を追記します。

編集対象ファイルパス:

dify/docker/volumes/sandbox/dependencies/python-requirements.txt

pandas

その他必要なライブラリがあれば追記

追記後、Sandboxコンテナを再起動してライブラリをインストールさせます。

$ docker restart docker-sandbox-1

3. ダミーモジュールの配置

作成した python.so をSandboxコンテナ内の所定の場所に上書きコピーします。

※コンテナを再起動するたびに元に戻る可能性があるため、再起動後は再度このコマンドを実行する必要があります。

$ docker cp python.so docker-sandbox-1:/var/sandbox/sandbox-python/

動作確認

Difyの画面を開き、Code Interpreterブロックで以下のコードを実行してみましょう。

import pandas as pd

def main(arg1: int, arg2: int) -> dict: # pandasが使えるかどうかのテスト df = pd.DataFrame({'col1': [1, 2], 'col2': [3, 4]})

return {
    "result": str(arg1 + arg2),
    "dataframe_shape": str(df.shape)
}
Dify Code Interpreterでの実行結果

エラーが出ずに実行結果が返ってくれば成功です!

これにより、Dify上でPandasを使った高度なデータ加工や分析が可能になります。

まとめ

DifyのSandbox環境におけるPythonモジュール制限は、セキュリティモジュールをダミーに差し替えることで回避可能です。

ただし、この方法はセキュリティリスクを伴うため、あくまで開発・検証環境での利用に限定し、本番運用ではAPI連携などの安全な手法を検討してください。

【推奨】業務システム化に有効なアイテム

生成AIを学ぶ

システム化のパートナー

VPSサーバの選定

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

CAPTCHA


目次