From 9325608e5cddf09a68513ab315f23059875963fb Mon Sep 17 00:00:00 2001 From: lintsinghua <1930438860@qq.com> Date: Mon, 27 Oct 2025 17:39:41 +0800 Subject: [PATCH] feat: enhance OpenAIAdapter to support reasoning models - Added detection for reasoning models (GPT-5 and o1 series) to adjust request body accordingly. - Implemented conditional logic to use max_completion_tokens for reasoning models and max_tokens for others. - Refactored request body construction for improved clarity and maintainability. --- .../services/llm/adapters/openai-adapter.ts | 32 +++++++++++++------ 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/src/shared/services/llm/adapters/openai-adapter.ts b/src/shared/services/llm/adapters/openai-adapter.ts index 56bebe4..283f675 100644 --- a/src/shared/services/llm/adapters/openai-adapter.ts +++ b/src/shared/services/llm/adapters/openai-adapter.ts @@ -36,18 +36,32 @@ export class OpenAIAdapter extends BaseLLMAdapter { Object.assign(headers, this.config.customHeaders); } + // 检测是否为推理模型(GPT-5 或 o1 系列,但排除 gpt-5-chat 等非推理模型) + const modelName = this.config.model.toLowerCase(); + const isReasoningModel = (modelName.includes('o1') || modelName.includes('o3')) || + (modelName.includes('gpt-5') && !modelName.includes('chat')); + + // 构建请求体 + const requestBody: any = { + model: this.config.model, + messages: request.messages, + temperature: request.temperature ?? this.config.temperature, + top_p: request.topP ?? this.config.topP, + frequency_penalty: this.config.frequencyPenalty, + presence_penalty: this.config.presencePenalty, + }; + + // GPT-5 推理模型使用 max_completion_tokens,其他模型使用 max_tokens + if (isReasoningModel) { + requestBody.max_completion_tokens = request.maxTokens ?? this.config.maxTokens; + } else { + requestBody.max_tokens = request.maxTokens ?? this.config.maxTokens; + } + const response = await fetch(`${this.baseUrl}/chat/completions`, { method: 'POST', headers: this.buildHeaders(headers), - body: JSON.stringify({ - model: this.config.model, - messages: request.messages, - temperature: request.temperature ?? this.config.temperature, - max_tokens: request.maxTokens ?? this.config.maxTokens, - top_p: request.topP ?? this.config.topP, - frequency_penalty: this.config.frequencyPenalty, - presence_penalty: this.config.presencePenalty, - }), + body: JSON.stringify(requestBody), }); if (!response.ok) {