From 69972c59ee68c97f77187856b77fd4668bc084f1 Mon Sep 17 00:00:00 2001 From: 014-code <2402143478@qq.com> Date: Wed, 1 Jul 2026 14:35:42 +0800 Subject: [PATCH] Fix AI plugin base URL port inference under Docker When the MCP endpoint is empty, PluginToolBuilder falls back to CommonUtils.getBaseUrl(request). In Docker reverse proxy deployment, the request server port may be 80 while the actual application local port is 8080, causing plugin calls to use jeecg-boot-system:80 and fail with connection refused. This change appends the internal local port only for single-label internal hosts without an explicit port, keeping configured endpoints and public domain URLs unchanged. --- .../airag/llm/handler/PluginToolBuilder.java | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/handler/PluginToolBuilder.java b/jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/handler/PluginToolBuilder.java index 0abe55fe81..039226e4d8 100644 --- a/jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/handler/PluginToolBuilder.java +++ b/jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/handler/PluginToolBuilder.java @@ -21,6 +21,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.client.HttpClientErrorException; +import java.net.URI; import java.util.*; /** @@ -58,6 +59,7 @@ public static Map buildTools(AiragMcp airagMcp, if (isEmptyBaseUrl) { if (currentHttpRequest != null) { baseUrl = CommonUtils.getBaseUrl(currentHttpRequest); + baseUrl = fixInternalBaseUrlPort(baseUrl, currentHttpRequest); log.info("插件[{}]的BaseURL为空,使用系统地址: {}", airagMcp.getName(), baseUrl); } else { log.warn("插件[{}]的BaseURL为空且无法获取系统地址,跳过工具构建", airagMcp.getName()); @@ -97,6 +99,39 @@ public static Map buildTools(AiragMcp airagMcp, return tools; } + /** + * Fixes the internal callback URL when a reverse proxy exposes the request on 80/443 but the app listens on another port. + */ + private static String fixInternalBaseUrlPort(String baseUrl, HttpServletRequest request) { + if (oConvertUtils.isEmpty(baseUrl) || request == null) { + return baseUrl; + } + + int localPort = request.getLocalPort(); + if (isDefaultHttpPort(localPort)) { + return baseUrl; + } + + try { + URI uri = URI.create(baseUrl); + if (uri.getPort() > 0 || !isDefaultHttpPort(request.getServerPort()) || !isSingleLabelHost(uri.getHost())) { + return baseUrl; + } + return new URI(uri.getScheme(), null, uri.getHost(), localPort, uri.getPath(), uri.getQuery(), uri.getFragment()).toString(); + } catch (Exception e) { + log.debug("Fix plugin baseUrl port failed, baseUrl={}", baseUrl, e); + return baseUrl; + } + } + + private static boolean isDefaultHttpPort(int port) { + return port == 80 || port == 443 || port <= 0; + } + + private static boolean isSingleLabelHost(String host) { + return oConvertUtils.isNotEmpty(host) && host.indexOf('.') < 0; + } + /** * 构建ToolSpecification */