# コード実行 ## 目次 - [紹介](#紹介) - [使用シナリオ](#使用シナリオ) - [ローカルデプロイ](#ローカルデプロイ) - [セキュリティポリシー](#セキュリティポリシー) ## 紹介 コードノードは、Python / NodeJSコードを実行してワークフロー内でデータ変換を行うことをサポートします。これにより、Arithmetic、JSON変換、テキスト処理などのシナリオでワークフローが簡素化されます。 このノードは開発者の柔軟性を大幅に向上させ、ワークフロー内にカスタムPythonまたはJavascriptスクリプトを埋め込んで、事前設定されたノードでは達成できない方法で変数を操作することができます。設定オプションを使用して、必要な入力変数と出力変数を指定し、対応する実行コードを記述できます。
## 設定 他のノードの変数をコードノードで使用する必要がある場合は、`入力変数`で変数名を定義し、これらの変数を参照する必要があります。[変数参照](../key_concept.md#変数)を参考にしてください。 ## 使用シナリオ コードノードを使用して、以下の一般的な操作を実行できます: ### 構造化データ処理 ワークフローでは、しばしば非構造化データの処理が必要です。例えば、JSON文字列の解析、抽出、変換などです。典型的な例として、HTTPノードのデータ処理があります。一般的なAPI応答構造では、データが多層のJSONオブジェクトにネストされていることがあり、特定のフィールドを抽出する必要があります。コードノードはこれらの操作を支援します。以下は、HTTPノードから返されたJSON文字列から`data.name`フィールドを抽出する簡単な例です: ```python def main(http_response: str) -> str: import json data = json.loads(http_response) return { # 出力変数にresultを宣言することに注意 'result': data['data']['name'] } ``` ### 数学計算 ワークフロー内で複雑な数学計算を行う必要がある場合、コードノードを使用できます。例えば、複雑な数学公式の計算やデータの統計分析です。以下は、配列の平方差を計算する簡単な例です: ```python def main(x: list) -> float: return { # 出力変数にresultを宣言することに注意 'result': sum([(i - sum(x) / len(x)) ** 2 for i in x]) / len(x) } ``` ### データの結合 時には、複数のデータソースを結合する必要がある場合があります。例えば、複数の知識検索、データサーチ、API呼び出しなどです。コードノードはこれらのデータソースを統合するのに役立ちます。以下は、2つの知識ベースのデータを結合する簡単な例です: ```python def main(knowledge1: list, knowledge2: list) -> list: return { # 出力変数にresultを宣言することに注意 'result': knowledge1 + knowledge2 } ``` ## ローカルデプロイ ローカルデプロイのユーザーである場合、悪意のあるコードが実行されないようにするためのサンドボックスサービスを起動する必要があります。このサービスを起動するにはDockerサービスを使用します。サンドボックスサービスの詳細は[こちら](https://github.com/langgenius/dify/tree/main/docker/docker-compose.middleware.yaml)から確認できます。また、`docker-compose`を使用してサービスを直接起動することもできます: ```bash docker-compose -f docker-compose.middleware.yaml up -d ``` ## 制限 PythonとJavascriptのいずれであっても、その実行環境は安全性を確保するために厳密に隔離(サンドボックス化)されています。これにより、ファイルシステムへの直接アクセス、ネットワークリクエストの実行、OSレベルのコマンドの実行など、システムリソースを大量に消費する可能性がある機能を使用することはできません。これらの制限により、コードの安全な実行が保証され、システムリソースの過剰消費が防止されます。