mirror of
https://github.com/countbot-ai/CountBot.git
synced 2026-09-14 20:46:47 +08:00
c4ffccd56f
Wiki 的三个 LLM 调用点(Agent 工具 ask、REST /wiki/ask、REST /wiki/compile) 都通过 from backend.app import get_shared_provider 获取共享 provider,但该函数 从未在 backend.app 中定义——provider 实际存放在 app.state.shared["provider"]。 ImportError 被调用方的 except Exception 静默吞掉,导致: - ask 永远走检索结果拼接回退,不产生自然语言回答 - compile 永远原样返回未编译内容 - 日志无任何报错,难以察觉 修复:在 backend.app 中按 get_tool_registry 的既有模式补充 get_shared_provider();lifespan 启动前返回 None 由调用方降级。 调用点无需改动。附回归测试。
45 lines
1.6 KiB
Python
45 lines
1.6 KiB
Python
"""get_shared_provider 回归测试。
|
||
|
||
背景:Wiki 的三个 LLM 调用点(Agent 工具 ask、REST /wiki/ask、REST /wiki/compile)
|
||
都通过 `from backend.app import get_shared_provider` 获取共享 provider,但
|
||
backend.app 中从未定义过该函数——provider 实际存放在 `app.state.shared["provider"]`。
|
||
ImportError 被调用方的 `except Exception` 静默吞掉,导致:
|
||
|
||
- ask 永远走「检索结果拼接」回退,不产生自然语言回答;
|
||
- compile 永远原样返回未编译内容;
|
||
- 日志中没有任何报错,问题难以察觉。
|
||
|
||
本文件验证 backend.app 暴露 get_shared_provider,语义与 get_tool_registry 一致:
|
||
lifespan 启动前返回 None(调用方可安全降级),shared 组件就绪后返回共享 provider。
|
||
"""
|
||
|
||
import sys
|
||
from pathlib import Path
|
||
|
||
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
|
||
|
||
from backend.app import app, get_shared_provider # noqa: E402
|
||
|
||
|
||
def test_returns_none_before_lifespan_startup():
|
||
# lifespan 尚未运行时 app.state.shared 不存在,应返回 None 而非抛错
|
||
app.state._state.pop("shared", None)
|
||
assert get_shared_provider() is None
|
||
|
||
|
||
def test_returns_provider_once_shared_components_exist():
|
||
sentinel = object()
|
||
app.state.shared = {"provider": sentinel}
|
||
try:
|
||
assert get_shared_provider() is sentinel
|
||
finally:
|
||
app.state._state.pop("shared", None)
|
||
|
||
|
||
def test_returns_none_when_shared_has_no_provider():
|
||
app.state.shared = {"provider": None}
|
||
try:
|
||
assert get_shared_provider() is None
|
||
finally:
|
||
app.state._state.pop("shared", None)
|