from typing import List, Optional
from agno.agent import Agent
from agno.media import File
from agno.models.openai import OpenAIResponses
from pydantic import BaseModel, Field
class Employment(BaseModel):
company: str
title: Optional[str] = None
start_date: Optional[str] = None
end_date: Optional[str] = Field(None, description="Null if current")
summary: Optional[str] = Field(None, description="Bullet points joined into one string")
class Education(BaseModel):
institution: str
degree: Optional[str] = None
field_of_study: Optional[str] = None
graduation_year: Optional[int] = None
class Resume(BaseModel):
full_name: Optional[str] = None
email: Optional[str] = None
phone: Optional[str] = None
location: Optional[str] = None
headline: Optional[str] = Field(None, description="Top-of-page summary line")
employment: List[Employment] = Field(default_factory=list)
education: List[Education] = Field(default_factory=list)
skills: List[str] = Field(default_factory=list)
agent = Agent(
model=OpenAIResponses(id="gpt-5.5"),
instructions=(
"Extract every field from the attached resume PDF. Preserve the "
"candidate's wording for titles and summaries. Use null when a "
"field is missing. Do not infer skills that are not on the page."
),
output_schema=Resume,
)
resume = agent.run(
"Extract this resume.",
files=[File(url="https://example.com/resume-sjohnson.pdf")],
).content
# Resume(full_name='Sarah Johnson', email='sarah@example.com',
# headline='Senior Platform Engineer',
# employment=[Employment(company='Acme Corp', title='Staff Engineer',
# start_date='2023-02', end_date=None, ...),
# Employment(company='Beta Labs', title='Senior Engineer',
# start_date='2019-06', end_date='2023-01', ...)],
# education=[Education(institution='University of Texas',
# degree='B.S.', field_of_study='Computer Science',
# graduation_year=2018)],
# skills=['Python', 'PostgreSQL', 'Kubernetes', 'Terraform'])