fix: maximum context length limit

pull/580/head
Administrator 2023-05-31 02:33:55 +08:00
rodzic f39279cef9
commit cb87be826e
1 zmienionych plików z 33 dodań i 16 usunięć

Wyświetl plik

@ -358,13 +358,40 @@ export class ChatGPTAPI {
this._apiOrg = apiOrg
}
protected _formatPrompt(messages: string[]) {
const userLabel = USER_LABEL_DEFAULT;
const assistantLabel = ASSISTANT_LABEL_DEFAULT;
return messages.reduce((prompt2, message) => {
switch (message.role) {
case "system":
return prompt2.concat([`Instructions:
${message.content}`]);
case "user":
return prompt2.concat([`${userLabel}:
${message.content}`]);
default:
return prompt2.concat([`${assistantLabel}:
${message.content}`]);
}
}, []).join("\n\n");
}
protected async _recursivePruning(messages: string[], maxNumTokens: number){
const prompt = this._formatPrompt(messages)
const currentTokens = await this._getTokenCount(prompt);
if (currentTokens <= maxNumTokens) {
return messages;
}
messages.splice(1, 1);
return this.reduceMessages(messages, maxNumTokens);
}
protected async _buildMessages(text: string, opts: types.SendMessageOptions) {
const { systemMessage = this._systemMessage } = opts
let { parentMessageId } = opts
const userLabel = USER_LABEL_DEFAULT
const assistantLabel = ASSISTANT_LABEL_DEFAULT
const maxNumTokens = this._maxModelTokens - this._maxResponseTokens
let messages: types.openai.ChatCompletionRequestMessage[] = []
@ -388,23 +415,13 @@ export class ChatGPTAPI {
let numTokens = 0
do {
const prompt = nextMessages
.reduce((prompt, message) => {
switch (message.role) {
case 'system':
return prompt.concat([`Instructions:\n${message.content}`])
case 'user':
return prompt.concat([`${userLabel}:\n${message.content}`])
default:
return prompt.concat([`${assistantLabel}:\n${message.content}`])
}
}, [] as string[])
.join('\n\n')
const prompt = this._formatPrompt(nextMessages)
const nextNumTokensEstimate = await this._getTokenCount(prompt)
const isValidPrompt = nextNumTokensEstimate <= maxNumTokens
if (prompt && !isValidPrompt) {
// If the limit is exceeded, it is necessary to handle the historical context, otherwise it will cause a 429 maximum context limit error
messages = await this._recursivePruning(messages, maxNumTokens)
break
}