mirror of
https://github.com/fawney19/Aether.git
synced 2026-09-02 17:30:23 +08:00
fix(admin): 优先级脏检查、base_url 校验、usage detail 延迟加载及导入数据验证
- 前端优先级管理: 保存时对比原始快照,仅提交实际变更的 provider/key 优先级, 并限制并发请求数(SAVE_CONCURRENCY=6),避免无效 API 调用 - handler_adapter_base: _normalize_test_base_url 改为 _validate_test_base_url, 移除对 dict 类型 base_url 的兼容,严格要求字符串输入 - provider_query: 新增 _require_test_endpoint_base_url,在测试链路提前校验 endpoint.base_url 类型和非空 - system.py: 导入 endpoint 时通过 ProviderEndpointCreate 模型校验数据, 拒绝非法 base_url 类型(如 dict) - usage detail: 使用 defer() 延迟加载 body 列,通过 SQL CASE 表达式在 数据库端计算 has_*_body 标记,减少不必要的大字段传输 - provider routes: 新建 provider 时 priority=0 边界处理,clamp 并 shift
This commit is contained in:
@@ -4,59 +4,22 @@ from src.api.handlers.claude.adapter import ClaudeChatAdapter
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_check_endpoint_accepts_base_url_dict(monkeypatch: pytest.MonkeyPatch) -> None:
|
||||
captured: dict[str, object] = {}
|
||||
async def test_check_endpoint_rejects_base_url_dict() -> None:
|
||||
with pytest.raises(TypeError, match="base_url must be a non-empty string"):
|
||||
await ClaudeChatAdapter.check_endpoint(
|
||||
client=None, # type: ignore[arg-type]
|
||||
base_url={"base_url": "https://api.anthropic.com"}, # type: ignore[arg-type]
|
||||
api_key="test-key",
|
||||
request_data={
|
||||
"model": "claude-sonnet-4-5-20250929",
|
||||
"messages": [{"role": "user", "content": "hello"}],
|
||||
"max_tokens": 32,
|
||||
"stream": False,
|
||||
},
|
||||
)
|
||||
|
||||
async def fake_run_endpoint_check(**kwargs):
|
||||
captured.update(kwargs)
|
||||
return {"status_code": 200, "headers": {}, "response_time_ms": 1, "request_id": "test"}
|
||||
|
||||
monkeypatch.setattr(
|
||||
"src.api.handlers.base.endpoint_checker.run_endpoint_check",
|
||||
fake_run_endpoint_check,
|
||||
def test_validate_test_base_url_trims_whitespace() -> None:
|
||||
assert ClaudeChatAdapter._validate_test_base_url(" https://api.anthropic.com/v1 ") == (
|
||||
"https://api.anthropic.com/v1"
|
||||
)
|
||||
|
||||
await ClaudeChatAdapter.check_endpoint(
|
||||
client=None,
|
||||
base_url={"base_url": "https://api.anthropic.com"},
|
||||
api_key="test-key",
|
||||
request_data={
|
||||
"model": "claude-sonnet-4-5-20250929",
|
||||
"messages": [{"role": "user", "content": "hello"}],
|
||||
"max_tokens": 32,
|
||||
"stream": False,
|
||||
},
|
||||
)
|
||||
|
||||
assert captured["url"] == "https://api.anthropic.com/v1/messages"
|
||||
assert isinstance(captured["json_body"], dict)
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_check_endpoint_accepts_url_key_in_base_url_dict(
|
||||
monkeypatch: pytest.MonkeyPatch,
|
||||
) -> None:
|
||||
captured: dict[str, object] = {}
|
||||
|
||||
async def fake_run_endpoint_check(**kwargs):
|
||||
captured.update(kwargs)
|
||||
return {"status_code": 200, "headers": {}, "response_time_ms": 1, "request_id": "test"}
|
||||
|
||||
monkeypatch.setattr(
|
||||
"src.api.handlers.base.endpoint_checker.run_endpoint_check",
|
||||
fake_run_endpoint_check,
|
||||
)
|
||||
|
||||
await ClaudeChatAdapter.check_endpoint(
|
||||
client=None,
|
||||
base_url={"url": "https://api.anthropic.com/v1"},
|
||||
api_key="test-key",
|
||||
request_data={
|
||||
"model": "claude-sonnet-4-5-20250929",
|
||||
"messages": [{"role": "user", "content": "hello"}],
|
||||
"max_tokens": 32,
|
||||
"stream": False,
|
||||
},
|
||||
)
|
||||
|
||||
assert captured["url"] == "https://api.anthropic.com/v1/messages"
|
||||
|
||||
Reference in New Issue
Block a user