jcbowyer's picture
Clean HuggingFace deployment without binary files
e59d91d
Raw
History Blame Contribute Delete
2.02 kB
"""Pydantic schemas for structured jurisdiction page extraction."""
from __future__ import annotations
from typing import List, Optional
from pydantic import BaseModel, Field
class MeetingRow(BaseModel):
title: str = Field(description="Meeting or hearing title")
meeting_date: Optional[str] = Field(
default=None,
description="Primary meeting date in YYYY-MM-DD when clear; else ISO or human text",
)
agenda_url: Optional[str] = Field(default=None, description="Link to agenda PDF or page")
minutes_url: Optional[str] = Field(default=None, description="Link to minutes PDF or page")
location: Optional[str] = Field(default=None, description="Meeting location if stated")
class ContactRow(BaseModel):
name: Optional[str] = Field(default=None, description="Person or office name")
role: Optional[str] = Field(default=None, description="Title or role")
email: Optional[str] = Field(default=None, description="Email address")
phone: Optional[str] = Field(default=None, description="Phone number")
class JurisdictionPageExtraction(BaseModel):
"""Structured fields extracted from a government web page."""
jurisdiction_name: Optional[str] = Field(
default=None,
description="City, county, board, or department name on the page",
)
page_summary: Optional[str] = Field(
default=None,
description="One-sentence summary of what this page is about",
)
meetings: List[MeetingRow] = Field(
default_factory=list,
description="Public meetings, hearings, or agendas listed on the page",
)
contacts: List[ContactRow] = Field(
default_factory=list,
description="Official contacts found on the page",
)
contact_email: Optional[str] = Field(
default=None,
description="Primary general contact email if one is prominent",
)
notes: Optional[str] = Field(
default=None,
description="Caveats, ambiguous dates, or missing data",
)