Simplify the ChatCompletion calling loop

removes duplicate code in while loop
This commit is contained in:
Wroclaw 2023-07-30 01:32:09 +02:00
parent 56869a2dc2
commit 124ac5cbf0

View file

@ -1,5 +1,5 @@
import DiscordApi, { GuildTextBasedChannel } from "discord.js";
import { ChatCompletionRequestMessage } from "openai";
import { ChatCompletionRequestMessage, ChatCompletionResponseMessage } from "openai";
import { database, openai } from "./index";
import Moderation from "./moderation";
@ -241,27 +241,10 @@ async function executeFromQueue(channel: string) {
}
OpenAImessages = toOpenAIMessages(messages);
let answer = await openai.createChatCompletion({
...config.chatCompletionConfig,
messages: OpenAImessages,
// FIXME: don't use new instance of FunctionManager
functions: new FunctionManager().getFunctions(),
});
let generatedMessage: ChatCompletionResponseMessage | undefined = undefined;
let answer: Awaited<ReturnType<typeof openai.createChatCompletion>>;
logUsedTokens(answer, message, ++functionRanCounter);
let generatedMessage = answer.data.choices[0].message;
if (!generatedMessage) throw new Error("empty message received");
// handle function calls
while (generatedMessage.function_call) {
OpenAImessages.push(generatedMessage);
OpenAImessages.push({
role: "function",
name: generatedMessage.function_call.name,
// FIXME: don't use new instance of FunctionManager
content: new FunctionManager().handleFunction(generatedMessage.function_call),
});
do {
answer = await openai.createChatCompletion({
...config.chatCompletionConfig,
messages: OpenAImessages,
@ -272,8 +255,19 @@ async function executeFromQueue(channel: string) {
logUsedTokens(answer, message, ++functionRanCounter);
generatedMessage = answer.data.choices[0].message;
if (!generatedMessage) throw new Error("empty message received");
}
if (!generatedMessage) throw new Error("Empty message received");
// handle function calls
if (generatedMessage.function_call) {
OpenAImessages.push(generatedMessage);
OpenAImessages.push({
role: "function",
name: generatedMessage.function_call.name,
// FIXME: don't use new instance of FunctionManager
content: new FunctionManager().handleFunction(generatedMessage.function_call),
});
}
} while (generatedMessage.function_call);
const answerContent = answer.data.choices[0].message?.content;