Dify
日本語
日本語
  • 入門
    • Difyへようこそ
      • 特性と技術仕様
      • モデルプロバイダーリスト
    • クラウドサービス
    • コミュニティ版
      • Docker Compose デプロイ
      • ローカルソースコードで起動
      • aaPanelでのデプロイ方法
      • フロントエンドDockerコンテナを単独起動
      • 環境変数の説明
      • よくある質問
    • Dify Premium
    • Dify 教育版
  • マニュアル
    • モデル
      • 新しいプロバイダーの追加
      • 事前定義されたモデルの追加
      • カスタムモデルの追加
      • インタフェース
      • 配置ルール
      • 負荷分散
    • アプリ・オーケストレーション
      • アプリの作成
      • チャットボット
        • 複数モデルのデバッグ
      • エージェント
      • ツールキット
        • コンテンツモデレーション
    • ワークフロー
      • キーコンセプト
      • 変数
      • ノードの説明
        • 開始
        • 終了
        • 回答
        • LLM
        • 知識検索
        • 質問分類
        • 条件分岐
        • コード実行
        • テンプレート
        • テキスト抽出ツール
        • リスト処理
        • 変数集約
        • 変数代入
        • 反復処理(イテレーション)
        • パラメータ抽出
        • HTTPリクエスト
        • エージェント
        • ツール
        • 繰り返し処理(ループ)
      • ショートカットキー
      • オーケストレートノード
      • ファイルアップロード
      • エラー処理
        • 事前定義されたエラー処理ロジック
        • エラータイプの概要
      • 追加機能
      • プレビューとデバッグ
        • プレビューと実行
        • ステップ実行
        • 対話/実行ログ
        • チェックリスト
        • 実行履歴
      • アプリケーション公開
      • JSON形式での出力
      • 変更通知:画像アップロード機能がファイルアップロード機能に統合されました
    • ナレッジベース
      • ナレッジベース作成
        • 1. オンラインデータソースの活用
          • 1.1 Notion からデータをインポート
          • 1.2 Webサイトからデータをインポート
        • 2. チャンクモードの指定
        • 3. インデックス方式と検索オプションの設定
      • ナレッジベースの管理
        • ナレッジベース内ドキュメントの管理
        • APIを活用したナレッジベースのメンテナンス
      • メタデータ
      • アプリ内でのナレッジベース統合
      • リコールテスト/引用帰属
      • ナレッジベースの要求頻度制限
      • 外部ナレッジベースとの接続
      • 外部ナレッジベースAPI
    • ツール
      • クイック統合ツール
      • 高度統合ツール
      • ツールの設定
        • Google
        • Bing
        • SearchApi
        • StableDiffusion
        • Perplexity Search
        • AlphaVantage 株式分析
        • Dall-e
        • Youtube
        • Serper
        • SearXNG
        • SiliconFlow(Flux AI サポート)
        • ComfyUI
    • アプリ公開
      • シングルページWebアプリとして公開
        • Web アプリの設定
        • テキスト生成アプリ
        • 対話型アプリ
      • Webサイトへの埋め込み
      • API基づく開発
      • フロントエンドテンプレートに基づいた再開発
    • アノテーション
      • ログとアノテーション
      • アノテーション返信
    • モニタリング
      • データ分析
      • 外部Opsツール統合
        • LangSmithを統合
        • LangFuseを統合
        • Opikを統合
    • 拡張
      • API 拡張
        • Cloudflare Workers を使用した API ツールのデプロイ
        • コンテンツモデレーション
      • コード拡張
        • 外部データツール
        • コンテンツモデレーション
    • コラボレーション
      • 発見
      • メンバーの招待と管理
    • 管理
      • アプリの管理
      • チームメンバーの管理
      • 個人アカウントの管理
      • サブスクリプション管理
      • バージョン管理
  • ハンドオン工房
    • 初級編
      • ゼロからAI画像生成アプリの構築方法
      • AIエージェントの実践:個人のオンライン旅行アシスタントの構築方法
    • 中級編
      • チャットストリームエージェントを使用した Twitter アカウントの分析方法
      • ファイルアップロードを使用した記事理解アシスタントの構築方法
  • コミュニティ
    • サポートの求め
    • 貢献者ガイド
    • ドキュメントへの貢献
  • プラグイン
    • 機能紹介
    • クイックスタート
      • プラグインのインストールと活用
      • プラグイン開発の入門
        • 開発環境のセットアップ
        • ツール型プラグイン
        • モデル型プラグイン
          • モデルプロバイダーの構築
          • 定義済みモデルの組み込み
          • カスタムモデルの組み込み
        • エージェント戦略プラグイン
        • 拡張機能型プラグイン
        • バンドル
      • プラグインのデバッグ方法
    • プラグイン管理方法
    • スキーマ仕様
      • Manifest(マニフェスト)
      • Endpoint(エンドポイント)
      • Tool(ツール)
      • Agent(エージェント)
      • Model(モデル)
        • モデル設計規則
        • モデルスキーマ
      • 一般的な標準仕様
      • 永続化されたストレージ
      • Difyサービスの逆呼び出し
        • アプリ
        • モデル
        • ツール
        • ノード
    • ベストプラクティス
      • Slack Bot プラグインの開発
      • Dify MCP プラグインガイド:ワンクリックで Zapier に接続してメールを自動送信
    • プラグインの公開
      • プラグインの自動公開
      • Difyマーケットプレイスへの公開
        • プラグイン開発者ガイドライン
        • プラグインのプライバシー保護に関するガイドライン
      • 個人GitHubリポジトリへの公開
      • ローカルでの公開と共有
      • 第三者署名検証のためにプラグインに署名する
    • よくある質問
  • 開発
    • バックエンド
      • DifySandbox
        • 貢献ガイド
    • モデルの統合
      • Hugging Faceのオープンソースモデルを統合
      • Replicateのオープンソースモデルを統合
      • Xinferenceでデプロイしたローカルモデルを統合
      • OpenLLMでデプロイしたローカルモデルを統合
      • LocalAIでデプロイしたローカルモデルを統合
      • Ollamaでデプロイしたローカルモデルを統合
      • LiteLLM Proxyを使用してモデルを統合する
      • GPUStackとの統合によるローカルモデルのデプロイ
      • AWS Bedrock上のモデル(DeepSeek)の接続
    • 移行
      • コミュニティ版を v1.0.0 に移行する
  • もっと読む
    • 活用事例
      • DeepSeek & Dify連携ガイド:多段階推論を活用したAIアプリケーション構築
      • Ollama + DeepSeek + Dify のプライベートデプロイ:あなた自身のAIアシスタントの構築方法
      • あなた専用のQAチャットボットのトレーニング方法
      • コードなしでMidjourney プロンプトボットを作成する方法
      • Notion AI アシスタントを構築する
      • 数分で業務データを持つ公式サイトのAIチャットボットを作成する方法
      • DifyチャットボットをWixサイトに統合する方法
      • AWS Bedrockのナレッジベースに統合する方法
      • Difyで大規模言語モデルの「競技場」を体験する方法:DeepSeek R1 VS o1 を例に
      • Difyスケジューラーの構築
      • DifyクラウドでAI Thesis Slack Botを構築
    • さらに読む
      • LLMOpsとは何ですか?
      • 配列変数とは何ですか?
      • 検索拡張生成(RAG)
        • ハイブリッド検索
        • Rerank
        • リトリーバルモード
      • プロンプトエンジニアリング
      • DifyでJSONスキーマ出力を使用する方法
    • FAQ
      • ローカルデプロイに関するFAQ
      • LLM設定と使用に関するFAQ
      • プラグイン
  • ポリシー
    • オープンソースライセンス
    • ユーザ規約
      • 利用規約
      • プライバシーポリシー
      • 合規性レポートの入手方法
