File size: 4,476 Bytes
31da410 cda8be4 4bf0fdd 31da410 4bf0fdd cda8be4 72da33d cda8be4 4bf0fdd 72da33d 4bf0fdd cda8be4 6be0864 4bf0fdd 6be0864 ad68a7f cda8be4 4bf0fdd cda8be4 4bf0fdd cda8be4 4bf0fdd 72da33d 4bf0fdd 31da410 72da33d 31da410 cda8be4 31da410 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 | // 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);
}
|