Limit sent chat to 2048 tokens.

This also solves the issue where we would request more tokens,
than the model is capable of (over 4096)
This commit is contained in:
Wroclaw 2023-03-19 04:15:08 +01:00
parent aafefc3ad0
commit 2a38ae4a95
4 changed files with 30 additions and 12 deletions

View file

@ -3,6 +3,7 @@ import { Collection, Message as DiscordMessage } from "discord.js";
import FoldToAscii from "fold-to-ascii";
import config from "./config.json";
import countTokens from "./tokenCounter";
/**
* Formats the message to use as a message content in OpenAI api
@ -74,24 +75,29 @@ function getAuthorUsername(message: DiscordMessage): string {
}
/**
* Converts the Collection of Discord Messages to array of OpenAI Messages
* Converts the Collection of Discord Messages to array of OpenAI Messages to send
* @param messages the collection to convert
* @returns the converted messages
*/
export default function toOpenAIMessages(messages: Collection<string, DiscordMessage>): OpenAIMessage[] {
const rvalue: OpenAIMessage[] = [];
let tokenCount = 0;
messages.sort((a, b) => b.createdTimestamp - a.createdTimestamp);
for (const message of messages.values()) {
const content = formatMessage(message);
// FIXME: tokens are not being counted properly (it's lower than it is) but it's enough for me for now.
tokenCount += countTokens(content);
if (tokenCount > 2048) break;
rvalue.push({
role: message.author.id == message.client.user.id ? "assistant" : "user",
content: content,
name: getAuthorUsername(message),
});
}
rvalue.push({ role: "system", content: config.systemPrompt});
messages
.sort((a, b) => a.createdTimestamp - b.createdTimestamp)
.each(message => {
rvalue.push({
role: message.author.id == message.client.user.id ? "assistant" : "user",
content: formatMessage(message),
name: getAuthorUsername(message),
});
});
return rvalue;
return rvalue.reverse();
}

5
src/tokenCounter.ts Normal file
View file

@ -0,0 +1,5 @@
import { encode } from "gpt-3-encoder";
export default function countTokens(text: string): number {
return encode(text).length;
}