File size: 1,837 Bytes
ddce7e8 | 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 | export function parseGeminiCandidateParts({
parts,
sessionId,
model,
convertToToolCall,
saveBase64Image
} = {}) {
if (!Array.isArray(parts)) {
return {
content: '',
reasoningContent: null,
reasoningSignature: null,
toolCalls: [],
imageUrls: []
};
}
let content = '';
let reasoningContent = '';
let reasoningSignature = null;
let lastSeenSignature = null;
const toolCalls = [];
const imageUrls = [];
for (const part of parts) {
if (part?.thoughtSignature) {
lastSeenSignature = part.thoughtSignature;
}
if (part?.thought === true) {
reasoningContent += part.text || '';
if (part.thoughtSignature) {
reasoningSignature = part.thoughtSignature;
}
continue;
}
if (part?.text !== undefined) {
content += part.text;
continue;
}
if (part?.functionCall) {
const toolCall = convertToToolCall(part.functionCall, sessionId ?? null, model);
const sig = part.thoughtSignature || lastSeenSignature || null;
if (sig) toolCall.thoughtSignature = sig;
toolCalls.push(toolCall);
continue;
}
if (part?.inlineData) {
const imageUrl = saveBase64Image(part.inlineData.data, part.inlineData.mimeType);
imageUrls.push(imageUrl);
continue;
}
}
if (!reasoningSignature && lastSeenSignature) {
reasoningSignature = lastSeenSignature;
}
return {
content,
reasoningContent: reasoningContent || null,
reasoningSignature,
toolCalls,
imageUrls
};
}
export function toOpenAIUsage(usageMetadata) {
if (!usageMetadata) return null;
return {
prompt_tokens: usageMetadata.promptTokenCount || 0,
completion_tokens: usageMetadata.candidatesTokenCount || 0,
total_tokens: usageMetadata.totalTokenCount || 0
};
}
|