Powered by GitBook
On this page
  1. マニュアル
  2. ツール

高度統合ツール

Previousクイック統合ツールNextツールの設定

Last updated 3 months ago

「ツール」は「プラグイン」エコシステムに完全アップグレードされました。詳しい開発手順についてはをご参照ください。以下の内容はアーカイブされています。

高度接続を始める前に、を読んで、Difyのツール接続プロセスについて基本的な理解を持っていることを確認してください。

ツールインターフェース

Toolクラスには、開発者がより複雑なツールを迅速に構築できるようにするための一連のショートカットメソッドが定義されています。

メッセージ応答

Difyはテキスト、リンク、画像、ファイルBLOBなどのさまざまなメッセージタイプをサポートしており、以下のインターフェースを使用して、LLMやユーザーに異なるタイプのメッセージを返すことができます。

注意点:以下のインターフェースの一部のパラメータは、後の章で紹介します。

画像URL

画像のURLを渡すだけで、Difyは自動的に画像をダウンロードしてユーザーに返します。

    def create_image_message(self, image: str, save_as: str = '') -> ToolInvokeMessage:
        """
            画像メッセージを作成

            :param image: 画像のURL
            :return: 画像メッセージ
        """

リンク

リンクを返す必要がある場合は、以下のインターフェースを使用できます。

    def create_link_message(self, link: str, save_as: str = '') -> ToolInvokeMessage:
        """
            リンクメッセージを作成

            :param link: リンクのURL
            :return: リンクメッセージ
        """

