structured-outputs · git:20260821.05c0d52 · 2026-08-21 · sha256 b8190557c11148db

structured-outputs git:20260821.05c0d52A

Immutable. This exact content is served forever at /api/v1/blob/b8190557c11148db.

---
name: "structured-outputs"
description: >-
  Use when needing 100% type-safe, schema-valid data extraction from LLMs. Keywords: structured output, JSON schema, Pydantic, Zod, type-safe, constrained decoding, validation, tool use.
---

# Structured Outputs & Type-Safe Extraction

## Overview
The `structured-outputs` skill provides a framework for ensuring that language models produce data in deterministic, valid, and type-safe formats. This is essential for building robust AI-driven systems where LLM outputs must be consumed by downstream services, databases, or UI components.

## When To Use
- When extracting structured data from unstructured text (e.g., invoices, logs, emails).
- When controlling tool call arguments to guarantee they meet internal API specifications.
- When you need to bridge the gap between non-deterministic LLM generation and deterministic software logic.
- Whenever you see developers relying on regex parsing of unstructured model text.

## Core Concepts
1. **Schema Definition**: Defining the expected structure using JSON Schema, Pydantic (Python), or Zod (TypeScript).
2. **Validation**: Enforcing schema constraints at generation time or post-generation.
3. **Recovery**: Handling failures gracefully using self-healing loops.
4. **Constraint Generation**: Using techniques to force compliance during the generation process itself.

## Patterns

### 1. Strict Schema Contracts
- Use **Pydantic v2** for Python and **Zod** for TypeScript to create strongly-typed classes that represent your domain entities.
- Ensure all fields are explicitly defined with types and, where necessary, constraints (e.g., `Field(min_length=1, ...)`).

### 2. Parse-Validate-Retry (Instructor Pattern)
When an LLM fails to match the schema:
- Catch the validation error.
- Extract the specific path of the error (e.g., `user.address.zipcode`).
- Re-prompt the model by injecting the original prompt, the failed output, and the validation error traceback.
- **Goal**: Enable the model to "self-heal" by correcting its own structural mistakes.

### 3. Token-Level Constrained Decoding (Outlines/CFG)
Instead of relying on retries, constrain the generation at the token level:
- Use Finite State Machines (FSM) to mask invalid tokens during the generation process.
- This guarantees 100% schema compliance by definition, effectively eliminating "JSON parsing errors".

### 4. Schema-Aligned Streaming
- Implement partial JSON parsing for long-form generations.
- Use libraries that can identify and stream partial objects (e.g., completing an array element before the next token arrives).

### 5. BAML Polyglot Contracts
- Use [BAML](https://boundaryml.com/) or similar DSLs to define schemas once.
- Automatically generate client libraries (Python, TS, Go) to keep the backend and frontend in sync with the LLM schema.

### 6. Tool Use Schema Design
- Follow the "KISS" (Keep It Simple, Stupid) principle for tools.
- Avoid deeply nested schemas unless absolutely necessary.
- Use meaningful descriptions for every field—the model relies on these descriptions to decide what to populate.

## Quality Gates
- **Validation Check**: Every LLM output must pass a schema validation function before being treated as trusted data.
- **No Markdown Fences**: In production, ensure the pipeline does not depend on looking for ` ```json ` blocks. Configure the API to return the raw JSON body if possible, or build robust "json-blobs-only" extractors.
- **Type-Safety**: Code using the extracted data should fail to compile (if using TS) or fail during static analysis (if using Python) if it doesn't align with the generated class.

## Anti-patterns
- **Un-typed string returns**: Using generic `text` outputs and trying to parse them later.
- **"JSON in markdown fences" dependence**: Assuming the model will always use correct markdown tags.
- **Over-nested schemas**: Forcing the model to maintain complex hierarchical state, which increases the likelihood of halluncinations.
- **Silent failure**: Swallowing JSON parsing errors or schema validation errors instead of logging/retrying/failing the task.
- **Implicit Schemas**: Relying on prompt engineering to "describe" the schema instead of providing a formal, machine-readable JSON Schema.

## References
- [Instructor (Python)](https://github.com/jxnl/instructor)
- [Zod (TypeScript)](https://zod.dev/)
- [Pydantic (Python)](https://docs.pydantic.dev/)
- [Outlines (Constrained Generation)](https://github.com/outlines-dev/outlines)
- [BAML (Polyglot Schemas)](https://boundaryml.com/)