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
  };
}