From 715ae78ea08e8f0e7c6c857d76f47384dd7289e7 Mon Sep 17 00:00:00 2001 From: devteamaegis Date: Tue, 9 Jun 2026 14:40:21 -0400 Subject: [PATCH] fix(schemas): give optional tool params a None default so minimal calls don't crash Optional[...] fields declared with Field(description=...) and no default are required in Pydantic v2, so invoking tools like create_inbox with no arguments (the documented default) raised a ValidationError instead of running. --- python/src/agentmail_toolkit/schemas.py | 32 +++++++++---------- .../tests/test_schemas_optional_defaults.py | 15 +++++++++ 2 files changed, 31 insertions(+), 16 deletions(-) create mode 100644 python/tests/test_schemas_optional_defaults.py diff --git a/python/src/agentmail_toolkit/schemas.py b/python/src/agentmail_toolkit/schemas.py index f38fdfa..21ec27f 100644 --- a/python/src/agentmail_toolkit/schemas.py +++ b/python/src/agentmail_toolkit/schemas.py @@ -12,7 +12,7 @@ class ListItemsParams(BaseModel): limit: Optional[int] = Field( default=10, description="Max number of items to return" ) - page_token: Optional[str] = Field(description="Pagination page token") + page_token: Optional[str] = Field(default=None, description="Pagination page token") class GetInboxParams(BaseModel): @@ -20,16 +20,16 @@ class GetInboxParams(BaseModel): class CreateInboxParams(BaseModel): - username: Optional[str] = Field(description="Username") - domain: Optional[str] = Field(description="Domain") - display_name: Optional[str] = Field(description="Display name") + username: Optional[str] = Field(default=None, description="Username") + domain: Optional[str] = Field(default=None, description="Domain") + display_name: Optional[str] = Field(default=None, description="Display name") class ListInboxItemsParams(ListItemsParams): inbox_id: InboxIdField - labels: Optional[List[str]] = Field(description="Filter items with labels") - before: Optional[datetime] = Field(description="Filter items before datetime") - after: Optional[datetime] = Field(description="Filter items after datetime") + labels: Optional[List[str]] = Field(default=None, description="Filter items with labels") + before: Optional[datetime] = Field(default=None, description="Filter items before datetime") + after: Optional[datetime] = Field(default=None, description="Filter items after datetime") class GetThreadParams(BaseModel): @@ -52,22 +52,22 @@ class Attachment(BaseModel): class BaseMessageParams(BaseModel): inbox_id: InboxIdField - text: Optional[str] = Field(description="Plain text body") - html: Optional[str] = Field(description="HTML body") - labels: Optional[List[str]] = Field(description="Labels") + text: Optional[str] = Field(default=None, description="Plain text body") + html: Optional[str] = Field(default=None, description="HTML body") + labels: Optional[List[str]] = Field(default=None, description="Labels") attachments: Optional[List[Attachment]] = Field(default=None, description="Attachments") class SendMessageParams(BaseMessageParams): to: List[str] = Field(description="Recipients") - cc: Optional[List[str]] = Field(description="CC recipients") - bcc: Optional[List[str]] = Field(description="BCC recipients") - subject: Optional[str] = Field(description="Subject") + cc: Optional[List[str]] = Field(default=None, description="CC recipients") + bcc: Optional[List[str]] = Field(default=None, description="BCC recipients") + subject: Optional[str] = Field(default=None, description="Subject") class ReplyToMessageParams(BaseMessageParams): message_id: MessageIdField - reply_all: Optional[bool] = Field(description="Reply to all recipients") + reply_all: Optional[bool] = Field(default=None, description="Reply to all recipients") class ForwardMessageParams(SendMessageParams): @@ -77,5 +77,5 @@ class ForwardMessageParams(SendMessageParams): class UpdateMessageParams(BaseModel): inbox_id: InboxIdField message_id: MessageIdField - add_labels: Optional[List[str]] = Field(description="Labels to add") - remove_labels: Optional[List[str]] = Field(description="Labels to remove") + add_labels: Optional[List[str]] = Field(default=None, description="Labels to add") + remove_labels: Optional[List[str]] = Field(default=None, description="Labels to remove") diff --git a/python/tests/test_schemas_optional_defaults.py b/python/tests/test_schemas_optional_defaults.py new file mode 100644 index 0000000..8c75768 --- /dev/null +++ b/python/tests/test_schemas_optional_defaults.py @@ -0,0 +1,15 @@ +from agentmail_toolkit.schemas import CreateInboxParams, ListItemsParams + + +def test_create_inbox_params_allows_empty(): + # SDK's inboxes.create() accepts no arguments (random inbox); + # the tool schema must not require username/domain/display_name. + params = CreateInboxParams() + assert params.username is None + assert params.domain is None + assert params.display_name is None + + +def test_list_items_params_allows_only_limit(): + params = ListItemsParams(limit=5) + assert params.page_token is None