-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathcompat.py
More file actions
154 lines (114 loc) · 5 KB
/
compat.py
File metadata and controls
154 lines (114 loc) · 5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
"""兼容层抽象类型 — 供应商无关的 Claude/Anthropic 语义模型.
从 :mod:`coding.proxy.compat.canonical` 和
:mod:`coding.proxy.compat.session_store` 正交提取纯声明式类型定义。
构建逻辑(如 ``build_canonical_request()``)和持久化管理器(如
``CompatSessionStore``)保留在原模块。
"""
from __future__ import annotations
from dataclasses import dataclass, field
from enum import StrEnum
from typing import Any
# ═══════════════════════════════════════════════════════════════
# 消息部分类型体系
# ═══════════════════════════════════════════════════════════════
class CanonicalPartType(StrEnum):
"""规范消息部分的类型枚举."""
TEXT = "text"
THINKING = "thinking"
IMAGE = "image"
TOOL_USE = "tool_use"
TOOL_RESULT = "tool_result"
UNKNOWN = "unknown"
@dataclass(frozen=True)
class CanonicalThinking:
"""思考(extended thinking)能力参数."""
enabled: bool = False
budget_tokens: int | None = None
effort: str | None = None
source_field: str | None = None
@dataclass(frozen=True)
class CanonicalToolCall:
"""工具调用记录."""
tool_id: str
name: str
arguments: dict[str, Any] = field(default_factory=dict)
provider_tool_id: str | None = None
provider_kind: str = "function"
@dataclass(frozen=True)
class CanonicalMessagePart:
"""规范化的消息内容块."""
type: CanonicalPartType
role: str
text: str = ""
tool_call: CanonicalToolCall | None = None
tool_result_id: str | None = None
raw_block: dict[str, Any] | None = None
@dataclass(frozen=True)
class CanonicalRequest:
"""规范化的完整请求抽象."""
session_key: str
trace_id: str
request_id: str
model: str
messages: list[CanonicalMessagePart]
thinking: CanonicalThinking
metadata: dict[str, Any]
tool_names: list[str]
supports_json_output: bool
# ═══════════════════════════════════════════════════════════════
# 兼容性评估类型体系
# ═══════════════════════════════════════════════════════════════
class CompatibilityStatus(StrEnum):
"""供应商对某语义特性的兼容状态."""
NATIVE = "native"
SIMULATED = "simulated"
UNSAFE = "unsafe"
UNKNOWN = "unknown"
@dataclass(frozen=True)
class CompatibilityProfile:
"""供应商各维度的兼容性画像."""
thinking: CompatibilityStatus = CompatibilityStatus.UNKNOWN
tool_calling: CompatibilityStatus = CompatibilityStatus.UNKNOWN
tool_streaming: CompatibilityStatus = CompatibilityStatus.UNKNOWN
mcp_tools: CompatibilityStatus = CompatibilityStatus.UNKNOWN
images: CompatibilityStatus = CompatibilityStatus.UNKNOWN
metadata: CompatibilityStatus = CompatibilityStatus.UNKNOWN
json_output: CompatibilityStatus = CompatibilityStatus.UNKNOWN
usage_tokens: CompatibilityStatus = CompatibilityStatus.UNKNOWN
@dataclass(frozen=True)
class CompatibilityDecision:
"""单次请求的兼容性决策结果."""
status: CompatibilityStatus
simulation_actions: list[str] = field(default_factory=list)
unsupported_semantics: list[str] = field(default_factory=list)
@dataclass
class CompatibilityTrace:
"""兼容性处理链路追踪记录."""
trace_id: str
vendor: str
session_key: str
provider_protocol: str
compat_mode: str
simulation_actions: list[str] = field(default_factory=list)
unsupported_semantics: list[str] = field(default_factory=list)
session_state_hits: int = 0
request_adaptations: list[str] = field(default_factory=list)
generated_at_unix: int = field(
default_factory=lambda: int(__import__("time").time())
)
def to_dict(self) -> dict[str, Any]:
from dataclasses import asdict
return asdict(self)
# ═══════════════════════════════════════════════════════════════
# 会话状态记录
# ═══════════════════════════════════════════════════════════════
@dataclass
class CompatSessionRecord:
"""兼容层会话持久化记录."""
session_key: str
trace_id: str = ""
tool_call_map: dict[str, str] = field(default_factory=dict)
thought_signature_map: dict[str, str] = field(default_factory=dict)
provider_state: dict[str, Any] = field(default_factory=dict)
state_version: int = 1
updated_at_unix: int = 0