ChatGPTのように返答するSlackBotを作った話
この記事は?
はやりのChatGPTのように返答するSlackBotを作成してみました!サンプルコードも載せているのでよかったら参考にしてください〜
ChatGPTのAPI、OpenAI-API
まずChatGPTのように返答する方法ですが、今回openAI APIを利用します
下図はopenAPIの利用画面ですが、ご覧のようにいくつかのAPIが存在します
今回はこの中でもText completionというライブラリを利用していきます。
APIの作成
それではここからコードを見ていきましょう
今回はCloudFunctionで作成しました
クソコードですが積極的に晒していきたいので、こちらに記載してます !
まずSlackから来たリクエストを処理します
Slackのコマンドでは送信するリクエストが決まっています。
今回この中からtext
と response_url
の2つを使います。
token=gIkuvaNzQIHg97ATvDxqgjtO
&team_id=T0001
&team_domain=example
&enterprise_id=E0001
&enterprise_name=Globular%20Construct%20Inc
&channel_id=C2147483705
&channel_name=test
&user_id=U2147483697
&user_name=Steve
&command=/weather
&text=94070
&response_url=https://hooks.slack.com/commands/1234/5678
&trigger_id=13345224609.738474920.8088930838d88f008e0
&api_app_id=A123456
コード上ではまずresponse_url とtextを取得しています。
またテキストの結果を待たずに200okを返しています。こうしないとSlackcommandが応答を待ってタイムアウトしまうためです。
exports.chatgpt = (req, res) => {
console.log('req:', req.body);
const message = req.body.text || "";
const response_url = req.body.response_url;
_requestCompletion(res, message,response_url);
res.status(200).send("");
};
続いてopenaiのAPIを叩きます。
Slackからもらったtextを叩いているだけです。
openaiのAPI_KEYを入れるだけで動きます
function _requestCompletion(res, message, response_url) {
const apiKey = %%%OPENAI_APIKEY%%%
const apiUrl = 'https://api.openai.com/v1/completions';
const prompt = message;
let headers = {
'Authorization':'Bearer '+ apiKey,
'Content-type': 'application/json',
};
const body = {
'model': 'text-davinci-003',
'max_tokens' : 1024,
'temperature' : 0.9,
'prompt': prompt
};
const options = {
method: 'POST',
body: JSON.stringify(body),
headers: headers,
}
fetch(apiUrl, options)
.then(res => res.json())
.then((result) => {
let resultText = "";
result.choices.forEach(element => {
resultText += element.text
});
console.log('Success:', resultText);
_slackMessage(response_url,resultText)
})
.catch((error) => {
console.error('Error:', error);
});
}
最後にSlackAPIです
ここもリクエストでもらった response_url
に対して応答返しています。これでBotができています。
async function _slackMessage(url,text) {
let headers = {
'Content-type': 'application/json',
};
const body = {
"text": text,
"response_type": "in_channel",
};
const options = {
method: 'POST',
body: JSON.stringify(body),
headers: headers,
}
fetch(url, options)
.then(res => res.json())
.then((result) => {
console.log('Success:', result);
})
.catch((error) => {
console.error('Error:', error);
});
}
Slackコマンドの作成
こちらは手順を載せようとしたのですが、特質すべき点だけ書かせていただきます!
迷うことはないのですが、APIは下記の画面から入力します。
また、SlackBot作成にありがちな、パーミッションの設定は response_url
を利用してるので今回不要です。
権限毎回覚えられないので楽ちんでいいですね!
実践
おおおおおお!すごい!!
と思うじゃないですか実は間違えてました。まぁこれを参考に開発できたので良いのですが、
質問が悪いのかうまく返ってこないことが多々あります
全く知らないランチ提案してくる!と思ったらそんな店ありませんでした笑笑
しかしコードレビューしてなど、具体的にいうと結構ちゃんと返してくれます!
まとめ
以上でChatGPTのように返答するSlackBotができました
今後の気が向いたらやることを最後に書きます。
まずは対話式にしたいです。
ChatGPT利用の方は分かると思いますが、ChatGPTは対話式なのでセッションでいい感じに察してくれるんですよね。渋谷にいますと言った後にランチだったら渋谷のランチを提案してくれるような感じ。(むずそう)
あとはOpenAIの他のAPIも触ってみたいなと思いました
細かく触っていないのでわからないですが色々できそうですよね〜
再掲ですが今回利用したコードをおいておきます!参考になるかどうかわかりませんが見てもらえたら嬉しいです!
Discussion