AIClient-2-API/src/openai/openai-strategy.js
hex2077 66f758d741 feat(convert): 增强协议转换功能,支持更多模型和工具调用
- 新增OpenAI到Claude的协议转换支持
- 添加工具调用状态管理器和JSON Schema清理功能
- 实现智能的reasoning_effort等级判断
- 优化错误处理和日志记录
- 重构代码结构,增加注释和辅助函数
2025-09-05 18:03:34 +08:00

84 lines
3.2 KiB
JavaScript

import { ProviderStrategy } from '../provider-strategy.js';
import { extractSystemPromptFromRequestBody, MODEL_PROTOCOL_PREFIX } from '../common.js';
/**
* OpenAI provider strategy implementation.
*/
class OpenAIStrategy extends ProviderStrategy {
extractModelAndStreamInfo(req, requestBody) {
const model = requestBody.model;
const isStream = requestBody.stream === true;
return { model, isStream };
}
extractResponseText(response) {
if (!response.choices) {
return '';
}
if (response.choices && response.choices.length > 0) {
const choice = response.choices[0];
if (choice.message && choice.message.content) {
return choice.message.content;
} else if (choice.delta && choice.delta.content) {
return choice.delta.content;
} else if (choice.delta && choice.delta.tool_calls && choice.delta.tool_calls.length > 0) {
return choice.delta.tool_calls;
}
}
return '';
}
extractPromptText(requestBody) {
if (requestBody.messages && requestBody.messages.length > 0) {
const lastMessage = requestBody.messages[requestBody.messages.length - 1];
let content = lastMessage.content;
if (typeof content === 'object' && content !== null) {
if (Array.isArray(content)) {
return content.map(item => item.text).join('\n');
} else {
return JSON.stringify(content);
}
}
return content;
}
return '';
}
async applySystemPromptFromFile(config, requestBody) {
if (!config.SYSTEM_PROMPT_FILE_PATH) {
return requestBody;
}
const filePromptContent = config.SYSTEM_PROMPT_CONTENT;
if (filePromptContent === null) {
return requestBody;
}
const existingSystemText = extractSystemPromptFromRequestBody(requestBody, MODEL_PROTOCOL_PREFIX.OPENAI);
const newSystemText = config.SYSTEM_PROMPT_MODE === 'append' && existingSystemText
? `${existingSystemText}\n${filePromptContent}`
: filePromptContent;
if (!requestBody.messages) {
requestBody.messages = [];
}
const systemMessageIndex = requestBody.messages.findIndex(m => m.role === 'system');
if (systemMessageIndex !== -1) {
requestBody.messages[systemMessageIndex].content = newSystemText;
} else {
requestBody.messages.unshift({ role: 'system', content: newSystemText });
}
console.log(`[System Prompt] Applied system prompt from ${config.SYSTEM_PROMPT_FILE_PATH} in '${config.SYSTEM_PROMPT_MODE}' mode for provider 'openai'.`);
return requestBody;
}
async manageSystemPrompt(requestBody) {
//console.log('[System Prompt] Managing system prompt for provider "openai".', requestBody);
const incomingSystemText = extractSystemPromptFromRequestBody(requestBody, MODEL_PROTOCOL_PREFIX.OPENAI);
await this._updateSystemPromptFile(incomingSystemText, MODEL_PROTOCOL_PREFIX.OPENAI);
}
}
export { OpenAIStrategy };