refactor(api_format): 重构为结构化的 (ApiFamily, EndpointKind) 标识体系

将扁平的 APIFormat 枚举 (CLAUDE, OPENAI, GEMINI, *_CLI) 重构为二维结构:
- ApiFamily: 协议族 (openai, claude, gemini)
- EndpointKind: 端点变体 (chat, cli, video, image)

新增 EndpointSignature 数据类和 `family:kind` 签名键工具函数,
统一 JSON dict/metrics/logs 中的字符串标识格式。
This commit is contained in:
fawney19
2026-02-01 17:25:28 +08:00
parent 2101a957ce
commit c246ccfc91
51 changed files with 1078 additions and 869 deletions

View File

@@ -0,0 +1,41 @@
import pytest
from src.core.api_format.enums import ApiFamily, EndpointKind
from src.core.api_format.signature import (
EndpointSignature,
make_signature_key,
normalize_endpoint_signature,
normalize_signature_key,
parse_signature_key,
)
def test_make_signature_key_accepts_enums_and_strings() -> None:
assert make_signature_key(ApiFamily.OPENAI, EndpointKind.CHAT) == "openai:chat"
assert make_signature_key("OpenAI", "CHAT") == "openai:chat"
def test_parse_signature_key_roundtrip() -> None:
sig = parse_signature_key("OpenAI:CHAT")
assert sig.api_family == ApiFamily.OPENAI
assert sig.endpoint_kind == EndpointKind.CHAT
assert sig.key == "openai:chat"
def test_parse_signature_key_invalid_raises() -> None:
with pytest.raises(ValueError):
parse_signature_key("OPENAI") # missing ':'
def test_normalize_signature_key() -> None:
assert normalize_signature_key(" OpenAI:CHAT ") == "openai:chat"
def test_normalize_endpoint_signature_tuple_input() -> None:
sig = normalize_endpoint_signature((ApiFamily.GEMINI, EndpointKind.VIDEO))
assert sig == EndpointSignature(api_family=ApiFamily.GEMINI, endpoint_kind=EndpointKind.VIDEO)
def test_normalize_endpoint_signature_invalid_string_returns_default() -> None:
default = EndpointSignature(api_family=ApiFamily.CLAUDE, endpoint_kind=EndpointKind.CHAT)
assert normalize_endpoint_signature("not-a-signature", default=default) == default