2026-01-30 03:10:21 +08:00
|
|
|
|
from typing import Any, Literal
|
2025-12-10 20:52:44 +08:00
|
|
|
|
|
2026-01-30 03:10:21 +08:00
|
|
|
|
from pydantic import BaseModel, ConfigDict
|
2025-12-10 20:52:44 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 配置允许额外字段,以支持API的新特性
|
|
|
|
|
|
class BaseModelWithExtras(BaseModel):
|
|
|
|
|
|
model_config = ConfigDict(extra="allow")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ClaudeContentBlockText(BaseModelWithExtras):
|
|
|
|
|
|
type: Literal["text"]
|
|
|
|
|
|
text: str
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ClaudeContentBlockImage(BaseModelWithExtras):
|
|
|
|
|
|
type: Literal["image"]
|
2026-01-30 03:10:21 +08:00
|
|
|
|
source: dict[str, Any]
|
2025-12-10 20:52:44 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ClaudeContentBlockToolUse(BaseModelWithExtras):
|
|
|
|
|
|
type: Literal["tool_use"]
|
|
|
|
|
|
id: str
|
|
|
|
|
|
name: str
|
2026-01-30 03:10:21 +08:00
|
|
|
|
input: dict[str, Any]
|
2025-12-10 20:52:44 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ClaudeContentBlockToolResult(BaseModelWithExtras):
|
|
|
|
|
|
type: Literal["tool_result"]
|
|
|
|
|
|
tool_use_id: str
|
2026-01-30 03:10:21 +08:00
|
|
|
|
content: str | list[dict[str, Any]] | dict[str, Any]
|
2025-12-10 20:52:44 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ClaudeContentBlockThinking(BaseModelWithExtras):
|
|
|
|
|
|
type: Literal["thinking"]
|
|
|
|
|
|
thinking: str
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ClaudeSystemContent(BaseModelWithExtras):
|
|
|
|
|
|
type: Literal["text"]
|
|
|
|
|
|
text: str
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ClaudeMessage(BaseModelWithExtras):
|
|
|
|
|
|
role: Literal["user", "assistant"]
|
|
|
|
|
|
# 宽松的内容类型定义 - 接受字符串或任意字典列表
|
|
|
|
|
|
# 作为转发代理,不应该严格限制内容块类型,以支持API的新特性
|
2026-01-30 03:10:21 +08:00
|
|
|
|
content: str | list[dict[str, Any]]
|
2025-12-10 20:52:44 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ClaudeTool(BaseModelWithExtras):
|
|
|
|
|
|
name: str
|
2026-01-30 03:10:21 +08:00
|
|
|
|
description: str | None = None
|
|
|
|
|
|
input_schema: dict[str, Any]
|
2025-12-10 20:52:44 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ClaudeThinkingConfig(BaseModelWithExtras):
|
|
|
|
|
|
enabled: bool = True
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ClaudeMessagesRequest(BaseModelWithExtras):
|
|
|
|
|
|
model: str
|
|
|
|
|
|
max_tokens: int
|
2026-01-30 03:10:21 +08:00
|
|
|
|
messages: list[ClaudeMessage]
|
2025-12-10 20:52:44 +08:00
|
|
|
|
# 宽松的system类型 - 接受字符串、字典列表或任意字典
|
2026-01-30 03:10:21 +08:00
|
|
|
|
system: str | list[dict[str, Any]] | dict[str, Any] | None = None
|
|
|
|
|
|
stop_sequences: list[str] | None = None
|
|
|
|
|
|
stream: bool | None = False
|
|
|
|
|
|
temperature: float | None = 1.0
|
|
|
|
|
|
top_p: float | None = None
|
|
|
|
|
|
top_k: int | None = None
|
|
|
|
|
|
metadata: dict[str, Any] | None = None
|
|
|
|
|
|
tools: list[dict[str, Any]] | None = None # 改为更宽松的类型
|
|
|
|
|
|
tool_choice: dict[str, Any] | None = None
|
|
|
|
|
|
thinking: dict[str, Any] | None = None # 改为更宽松的类型
|
2025-12-10 20:52:44 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ClaudeTokenCountRequest(BaseModelWithExtras):
|
|
|
|
|
|
model: str
|
2026-01-30 03:10:21 +08:00
|
|
|
|
messages: list[ClaudeMessage]
|
2025-12-10 20:52:44 +08:00
|
|
|
|
# 宽松的类型定义以支持API新特性
|
2026-01-30 03:10:21 +08:00
|
|
|
|
system: str | list[dict[str, Any]] | dict[str, Any] | None = None
|
|
|
|
|
|
tools: list[dict[str, Any]] | None = None
|
|
|
|
|
|
thinking: dict[str, Any] | None = None
|
|
|
|
|
|
tool_choice: dict[str, Any] | None = None
|
2025-12-10 20:52:44 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
|
|
|
|
|
# 响应模型
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ClaudeResponseUsage(BaseModelWithExtras):
|
|
|
|
|
|
"""Claude 响应 token 使用量"""
|
|
|
|
|
|
|
|
|
|
|
|
input_tokens: int = 0
|
|
|
|
|
|
output_tokens: int = 0
|
2026-01-30 03:10:21 +08:00
|
|
|
|
cache_creation_input_tokens: int | None = None
|
|
|
|
|
|
cache_read_input_tokens: int | None = None
|
2025-12-10 20:52:44 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ClaudeResponse(BaseModelWithExtras):
|
|
|
|
|
|
"""
|
|
|
|
|
|
Claude Messages API 响应模型
|
|
|
|
|
|
|
|
|
|
|
|
对应 POST /v1/messages 端点的响应体。
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
id: str
|
|
|
|
|
|
model: str
|
|
|
|
|
|
type: Literal["message"] = "message"
|
|
|
|
|
|
role: Literal["assistant"] = "assistant"
|
2026-01-30 03:10:21 +08:00
|
|
|
|
content: list[dict[str, Any]]
|
|
|
|
|
|
stop_reason: str | None = None
|
|
|
|
|
|
stop_sequence: str | None = None
|
|
|
|
|
|
usage: ClaudeResponseUsage | None = None
|
|
|
|
|
|
context_management: dict[str, Any] | None = None
|
|
|
|
|
|
container: dict[str, Any] | None = None
|