Session 5· 17· 10 min
Parse Calendar Event (Pydantic)
What you'll learn
- ▸Define a Pydantic BaseModel for the expected output
- ▸Use responses.parse() with text_format=YourModel
- ▸Get a typed Python object back instead of raw JSON
The cleaner way to do structured output
In Phase 1 you wrote JSON Schema by hand as a Python dict. That works — but Pydantic does the same thing in much cleaner code. Define a class, pass it as text_format, get a typed Python object back. No json.loads(). No dict key checks.
Phase 1 — by hand
- •schema = {"type": "object", ...} dict
- •response_format={"type": "json_schema", ...}
- •json.loads(response.choices[0].message.content)
- •Dict access: data["name"]
Phase 3 — with Pydantic
- •class CalendarEvent(BaseModel): ...
- •client.responses.parse(..., text_format=CalendarEvent)
- •response.output_parsed → CalendarEvent instance
- •Attribute access: event.name
17_responses_parse_calendar_event.py
from pydantic import BaseModel ①
class CalendarEvent(BaseModel): ②
name: str
date: str
participants: list[str]
response = client.responses.parse( ③
model="gpt-4o-2024-08-06",
input=[
{"role": "system", "content": "Extract the event information."},
{"role": "user", "content": "Alice and Bob are going to a science fair on Friday."},
],
text_format=CalendarEvent, ④
)
event = response.output_parsed ⑤
print(event.name, event.date, event.participants) ⑥①Pydantic is the standard Python data-validation library.
②Fields with type hints define the schema — SDK translates this to a JSON schema for you.
③Back to responses.parse() — this is the newer endpoint (Session 1 used responses.create).
④text_format takes your Pydantic class, not a dict schema.
⑤output_parsed is a real CalendarEvent instance, not a dict.
⑥Attribute access with typed autocomplete — VS Code knows event.name is a string.
$ python 17_responses_parse_calendar_event.py
Why this is better
Pydantic models give you IDE autocomplete, type checking with mypy/pylance, field validators, automatic conversion to dicts (event.model_dump()), and they live in one clean class instead of a sprawling schema dict.
Knowledge Check
What does output_parsed give you?
Recap — what you just learned
- ✓Pydantic + responses.parse() = structured output with zero boilerplate
- ✓Define a BaseModel with type hints — the SDK builds the schema for you
- ✓Get a typed instance back via output_parsed
- ✓Same structured-output power, cleaner code