DifyからSupabaseを使ってみる - ①プラグイン編

こんにちは!

前回、BaaSのデータベースプラットフォームSupabaseについて紹介しました。標準で備わっているREST APIを利用してHTTPリクエストでテーブルへのアクセスが出来るところまでをやってみましたが、今回はノーコードのAIワークフローツールDifyからSupabaseにアクセスする方法などについて書いてみたいと思います。

Difyからのアクセス方法

DifyからSupabaseにアクセスする方法はいくつかあります。

  • Difyの公式マーケットプレイスで公開されているSupabaseプラグインを使用する方法
  • HTTPノードでREST APIを叩く方法
  • 汎用のデータベースクライアントプラグインを使用する方法

それぞれ順に試してみましょう。

Dify公式のsupabaseプラグイン

まずはノーコードで利用可能なsupabaseのプラグインを試してみます。

インストール

Dify の ツール からマーケットプレイスを開き、「supabase」で検索するとプラグインが出てきますのでインストールします。

プラグインをインストールしたらSupabaseの設定を開きます。ここでAPIキー認証の設定を行います。(設定はワークフロー作成時のエディター内からでも可能です)

  • 認証名: この認証の任意の名前
  • Supabase URL: エンドポイントのURL。https://[プロジェクトID].supabase.co の形式。SupabaseのData API項目内で確認出来ます。
  • Supabaseキー: Publishable keyのAPI KEY。SupabaseのAPI Keys項目内で確認出来ます。

ワークフローサンプル(行を作成)

新しいワークフローを作成し、ユーザー入力ノードでレコードに挿入するためのデータ入力を用意します。

titleとmessageの入力をそれぞれStringの短文、段落、で用意しました。

次に「+」を押してツールからSupabaseのノード「行を作成」を追加します。

テーブル名に「messages」と設定し、行データの項目には挿入したいデータをJSON形式で記述します。

{"title": "[ユーザー入力/title]", "message": "[ユーザー入力/message]"}

ユーザー入力ノードで入力させた値を挿入したいので、対象カラムをJSONのキーに指定し、値にはノードの出力を指定します(青色の部分)。

最後に出力ノードを追加します。出力変数は何でも良いです。とりあえず「行を作成」ノードのjson出力にしておきます。

これでワークフローサンプルが完成しました。

テスト実行

作成したワークフローを「テスト実行」から実行します。

titleとmessageに適当な文字列を入力し「実行開始」をクリック

各ノードが順に実行されて正常に完了しました。結果の出力は「行を作成」ノードのjson出力が表示されています。

SupabaseのTable Editorでも確認してみます。

テーブルにレコードが追加されていることが確認できました。

行データの注意点

このように比較的簡単にノーコードでデータベースにデータを登録することが出来ますが、重要な注意点があります。行データに指定するJSONに変数などを入れたい場合、適切なエスケープがされていないとJSONが不正な文字列となってしまいエラーが発生します。場合によってはおかしな解釈がされてデータの混入やセキュリティリスクに繋がったりします。

解決策の1つとしては、テンプレートノードを使ってJSONを事前に組み立てておく方法などがあります。

「行を作成」ノードの前にテンプレートノードを追加します。

入力変数に、ユーザー入力のtitleとmessageをセットしたものを用意します。ここではarg1とarg2を用意しました。テンプレートのコードは、JSONで行データを記述し、値に相当する部分に入力変数を指定します。この時tojsonフィルタを合わせて指定しておくことで適切なエスケープが行われた状態になります。

「行を作成」ノードでは、行データのところをテンプレートノードのoutput出力を指定します。

これで、入力文字によってJSONが壊れることなく正しいJSONを渡すことが出来るようになりました。せっかくノーコードなのにこういうコード的なひと手間が入ってしまうのがちょっと残念ですがプラグインの仕様なので仕方ないですね。

ワークフローサンプル(行を取得)

次に「行を取得」ノードを試してみます。先ほどのワークフローと同様にユーザー入力のノードから作成します。

入力項目としてtitleをStringで用意します。

続いて「+」を押し、Supabaseツールの「行を取得」ノードを追加します。

テーブル名にmessagesを指定し、フィルターに条件を記述します

title=[ユーザー入力/title]

単純にtitleが入力文字列と一致するものを検索するフィルター記述です。

最後に、出力ノードを追加してワークフローを完成させます。

テスト実行

作成したワークフローを「テスト実行」から実行します。

titleに「Dify投稿テスト1」と入力し「実行開始」をクリックします。

titleが「Dify投稿テスト1」に該当するレコードが返されていることが確認できました。

「行を削除」「行を更新」

ほかに「行を削除」ノードと「行を更新」ノードがありますが、使用方法は同様です。

「行を削除」ノードでは削除条件をフィルタに指定します。
「行を更新」ノードでは更新対象の条件をフィルタに指定し、書き込みたい内容を行データにJSONで記述します。

Supabaseプラグインの残念なところ

先ほど「行を取得」ではtitleが入力文字列に一致するフィルタ条件を記述しました。テキストの検索ならLIKE検索も行いたいところですが、色々試した結果このプラグインでは一致のフィルタしか指定できそうにありませんでした。

フィルタ条件に「カラム=値」と記述すると、Supabase側に伝わる際に「カラム=eq.値」というように固定で自動変換されて渡されているようででした。そのためPostgRESTでのLIKEのフィルタ指定である「カラム=like.*値*」と記述してもそのまま伝わらず「カラム=eq.like.*値*」と自動変換されてしまい機能しません。うーん、これはかなり残念。今後の機能改善に期待したいところです。

現在は特定のIDのデータを取ってくる。といった用途くらいなら使える感じでしょうか。

それかINSERTは比較的問題なく手軽に行えるのでデータを登録するだけの用途なら良いかもしれませんね。

次回

今回はSupabaseプラグインの使い方について解説しました。Supabaseプラグインではフィルタに一致条件しか記述できなかったので、次回はそのあたりを改善すべくHTTPノードを使用してREST APIを直接叩く方法について解説したいと思います。