// OpenAI 格式转换工具 import config from '../../config/config.js'; import { extractSystemInstruction } from '../utils.js'; import { convertOpenAIToolsToAntigravity } from '../toolConverter.js'; import { getSignatureContext, pushUserMessage, findFunctionNameById, pushFunctionResponse, createThoughtPart, createFunctionCallPart, processToolName, pushModelMessage, buildRequestBody, modelMapping, isEnableThinking, generateGenerationConfig } from './common.js'; function extractImagesFromContent(content) { const result = { text: '', images: [] }; if (typeof content === 'string') { result.text = content; return result; } if (Array.isArray(content)) { for (const item of content) { if (item.type === 'text') { result.text += item.text; } else if (item.type === 'image_url') { const imageUrl = item.image_url?.url || ''; const match = imageUrl.match(/^data:image\/(\w+);base64,(.+)$/); if (match) { result.images.push({ inlineData: { mimeType: `image/${match[1]}`, data: match[2] } }); } } } } return result; } function handleAssistantMessage(message, antigravityMessages, enableThinking, actualModelName, sessionId) { const hasToolCalls = message.tool_calls && message.tool_calls.length > 0; const hasContent = message.content && message.content.trim() !== ''; const { reasoningSignature, toolSignature } = getSignatureContext(sessionId, actualModelName); const toolCalls = hasToolCalls ? message.tool_calls.map(toolCall => { const safeName = processToolName(toolCall.function.name, sessionId, actualModelName); const signature = enableThinking ? (toolCall.thoughtSignature || toolSignature) : null; return createFunctionCallPart(toolCall.id, safeName, toolCall.function.arguments, signature); }) : []; const parts = []; if (enableThinking) { const reasoningText = (typeof message.reasoning_content === 'string' && message.reasoning_content.length > 0) ? message.reasoning_content : ' '; parts.push(createThoughtPart(reasoningText)); } if (hasContent) parts.push({ text: message.content.trimEnd(), thoughtSignature: message.thoughtSignature || reasoningSignature }); if (!enableThinking && parts[0]) delete parts[0].thoughtSignature; pushModelMessage({ parts, toolCalls, hasContent }, antigravityMessages); } function handleToolCall(message, antigravityMessages) { const functionName = findFunctionNameById(message.tool_call_id, antigravityMessages); pushFunctionResponse(message.tool_call_id, functionName, message.content, antigravityMessages); } function openaiMessageToAntigravity(openaiMessages, enableThinking, actualModelName, sessionId) { const antigravityMessages = []; for (const message of openaiMessages) { if (message.role === 'user' || message.role === 'system') { const extracted = extractImagesFromContent(message.content); pushUserMessage(extracted, antigravityMessages); } else if (message.role === 'assistant') { handleAssistantMessage(message, antigravityMessages, enableThinking, actualModelName, sessionId); } else if (message.role === 'tool') { handleToolCall(message, antigravityMessages); } } //console.log(JSON.stringify(antigravityMessages,null,2)); return antigravityMessages; } export function generateRequestBody(openaiMessages, modelName, parameters, openaiTools, token) { const enableThinking = isEnableThinking(modelName); const actualModelName = modelMapping(modelName); const mergedSystemInstruction = extractSystemInstruction(openaiMessages); let filteredMessages = openaiMessages; let startIndex = 0; if (config.useContextSystemPrompt) { for (let i = 0; i < openaiMessages.length; i++) { if (openaiMessages[i].role === 'system') { startIndex = i + 1; } else { filteredMessages = openaiMessages.slice(startIndex); break; } } } return buildRequestBody({ contents: openaiMessageToAntigravity(filteredMessages, enableThinking, actualModelName, token.sessionId), tools: convertOpenAIToolsToAntigravity(openaiTools, token.sessionId, actualModelName), generationConfig: generateGenerationConfig(parameters, enableThinking, actualModelName), sessionId: token.sessionId, systemInstruction: mergedSystemInstruction }, token, actualModelName); }