pydantic_ai.models.gemini
Custom interface to the generativelanguage.googleapis.com
API using HTTPX and Pydantic.
The Google SDK for interacting with the generativelanguage.googleapis.com
API
google-generativeai
reads like it was written by a
Java developer who thought they knew everything about OOP, spent 30 minutes trying to learn Python,
gave up and decided to build the library to prove how horrible Python is. It also doesn't use httpx for HTTP requests,
and tries to implement tool calling itself, but doesn't use Pydantic or equivalent for validation.
We could also use the Google Vertex SDK,
google-cloud-aiplatform
which uses the *-aiplatform.googleapis.com
API, but that requires a service account for authentication
which is a faff to set up and manage.
Both APIs claim compatibility with OpenAI's API, but that breaks down with even the simplest of requests, hence this custom interface.
Despite these limitations, the Gemini model is actually quite powerful and very fast.
GeminiModelName
module-attribute
GeminiModelName = Literal[
"gemini-1.5-flash",
"gemini-1.5-flash-8b",
"gemini-1.5-pro",
"gemini-1.0-pro",
]
Named Gemini models.
See the Gemini API docs for a full list.
GeminiModel
dataclass
Bases: Model
A model that uses Gemini via generativelanguage.googleapis.com
API.
This is implemented from scratch rather than using a dedicated SDK, good API documentation is available here.
Apart from __init__
, all methods are private or match those of the base class.
__init__
__init__(
model_name: GeminiModelName,
*,
api_key: str | None = None,
http_client: AsyncClient | None = None,
url_template: str = "https://generativelanguage.googleapis.com/v1beta/models/{model}:{function}"
)
Initialize a Gemini model.
Parameters:
Name | Type | Description | Default |
---|---|---|---|
model_name
|
GeminiModelName
|
The name of the model to use. |
required |
api_key
|
str | None
|
The API key to use for authentication, if not provided, the |
None
|
http_client
|
AsyncClient | None
|
An existing |
None
|
url_template
|
str
|
The URL template to use for making requests, you shouldn't need to change this, docs here. |
'https://generativelanguage.googleapis.com/v1beta/models/{model}:{function}'
|
GeminiAgentModel
dataclass
GeminiStreamTextResponse
dataclass
GeminiStreamStructuredResponse
dataclass
Bases: StreamStructuredResponse
Implementation of StreamStructuredResponse
for the Gemini model.
get
get(*, final: bool = False) -> ModelStructuredResponse
Get the ModelStructuredResponse
at this point.
NOTE: It's not clear how the stream of responses should be combined because Gemini seems to always reply with a single response, when returning a structured data.
I'm therefore assuming that each part contains a complete tool call, and not trying to combine data from separate parts.