見出し画像

【テンプレ配布】Discord AI BOTで「○○して」という指示で何でも操作する(Dify x Gemini x Discordpy)

割引あり

こんにちは、Rcatです。
今回は前に紹介した、Difyの高機能質問分岐と、DiscordでGeminiとお話しする記事を合体させたような内容です。
具体的にはAIを搭載して指示を理解して行動してくれるDiscord BOTの作成です。

とりあえずどんなことをするかは概要をご覧ください

参照記事はこちら

BOTの作り方


概要

まず動作で確認

とりあえず実際の動作がこちら
前回の記事で"アレOサ XXして的なのをやりたい"と書きましたが、それを実現した形です。
私の場合、自作のLEDライトはWi-Fi経由で操作できます。なので、Discordを使って明るさ変更の指示を出せるようにしてみました。
以下のような形で、何をするのかどのくらいの明るさにするのかといったことを言葉で説明するだけでコマンドに変換し実行してくれます。
実際にBOTが応答した瞬間、ライトがついたり消えたりします。

どうでもいいことを発言すると認識失敗になります。

具体的に何ができるようになる?

このボットを使ってできることは、ボットが稼働しているパソコン内での操作およびネットワークを通じたアクセスです。

具体例1 LEDライトの操作(動画で実演したもの)

ハードウェアを用意することで、ネットワークを通じたアクセスを行い現実に動作を起こすこともできます
例えば私の自作LEDライトは自宅のwi-fiに接続されており、特定のURLを叩くことで明るさを変更できるようになっています。

以下が本来の操作画面です。分かりやすいように右側にはデバッグコントロールを出しています。
真ん中のつまみを回すことで明るさを調整できます。また、2色のLEDを搭載しているので、上側のボタンで色味を入れ替えることができます。
右下のデバッグコンソールを確認すると、操作を行った際のURLが書かれています。
具体的には、"http://192.168.0.23/ledcontrol?v=10"と"http://192.168.0.23/ledcontrol?c=0"のことです。
v=で明るさを設定し、c=で色味を設定します。
のURLへのアクセスをBOTから行うことで、現実の照明の操作を行います。

このURLアクセスの詳しい仕組みを知りたい方はだいぶ前ですが、以下の動画で解説しています。
ラジコンの部分がLEDライトに置き換わっただけです。

具体例2 PCの電源を入れる

BOT本体は、低消費電力なミニPCで24H動作していますが、メインのPCは別にあります。
そして、パソコンが2台あれば1台のパソコンから特定の信号を送ることで、もう1台のパソコンの電源を遠隔で入れることができます(別にパソコンでなくてもネットワークに信号を流せれば何でもいい)。

この操作を行う場合はPythonから別のプログラムを起動したり、直接BOTの内部で動作を行ったりします。
信号を送ること自体は簡単なので、botの中に組み込んでいます。

実際の動作がこちら

遠隔で電源を入れる仕組みと詳しいやり方はこちらにまとめました。

具体例3 プログラムの実行(机上)

実はこれが一番手が出しやすかったりするんですが、プログラムの起動ですね。基本的にはBOTと同じパソコン内で何かしらのプログラムを起動するという意味です。
例えば、以下でゲームサーバーをDiscordのBOTで操作するということをやっていますが、そのボットに今回のAIを組み込めば、言葉でサーバーの操作ができるようになりますね。

テンプレートの配布と使い方

というわけで、このような操作を行うためのBOTを作るテンプレートを用意したので、それの使い方を解説します

事前準備

このBOTはAIを使うのでDifyの用意をしてください。
詳しくはこちら

DiscordのBOTアカウントも必要です。
簡単に作り方を紹介しているので作ってサーバーに招待まで済ませてください。

また、ボットのトークンは以下のファイルに書き込んでおいてください。

導入

ここからは本作の導入手順を解説します。

DifyにBOTをインポート

配布されているデータ内の"ユーザー入力コマンド変換.yml"を読み込んでください。
そしてこのbotのAPIキーをメモしておいてください。
これでDifyの準備は完了です。

APIキーを隠してないのはローカルからでしかアクセスできないからです

設定事項の書き込み

本作はスクリプト内に設定が書き込んであるので、必要な部分を書き換える必要があります

全般設定

ここではbotの一般的な設定を行います。
一番最初にWebサーバーの設定がありますが、これはソケットIOを使用して別のプログラムと連携するためのものです。これは過去作のテンプレートから引き継いでいる機能であり、特に今回は使用しません。

その下のチャンネル設定はコマンドと直接関係ありませんが、本作から新しく導入しました。
特定のチャンネルからのメッセージであることを識別したり、指定したチャンネルに発言したりしたい場合、それらのチャンネルがない場合エラーになります。それらを防ぐために、ここでチャンネルの名前を定義してしまいます。もしもなかった場合、自動的に作成できる仕組みです。
また、ボット稼働時この辞書にチャンネルのオブジェクトが代入されるので、そのままこの辞書を使って発言などが可能です。

AIの設定
ここでDifyの設定を行います。
稼働しているパソコンのIPアドレスと使用するAPIキーを入れます。同じパソコンでもローカルホストだと反応しないので、明示的にIPアドレスを入れてください。

コマンド定義部

次にコマンドのリストや使い方を設定します。
デフォルトでは終了と再起動に関するコマンドが登録されています。
ここではコマンドの名前と指定された際に、実行する関数、関数を実行するのに必要な引数の名前と値の説明オプションの引数を設定できます。
ここで全てのコマンドを設定しておくことで、AIにコマンド一覧として提供して指示の中からどのコマンドなのか判別してもらいます。

