Skip to content

Commit 83e46b9

Browse files
committed
replace deprecated google-generativeai with google-genai
update gemini genai provider with new calls from SDK provider_options specifies any http options suppress unneeded info logging
1 parent 7900db3 commit 83e46b9

File tree

3 files changed

+30
-22
lines changed

3 files changed

+30
-22
lines changed

docker/main/requirements-wheels.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ onnxruntime == 1.22.*
4747
# Embeddings
4848
transformers == 4.45.*
4949
# Generative AI
50-
google-generativeai == 0.8.*
50+
google-genai == 1.58.*
5151
ollama == 0.6.*
5252
openai == 1.65.*
5353
# push notifications

frigate/genai/gemini.py

Lines changed: 28 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
import logging
44
from typing import Optional
55

6-
import google.generativeai as genai
7-
from google.api_core.exceptions import GoogleAPICallError
6+
from google import genai
7+
from google.genai import errors, types
88

99
from frigate.config import GenAIProviderEnum
1010
from frigate.genai import GenAIClient, register_genai_provider
@@ -16,44 +16,51 @@
1616
class GeminiClient(GenAIClient):
1717
"""Generative AI client for Frigate using Gemini."""
1818

19-
provider: genai.GenerativeModel
19+
provider: genai.Client
2020

2121
def _init_provider(self):
2222
"""Initialize the client."""
23-
genai.configure(api_key=self.genai_config.api_key)
24-
return genai.GenerativeModel(
25-
self.genai_config.model, **self.genai_config.provider_options
23+
# Merge provider_options into HttpOptions
24+
http_options_dict = {
25+
"api_version": "v1",
26+
"timeout": int(self.timeout * 1000), # requires milliseconds
27+
}
28+
29+
if isinstance(self.genai_config.provider_options, dict):
30+
http_options_dict.update(self.genai_config.provider_options)
31+
32+
return genai.Client(
33+
api_key=self.genai_config.api_key,
34+
http_options=types.HttpOptions(**http_options_dict),
2635
)
2736

2837
def _send(self, prompt: str, images: list[bytes]) -> Optional[str]:
2938
"""Submit a request to Gemini."""
30-
data = [
31-
{
32-
"mime_type": "image/jpeg",
33-
"data": img,
34-
}
35-
for img in images
39+
contents = [
40+
types.Part.from_bytes(data=img, mime_type="image/jpeg") for img in images
3641
] + [prompt]
3742
try:
3843
# Merge runtime_options into generation_config if provided
3944
generation_config_dict = {"candidate_count": 1}
4045
generation_config_dict.update(self.genai_config.runtime_options)
4146

42-
response = self.provider.generate_content(
43-
data,
44-
generation_config=genai.types.GenerationConfig(
45-
**generation_config_dict
46-
),
47-
request_options=genai.types.RequestOptions(
48-
timeout=self.timeout,
47+
response = self.provider.models.generate_content(
48+
model=self.genai_config.model,
49+
contents=contents,
50+
config=types.GenerateContentConfig(
51+
**generation_config_dict,
4952
),
5053
)
51-
except GoogleAPICallError as e:
54+
except errors.APIError as e:
5255
logger.warning("Gemini returned an error: %s", str(e))
5356
return None
57+
except Exception as e:
58+
logger.warning("An unexpected error occurred with Gemini: %s", str(e))
59+
return None
60+
5461
try:
5562
description = response.text.strip()
56-
except ValueError:
63+
except (ValueError, AttributeError):
5764
# No description was generated
5865
return None
5966
return description

frigate/log.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ def apply_log_levels(default: str, log_levels: dict[str, LogLevel]) -> None:
8989
"ws4py": LogLevel.error,
9090
"PIL": LogLevel.warning,
9191
"numba": LogLevel.warning,
92+
"google_genai.models": LogLevel.warning,
9293
**log_levels,
9394
}
9495

0 commit comments

Comments
 (0)