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.ChatOpenAI(
    apiKey: apiKey,
    baseUrl: baseUrl,
    defaultOptions: lc.ChatOpenAIOptions(
      model: request.model.id,
      user: request.user,
      responseFormat:
          request.responseFormat != null
              ? lc.ChatOpenAIResponseFormat.jsonSchema(
                lc.ChatOpenAIJsonSchema(
                  name: request.responseFormat!.name,
                  strict: true,
                  description: request.responseFormat!.description,
                  schema: request.responseFormat!.schema,
                ),
              )
              : null,
      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,
  );
}