File size: 2,521 Bytes
95f8c4b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""Structured HTTP response models."""

from __future__ import annotations
from typing import Literal

from pydantic import BaseModel


class ErrorDetail(BaseModel):
    message: str
    type: str = "server_error"


class ErrorResponse(BaseModel):
    error: ErrorDetail


class GeminiUsageMetadata(BaseModel):
    promptTokenCount: int = 0
    candidatesTokenCount: int = 0
    thoughtsTokenCount: int = 0
    totalTokenCount: int = 0


class GeminiFunctionCallPayload(BaseModel):
    name: str
    args: object | None = None


class GeminiFunctionResponsePayload(BaseModel):
    name: str
    response: object | None = None


class GeminiInlineDataResponse(BaseModel):
    mimeType: str
    data: str


class GeminiPartResponse(BaseModel):
    text: str | None = None
    thought: bool | None = None
    inlineData: GeminiInlineDataResponse | None = None
    thoughtSignature: str | None = None
    functionCall: GeminiFunctionCallPayload | None = None
    functionResponse: GeminiFunctionResponsePayload | None = None


class GeminiContentResponse(BaseModel):
    role: Literal["model"] = "model"
    parts: list[GeminiPartResponse]


class GeminiCandidateResponse(BaseModel):
    content: GeminiContentResponse
    finishReason: str | None = None


class GeminiGenerateContentResponse(BaseModel):
    candidates: list[GeminiCandidateResponse]
    usageMetadata: GeminiUsageMetadata | None = None


class HealthResponse(BaseModel):
    status: str
    busy: bool


class ModelStatsResponse(BaseModel):
    requests: int
    success: int
    rate_limited: int
    errors: int
    prompt_tokens: int
    completion_tokens: int
    total_tokens: int
    last_used: str | None = None


class StatsTotalsResponse(BaseModel):
    requests: int
    success: int
    rate_limited: int
    errors: int
    prompt_tokens: int
    completion_tokens: int
    total_tokens: int


class StatsResponse(BaseModel):
    models: dict[str, ModelStatsResponse]
    totals: StatsTotalsResponse


class GeminiModelResponse(BaseModel):
    name: str
    version: str | None = "001"
    displayName: str | None = None
    description: str | None = None
    inputTokenLimit: int | None = None
    outputTokenLimit: int | None = None
    supportedGenerationMethods: list[str] = [
        "generateContent",
        "countTokens",
        "createCachedContent",
    ]
    temperature: float | None = None
    topP: float | None = None
    topK: int | None = None


class GeminiModelListResponse(BaseModel):
    models: list[GeminiModelResponse]