Automatic function calling rejects `datetime` and `UUID` arguments

未关闭
#3,331 1 条评论 0 个 reaction 已指派 1 人 在 GitHub 查看

维护者通常 1 天内回复

@Venkaiahbabuneelam 已经在做这个了。

开始于 2026年11月11日。

  • #3333 来自 @copybara-service —— 未关闭

评估

难度
3/5
预计耗时
1-2 天
新手友好度
75/100
Issue 类型
缺陷
描述清晰度
描述清楚
活跃度
活跃
技术栈
python

调研方向

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.

由索引模型根据 Issue 内容生成。

描述

priority: p2 type: bug
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!

主要语言
Python
星标
4.1k
派生
1.1k
平均合并
1 天 20 小时
30 天内合并 PR
90

环境准备

  • 没有 Dockerfile 或 Docker Compose 文件
  • 没有 Pull Request 模板
  • 阅读贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

googleapis/python-genai 的其他 Issue

查看 googleapis/python-genai 的全部 Issue

相似的 Issue

更多 Python Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。