progressive-chatgpt-bot
Version:
A progressive ChatGPT feishu bot, made to assist my girlfriend's work.
56 lines • 2.42 kB
JavaScript
import { replyCard, editCard, reply, buildProgressiveCard } from './lark';
import { OpenAIMessageDB } from './aircode';
import { throttle } from './utils';
export async function handleByOpenAI(logger, larkClient, setting, messageId, content) {
logger.debug(`content:${content}`);
logger.debug(`messageId:${messageId}`);
logger.debug(`apiKey:${setting.openaiApiKey}`);
const { ChatGPTAPI } = await import('chatgpt');
logger.debug('ChatGPTAPI', ChatGPTAPI);
const api = new ChatGPTAPI({
apiKey: setting.openaiApiKey,
debug: true,
});
let pendingRequest;
let progressMessageId;
const onProgress = throttle(async (partialResponse) => {
var _a;
logger.debug('partialResponse', partialResponse);
if (pendingRequest) {
const replyResponse = await pendingRequest;
if (!progressMessageId) {
progressMessageId = (_a = replyResponse === null || replyResponse === void 0 ? void 0 : replyResponse.data) === null || _a === void 0 ? void 0 : _a.message_id;
}
}
if (!progressMessageId) {
pendingRequest = replyCard(larkClient, messageId, buildProgressiveCard(partialResponse.text));
}
else {
pendingRequest = editCard(larkClient, progressMessageId, buildProgressiveCard(partialResponse.text));
}
await pendingRequest;
}, 2000);
try {
logger.debug('sendMessage start');
const lastMessage = await OpenAIMessageDB.where().findOne();
logger.debug('lastMessage', lastMessage);
const res = await api.sendMessage(content, {
onProgress,
parentMessageId: lastMessage === null || lastMessage === void 0 ? void 0 : lastMessage.pid,
conversationId: lastMessage === null || lastMessage === void 0 ? void 0 : lastMessage.cid,
});
if (lastMessage) {
await OpenAIMessageDB.delete([lastMessage]);
}
await OpenAIMessageDB.save({ pid: res.id, cid: res.conversationId });
logger.debug('res.text', res.text);
// do not send message when it has been processed under `onProgress` callback
if (!progressMessageId) {
await reply(larkClient, messageId, res.text);
}
}
catch (e) {
await reply(larkClient, messageId, `failed: ${e}`);
}
}
//# sourceMappingURL=openai.js.map