1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
| import java.util.Map; import java.util.List; import java.util.ArrayList; import java.util.HashMap; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.net.URI; import com.fasterxml.jackson.databind.ObjectMapper;
public class SearchTool extends BaseTool { private String apiKey; private String baseUrl; private HttpClient httpClient; private ObjectMapper objectMapper;
public SearchTool(String apiKey) { this.apiKey = apiKey; this.baseUrl = "https://serpapi.com/search"; this.httpClient = HttpClient.newHttpClient(); this.objectMapper = new ObjectMapper(); }
@Override public String getName() { return "web_search"; }
@Override public String getDescription() { return "搜索网页信息,返回相关结果"; }
@Override public String execute(Map<String, Object> kwargs) { String query = (String) kwargs.get("query"); Integer numResults = kwargs.containsKey("num_results") ? (Integer) kwargs.get("num_results") : 5;
try { String url = baseUrl + "?q=" + java.net.URLEncoder.encode(query, "UTF-8") + "&api_key=" + apiKey + "&num=" + numResults;
HttpRequest request = HttpRequest.newBuilder() .uri(URI.create(url)) .GET() .build();
HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
Map<String, Object> data = objectMapper.readValue(response.body(), Map.class); List<Map<String, Object>> organicResults = (List<Map<String, Object>>) data.getOrDefault("organic_results", new ArrayList<>());
List<Map<String, Object>> results = new ArrayList<>(); for (int i = 0; i < Math.min(numResults, organicResults.size()); i++) { Map<String, Object> result = organicResults.get(i); Map<String, Object> resultMap = new HashMap<>(); resultMap.put("title", result.getOrDefault("title", "")); resultMap.put("link", result.getOrDefault("link", "")); resultMap.put("snippet", result.getOrDefault("snippet", "")); results.add(resultMap); }
return formatResults(results);
} catch (Exception e) { return "搜索失败:" + e.getMessage(); } }
private String formatResults(List<Map<String, Object>> results) { if (results.isEmpty()) { return "未找到相关结果"; }
StringBuilder formatted = new StringBuilder("🔍 搜索结果:\n\n"); for (int i = 0; i < results.size(); i++) { Map<String, Object> result = results.get(i); formatted.append(String.format("%d. %s\n", i + 1, result.get("title"))); formatted.append(String.format(" %s\n", result.get("link"))); String snippet = (String) result.get("snippet"); formatted.append(String.format(" %s...\n\n", snippet.substring(0, Math.min(100, snippet.length())))); }
return formatted.toString(); }
@Override public Map<String, Object> getParametersSchema() { Map<String, Object> schema = new HashMap<>();
Map<String, Object> querySchema = new HashMap<>(); querySchema.put("type", "string"); querySchema.put("description", "搜索查询关键词");
Map<String, Object> numResultsSchema = new HashMap<>(); numResultsSchema.put("type", "integer"); numResultsSchema.put("description", "返回结果数量"); numResultsSchema.put("default", 5); numResultsSchema.put("minimum", 1); numResultsSchema.put("maximum", 10);
schema.put("query", querySchema); schema.put("num_results", numResultsSchema);
return schema; }
@Override public List<String> getRequiredParameters() { return java.util.Arrays.asList("query"); }
|