具体的なコマンドの定義

コマンドの定義方法について具体的に解説
全体のコマンドリストは辞書になっており、キーがコマンド名です。
その中も辞書になっており、それがコマンドの詳細です。
コマンドの詳細には、実行する関数とこのコマンドの説明、必須引数と省略可能引数それぞれの名前と値の説明が入っています。

具体的な考え方
例えば冒頭のLEDをつける関数の場合は以下のような形で定義されています。まず説明で”ベッドのLEDを操作します”という説明になっています。
この説明があることで、AIはベッドのLEDをOOしてという指示に対して、この関数を実行すればいいんだなという判定ができます。
また、この関数はただ実行するだけでは意味がなく、どのくらいの明るさでつけるのか?また、色味はどうすればいいのかといった2つの要素があります。ここで使用するのが引数です。
ここでは明るさと色を引数に取ります。できるだけわかりやすい引数の名前とそこに入るべき値と説明を入れます。この情報を元にAIがメッセージから必要な引数を認識して渡してくれるという仕組みです。うまく認識してくれない場合、この辺を工夫しましょう。
今回はどちらが片方だけでも変更ができるように、両方とも省略可能を引数としています。単純に電気をつけるだけであれば、必須引数に入れるべきでしょう。
ちなみにDL限定としている部分はこの一言でコマンドの認識精度が上がることが実験でわかっている内容です。気になる方はぜひ配布を受けてください。

コマンド関数のテンプレート

次に実行する関数です。
先ほどのコマンド一覧の中の"function"キーに該当する部分です。
必ず非同期関数で定義してください。
そして、この関数はメッセージオブジェクトを先頭にとり、その後ろに任意の引数を取ります。メッセージオブジェクトに関しては自動的に渡されます。これはAIにコマンドを投げてきた時のメッセージです。そのメッセージに対して返信したり、同じチャンネルに返したりしやすいように渡されています。
任意の引数については、コマンドで定義した通りの名前で引数を受け取るようにしてください。

例:LED_BedControl関数の定義

例えばLEDの部分を見せてしまうとこのようになっています。
引数は両方とも任意なので、デフォルトの値-1が割り当てられています。
関数の内容はそんなに複雑ではありません。この関数はLEDを操作するために、指定のURLに引数をつけてアクセスするだけです。
ちなみにAIが認識する引数は必ずしも説明通りであるとは限らないので、ある程度エラー検知を入れておくことをおすすめします。今回は明るさの部分は0から100でなければならないですが、どんな値が来てもいいように処理を追加しています。

また、ここで怖いのが数値を引き数に取る場合、数値として渡されるのか、それとも文字として渡されるのかわからないというところです。
例えば、LED操作をしている時、ポットからの応答が以下のようになっていました。強さが違う以外で変化があるんですが、わかるでしょうか?

答えはレベルの後ろの数字が''で囲まれているか否かです。これはAIが気分次第で変えてきます。0の時は数値で20の時は文字で返していますね。
こういった場合に対応できるように、必ず数値に変換する関数を噛ませたり、数値かどうか判定するなど入れておいた方がいいでしょう。

使ってみる

使い方

特に何もしていない初期状態では"command"チャンネルが自動的に作成され、そこに対して発言することで機能します。
この辺を変更したい場合は、テンプレート内のメッセージを受け取った際のイベント関数を修正してください。
なお、Discordのbotに対する基礎知識は前提とします。
分からない場合は冒頭で紹介したDiscordメモをご確認ください。

ダイレクトにコマンドを叩く

障害でAIが利用できない場合に備えて、ダイレクトにコマンドを打つこともできます。

コマンドの構文は次の通りです。
コマンド名 引数1=値 引数2=値…
AIが認識するのと同じフォーマットで入力するだけです。

間違えるとこんな感じで怒られます。

余計な引数をつけても怒られます。

ダイレクトコマンドがわからない時

HELPと大文字で入力するとリファレンスが出力されます。
ちなみに、この時表示されるリファレンスがAIにそのまま渡されているものと同じです。

配布

最後までご覧いただきありがとうございます。
本作の詳細なソースコードや、これを使ったBOTの開発を行いたい場合は、以下で配布しています。

利用規約の上書き

本作はテンプレートとして使うことを目的としています。
そのため、利用規約の禁止行為に存在する"プログラム作品(例:チャットボット)を、サービスとして第三者に提供すること"を本作をベースに作ったチャットボットに限り削除します。※2次配布は禁止継続
ただし、連携する他のサービスで第三者に提供することを禁止している場合があるのでご注意ください。

配布URL

利用規約に同意の上ご利用ください。利用規約はダウンロード画面から確認できます。
本作のダウンロードは別途キーワードが必要です。
キーワードはこのすぐ下の有料区間で開示しています。

https://script.google.com/macros/s/AKfycbxdcr8pnazR7RbjaSICTtaNWfN7h_rjQrKlZ3h9CZpPRFzRILk1OGc8mZqKbF-NXNO9/exec?name=DiscordBOT_AIコマンドテンプレート

下記最新版も同時に公開されます

https://script.google.com/macros/s/AKfycbxdcr8pnazR7RbjaSICTtaNWfN7h_rjQrKlZ3h9CZpPRFzRILk1OGc8mZqKbF-NXNO9/exec?name=DiscordBOT_AIコマンドテンプレート_タイマー付き

ここから先は

101字

期間限定 PayPay支払いすると抽選でお得に!

情報が役に立ったと思えば、僅かでも投げ銭していただけるとありがたいです。