Automatic function calling rejects `datetime` and `UUID` arguments
Maintainer antworten meist innerhalb von 1 Tag
Bewertung
- Schwierigkeit
- 3/5
- Geschätzter Aufwand
- 1-2 Tage
- Anfängerfreundlichkeit
- 75/100
- Issue-Typ
- Bug
- Klarheit
- Klar beschrieben
- Aktivitätsstatus
- Aktiv
- Tech-Stack
- python
- Bereich
- backend-api-design
Rechercherichtung
Start by reading convert_if_exist_pydantic_model, which the issue identifies as the point rejecting JSON strings for datetime and UUID, and compare its validation with the pydantic schema generation. Check the automatic function calling tests for argument conversion and add coverage for both types. Done when valid schema-compatible strings reach the tool as converted arguments and the tests pass.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
Environment details
- Programming language: Python
- OS: macOS
- Language runtime version: Python 3.12.13
- Package version: google-genai 3.0.0 (same on 2.24.0 and
main)
Steps to reproduce
With automatic function calling, a tool that takes a datetime or a UUID never runs. The declaration tells the model to send a date-time (or uuid) string, the model does, and google-genai rejects it.
This fakes the Gemini API, so no key is needed:
import datetime, json, uuid
import httpx
from google import genai
from google.genai import types
ran, sent = [], []
def schedule(when: datetime.datetime, job_id: uuid.UUID) -> str:
"""Schedule a job."""
ran.append(True)
return "ok"
def fake_gemini(request):
sent.append(json.loads(request.content))
args = {"when": "2026-11-10T09:30:00Z", "job_id": "12345678-1234-5678-1234-567812345678"}
part = {"functionCall": {"name": "schedule", "args": args}} if len(sent) == 1 else {"text": "done"}
return httpx.Response(200, json={"candidates": [{"content": {"role": "model", "parts": [part]}}]})
client = genai.Client(
api_key="fake",
http_options=types.HttpOptions(httpx_client=httpx.Client(transport=httpx.MockTransport(fake_gemini))),
)
client.models.generate_content(
model="gemini-2.5-flash", contents="Schedule it.", config=types.GenerateContentConfig(tools=[schedule])
)
print("declared:", sent[0]["tools"][0]["functionDeclarations"][0]["parameters_json_schema"]["properties"])
print("ran:", bool(ran))
print("sent back:", sent[1]["contents"][-1]["parts"][0]["functionResponse"]["response"])
uv run --no-project --python 3.12 --with "google-genai[httpx]==3.0.0" python repro.py prints:
declared: {'when': {'format': 'date-time', 'type': 'string'}, 'job_id': {'format': 'uuid', 'type': 'string'}}
ran: False
sent back: {'error': "Failed to parse parameter when for function schedule from function call part because function call argument value 2026-11-10T09:30:00Z is not compatible with parameter annotation <class 'datetime.datetime'>."}
job_id fails the same way once when is gone. The call still completes, so nothing says the tool never ran.
The cause: the schema comes from pydantic, but convert_if_exist_pydantic_model ends with isinstance(value, annotation), and a JSON string is never a datetime or UUID. Validating with pydantic too, e.g. pydantic.TypeAdapter(annotation).validate_python(value), would make them agree.
Related, for other types: #2013 (set[str] and other generics, fix in #3295) and #2199 (IntEnum, fix in #3288). From their diffs, neither PR covers datetime or UUID.
Thanks!
- Vorherrschende Sprache
- Python
- Sterne
- 4.1k
- Forks
- 1.1k
- Ø Merge
- 1 T. 20 Std.
- Gemergte PRs (30 T.)
- 90
Entwicklungsumgebung
- Kein Dockerfile und keine Docker-Compose-Datei
- Keine Pull-Request-Vorlage
- Beitragsleitfaden lesen
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus googleapis/python-genai
-
Interactions retries ignore the documented `initial_delay` and `max_delay` defaultsEvtl. vergeben @Venkaiahbabuneelam hat das vor 5 Tagen übernommen. Offenpriority: p2 status:awaiting user response type: bug
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 68/100
googleapis/python-genai#3317 · 1 Kommentar · 1 zugewiesene Person ·
Maintainer antworten meist innerhalb von 1 Tag
-
Test import module that doesn't existEvtl. vergeben @Venkaiahbabuneelam hat das vor 31 Tagen übernommen. Offenpriority: p2 type: bug
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 66/100
googleapis/python-genai#3122 · 6 Kommentare · 1 zugewiesene Person ·
Maintainer antworten meist innerhalb von 1 Tag
-
Curated history keeps half a user turn when the model turn is invalidEvtl. vergeben @Venkaiahbabuneelam hat das vor 39 Tagen übernommen. Offenpriority: p2 type: bug
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 62/100
googleapis/python-genai#3051 · 3 Kommentare · 1 zugewiesene Person ·
Maintainer antworten meist innerhalb von 1 Tag
-
[Bug]: Unsubscripted typing.List and typing.Dict crash convert_if_exist_pydantic_model in AFCEvtl. vergeben @Venkaiahbabuneelam hat das vor 39 Tagen übernommen. Offenpriority: p2 type: bug
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 82/100
googleapis/python-genai#3044 · 1 Kommentar · 1 zugewiesene Person ·
Maintainer antworten meist innerhalb von 1 Tag
-
Structured-output continuation merge raises AttributeError: __pydantic_generic_metadata__ when a hop has parsed JSONEvtl. vergeben @Venkaiahbabuneelam hat das vor 3 Tagen übernommen. Offenpriority: p2 type: bug
googleapis/python-genai#3350 · 1 Kommentar · 1 zugewiesene Person ·
Maintainer antworten meist innerhalb von 1 Tag
Alle Issues in googleapis/python-genai
Ähnliche Issues
-
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 85/100
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 62/100
OCA/account-invoicing#2529 ·
Maintainer antworten meist innerhalb von 1 Tag
-
area/ci
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 62/100
Maintainer antworten meist innerhalb von 1 Tag
-
ImageGen generate-batch aborts valid JSONL jobs containing a Unicode line separator in poster textOffenbug imagen skills
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
Maintainer antworten meist innerhalb von 1 Tag
-
Email validation accepts a trailing newlineEvtl. vergeben @marcello-pichini hat das heute übernommen. Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
Maintainer antworten meist innerhalb von 1 Tag