kopia lustrzana https://github.com/transitive-bullshit/chatgpt-api
fix: maximum context length limit
rodzic
f39279cef9
commit
cb87be826e
|
@ -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
|
||||
}
|
||||
|
||||
|
|
Ładowanie…
Reference in New Issue