processSearchResponse function

WebSearchOutput processSearchResponse(
  1. String originalQuery,
  2. List<Map<String, dynamic>> contentBlocks,
  3. double durationSeconds
)

Process search results from an API response containing web_search_tool_result blocks.

Implementation

WebSearchOutput processSearchResponse(
  String originalQuery,
  List<Map<String, dynamic>> contentBlocks,
  double durationSeconds,
) {
  final results = <dynamic>[];
  var searchCount = 0;

  var currentText = StringBuffer();
  var inText = true;

  for (final block in contentBlocks) {
    final type = block['type'] as String?;

    if (type == 'text') {
      final text = block['text'] as String? ?? '';
      if (!inText && currentText.isNotEmpty) {
        results.add(currentText.toString());
        currentText = StringBuffer();
      }
      inText = true;
      currentText.write(text);
    } else if (type == 'web_search_tool_result') {
      if (inText && currentText.isNotEmpty) {
        results.add(currentText.toString());
        currentText = StringBuffer();
        inText = false;
      }

      searchCount++;
      final content = block['content'] as List?;
      if (content != null) {
        final searchResults = content
            .whereType<Map<String, dynamic>>()
            .where((r) => r.containsKey('url'))
            .map((r) => SearchResult.fromJson(r))
            .toList();
        if (searchResults.isNotEmpty) {
          results.add(searchResults);
        }
      }

      // Check for errors
      final errorCode = block['error_code'] as String?;
      if (errorCode != null) {
        results.add('Search error: $errorCode');
      }
    }
  }

  // Flush remaining text
  if (currentText.isNotEmpty) {
    results.add(currentText.toString());
  }

  return WebSearchOutput(
    query: originalQuery,
    results: results,
    durationSeconds: durationSeconds,
    searchCount: searchCount,
  );
}