テキスト

テキストメッセージを返す必要がある場合は、以下のインターフェースを使用できます。

    def create_text_message(self, text: str, save_as: str = '') -> ToolInvokeMessage:
        """
            テキストメッセージを作成

            :param text: メッセージのテキスト
            :return: テキストメッセージ
        """

ファイルBLOB

画像、音声、動画、PPT、Word、Excelなどのファイルの生データを返す必要がある場合は、以下のインターフェースを使用できます。

  • blob ファイルの生データ、bytesタイプ

  • meta ファイルのメタデータ、ファイルタイプが分かる場合はmime_typeを渡すことが推奨されます。そうでない場合、Difyはデフォルトでoctet/streamを使用します。

    def create_blob_message(self, blob: bytes, meta: dict = None, save_as: str = '') -> ToolInvokeMessage:
        """
            BLOBメッセージを作成

            :param blob: BLOBデータ
            :return: BLOBメッセージ
        """

クイックツール

大規模モデル応用において、以下の2つの一般的なニーズがあります:

  • 長文を事前に要約し、その要約内容をLLMに渡すことで、原文が長すぎてLLMが処理できない問題を防ぐ

  • ツールが取得した内容がリンクである場合、ウェブページ情報をスクレイピングしてからLLMに返す

これらのニーズを迅速に実現するために、以下の2つのクイックツールを提供しています。

テキスト要約ツール

このツールはuser_idと要約する必要があるテキストを入力し、要約されたテキストを返します。Difyは現在のワークスペースのデフォルトモデルを使用して長文を要約します。

    def summary(self, user_id: str, content: str) -> str:
        """
            コンテンツを要約

            :param user_id: ユーザーID
            :param content: コンテンツ
            :return: 要約
        """

ウェブスクレイピングツール

このツールはスクレイピングするウェブページのリンクとユーザーエージェント(任意)を入力し、そのウェブページ情報を含む文字列を返します。user_agentはオプションのパラメータで、ツールを識別するために使用されます。入力しない場合、Difyはデフォルトのuser_agentを使用します。

    def get_url(self, url: str, user_agent: str = None) -> str:
        """
            URLを取得
        """ スクレイピング結果

変数プール

Toolでは、ツールの実行中に生成される変数やファイルなどを保存するための変数プールを導入しています。これらの変数は、ツールの実行中に他のツールによって使用されることがあります。

以下に、DallE3とVectorizer.AIを例に、変数プールの使用方法を紹介します。

  • DallE3はテキストに基づいて画像を生成するツールで、ここではDallE3がカフェのロゴを生成します。

  • Vectorizer.AIは画像をベクター画像に変換するツールで、生成された画像を無限に拡大しても劣化しないようにし、ここではDallE3が生成したPNGアイコンをベクター画像に変換し、デザイナーが実際に使用できるようにします。

DallE3

まず、DallE3を使用して画像を生成し、生成された画像を変数プールに保存します。コードは以下の通りです。

from typing import Any, Dict, List, Union
from core.tools.entities.tool_entities import ToolInvokeMessage
from core.tools.tool.builtin_tool import BuiltinTool

from base64 import b64decode

from openai import OpenAI

class DallE3Tool(BuiltinTool):
    def _invoke(self, 
                user_id: str, 
               tool_Parameters: Dict[str, Any], 
        ) -> Union[ToolInvokeMessage, List[ToolInvokeMessage]]:
        """
            invoke tools
        """
        client = OpenAI(
            api_key=self.runtime.credentials['openai_api_key'],
        )

        # プロンプト
        prompt = tool_Parameters.get('prompt', '')
        if not prompt:
            return self.create_text_message('プロンプトを入力してください')

        # openapi dalle3を呼び出す
        response = client.images.generate(
            prompt=prompt, model='dall-e-3',
            size='1024x1024', n=1, style='vivid', quality='standard',
            response_format='b64_json'
        )

        result = []
        for image in response.data:
            # すべての画像をsave_asパラメータを介して変数プールに保存し、変数名をself.VARIABLE_KEY.IMAGE.valueに設定します。後続の新しい画像が生成される場合、前の画像が上書きされます。
            result.append(self.create_blob_message(blob=b64decode(image.b64_json), 
                                                   meta={ 'mime_type': 'image/png' },
                                                    save_as=self.VARIABLE_KEY.IMAGE.value))

        return result

ここで、self.VARIABLE_KEY.IMAGE.valueを画像の変数名として使用していることに注意してください。開発者のツールが相互に連携できるように、このKEYを定義しました。自由に使用してもよいし、カスタムのKEYを渡しても構いません。

Vectorizer.AI

