From 30a1c1af573820b5008d8d535e44772d4cab61a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E8=88=AA=E5=AE=87?= <3364451258@qq.com> Date: Sun, 5 Jul 2026 01:17:13 +0800 Subject: [PATCH] fix: SSL certificate issue and Windows terminal encoding --- src/cli/main.py | 5 +++++ src/core/embedder.py | 22 +++++++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/cli/main.py b/src/cli/main.py index 8aff262..4944172 100644 --- a/src/cli/main.py +++ b/src/cli/main.py @@ -1,10 +1,15 @@ """命令行工具入口.""" from pathlib import Path import sys +import io import typer import uvicorn +# Windows 终端默认用 GBK, 无法输出 emoji, 强制 UTF-8 +if sys.stdout.encoding != "utf-8": + sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace") + # 确保 src 在路径中 sys.path.insert(0, str(Path(__file__).parent.parent)) diff --git a/src/core/embedder.py b/src/core/embedder.py index 0bcd300..cfa5ba4 100644 --- a/src/core/embedder.py +++ b/src/core/embedder.py @@ -1,4 +1,11 @@ """嵌入模型抽象层.""" +import os + +# 解决 Windows SSL 证书问题: 强制使用本地缓存模型, 避免联网验证 +# 模型首次下载需要先临时取消这些环境变量 (或手动运行一次下载脚本) +os.environ.setdefault("HF_HUB_OFFLINE", "1") +os.environ.setdefault("TRANSFORMERS_OFFLINE", "1") + from sentence_transformers import SentenceTransformer from src.core.config import EmbedConfig @@ -10,7 +17,20 @@ class Embedder: def __init__(self, config: EmbedConfig): self._config = config if config.mode == "local": - self._model = SentenceTransformer(config.local_model) + # 优先从本地缓存加载, 若模型未下载则通过镜像下载 + try: + self._model = SentenceTransformer( + config.local_model, local_files_only=True + ) + except Exception: + # 模型未缓存: 临时开启网络, 使用国内镜像 + os.environ.pop("HF_HUB_OFFLINE", None) + os.environ.pop("TRANSFORMERS_OFFLINE", None) + os.environ["HF_ENDPOINT"] = "https://hf-mirror.com" + self._model = SentenceTransformer(config.local_model) + # 恢复离线设置, 后续加载走缓存 + os.environ["HF_HUB_OFFLINE"] = "1" + os.environ["TRANSFORMERS_OFFLINE"] = "1" elif config.mode == "api": self._model = None # 延迟初始化, 需要 openai 包 self._api_base = config.api_base