From a00013395adf32832c07144abccb18609223f27c Mon Sep 17 00:00:00 2001 From: huangge1199 Date: Wed, 28 May 2025 15:12:30 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E7=94=A8=E5=B7=A5=E5=85=B7=EF=BC=9A?= =?UTF-8?q?=E8=81=94=E7=BD=91=E6=90=9C=E7=B4=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../aiagent/Service/ToolsService.java | 4 ++ .../Service/impl/ToolsServiceImpl.java | 14 +++++ .../aiagent/controller/ToolController.java | 10 +++- .../aiagent/tools/WebSearchTool.java | 56 +++++++++++++++++++ 4 files changed, 82 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/huangge1199/aiagent/tools/WebSearchTool.java diff --git a/src/main/java/com/huangge1199/aiagent/Service/ToolsService.java b/src/main/java/com/huangge1199/aiagent/Service/ToolsService.java index d8c7bf4..6c1e2ba 100644 --- a/src/main/java/com/huangge1199/aiagent/Service/ToolsService.java +++ b/src/main/java/com/huangge1199/aiagent/Service/ToolsService.java @@ -1,5 +1,7 @@ package com.huangge1199.aiagent.Service; +import java.util.List; + /** * ToolsService * @@ -14,4 +16,6 @@ public interface ToolsService { String readFileTest(String name); String aiWriteFile(String question); + + List webSearch(String question); } diff --git a/src/main/java/com/huangge1199/aiagent/Service/impl/ToolsServiceImpl.java b/src/main/java/com/huangge1199/aiagent/Service/impl/ToolsServiceImpl.java index a9116f3..53a99db 100644 --- a/src/main/java/com/huangge1199/aiagent/Service/impl/ToolsServiceImpl.java +++ b/src/main/java/com/huangge1199/aiagent/Service/impl/ToolsServiceImpl.java @@ -4,11 +4,16 @@ import com.huangge1199.aiagent.Service.ToolsService; import com.huangge1199.aiagent.config.MyLoggerAdvisor; import com.huangge1199.aiagent.tools.FileTool; import com.huangge1199.aiagent.tools.WeatherTool; +import com.huangge1199.aiagent.tools.WebSearchTool; import jakarta.annotation.Resource; import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.ollama.OllamaChatModel; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import java.util.ArrayList; +import java.util.List; + /** * ToolsServiceImpl * @@ -21,6 +26,9 @@ public class ToolsServiceImpl implements ToolsService { @Resource private OllamaChatModel ollamaChatModel; + @Value("${search-api.api-key}") + private String searchApiKey; + @Override public String getWeather(String question) { return ChatClient.create(ollamaChatModel) @@ -50,4 +58,10 @@ public class ToolsServiceImpl implements ToolsService { .tools(new FileTool()) .call().content(); } + + @Override + public List webSearch(String question) { + WebSearchTool webSearchTool = new WebSearchTool(searchApiKey); + return List.of(webSearchTool.searchWeb(question).split(",")); + } } diff --git a/src/main/java/com/huangge1199/aiagent/controller/ToolController.java b/src/main/java/com/huangge1199/aiagent/controller/ToolController.java index aee224f..765b3cc 100644 --- a/src/main/java/com/huangge1199/aiagent/controller/ToolController.java +++ b/src/main/java/com/huangge1199/aiagent/controller/ToolController.java @@ -1,14 +1,12 @@ package com.huangge1199.aiagent.controller; import cn.hutool.json.JSONObject; -import com.alibaba.cloud.nacos.utils.StringUtils; import com.huangge1199.aiagent.Service.ToolsService; import com.huangge1199.aiagent.common.R; import com.huangge1199.aiagent.util.CheckUtils; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.ai.document.Document; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -64,4 +62,12 @@ public class ToolController { String result = toolsService.aiWriteFile(question); return R.ok(result); } + + @PostMapping("/webSearch") + @Operation(summary = "联网搜索") + public R> webSearch(@RequestBody String question) { + CheckUtils.checkEmpty(question, "问题"); + List result = toolsService.webSearch(question); + return R.ok(result); + } } diff --git a/src/main/java/com/huangge1199/aiagent/tools/WebSearchTool.java b/src/main/java/com/huangge1199/aiagent/tools/WebSearchTool.java new file mode 100644 index 0000000..33ba902 --- /dev/null +++ b/src/main/java/com/huangge1199/aiagent/tools/WebSearchTool.java @@ -0,0 +1,56 @@ +package com.huangge1199.aiagent.tools; + +import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import org.springframework.ai.tool.annotation.Tool; +import org.springframework.ai.tool.annotation.ToolParam; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * WebSearchTool + * + * @author huangge1199 + * @since 2025/5/28 11:00:28 + */ +public class WebSearchTool { + + // SearchAPI 的搜索接口地址 + private static final String SEARCH_API_URL = "https://www.searchapi.io/api/v1/search"; + + private final String apiKey; + + public WebSearchTool(String apiKey) { + this.apiKey = apiKey; + } + + @Tool(description = "Search for information from Baidu Search Engine") + public String searchWeb( + @ToolParam(description = "Search query keyword") String query) { + Map paramMap = new HashMap<>(); + paramMap.put("q", query); + paramMap.put("api_key", apiKey); + paramMap.put("engine", "bing"); + try { + String response = HttpUtil.get(SEARCH_API_URL, paramMap); + // 取出返回结果的前 5 条 + JSONObject jsonObject = JSONUtil.parseObj(response); + // 提取 organic_results 部分 + JSONArray organicResults = jsonObject.getJSONArray("organic_results"); + List objects = organicResults.subList(0, 5); + // 拼接搜索结果为字符串 + return objects.stream().map(obj -> { + JSONObject tmpJsonObject = (JSONObject) obj; + return tmpJsonObject.get("title").toString(); + }).collect(Collectors.joining(",")); + } catch (Exception e) { + return "Error searching Baidu: " + e.getMessage(); + } + } +} +