Files
Aether/tests/services/test_provider_transport_claude_code.py
fawney19 579b5e4623 feat(provider): 增加 Claude Code 适配器、高级配置能力与 OAuth 账号类型统一解析
- 新增 Claude Code provider adapter (context, envelope, plugin, constants)
- 扩展 provider admin 路由,支持 Claude Code 高级配置 (CRUD)
- 统一 OAuth 账号类型解析逻辑,前后端对齐
- 重构 BatchAssignModelsDialog / ModelMappingDialog,简化组件逻辑
- handler 基类增强: request_builder 支持 Claude Code 信封格式
- CLI stream/sync mixin 适配 Claude Code 流式与同步模式
- 扩展 candidate builder / failover / scheduler 对 Claude Code 的支持
- 前端增加请求时间线可视化 (HorizontalRequestTimeline)
- 补充 Claude Code envelope / runtime controls / distributed sessions 等测试

Closes #183
Closes #185

Co-Authored-By: AAEE86 <ppk0227@hotmail.com>
2026-02-27 13:54:46 +08:00

85 lines
2.4 KiB
Python

from __future__ import annotations
from dataclasses import dataclass
from types import SimpleNamespace
import pytest
from src.services.model.upstream_fetcher import UpstreamModelsFetcherRegistry
from src.services.provider.adapters.claude_code.plugin import register_all
from src.services.provider.transport import build_provider_url
@dataclass
class _DummyEndpoint:
base_url: str
api_format: str
custom_path: str | None = None
provider: object | None = None
def test_claude_code_claude_cli_uses_messages_path() -> None:
endpoint = _DummyEndpoint(
base_url="https://api.anthropic.com",
api_format="claude:cli",
provider=SimpleNamespace(provider_type="claude_code"),
)
url = build_provider_url(
endpoint, # type: ignore[arg-type]
path_params={"model": "ignored"},
is_stream=True,
)
assert url == "https://api.anthropic.com/v1/messages"
def test_claude_code_claude_cli_does_not_duplicate_messages_suffix() -> None:
endpoint = _DummyEndpoint(
base_url="https://api.anthropic.com/v1/messages",
api_format="claude:cli",
provider=SimpleNamespace(provider_type="claude_code"),
)
url = build_provider_url(
endpoint, # type: ignore[arg-type]
path_params={"model": "ignored"},
is_stream=False,
)
assert url == "https://api.anthropic.com/v1/messages"
def test_claude_code_claude_cli_appends_query_params() -> None:
endpoint = _DummyEndpoint(
base_url="https://api.anthropic.com/v1",
api_format="claude:cli",
provider=SimpleNamespace(provider_type="claude_code"),
)
url = build_provider_url(
endpoint, # type: ignore[arg-type]
query_params={"beta": "true"},
path_params={"model": "ignored"},
is_stream=False,
)
assert url == "https://api.anthropic.com/v1/messages?beta=true"
@pytest.mark.asyncio
async def test_claude_code_registers_preset_model_fetcher() -> None:
register_all()
fetcher = UpstreamModelsFetcherRegistry.get("claude_code")
assert fetcher is not None
models, errors, has_success, upstream_metadata = await fetcher(SimpleNamespace(), 1.0)
model_ids = {m["id"] for m in models}
assert "claude-sonnet-4-5-20250929" in model_ids
assert "claude-opus-4-6" in model_ids
assert errors == []
assert has_success is True
assert upstream_metadata is None