call method

  1. @override
Future<ChatResult> call(
  1. ChatRequest request
)
override

Implementation

@override
Future<ChatResult> call(ChatRequest request) async {
  request = request.adapted;

  lc.ChatResult result = await lc.ChatGoogleGenerativeAI(
    apiKey: apiKey,
    baseUrl: baseUrl,
    defaultOptions: lc.ChatGoogleGenerativeAIOptions(
      model: request.model.id,
      responseMimeType:
          request.responseFormat != null ? "application/json" : null,
      responseSchema: request.responseFormat?.schema,
      toolChoice: request.tools.isNotEmpty ? lc.ChatToolChoiceAuto() : null,
      tools:
          request.tools.isEmpty
              ? null
              : request.tools.map((i) => i.toolSchema.toLangChain).toList(),
    ),
  ).invoke(
    lc.PromptValue.chat([for (Message i in request.messages) i.toLangChain]),
  );

  ChatUsage usage = ChatUsage(
    inputTokens: result.usage.promptTokens ?? 0,
    outputTokens: result.usage.responseTokens ?? 0,
  );

  return ChatResult(
    message: result.output.toAgentic as AgentMessage,
    realCost: request.model.cost.getRealCost(
      usage.inputTokens,
      usage.outputTokens,
    ),
    metadata: result.metadata,
    finishReason: result.finishReason.toAgentic,
    usage: usage,
  );
}