mirror of
https://github.com/fawney19/Aether.git
synced 2026-09-02 17:30:23 +08:00
feat: 扩展 Rust gateway 全功能模块,新增 billing/crypto/wallet crate 及完整数据层
- 新增 aether-billing、aether-crypto、aether-wallet 独立 crate - aether-data 扩展 repository 层:announcements、auth_modules、billing、 candidate_selection、gemini_file_mappings、global_models、management_tokens、 oauth_providers、proxy_nodes、quota、users、wallet 等模块 - aether-gateway 新增 api/auth/billing/control/middleware/scheduler/usage/ video_tasks/hooks/maintenance/model_fetch/provider_transport 等功能模块 - 重构 executor decision 和 gateway state 为模块目录结构 - 新增 gateway router、frontdoor 路由层及对应测试 - Python 侧 API 路由重构,新增 compat/support 模块 - 前端 Logo 组件更新及 Provider 管理页面调整
This commit is contained in:
117
tests/api/public/test_gemini_shell.py
Normal file
117
tests/api/public/test_gemini_shell.py
Normal file
@@ -0,0 +1,117 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from typing import Any
|
||||
|
||||
import pytest
|
||||
from starlette.requests import Request
|
||||
|
||||
|
||||
def _make_request(path: str, method: str = "POST", headers: list[tuple[bytes, bytes]] | None = None) -> Request:
|
||||
scope = {
|
||||
"type": "http",
|
||||
"asgi": {"version": "3.0"},
|
||||
"http_version": "1.1",
|
||||
"method": method,
|
||||
"scheme": "http",
|
||||
"path": path,
|
||||
"raw_path": path.encode(),
|
||||
"query_string": b"",
|
||||
"headers": headers or [],
|
||||
"client": ("127.0.0.1", 12345),
|
||||
"server": ("testserver", 80),
|
||||
}
|
||||
return Request(scope)
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
@pytest.mark.parametrize(
|
||||
("route", "model", "stream"),
|
||||
[
|
||||
("v1beta_generate", "gemini-2.5-flash", False),
|
||||
("v1beta_stream", "gemini-2.5-flash", True),
|
||||
("v1_generate", "gemini-2.5-flash", False),
|
||||
("v1_stream", "gemini-2.5-flash", True),
|
||||
],
|
||||
)
|
||||
async def test_public_gemini_routes_use_pipeline_shell(
|
||||
monkeypatch: pytest.MonkeyPatch,
|
||||
route: str,
|
||||
model: str,
|
||||
stream: bool,
|
||||
) -> None:
|
||||
from src.api.public import gemini as mod
|
||||
|
||||
captured: dict[str, Any] = {}
|
||||
|
||||
async def fake_run(*, adapter, http_request, db, mode, api_format_hint, path_params, **_kwargs):
|
||||
captured.update(
|
||||
{
|
||||
"adapter": adapter,
|
||||
"request": http_request,
|
||||
"db": db,
|
||||
"mode": mode,
|
||||
"api_format_hint": api_format_hint,
|
||||
"path_params": path_params,
|
||||
}
|
||||
)
|
||||
return {"ok": True}
|
||||
|
||||
monkeypatch.setattr(mod.pipeline, "run", fake_run)
|
||||
|
||||
db = object()
|
||||
request = _make_request(f"/{route}")
|
||||
|
||||
if route == "v1beta_generate":
|
||||
result = await mod.generate_content(model=model, http_request=request, db=db)
|
||||
elif route == "v1beta_stream":
|
||||
result = await mod.stream_generate_content(model=model, http_request=request, db=db)
|
||||
elif route == "v1_generate":
|
||||
result = await mod.generate_content_v1(model=model, http_request=request, db=db)
|
||||
else:
|
||||
result = await mod.stream_generate_content_v1(model=model, http_request=request, db=db)
|
||||
|
||||
assert result == {"ok": True}
|
||||
assert isinstance(captured["adapter"], mod.PublicGeminiContentAdapter)
|
||||
assert captured["adapter"].model == model
|
||||
assert captured["adapter"].stream is stream
|
||||
assert captured["request"] is request
|
||||
assert captured["db"] is db
|
||||
assert captured["mode"] == captured["adapter"].mode
|
||||
assert captured["api_format_hint"] == "gemini:chat"
|
||||
assert captured["path_params"] == {"model": model, "stream": stream}
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_public_gemini_shell_detects_cli_request_for_api_format_hint(
|
||||
monkeypatch: pytest.MonkeyPatch,
|
||||
) -> None:
|
||||
from src.api.public import gemini as mod
|
||||
|
||||
captured: dict[str, Any] = {}
|
||||
|
||||
async def fake_run(*, adapter, http_request, db, mode, api_format_hint, path_params, **_kwargs):
|
||||
captured.update(
|
||||
{
|
||||
"adapter": adapter,
|
||||
"request": http_request,
|
||||
"db": db,
|
||||
"mode": mode,
|
||||
"api_format_hint": api_format_hint,
|
||||
"path_params": path_params,
|
||||
}
|
||||
)
|
||||
return {"ok": True}
|
||||
|
||||
monkeypatch.setattr(mod.pipeline, "run", fake_run)
|
||||
|
||||
request = _make_request(
|
||||
"/v1beta/models/gemini-2.5-flash:generateContent",
|
||||
headers=[(b"x-app", b"gemini-cli")],
|
||||
)
|
||||
|
||||
result = await mod.generate_content(model="gemini-2.5-flash", http_request=request, db=object())
|
||||
|
||||
assert result == {"ok": True}
|
||||
assert isinstance(captured["adapter"], mod.PublicGeminiContentAdapter)
|
||||
assert captured["api_format_hint"] == "gemini:cli"
|
||||
assert captured["path_params"] == {"model": "gemini-2.5-flash", "stream": False}
|
||||
Reference in New Issue
Block a user