Ferr0's picture
ZeroGPU: Qwen2.5-3B + Outlines — schema-conformance demo
a4ab2df verified
Raw
History Blame Contribute Delete
2.05 kB
"""Demo schemas for the Structured Output Playground.
Each preset is a Pydantic model. We use Pydantic only to *generate* a clean
JSON Schema (`model_json_schema`); the actual generation is constrained by
that schema at decode time, and validation is done with `jsonschema`.
"""
from enum import Enum
from typing import List, Optional
from pydantic import BaseModel, Field
class Seniority(str, Enum):
junior = "junior"
mid = "mid"
senior = "senior"
lead = "lead"
unknown = "unknown"
class SalaryRange(BaseModel):
min: Optional[int] = None
max: Optional[int] = None
currency: Optional[str] = None
class JobPosting(BaseModel):
title: str
company: Optional[str] = None
location: Optional[str] = None
remote: bool = False
seniority: Seniority = Seniority.unknown
skills: List[str] = Field(default_factory=list)
salary: Optional[SalaryRange] = None
class ContactCard(BaseModel):
name: str
email: Optional[str] = None
phone: Optional[str] = None
company: Optional[str] = None
role: Optional[str] = None
class Product(BaseModel):
name: str
category: Optional[str] = None
price: Optional[float] = None
currency: Optional[str] = None
in_stock: bool = True
features: List[str] = Field(default_factory=list)
class Priority(str, Enum):
low = "low"
medium = "medium"
high = "high"
class Event(BaseModel):
# enum + int + bool on purpose: this is where free-form prompting drifts
# (a string where an int is required, a value outside the enum…), and where
# constrained decoding earns its keep.
title: str
attendees: int
priority: Priority
online: bool
# preset label -> Pydantic model
PRESETS = {
"Contact card": ContactCard,
"Product": Product,
"Job posting": JobPosting,
"Event": Event,
}
CUSTOM_LABEL = "Custom (edit the schema)"
def preset_schema(label: str) -> dict:
"""Return the JSON Schema dict for a preset label."""
return PRESETS[label].model_json_schema()