mirror of
https://github.com/JefferyHcool/BiliNote.git
synced 2026-07-13 00:21:37 +08:00
问题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>
65 lines
2.3 KiB
Python
65 lines
2.3 KiB
Python
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()
|