| |
| """ |
| API 数据模型定义。 |
| 使用 Pydantic 定义 API 请求体、响应体以及内部使用的数据结构。 |
| """ |
| |
| from typing import List, Dict, Optional, Union, Literal, Any |
| |
| from pydantic import BaseModel, Field |
| |
| from datetime import datetime |
| import time |
|
|
| |
|
|
| |
| class Message(BaseModel): |
| """ |
| 表示聊天消息的结构,兼容 OpenAI API 格式。 |
| """ |
| role: str |
| |
| content: Union[str, List[Dict[str, Any]]] |
|
|
| |
| class ResponseMessage(BaseModel): |
| """ |
| 表示模型响应消息的结构,兼容 OpenAI API 格式,并增加了对工具调用的支持。 |
| """ |
| role: str |
| content: Optional[str] = None |
| tool_calls: Optional[List[Dict[str, Any]]] = None |
|
|
| |
| class ChatCompletionRequest(BaseModel): |
| """ |
| 表示发送给 `/v1/chat/completions` 端点的聊天补全请求结构,兼容 OpenAI API。 |
| """ |
| model: str |
| messages: List[Message] |
| temperature: float = Field(0.7, ge=0.0, le=2.0) |
| top_p: Optional[float] = Field(1.0, ge=0.0, le=1.0) |
| n: int = Field(1, ge=1) |
| stream: bool = False |
| stop: Optional[Union[str, List[str]]] = None |
| max_tokens: Optional[int] = Field(None, ge=1) |
| presence_penalty: Optional[float] = Field(0.0, ge=-2.0, le=2.0) |
| frequency_penalty: Optional[float] = Field(0.0, ge=-2.0, le=2.0) |
| user_id: Optional[str] = None |
|
|
| |
| class Choice(BaseModel): |
| """ |
| 表示聊天补全响应中的一个生成选项 (Choice)。 |
| """ |
| index: int |
| message: ResponseMessage |
| finish_reason: Optional[str] = None |
|
|
| |
| class Usage(BaseModel): |
| """ |
| 表示 API 调用中的 token 使用情况统计。 |
| """ |
| prompt_tokens: int = 0 |
| completion_tokens: int = 0 |
| total_tokens: int = 0 |
|
|
| |
| class ChatCompletionResponse(BaseModel): |
| """ |
| 表示 `/v1/chat/completions` 端点返回的聊天补全响应的整体结构,兼容 OpenAI API。 |
| """ |
| id: str = Field(default_factory=lambda: f"chatcmpl-{int(time.time() * 1000)}") |
| object: Literal["chat.completion"] = "chat.completion" |
| created: int = Field(default_factory=lambda: int(time.time())) |
| model: str |
| choices: List[Choice] |
| usage: Usage = Field(default_factory=Usage) |
|
|
| |
| class ErrorResponse(BaseModel): |
| """ |
| 表示 API 返回错误时的标准响应结构。 |
| """ |
| message: str |
| type: str |
| param: Optional[str] = None |
| code: Optional[str] = None |
|
|
| |
| class ModelData(BaseModel): |
| """表示模型列表中的单个模型信息""" |
| id: str |
| object: str = "model" |
| created: int = Field(default_factory=lambda: int(time.time())) |
| owned_by: str = "organization-owner" |
|
|
| class ModelList(BaseModel): |
| """ |
| 表示 `/v1/models` 端点返回的模型列表响应结构,兼容 OpenAI API。 |
| """ |
| object: str = "list" |
| data: List[ModelData] |
|
|
| |
|
|
| class InlineData(BaseModel): |
| """ |
| 表示 Gemini API 中的内联数据结构,通常用于图像。 |
| """ |
| mime_type: str |
| data: str |
|
|
| class GeminiContentPart(BaseModel): |
| """ |
| 表示 Gemini API 内容 (Content) 中的一个部分 (Part)。 |
| 一个 Part 可以是文本 (`text`) 或内联数据 (`inline_data`) 等。 |
| """ |
| text: Optional[str] = None |
| inline_data: Optional[InlineData] = None |
| |
|
|
| class GeminiContent(BaseModel): |
| """ |
| 表示 Gemini API 对话中的一段内容 (Content)。 |
| 包含发送者角色 ('user' 或 'model') 和一个或多个部分 (parts)。 |
| """ |
| role: Optional[str] = None |
| parts: List[GeminiContentPart] |
|
|
| class GeminiGenerationConfig(BaseModel): |
| """ |
| 表示 Gemini API 的生成配置参数 (`generationConfig`)。 |
| """ |
| temperature: Optional[float] = Field(None, description="控制随机性,范围 [0.0, 2.0]", ge=0.0, le=2.0) |
| top_p: Optional[float] = Field(None, description="核心采样概率阈值,范围 [0.0, 1.0]", ge=0.0, le=1.0) |
| top_k: Optional[int] = Field(None, description="Top-K 采样数量,必须 >= 1", ge=1) |
| candidate_count: Optional[int] = Field(None, description="生成的候选响应数量,必须 >= 1", ge=1) |
| max_output_tokens: Optional[int] = Field(None, description="最大输出 token 数量,必须 >= 1", ge=1) |
| stop_sequences: Optional[List[str]] = Field(None, description="停止生成的序列列表") |
|
|
| class GeminiSafetySetting(BaseModel): |
| """ |
| 表示 Gemini API 的安全设置 (`safetySettings`) 中的一项。 |
| 用于指定某个安全类别的内容过滤阈值。 |
| """ |
| category: str |
| threshold: str |
|
|
| class GeminiSafetyRating(BaseModel): |
| """ |
| 表示 Gemini API 返回的安全评分 (`safetyRatings`) 中的一项。 |
| 指示生成内容在某个安全类别上的风险概率。 |
| """ |
| category: str |
| probability: str |
| blocked: Optional[bool] = None |
|
|
| class GeminiPromptFeedback(BaseModel): |
| """ |
| 表示 Gemini API 对输入提示 (`prompt`) 的反馈信息 (`promptFeedback`)。 |
| 主要包含安全相关的评分和阻止原因。 |
| """ |
| safety_ratings: Optional[List[GeminiSafetyRating]] = None |
| block_reason: Optional[str] = None |
|
|
| class GeminiCandidate(BaseModel): |
| """ |
| 表示 Gemini API 生成的单个响应候选 (`candidates`)。 |
| """ |
| content: Optional[GeminiContent] = None |
| finish_reason: Optional[str] = None |
| safety_ratings: Optional[List[GeminiSafetyRating]] = None |
| citation_metadata: Optional[Dict[str, Any]] = None |
| |
|
|
| class GeminiGenerateContentRequestV2(BaseModel): |
| """ |
| 表示发送给 Gemini 原生 API `/v2/models/{model}:generateContent` 端点的请求体结构。 |
| """ |
| contents: List[GeminiContent] |
| generation_config: Optional[GeminiGenerationConfig] = None |
| safety_settings: Optional[List[GeminiSafetySetting]] = None |
| |
|
|
| class GeminiGenerateContentResponseV2(BaseModel): |
| """ |
| 表示 Gemini 原生 API `/v2/models/{model}:generateContent` 端点返回的响应体结构。 |
| """ |
| candidates: Optional[List[GeminiCandidate]] = None |
| prompt_feedback: Optional[GeminiPromptFeedback] = None |
| usage_metadata: Optional[Dict[str, Any]] = None |
|
|
| |
|
|
| class CachedContentEntry(BaseModel): |
| """ |
| 表示数据库中缓存条目的 Pydantic 模型,用于 API 响应。 |
| """ |
| id: int |
| gemini_cache_id: str |
| content_hash: str |
| api_key_id: Optional[int] = None |
| user_id: Optional[str] = None |
| created_at: datetime |
| expires_at: datetime |
| last_used_at: Optional[datetime] = None |
| usage_count: Optional[int] = 0 |
|
|
| class Config: |
| from_attributes = True |
|
|
| class CacheListResponse(BaseModel): |
| """ |
| 表示缓存列表 API (`/cache`) 的响应模型。 |
| """ |
| total: int |
| caches: List[CachedContentEntry] |
|
|
| |
| |
| class CacheEntryResponse(BaseModel): |
| """ |
| 表示单个缓存条目的响应模型 (与 CachedContentEntry 结构相同,但用于 API 响应类型提示)。 |
| """ |
| id: int |
| gemini_cache_id: str |
| content_hash: str |
| api_key_id: Optional[int] = None |
| user_id: Optional[str] = None |
| created_at: datetime |
| expires_at: datetime |
| last_used_at: Optional[datetime] = None |
| usage_count: Optional[int] = 0 |
|
|
| class Config: |
| from_attributes = True |
|
|