ことの発端は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制作・システム開発に関する
ご相談はこちらよりご連絡ください。
お客様のビジネスの成長と成功を支えるパートナーとして、
どんなご相談でもお待ちしております。お気軽にお問い合わせください。