| from typing import Any, Dict, List, Optional, Union |
|
|
| from pydantic import BaseModel, Field |
|
|
|
|
| |
| def model_to_dict(model: BaseModel) -> Dict[str, Any]: |
| """ |
| 兼容 Pydantic v1 和 v2 的模型转字典方法 |
| - v1: model.dict() |
| - v2: model.model_dump() |
| """ |
| if hasattr(model, 'model_dump'): |
| |
| return model.model_dump() |
| else: |
| |
| return model.dict() |
|
|
|
|
| |
| class Model(BaseModel): |
| id: str |
| object: str = "model" |
| created: Optional[int] = None |
| owned_by: Optional[str] = "google" |
|
|
|
|
| class ModelList(BaseModel): |
| object: str = "list" |
| data: List[Model] |
|
|
|
|
| |
| class OpenAIToolFunction(BaseModel): |
| name: str |
| arguments: str |
|
|
|
|
| class OpenAIToolCall(BaseModel): |
| id: str |
| type: str = "function" |
| function: OpenAIToolFunction |
|
|
|
|
| class OpenAITool(BaseModel): |
| type: str = "function" |
| function: Dict[str, Any] |
|
|
|
|
| class OpenAIChatMessage(BaseModel): |
| role: str |
| content: Union[str, List[Dict[str, Any]], None] = None |
| reasoning_content: Optional[str] = None |
| name: Optional[str] = None |
| tool_calls: Optional[List[OpenAIToolCall]] = None |
| tool_call_id: Optional[str] = None |
|
|
|
|
| class OpenAIChatCompletionRequest(BaseModel): |
| model: str |
| messages: List[OpenAIChatMessage] |
| stream: bool = False |
| temperature: Optional[float] = Field(None, ge=0.0, le=2.0) |
| top_p: Optional[float] = Field(None, ge=0.0, le=1.0) |
| max_tokens: Optional[int] = Field(None, ge=1) |
| stop: Optional[Union[str, List[str]]] = None |
| frequency_penalty: Optional[float] = Field(None, ge=-2.0, le=2.0) |
| presence_penalty: Optional[float] = Field(None, ge=-2.0, le=2.0) |
| n: Optional[int] = Field(1, ge=1, le=128) |
| seed: Optional[int] = None |
| response_format: Optional[Dict[str, Any]] = None |
| top_k: Optional[int] = Field(None, ge=1) |
| tools: Optional[List[OpenAITool]] = None |
| tool_choice: Optional[Union[str, Dict[str, Any]]] = None |
|
|
| class Config: |
| extra = "allow" |
|
|
|
|
| |
| ChatCompletionRequest = OpenAIChatCompletionRequest |
|
|
|
|
| class OpenAIChatCompletionChoice(BaseModel): |
| index: int |
| message: OpenAIChatMessage |
| finish_reason: Optional[str] = None |
| logprobs: Optional[Dict[str, Any]] = None |
|
|
|
|
| class OpenAIChatCompletionResponse(BaseModel): |
| id: str |
| object: str = "chat.completion" |
| created: int |
| model: str |
| choices: List[OpenAIChatCompletionChoice] |
| usage: Optional[Dict[str, int]] = None |
| system_fingerprint: Optional[str] = None |
|
|
|
|
| class OpenAIDelta(BaseModel): |
| role: Optional[str] = None |
| content: Optional[str] = None |
| reasoning_content: Optional[str] = None |
|
|
|
|
| class OpenAIChatCompletionStreamChoice(BaseModel): |
| index: int |
| delta: OpenAIDelta |
| finish_reason: Optional[str] = None |
| logprobs: Optional[Dict[str, Any]] = None |
|
|
|
|
| class OpenAIChatCompletionStreamResponse(BaseModel): |
| id: str |
| object: str = "chat.completion.chunk" |
| created: int |
| model: str |
| choices: List[OpenAIChatCompletionStreamChoice] |
| system_fingerprint: Optional[str] = None |
|
|
|
|
| |
| class GeminiPart(BaseModel): |
| text: Optional[str] = None |
| inlineData: Optional[Dict[str, Any]] = None |
| fileData: Optional[Dict[str, Any]] = None |
| thought: Optional[bool] = False |
|
|
|
|
| class GeminiContent(BaseModel): |
| role: str |
| parts: List[GeminiPart] |
|
|
|
|
| class GeminiSystemInstruction(BaseModel): |
| parts: List[GeminiPart] |
|
|
|
|
| class GeminiImageConfig(BaseModel): |
| """图片生成配置""" |
| aspect_ratio: Optional[str] = None |
| image_size: Optional[str] = None |
|
|
|
|
| class GeminiGenerationConfig(BaseModel): |
| temperature: Optional[float] = Field(None, ge=0.0, le=2.0) |
| topP: Optional[float] = Field(None, ge=0.0, le=1.0) |
| topK: Optional[int] = Field(None, ge=1) |
| maxOutputTokens: Optional[int] = Field(None, ge=1) |
| stopSequences: Optional[List[str]] = None |
| responseMimeType: Optional[str] = None |
| responseSchema: Optional[Dict[str, Any]] = None |
| candidateCount: Optional[int] = Field(None, ge=1, le=8) |
| seed: Optional[int] = None |
| frequencyPenalty: Optional[float] = Field(None, ge=-2.0, le=2.0) |
| presencePenalty: Optional[float] = Field(None, ge=-2.0, le=2.0) |
| thinkingConfig: Optional[Dict[str, Any]] = None |
| |
| response_modalities: Optional[List[str]] = None |
| image_config: Optional[GeminiImageConfig] = None |
|
|
|
|
| class GeminiSafetySetting(BaseModel): |
| category: str |
| threshold: str |
|
|
|
|
| class GeminiRequest(BaseModel): |
| contents: List[GeminiContent] |
| systemInstruction: Optional[GeminiSystemInstruction] = None |
| generationConfig: Optional[GeminiGenerationConfig] = None |
| safetySettings: Optional[List[GeminiSafetySetting]] = None |
| tools: Optional[List[Dict[str, Any]]] = None |
| toolConfig: Optional[Dict[str, Any]] = None |
| cachedContent: Optional[str] = None |
|
|
| class Config: |
| extra = "allow" |
|
|
|
|
| class GeminiCandidate(BaseModel): |
| content: GeminiContent |
| finishReason: Optional[str] = None |
| index: int = 0 |
| safetyRatings: Optional[List[Dict[str, Any]]] = None |
| citationMetadata: Optional[Dict[str, Any]] = None |
| tokenCount: Optional[int] = None |
|
|
|
|
| class GeminiUsageMetadata(BaseModel): |
| promptTokenCount: Optional[int] = None |
| candidatesTokenCount: Optional[int] = None |
| totalTokenCount: Optional[int] = None |
|
|
|
|
| class GeminiResponse(BaseModel): |
| candidates: List[GeminiCandidate] |
| usageMetadata: Optional[GeminiUsageMetadata] = None |
| modelVersion: Optional[str] = None |
|
|
|
|
| |
| class ClaudeContentBlock(BaseModel): |
| type: str |
| text: Optional[str] = None |
| source: Optional[Dict[str, Any]] = None |
| id: Optional[str] = None |
| name: Optional[str] = None |
| input: Optional[Dict[str, Any]] = None |
| tool_use_id: Optional[str] = None |
| content: Optional[Union[str, List[Dict[str, Any]]]] = None |
|
|
|
|
| class ClaudeMessage(BaseModel): |
| role: str |
| content: Union[str, List[ClaudeContentBlock]] |
|
|
|
|
| class ClaudeTool(BaseModel): |
| name: str |
| description: Optional[str] = None |
| input_schema: Dict[str, Any] |
|
|
|
|
| class ClaudeMetadata(BaseModel): |
| user_id: Optional[str] = None |
|
|
|
|
| class ClaudeRequest(BaseModel): |
| model: str |
| messages: List[ClaudeMessage] |
| max_tokens: int = Field(..., ge=1) |
| system: Optional[Union[str, List[Dict[str, Any]]]] = None |
| temperature: Optional[float] = Field(None, ge=0.0, le=1.0) |
| top_p: Optional[float] = Field(None, ge=0.0, le=1.0) |
| top_k: Optional[int] = Field(None, ge=1) |
| stop_sequences: Optional[List[str]] = None |
| stream: bool = False |
| metadata: Optional[ClaudeMetadata] = None |
| tools: Optional[List[ClaudeTool]] = None |
| tool_choice: Optional[Union[str, Dict[str, Any]]] = None |
|
|
| class Config: |
| extra = "allow" |
|
|
|
|
| class ClaudeUsage(BaseModel): |
| input_tokens: int |
| output_tokens: int |
|
|
|
|
| class ClaudeResponse(BaseModel): |
| id: str |
| type: str = "message" |
| role: str = "assistant" |
| content: List[ClaudeContentBlock] |
| model: str |
| stop_reason: Optional[str] = None |
| stop_sequence: Optional[str] = None |
| usage: ClaudeUsage |
|
|
|
|
| class ClaudeStreamEvent(BaseModel): |
| type: str |
| message: Optional[ClaudeResponse] = None |
| index: Optional[int] = None |
| content_block: Optional[ClaudeContentBlock] = None |
| delta: Optional[Dict[str, Any]] = None |
| usage: Optional[ClaudeUsage] = None |
|
|
| class Config: |
| extra = "allow" |
|
|
|
|
| |
| class APIError(BaseModel): |
| message: str |
| type: str = "api_error" |
| code: Optional[int] = None |
|
|
|
|
| class ErrorResponse(BaseModel): |
| error: APIError |
|
|
|
|
| |
| class SystemStatus(BaseModel): |
| status: str |
| timestamp: str |
| credentials: Dict[str, int] |
| config: Dict[str, Any] |
| current_credential: str |
|
|
|
|
| class CredentialInfo(BaseModel): |
| filename: str |
| project_id: Optional[str] = None |
| status: Dict[str, Any] |
| size: Optional[int] = None |
| modified_time: Optional[str] = None |
| error: Optional[str] = None |
|
|
|
|
| class LogEntry(BaseModel): |
| timestamp: str |
| level: str |
| message: str |
| module: Optional[str] = None |
|
|
|
|
| class ConfigValue(BaseModel): |
| key: str |
| value: Any |
| env_locked: bool = False |
| description: Optional[str] = None |
|
|
|
|
| |
| class AuthRequest(BaseModel): |
| project_id: Optional[str] = None |
| user_session: Optional[str] = None |
|
|
|
|
| class AuthResponse(BaseModel): |
| success: bool |
| auth_url: Optional[str] = None |
| state: Optional[str] = None |
| error: Optional[str] = None |
| credentials: Optional[Dict[str, Any]] = None |
| file_path: Optional[str] = None |
| requires_manual_project_id: Optional[bool] = None |
| requires_project_selection: Optional[bool] = None |
| available_projects: Optional[List[Dict[str, str]]] = None |
|
|
|
|
| class CredentialStatus(BaseModel): |
| disabled: bool = False |
| error_codes: List[int] = [] |
| last_success: Optional[str] = None |
|
|
|
|
| |
| class LoginRequest(BaseModel): |
| password: str |
|
|
|
|
| class AuthStartRequest(BaseModel): |
| project_id: Optional[str] = None |
| mode: Optional[str] = "geminicli" |
|
|
|
|
| class AuthCallbackRequest(BaseModel): |
| project_id: Optional[str] = None |
| mode: Optional[str] = "geminicli" |
|
|
|
|
| class AuthCallbackUrlRequest(BaseModel): |
| callback_url: str |
| project_id: Optional[str] = None |
| mode: Optional[str] = "geminicli" |
|
|
|
|
| class CredFileActionRequest(BaseModel): |
| filename: str |
| action: str |
|
|
|
|
| class CredFileBatchActionRequest(BaseModel): |
| action: str |
| filenames: List[str] |
|
|
|
|
| class ConfigSaveRequest(BaseModel): |
| config: dict |
|
|