createSearchPackagesTool function

Tool<Object, ToolOptions, Object> createSearchPackagesTool({
  1. PubClient? client,
})

Implementation

Tool createSearchPackagesTool({PubClient? client}) {
  final pubClient = client ?? PubClient();

  return Tool.fromFunction<SearchPackagesInput, String>(
    name: 'search_packages',
    description: 'Search pub.flutter-io.cn for packages matching a keyword or phrase. '
        'Returns package names and URLs. Use this as your FIRST step when user requests functionality. '
        'Results are ranked by relevance. '
        'After searching, use get_package_info on top 2-3 results to gather detailed metrics for comparison.',
    inputJsonSchema: object({
      'query': string().min(1).meta(MetadataEntry(description: 'Search query')),
      'limit': number()
          .positive()
          .meta(MetadataEntry(description: 'Number of results to return')),
    }).optionals(['limit']).toJsonSchema(),
    func: (SearchPackagesInput input) async {
      final results = await pubClient.search(input.query);
      final packages = results.packages.take(input.limit).toList();

      if (packages.isEmpty) {
        return 'No packages found for "${input.query}"';
      }

      return packages.asMap().entries.map((e) {
        final i = e.key + 1;
        final pkg = e.value.package;
        return '$i. $pkg\n   URL: https://pub.flutter-io.cn/packages/$pkg';
      }).join('\n\n');
    },
    getInputFromJson: (json) => SearchPackagesInput.fromJson(json),
    handleToolError: (e) {
      return 'Search packages tool error : ${e.toString()}';
    },
  );
}