liuw15's picture
修复工具未定义调用报错
ad68a7f
// 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);
}