diff --git a/backend/app/model_services/chat_services.py b/backend/app/model_services/chat_services.py index 552a74b..ae5f2fc 100644 --- a/backend/app/model_services/chat_services.py +++ b/backend/app/model_services/chat_services.py @@ -54,21 +54,42 @@ class LocalVLLMChatProvider(BaseServiceProvider[BaseChatModel]): return False try: - # 尝试创建一个简单的测试调用 - from langchain_openai import ChatOpenAI - from pydantic import SecretStr + # 先测试主机名能否解析 + import httpx + from urllib.parse import urlparse - llm = ChatOpenAI( - base_url=VLLM_BASE_URL, - api_key=SecretStr(LLM_API_KEY) if LLM_API_KEY else SecretStr("dummy"), - model=self._model, - timeout=10.0, - max_retries=1, - ) + parsed_url = urlparse(VLLM_BASE_URL) + host = parsed_url.hostname + port = parsed_url.port or (80 if parsed_url.scheme == 'http' else 443) - # 简单的 ping 测试(不实际调用模型) - logger.info(f"本地 VLLM 服务配置正确,准备使用: {self._model}") - return True + # 测试能否建立 TCP 连接(快速失败) + import socket + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.settimeout(2.0) + try: + sock.connect((host, port)) + sock.close() + except Exception as e: + logger.warning(f"本地 VLLM 服务无法连接: {host}:{port} - {e}") + return False + + # 再尝试调用简单的 API(比如 models 接口) + client = httpx.Client(base_url=VLLM_BASE_URL.rstrip('/'), timeout=5.0) + headers = {} + if LLM_API_KEY: + headers["Authorization"] = f"Bearer {LLM_API_KEY}" + + try: + response = client.get("/v1/models", headers=headers) + if response.status_code == 200: + logger.info(f"本地 VLLM 服务可用: {self._model}") + return True + except Exception: + pass + + # 如果 /v1/models 失败,也认为服务不可用 + logger.warning(f"本地 VLLM 服务响应异常") + return False except Exception as e: logger.warning(f"本地 VLLM 服务不可用: {e}") return False diff --git a/backend/app/model_services/rerank_services.py b/backend/app/model_services/rerank_services.py index ecd5855..4cc2052 100644 --- a/backend/app/model_services/rerank_services.py +++ b/backend/app/model_services/rerank_services.py @@ -277,22 +277,10 @@ class ZhipuRerankProvider(BaseServiceProvider[BaseRerankService]): def is_available(self) -> bool: """ 检查智谱 API 重排服务是否可用 + 注意:zhipuai 库 2.0.1 版本没有 rerank API,直接返回 False,降级到 LLM 方案 """ - if not ZHIPUAI_API_KEY: - logger.warning("ZHIPUAI_API_KEY 未配置") - return False - - try: - service = ZhipuRerankService(model=self._model) - test_scores = service.compute_scores("test query", ["test document"]) - logger.info(f"智谱重排服务可用") - return True - except ImportError: - logger.warning("zhipuai 库未安装") - return False - except Exception as e: - logger.warning(f"智谱重排服务不可用: {e}") - return False + logger.warning("智谱 rerank API 在当前 zhipuai 库版本不可用,降级到 LLM 方案") + return False def get_service(self) -> BaseRerankService: """