ことの発端はChatGPTすごいという噂をよく聞いていたので使ってみたらすごかった・・
というわけで、社内のチャットツールであるRocketChat(オープンソース)内で同じようなことができれば楽になるなと。
RocketChatについて
※RocketChat最高です!RocketChatは、オープンソースのWebチャットアプリケーションで、企業やコミュニティによる内部チャット、ビデオ会議、音声通話、ドキュメント共有など、多くのコラボレーション機能を提供します。
項目 | 値 |
---|---|
イベントトリガー | メッセージが送信されました |
有効 | オン |
名前 | なんでもOK |
チャンネル | all_public_channels ,all_private_groups, all_direct_messages |
トリガーになる言葉 | @ai |
URLs | URLならなんでもOK。Scriptの方で上書きします |
投稿ユーザー | ai ※事前にai ユーザーを作成してください。 |
エイリアス (オプション) | OpenAI |
スクリプトを有効にする | オン |
設定できましたら、保存してください。/* exported Script */ /* globals console, _, s */ /** Global Helpers * * console - A normal console instance * _ - An underscore instance * s - An underscore string instance */ class Script { /** * @params {object} request */ messageId; userName; authToken; aiUserName; apiKey; rocketChatUrl; constructor(){ this.messageId=""; this.userName = ""; this.authToken = ""; this.aiUserName = "ai"; this.apiKey = "ここに先程取得したAPIキーをセット"; this.rocketChatUrl = "現在利用しているRocketchatのURLアドレスを入力 https://〇〇〇〇"; } prepare_outgoing_request({ request }) { let d = new Date(); console.log("---- openAI START ----- "+d.toString()); let match; if(request.data.tmid){ this.messageId = request.data.tmid; }else{ this.messageId = request.data.message_id; } this.userName = request.data.user_name; this.authToken = request.data.token; let pat = new RegExp("^\@"+this.aiUserName); match = request.data.text.match(pat); // リクエストURLの設定 request.url = "https://api.openai.com/v1/chat/completions"; request.headers = { 'Authorization': 'Bearer '+this.apiKey, 'Content-Type': 'application/json' }; // データの成形 let userInput = request.data.text; let pat2 = new RegExp("\@"+this.aiUserName,"g"); let mymessage = userInput.replace(pat2,'').replace(/ /g,''); let messages = []; //スレッドのデータが有ればすべて取得 if(request.data.tmid){ let resultMessages; let loginResult; try { //rocketChatAPIにログイン loginResult = HTTP("POST", this.rocketChatUrl+"/api/v1/login?",{ data:{ "user":"****", "password":"****" } }); let authParam = JSON.parse(loginResult.result.content); if(authParam.data.authToken) { let authToken = authParam.data.authToken; //rocketChatAPIからスレッドのメッセージをすべて取得 let rootMessages = HTTP("GET", this.rocketChatUrl + "/api/v1/chat.getMessage?msgId=" + request.data.tmid, { headers: { "X-Auth-Token": authToken, "X-User-Id": authParam.data.userId, "Content-type": "application/json" }, }); if(rootMessages) { let rootMessageData = JSON.parse(rootMessages.result.content); messages.push({ "role": "user", "content": rootMessageData.message.msg }); } resultMessages = HTTP("GET", this.rocketChatUrl + "/api/v1/chat.getThreadMessages?tmid=" + request.data.tmid + "&tlm=2019-04-08T14:40:27.724Z", { headers: { "X-Auth-Token": authToken, "X-User-Id": authParam.data.userId, "Content-type": "application/json" }, }); if (resultMessages.result.content) { let messagesData = JSON.parse(resultMessages.result.content); for (var prop in messagesData.messages) { let role = "user"; if (messagesData.messages[prop].u.username == "ai") { role = "assistant"; } //いらない文字を削除 let mes = messagesData.messages[prop].msg; mes = mes.replace(/\@(.*?)\s/, " "); messages.push({ "role": role, "content": mes }); } } } }catch(e){ console.log(e); } }else{ //スレッドじゃない場合(はじめの投稿の場合は自分のメッセージをセット) messages.push({ "role":"user", "content":mymessage }); } let data = { "model": "gpt-3.5-turbo", "messages":messages }; if (match) { console.log(data); return { url: request.url, headers: request.headers, method: 'POST', data: data }; } } /** * @params {object} request, response */ process_outgoing_response({ request, response }) { // パースが必要ない場合 let jsonData = JSON.parse(response.content); if(jsonData && jsonData.choices){ return { content: { tmid:this.messageId, text: "@"+this.userName+" "+jsonData.choices[0].message.content, parseUrls: false } }; } } }
無料相談・お問い合わせ Web制作・システム開発に関する
ご相談はこちらよりご連絡ください。
お客様のビジネスの成長と成功を支えるパートナーとして、
どんなご相談でもお待ちしております。お気軽にお問い合わせください。