次に、Vectorizer.AIを使用して、DallE3が生成したPNGアイコンをベクター画像に変換します。ここで定義した関数を確認します。コードは以下の通りです。

from core.tools.tool.builtin_tool import BuiltinTool
from core.tools.entities.tool_entities import ToolInvokeMessage, ToolParameter
from core.tools.errors import ToolProviderCredentialValidationError

from typing import Any, Dict, List, Union
from httpx import post
from base64 import b64decode

class VectorizerTool(BuiltinTool):
    def _invoke(self, user_id: str, tool_Parameters: Dict[str, Any]) \
        -> Union[ToolInvokeMessage, List[ToolInvokeMessage]]:
        """
        ツールを呼び出す。画像変数名はここで渡す必要があるため、変数プールから画像を取得できます。
        """
        
    
    def get_runtime_parameters(self) -> List[ToolParameter]:
        """
        ツールパラメータリストをオーバーライドします。ここでは、変数プールの実際の状況に基づいてパラメータリストを動的に生成し、それに基づいてLLMがフォームを生成できます。
        """
        
    
    def is_tool_available(self) -> bool:
        """
        現在のツールが使用可能かどうかを確認します。変数プールに画像がない場合、LLMがこのツールを表示する必要はありません。ここでFalseを返します。
        """     

次に、これらの3つの関数を実装します。

from core.tools.tool.builtin_tool import BuiltinTool
from core.tools.entities.tool_entities import ToolInvokeMessage, ToolParameter
from core.tools.errors import ToolProviderCredentialValidationError

from typing import Any, Dict, List, Union
from httpx import post
from base64 import b64decode

class VectorizerTool(BuiltinTool):
    def _invoke(self, user_id: str, tool_Parameters: Dict[str, Any]) \
        -> Union[ToolInvokeMessage, List[ToolInvokeMessage]]:
        """
            ツールを呼び出す
        """
        api_key_name = self.runtime.credentials.get('api_key_name', None)
        api_key_value = self.runtime.credentials.get('api_key_value', None)

        if not api_key_name or not api_key_value:
            raise ToolProviderCredentialValidationError('APIキー名と値を入力してください')

        # 画像IDを取得、画像IDの定義はget_runtime_parametersで確認できます。
        image_id = tool_Parameters.get('image_id', '')
        if not image_id:
            return self.create_text_message('画像IDを入力してください')

        # 変数プールから以前のDallEが生成した画像を取得
        image_binary = self.get_variable_file(self.VARIABLE_KEY.IMAGE)
        if not image_binary:
            return self.create_text_message('画像が見つかりません。まずユーザーに画像を生成するよう依頼してください。')

        # ベクター画像を生成
        response = post(
            'https://vectorizer.ai/api/v1/vectorize',
            files={ 'image': image_binary },
            data={ 'mode': 'test' },
            auth=(api_key_name, api_key_value), 
            timeout=30
        )

        if response.status_code != 200:
            raise Exception(response.text)
        
        return [
            self.create_text_message('ベクター化されたSVGが画像として保存されました。'),
            self.create_blob_message(blob=response.content,
                                    meta={'mime_type': 'image/svg+xml'})
        ]
    
    def get_runtime_parameters(self) -> List[ToolParameter]:
        """
        実行時パラメータをオーバーライド
        """
        # ここでは、ツールパラメータリストをオーバーライドし、image_idを定義し、そのオプションリストを現在の変数プール内のすべての画像に設定しました。ここでの設定はyamlの設定と一致しています。
        return [
            ToolParameter.get_simple_instance(
                name='image_id',
                llm_description=f'ベクター化する画像ID。画像IDは{[i.name for i in self.list_default_image_variables()]}の中から指定してください。',
                type=ToolParameter.ToolParameterType.SELECT,
                required=True,
                options=[i.name for i in self.list_default_image_variables()]
            )
        ]
    
    def is_tool_available(self) -> bool:
        # 変数プールに画像がある場合のみ、LLMがこのツールを使用する必要があります。
        return len(self.list_default_image_variables()) > 0

ここで注意すべきは、実際にはimage_idを使用していないことです。このツールを呼び出すときに、デフォルトの変数プールに必ず画像があると仮定しているため、直接image_binary = self.get_variable_file(self.VARIABLEを使用しています。 mage_id、私たちはこのツールを呼び出す際には必ず変数プールに画像が存在すると仮定しましたので、画像バイナリ = self.get_variable_file(self.変数キー.画像)を直接使用して画像を取得しました。モデルの能力が弱い場合、開発者の皆さんもこの方法を用いることをお勧めします。これにより、モデルが誤ったパラメータを渡すことを防ぎ、エラー許容率を効果的に向上させることができます。

プラグイン開発
クイック接続