generatePromptHandlers function

String generatePromptHandlers(
  1. List<Map<String, dynamic>> prompts
)

Generates prompt handler methods for prompts/list and prompts/get.

Implementation

String generatePromptHandlers(List<Map<String, dynamic>> prompts) {
  final promptImpls = prompts
      .map((p) {
        final name = p['name'] as String;
        final methodName = p['methodName'] as String;
        final className = p['className'] as String?;
        final isStatic = p['isStatic'] as bool? ?? false;
        final isAsync = p['isAsync'] as bool;
        final sourceAlias = p['sourceAlias'] as String? ?? 'lib';
        final arguments = p['arguments'] as List<Map<String, dynamic>>;

        final argExtractions = arguments
            .map((arg) {
              final argName = arg['name'] as String;
              final dartName = arg['dartName'] as String;
              return """    final $dartName = request.arguments?['$argName'] as String?;
    if ($dartName != null && $dartName.length > $maxPromptArgumentLength) {
      throw ArgumentError('Argument $argName exceeds maximum length of $maxPromptArgumentLength characters');
    }""";
            })
            .join('\n');

        final argCalls = arguments
            .map((arg) {
              final dartName = arg['dartName'] as String;
              final isNamed = arg['isNamed'] as bool;
              return isNamed ? '$dartName: $dartName ?? \'\'' : dartName;
            })
            .join(', ');

        String call;
        if (className != null && isStatic) {
          call = isAsync
              ? 'await $sourceAlias.$className.$methodName($argCalls)'
              : '$sourceAlias.$className.$methodName($argCalls)';
        } else if (className != null) {
          call = isAsync
              ? 'await $sourceAlias.$className().$methodName($argCalls)'
              : '$sourceAlias.$className().$methodName($argCalls)';
        } else {
          call = isAsync
              ? 'await $sourceAlias.$methodName($argCalls)'
              : '$sourceAlias.$methodName($argCalls)';
        }

        return """  FutureOr<GetPromptResult> _prompt${name}Impl(GetPromptRequest request) async {
    try {
    $argExtractions
    final promptResult = $call;
    return GetPromptResult(
      description: promptResult.description,
      messages: promptResult.messages.map(_promptMessageToMcp).toList(),
    );
    } catch (e, st) {
      if (_logErrors) {
        io.stderr.writeln('[easy_api] prompt $name: \$e');
        io.stderr.writeln(st);
        await io.stderr.flush();
      }
      return GetPromptResult(
        description: 'An error occurred while processing the prompt.',
        messages: [],
      );
    }
  }""";
      })
      .join('\n\n');

  return '''
$promptImpls

  PromptMessage _promptMessageToMcp(easy_api.PromptMessage message) {
    final content = message.content;
    return switch (content) {
      easy_api.TextPromptContent() => PromptMessage(
          role: message.role == easy_api.PromptRole.user ? Role.user : Role.assistant,
          content: TextContent(text: content.text),
        ),
      easy_api.ImagePromptContent() => PromptMessage(
          role: message.role == easy_api.PromptRole.user ? Role.user : Role.assistant,
          content: ImageContent(data: content.data, mimeType: content.mimeType),
        ),
      easy_api.AudioPromptContent() => PromptMessage(
          role: message.role == easy_api.PromptRole.user ? Role.user : Role.assistant,
          content: AudioContent(data: content.data, mimeType: content.mimeType),
        ),
      easy_api.ResourcePromptContent() => PromptMessage(
          role: message.role == easy_api.PromptRole.user ? Role.user : Role.assistant,
          content: EmbeddedResource(
            resource: TextResourceContents(
              uri: content.uri,
              mimeType: content.mimeType,
              text: content.text,
            ),
          ),
        ),
    };
  }''';
}