ChatGPTのAPIとチャットワーク繋げてみた
「最近流行りのChatGPTとチャットワークとの連携できないですか?」と社内要望があり、丁度無料分のクレジットがあるタイミングだったので、なんとかしてみた。
導入結果
まずは出来上がりを。
社内エンジニアに公開したところ、色々遊んでくれました。
私たちツンデレっていう謎ワード。色々しゃべってくれて楽しい!
ってところで実際こういうことしたい方は更に下の方見ていってくれれば。
使うもの
- ChatGPT(厳密にはOpenAI)のAPI
- チャットワーク
- GAS(GoogleAppsScript)
こんだけ。
設計
設計はこんな感じ。
チャットワーク側のトリガとなるものなんかあったよな…と思ってましたが、webhookがありました。よかった。
指定のルームIDの窓における発言をトリガとしてGAS実行させた。
方法
チャットワークのAPIトークン発行
まずはチャットワーク側から。
これはチャットワーク側の説明みてもらったほうが早いので割愛。以下参照いただければ。
チャットワーク APIトークンを発行する
これは後で使うのでメモ。
OpenAIアカウント作成
キー発行にはChatAPT開発元のOpenAIにサインアップする必要あり。
以下のURLから登録をば。
OpenAI APIキー発行
作成したら以下のURLからログイン。
右上のメニューから「View API keys」を選択。
API keysのページに行くので、そこで「Create new secret key」を押すとキーが発行される。
※このキーは一度しか表示されないのでちゃんとメモっとく必要あり
GAS作成
GASはGoogleのアカウントを持ってれば使える。
スクリプト作成
こちらから新しいスクリプトを作成。
ライブラリの追加
「チャットワークAPIそのまま叩く」でもいいですが、今回はChatWorkClient使わせてもらう。
ライブラリの「+」ボタン →ライブラリの追加 と進み、
スクリプトID:1nf253qsOnZ-RcdcFu1Y2v4pGwTuuDxN5EbuvKEZprBWg764tjwA5fLav
といれて検索を押すと、ChatworkClientが見つかるのでそれを追加。
スクリプトの中身作成
実際にそのスクリプトの中身を作成。
{XXXXX}ってとこはチャットワークのAPIトークンだったりだとかOpenAIAPIキーに置き換えてもらえればOK。
チャットワークのwebhook前に送信テストしたければ、messageとroomIdを直接指定してあげればOK。
function doPost(e) {
// チャットワークのwebhookからの情報取得
var data = JSON.parse(e.postData.contents);
var message = data.webhook_event.body;
var roomId = data.webhook_event.room_id;
// chatGPT宛かチェック
if(message.indexOf("@chatgpt")){
return;
}
// ChatGPTへリクエスト
var gptMsg = requestChatCompletion(message);
// チャットワークへ送信
sendChatworkMessage(roomId,gptMsg);
}
/**
* チャットワークへのメッセージ送信
*/
function sendChatworkMessage(room_id,message) {
//Chatwork API Tokenを定数として定義
const token = '{チャットワークのAPIトークン}';
// ChatworkAPIクライアント作成
const client = ChatWorkClient.factory({token: token});
//ChatworkAPIクライアントからメッセージ投稿
client.sendMessage({
room_id: room_id,
body: "[info][title]チャットGPTからの返信[/title]"+ message + "[/info]"
});
}
/**
* ChatGPT APIへのリクエスト
*/
function requestChatCompletion(message) {
//スクリプトプロパティに設定したOpenAIのAPIキーを取得
const apiKey = '{OpenAI APIキー}';
//ChatGPTのAPIのエンドポイントを設定
const apiUrl = 'https://api.openai.com/v1/chat/completions';
//ChatGPTに投げるメッセージを定義(ユーザーロールの投稿文のみ)
const messages = [{'role': 'user', 'content': message}];
//OpenAIのAPIリクエストに必要なヘッダー情報を設定
const headers = {
'Authorization':'Bearer '+ apiKey,
'Content-type': 'application/json',
'X-Slack-No-Retry': 1
};
//ChatGPTモデルやトークン上限、プロンプトをオプションに設定
const options = {
'muteHttpExceptions' : true,
'headers': headers,
'method': 'POST',
'payload': JSON.stringify({
'model': 'gpt-3.5-turbo',
'max_tokens' : 1024,
'temperature' : 0.9,
'messages': messages})
};
try{
//OpenAIのChatGPTにAPIリクエストを送り、結果を変数に格納
const response = JSON.parse(UrlFetchApp.fetch(apiUrl, options).getContentText());
// エラーチェック
if(Object.keys(response).indexOf('error') !== -1){
return "エラーメッセージ:" + response.error.message;
}
//ChatGPTのAPIレスポンスをログ出力
console.log(response);
console.log(response.choices[0].message.content);
return response.choices[0].message.content;
}catch(e) {
return "OpenAIのAPIでエラー"
}
}
スクリプトのデプロイ
GASのコード画面右上にデプロイボタンがあるので、そこから「新しいデプロイ」を選択。
- 種類の選択:ウェブアプリ
- 設定
- 説明:お好きな説明文を
- 次のユーザーとして実行:自分
- アクセスできるユーザー:全員
とする。
この設定にしてるのは、実際に実行するのがチャットワークのwebhookからになるから。
デプロイが完了するとこういうポップアップがでるので、ウェブアプリのURLをコピってメモ。
チャットワークのwebhook設定
これが最後の工程。
チャットワークにwebhookを追加する。
まずは右上のところからサービス連携を選択。
webhookのところから新規作成。
以下のように設定。
- Webhook名:なんでもOK
- WebhookURL:さっきメモったGASデプロイ時のウェブアプリのURL
- イベント:ルームイベント選択、メッセージ作成にチェック、ルームID指定
これで一通り設定完了。
実行してみる
指定したチャットの窓にて頭に「@chatgpt」をつけて発言。
こんな感じに返ってきてくれます。
注意点
無料タイミングじゃないと普通にお金かかるので注意!(それでも安いけど)
無料枠超えたら普通に料金かかるので、使うかどうかはご相談の上で。
別垢を無料じゃないタイミングでとってしまって
You exceeded your current quota, please check your plan and billing details.
割当分超えてるから課金請求部分チェックして!ってエラーでた。悲しみ。
実際やってみて
AI系がかなりいろいろでてきて、色んなところで連携できたら楽しみでもあり恐くもあり。
とりあえず触ってってAIとも仲良くしていきましょい。
Discussion