mirror of
https://github.com/fawney19/Aether.git
synced 2026-09-02 17:30:23 +08:00
- 移除 token/latency Prometheus 指标的 model 标签,避免 provider x model 笛卡尔积 - HealthMonitor 滑动窗口从 DB JSON 迁移至进程内存,减少写放大 - ModelCostService 三层缓存增加 500 条上限,超限时清空 - StickyPriority 粘性缓存和健康状态字典增加容量淘汰 - AffinityManager 请求锁字典增加 500 条上限,淘汰空闲锁 - 配额刷新/探测查询使用 defer/load_only 避免加载大 JSON 列 - Alembic 迁移清理 DB 中遗留的 request_results_window 数据 - 同步更新测试适配 batch_get_cooldowns 返回值和批量删除异步化
104 lines
3.1 KiB
Python
104 lines
3.1 KiB
Python
from types import SimpleNamespace
|
|
|
|
import pytest
|
|
|
|
from src.api.admin.endpoints import routes
|
|
from src.api.admin.endpoints.routes import AdminCreateProviderEndpointAdapter
|
|
from src.models.database import Provider, ProviderEndpoint
|
|
from src.models.endpoint_models import ProviderEndpointCreate
|
|
|
|
|
|
class _FakeQuery:
|
|
def __init__(self, result: object | None) -> None:
|
|
self._result = result
|
|
|
|
def filter(self, *_args: object, **_kwargs: object) -> "_FakeQuery":
|
|
return self
|
|
|
|
def first(self) -> object | None:
|
|
return self._result
|
|
|
|
|
|
class _FakeDB:
|
|
def __init__(self, provider: object) -> None:
|
|
self.provider = provider
|
|
self.added: ProviderEndpoint | None = None
|
|
|
|
def query(self, model: object) -> _FakeQuery:
|
|
if model is Provider:
|
|
return _FakeQuery(self.provider)
|
|
if model is ProviderEndpoint:
|
|
return _FakeQuery(None)
|
|
raise AssertionError(f"unexpected model: {model}")
|
|
|
|
def add(self, obj: ProviderEndpoint) -> None:
|
|
self.added = obj
|
|
|
|
def commit(self) -> None:
|
|
return None
|
|
|
|
def refresh(self, _obj: ProviderEndpoint) -> None:
|
|
return None
|
|
|
|
|
|
async def _noop_invalidate_cache() -> None:
|
|
return None
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_create_endpoint_injects_default_body_rules_when_missing(
|
|
monkeypatch: pytest.MonkeyPatch,
|
|
) -> None:
|
|
monkeypatch.setattr(routes, "invalidate_models_list_cache", _noop_invalidate_cache)
|
|
monkeypatch.setattr(
|
|
routes,
|
|
"get_default_body_rules_for_endpoint",
|
|
lambda _fmt, **_kw: [{"action": "drop", "path": "max_output_tokens"}],
|
|
)
|
|
|
|
db = _FakeDB(
|
|
provider=SimpleNamespace(id="p1", name="P1", provider_type="custom"),
|
|
)
|
|
adapter = AdminCreateProviderEndpointAdapter(
|
|
provider_id="p1",
|
|
endpoint_data=ProviderEndpointCreate(
|
|
provider_id="p1",
|
|
api_format="openai:cli",
|
|
base_url="https://api.example.com",
|
|
),
|
|
)
|
|
|
|
await adapter.handle(SimpleNamespace(db=db)) # type: ignore[arg-type]
|
|
assert db.added is not None
|
|
assert db.added.body_rules == [{"action": "drop", "path": "max_output_tokens"}]
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_create_endpoint_keeps_user_body_rules_when_provided(
|
|
monkeypatch: pytest.MonkeyPatch,
|
|
) -> None:
|
|
monkeypatch.setattr(routes, "invalidate_models_list_cache", _noop_invalidate_cache)
|
|
monkeypatch.setattr(
|
|
routes,
|
|
"get_default_body_rules_for_endpoint",
|
|
lambda _fmt, **_kw: [{"action": "drop", "path": "max_output_tokens"}],
|
|
)
|
|
|
|
user_rules = [{"action": "set", "path": "metadata.source", "value": "user"}]
|
|
db = _FakeDB(
|
|
provider=SimpleNamespace(id="p1", name="P1", provider_type="custom"),
|
|
)
|
|
adapter = AdminCreateProviderEndpointAdapter(
|
|
provider_id="p1",
|
|
endpoint_data=ProviderEndpointCreate(
|
|
provider_id="p1",
|
|
api_format="openai:cli",
|
|
base_url="https://api.example.com",
|
|
body_rules=user_rules,
|
|
),
|
|
)
|
|
|
|
await adapter.handle(SimpleNamespace(db=db)) # type: ignore[arg-type]
|
|
assert db.added is not None
|
|
assert db.added.body_rules == user_rules
|