|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import { GenerateContentResponse, Part, FunctionCall } from '@google/genai'; |
|
|
|
|
|
export function getResponseText( |
|
|
response: GenerateContentResponse, |
|
|
): string | undefined { |
|
|
const parts = response.candidates?.[0]?.content?.parts; |
|
|
if (!parts) { |
|
|
return undefined; |
|
|
} |
|
|
const textSegments = parts |
|
|
.map((part) => part.text) |
|
|
.filter((text): text is string => typeof text === 'string'); |
|
|
|
|
|
if (textSegments.length === 0) { |
|
|
return undefined; |
|
|
} |
|
|
return textSegments.join(''); |
|
|
} |
|
|
|
|
|
export function getResponseTextFromParts(parts: Part[]): string | undefined { |
|
|
if (!parts) { |
|
|
return undefined; |
|
|
} |
|
|
const textSegments = parts |
|
|
.map((part) => part.text) |
|
|
.filter((text): text is string => typeof text === 'string'); |
|
|
|
|
|
if (textSegments.length === 0) { |
|
|
return undefined; |
|
|
} |
|
|
return textSegments.join(''); |
|
|
} |
|
|
|
|
|
export function getFunctionCalls( |
|
|
response: GenerateContentResponse, |
|
|
): FunctionCall[] | undefined { |
|
|
const parts = response.candidates?.[0]?.content?.parts; |
|
|
if (!parts) { |
|
|
return undefined; |
|
|
} |
|
|
const functionCallParts = parts |
|
|
.filter((part) => !!part.functionCall) |
|
|
.map((part) => part.functionCall as FunctionCall); |
|
|
return functionCallParts.length > 0 ? functionCallParts : undefined; |
|
|
} |
|
|
|
|
|
export function getFunctionCallsFromParts( |
|
|
parts: Part[], |
|
|
): FunctionCall[] | undefined { |
|
|
if (!parts) { |
|
|
return undefined; |
|
|
} |
|
|
const functionCallParts = parts |
|
|
.filter((part) => !!part.functionCall) |
|
|
.map((part) => part.functionCall as FunctionCall); |
|
|
return functionCallParts.length > 0 ? functionCallParts : undefined; |
|
|
} |
|
|
|
|
|
export function getFunctionCallsAsJson( |
|
|
response: GenerateContentResponse, |
|
|
): string | undefined { |
|
|
const functionCalls = getFunctionCalls(response); |
|
|
if (!functionCalls) { |
|
|
return undefined; |
|
|
} |
|
|
return JSON.stringify(functionCalls, null, 2); |
|
|
} |
|
|
|
|
|
export function getFunctionCallsFromPartsAsJson( |
|
|
parts: Part[], |
|
|
): string | undefined { |
|
|
const functionCalls = getFunctionCallsFromParts(parts); |
|
|
if (!functionCalls) { |
|
|
return undefined; |
|
|
} |
|
|
return JSON.stringify(functionCalls, null, 2); |
|
|
} |
|
|
|
|
|
export function getStructuredResponse( |
|
|
response: GenerateContentResponse, |
|
|
): string | undefined { |
|
|
const textContent = getResponseText(response); |
|
|
const functionCallsJson = getFunctionCallsAsJson(response); |
|
|
|
|
|
if (textContent && functionCallsJson) { |
|
|
return `${textContent}\n${functionCallsJson}`; |
|
|
} |
|
|
if (textContent) { |
|
|
return textContent; |
|
|
} |
|
|
if (functionCallsJson) { |
|
|
return functionCallsJson; |
|
|
} |
|
|
return undefined; |
|
|
} |
|
|
|
|
|
export function getStructuredResponseFromParts( |
|
|
parts: Part[], |
|
|
): string | undefined { |
|
|
const textContent = getResponseTextFromParts(parts); |
|
|
const functionCallsJson = getFunctionCallsFromPartsAsJson(parts); |
|
|
|
|
|
if (textContent && functionCallsJson) { |
|
|
return `${textContent}\n${functionCallsJson}`; |
|
|
} |
|
|
if (textContent) { |
|
|
return textContent; |
|
|
} |
|
|
if (functionCallsJson) { |
|
|
return functionCallsJson; |
|
|
} |
|
|
return undefined; |
|
|
} |
|
|
|