remoteModel function

Model remoteModel({
  1. required String name,
  2. required String url,
  3. FutureOr<Map<String, String>?> headers(
    1. Map<String, dynamic> context
    )?,
  4. ModelInfo? modelInfo,
  5. Client? httpClient,
})

Defines a remote Genkit model.

Implementation

Model remoteModel({
  required String name,
  required String url,
  FutureOr<Map<String, String>?> Function(Map<String, dynamic> context)?
  headers,
  ModelInfo? modelInfo,
  http.Client? httpClient,
}) {
  final remoteAction =
      defineRemoteAction<ModelRequest, ModelResponse, ModelResponseChunk, void>(
        url: url,
        httpClient: httpClient,
        inputSchema: ModelRequest.$schema,
        outputSchema: ModelResponse.$schema,
        streamSchema: ModelResponseChunk.$schema,
      );

  return Model(
      name: name,
      fn: (request, context) async {
        if (request == null) {
          throw ArgumentError('Model request cannot be null');
        }

        final resolvedHeaders = await headers?.call(context.context ?? {});

        if (context.streamingRequested) {
          final stream = remoteAction.stream(
            input: request,
            headers: resolvedHeaders,
          );

          await for (final chunk in stream) {
            context.sendChunk(chunk);
          }

          return stream.result;
        }

        return await remoteAction(input: request, headers: resolvedHeaders);
      },
    )
    ..metadata.addAll(
      modelMetadata(
        name,
        modelInfo:
            modelInfo ??
            ModelInfo(
              supports: {
                'multiturn': true,
                'media': true,
                'tools': true,
                'toolChoice': true,
                'systemRole': true,
                'constrained': true,
              },
            ),
      ).metadata,
    );
}