Tutorial 4: Multi-provider export from one function¶
Time: 10 minutes
Prerequisites: Tutorial 1
One Python function. Four provider formats. Zero rewrites.
The function¶
from typing import Annotated
from toolschema import Field, schema, tool
@tool
def book_flight(
origin: Annotated[str, Field(description="IATA code", pattern=r"^[A-Z]{3}$")],
destination: Annotated[str, Field(description="IATA code", pattern=r"^[A-Z]{3}$")],
passengers: Annotated[int, Field(ge=1, le=9)] = 1,
) -> dict:
"""Book a one-way flight."""
return {"confirmation": "TS-12345", "origin": origin, "destination": destination}
Export all formats¶
definition = schema(book_flight)
openai = definition.to_openai()
openai_strict = definition.to_openai(strict=True)
mcp = definition.to_mcp() # inline_refs=True by default (no $ref)
anthropic = definition.to_anthropic() # constraints → description text
gemini = definition.to_gemini() # STRING, INTEGER, OBJECT types
CLI batch export¶
uv run toolschema inspect myapp.tools:book_flight --format openai,mcp,anthropic,gemini
uv run toolschema export myapp.tools --output tools.json
OpenAI Agents SDK¶
from toolschema.integrations.openai_agents import to_agents_function_tool
agents_tool = to_agents_function_tool(definition, book_flight)
# agents_tool.params_json_schema matches definition.to_openai() parameters
Pydantic AI descriptor¶
from toolschema.integrations.pydantic_ai import to_pydantic_ai_tool
descriptor = to_pydantic_ai_tool(definition, book_flight)
# descriptor["parameters_json_schema"] ready for pydantic-ai registration
Run the example¶
uv run python examples/04_multi_provider.py
Provider differences (intentional)¶
| Provider | Key difference |
|---|---|
| OpenAI strict | All properties required; additionalProperties: false |
| MCP | camelCase inputSchema; $ref inlined by default |
| Anthropic | minLength/pattern moved into description text |
| Gemini | Uppercase type names (STRING, INTEGER) |
See provider quirks for details.