Automatic function calling rejects `datetime` and `UUID` arguments
Maintainers usually reply within 1 day
@Venkaiahbabuneelam is already working on this.
Since Nov 11, 2026.
- #3333 by @copybara-service — open
Assessment
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Newbie friendliness
- 75/100
- Issue type
- Bug
- Clarity
- Clearly specified
- Activity status
- Active
- Tech stack
- python
- Domain
- backend-api-design
Research direction
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.
Written by the indexing model from the issue text.
Description
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!
- Dominant language
- Python
- Stars
- 4.1k
- Forks
- 1.1k
- Avg merge
- 1d 20h
- Merged PRs (30d)
- 90
Getting set up
- No Dockerfile or Docker Compose file
- No pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from googleapis/python-genai
-
Interactions retries ignore the documented `initial_delay` and `max_delay` defaultsPossibly taken @Venkaiahbabuneelam claimed this 4 days ago. Openpriority: p2 status:awaiting user response type: bug
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
googleapis/python-genai#3317 · 1 comment · 1 assignee ·
Maintainers usually reply within 1 day
-
Test import module that doesn't existPossibly taken @Venkaiahbabuneelam claimed this 30 days ago. Openpriority: p2 type: bug
Difficulty 2/5 1-3 hours Newbie friendliness 66/100
googleapis/python-genai#3122 · 6 comments · 1 assignee ·
Maintainers usually reply within 1 day
-
Curated history keeps half a user turn when the model turn is invalidPossibly taken @Venkaiahbabuneelam claimed this 39 days ago. Openpriority: p2 type: bug
Difficulty 2/5 1-3 hours Newbie friendliness 62/100
googleapis/python-genai#3051 · 3 comments · 1 assignee ·
Maintainers usually reply within 1 day
-
[Bug]: Unsubscripted typing.List and typing.Dict crash convert_if_exist_pydantic_model in AFCPossibly taken @Venkaiahbabuneelam claimed this 39 days ago. Openpriority: p2 type: bug
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
googleapis/python-genai#3044 · 1 comment · 1 assignee ·
Maintainers usually reply within 1 day
-
Structured-output continuation merge raises AttributeError: __pydantic_generic_metadata__ when a hop has parsed JSONPossibly taken @Venkaiahbabuneelam claimed this 2 days ago. Openpriority: p2 type: bug
googleapis/python-genai#3350 · 1 comment · 1 assignee ·
Maintainers usually reply within 1 day
All issues in googleapis/python-genai
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
dbt-labs/spark-utils#51 ·
-
bug pydanty:is-working
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
pydantic/pydantic-ai#13444 ·
Maintainers usually reply within 1 day
-
good first issue help wanted
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
-
good first issue help wanted
Difficulty 1/5 Under an hour Newbie friendliness 72/100
-
changelog investigate
Difficulty 1/5 Under an hour Newbie friendliness 68/100
ramnes/notion-sdk-py#502 ·