Files
BiliNote/backend/tests/test_proxy_apply_env.py
huangjianwu bebf2e8c61 fix(backend): 修复 DeepSeek 模型列表为空 & whisper 下载不走代理 (#417)
问题1 — DeepSeek 模型下拉为空:
provider 的 /models 调用失败时,get_model_list 吞掉异常返回 [],
get_all_models_by_id 再对 [] 取 .data 触发 AttributeError 又被吞,
最终接口返回 {"code":0,"msg":"success","data":[]},把失败伪装成空成功,
用户看不到任何原因。
- 捕获并回传真实错误,不再二次吞
- 新增 model_fallback.normalize_models 兼容 SyncPage/list/dict,绝不再 .data 崩
- 内置供应商提供已知模型兜底清单(DeepSeek→deepseek-chat/deepseek-reasoner,
  Qwen→qwen-plus 等),动态拿不到时回退,保证下拉非空;动态可用时仍以动态为准

问题2 — whisper 模型下载不走代理(Docker 里代理没生效):
snapshot_download 既不读 UI 配的代理,HF_ENDPOINT 又固定 hf-mirror.com。
- ProxyConfigManager.apply_to_env() 把生效代理 export 到 HTTP(S)_PROXY/ALL_PROXY,
  huggingface_hub 即可复用;在每次下载前与启动时应用(覆盖转写按需下载)
- 网络类下载报错翻译成可操作提示(配代理 / 改 HF_ENDPOINT / 检查容器外网)
- .env.example 补充 HF_ENDPOINT 与代理覆盖说明

新增 tests/test_model_fallback.py、tests/test_proxy_apply_env.py(14 用例)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-29 13:54:44 +08:00

65 lines
2.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import importlib.util
import os
import pathlib
import tempfile
import unittest
ROOT = pathlib.Path(__file__).resolve().parents[1]
MODULE_PATH = ROOT / "app" / "services" / "proxy_config_manager.py"
spec = importlib.util.spec_from_file_location("proxy_config_manager", MODULE_PATH)
if spec is None or spec.loader is None:
raise ImportError("proxy_config_manager module spec not found")
pcm = importlib.util.module_from_spec(spec)
spec.loader.exec_module(pcm)
ProxyConfigManager = pcm.ProxyConfigManager
PROXY_ENV_KEYS = (
"HTTP_PROXY", "HTTPS_PROXY", "ALL_PROXY",
"http_proxy", "https_proxy", "all_proxy",
)
class TestApplyToEnv(unittest.TestCase):
def setUp(self):
self._saved = {k: os.environ.get(k) for k in PROXY_ENV_KEYS}
for k in PROXY_ENV_KEYS:
os.environ.pop(k, None)
self._tmp = tempfile.TemporaryDirectory()
self.cfg_path = os.path.join(self._tmp.name, "proxy.json")
def tearDown(self):
for k, v in self._saved.items():
if v is None:
os.environ.pop(k, None)
else:
os.environ[k] = v
self._tmp.cleanup()
def test_enabled_proxy_exported_to_env(self):
mgr = ProxyConfigManager(filepath=self.cfg_path)
mgr.update_config(enabled=True, url="http://127.0.0.1:7890")
returned = mgr.apply_to_env()
self.assertEqual(returned, "http://127.0.0.1:7890")
# huggingface_hub / requests 只认环境变量,必须 export 进去
for k in PROXY_ENV_KEYS:
self.assertEqual(os.environ.get(k), "http://127.0.0.1:7890", k)
def test_no_proxy_returns_none_and_no_env(self):
mgr = ProxyConfigManager(filepath=self.cfg_path)
returned = mgr.apply_to_env()
self.assertIsNone(returned)
for k in PROXY_ENV_KEYS:
self.assertIsNone(os.environ.get(k), k)
def test_env_fallback_is_idempotent(self):
# 没配文件代理但环境已有代理apply 应把它补全到所有别名(含小写)
os.environ["HTTPS_PROXY"] = "http://10.0.0.1:1080"
mgr = ProxyConfigManager(filepath=self.cfg_path)
returned = mgr.apply_to_env()
self.assertEqual(returned, "http://10.0.0.1:1080")
self.assertEqual(os.environ.get("https_proxy"), "http://10.0.0.1:1080")
if __name__ == "__main__":
unittest.main()