From 873e0473ec9aecddcba61c996f109e9729487ecc Mon Sep 17 00:00:00 2001 From: Danny Avila Date: Thu, 10 Oct 2024 08:36:36 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=A7=A0=20=20feat:=20Implement=20O1=20Mode?= =?UTF-8?q?l=20Support=20for=20Max=20Tokens=20Handling=20(#4376)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/app/clients/OpenAIClient.js | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/api/app/clients/OpenAIClient.js b/api/app/clients/OpenAIClient.js index dce5ec54fa..c3e9a24ef3 100644 --- a/api/app/clients/OpenAIClient.js +++ b/api/app/clients/OpenAIClient.js @@ -68,6 +68,8 @@ class OpenAIClient extends BaseClient { /** @type {OpenAIUsageMetadata | undefined} */ this.usage; + /** @type {boolean|undefined} */ + this.isO1Model; } // TODO: PluginsClient calls this 3x, unneeded @@ -98,6 +100,8 @@ class OpenAIClient extends BaseClient { this.options.modelOptions, ); + this.isO1Model = /\bo1\b/i.test(this.modelOptions.model); + this.defaultVisionModel = this.options.visionModel ?? 'gpt-4-vision-preview'; if (typeof this.options.attachments?.then === 'function') { this.options.attachments.then((attachments) => this.checkVisionRequest(attachments)); @@ -545,8 +549,7 @@ class OpenAIClient extends BaseClient { promptPrefix = this.augmentedPrompt + promptPrefix; } - const isO1Model = /\bo1\b/i.test(this.modelOptions.model); - if (promptPrefix && !isO1Model) { + if (promptPrefix && this.isO1Model !== true) { promptPrefix = `Instructions:\n${promptPrefix.trim()}`; instructions = { role: 'system', @@ -575,7 +578,7 @@ class OpenAIClient extends BaseClient { }; /** EXPERIMENTAL */ - if (promptPrefix && isO1Model) { + if (promptPrefix && this.isO1Model === true) { const lastUserMessageIndex = payload.findLastIndex((message) => message.role === 'user'); if (lastUserMessageIndex !== -1) { payload[ @@ -1227,6 +1230,11 @@ ${convo} opts.defaultHeaders = { ...opts.defaultHeaders, 'api-key': this.apiKey }; } + if (this.isO1Model === true && modelOptions.max_tokens != null) { + modelOptions.max_completion_tokens = modelOptions.max_tokens; + delete modelOptions.max_tokens; + } + if (process.env.OPENAI_ORGANIZATION) { opts.organization = process.env.OPENAI_ORGANIZATION; }