
Instructor
Wire Claude responses into typed Pydantic models for extraction, classification, and multi-entity parsing in your app backend.
Install
npx skills add https://github.com/orchestra-research/ai-research-skills --skill instructorWhat is this skill?
- CompanyInfo extraction with founded year, industry, and employee fields
- Sentiment classification with confidence bounded via Field(ge=0, le=1)
- Multi-entity Entities model for people, organizations, and locations
- Structured Analysis pattern with summary, key_points, sentiment, and actions
- Anthropic messages.create + response_model flow shown in each snippet
Adoption & trust: 1 installs on skills.sh; 9.4k GitHub stars; 3/3 security scanners passed (skills.sh audits).
Recommended Skills
Microsoft Foundrymicrosoft/azure-skills
Azure Aimicrosoft/azure-skills
Azure Hosted Copilot Sdkmicrosoft/azure-skills
Lark Eventlarksuite/cli
Running Claude Code Via Litellm Copilotxixu-me/skills
Setup Matt Pocock Skillsmattpocock/skills
Journey fit
Primary fit
Instructor patterns land when you integrate LLM APIs into application code—the Build integrations shelf. Integrations subphase matches structured-output client setup, response_model usage, and Enum/Field validation—not generic prompt tweaking alone.
Common Questions / FAQ
Is Instructor safe to install?
skills.sh reports 3 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.
SKILL.md
READMESKILL.md - Instructor
# Real-World Examples Practical examples of using Instructor for structured data extraction. ## Data Extraction ```python class CompanyInfo(BaseModel): name: str founded: int industry: str employees: int text = "Apple was founded in 1976 in the technology industry with 164,000 employees." company = client.messages.create( model="claude-sonnet-4-5-20250929", max_tokens=1024, messages=[{"role": "user", "content": f"Extract: {text}"}], response_model=CompanyInfo ) ``` ## Classification ```python class Sentiment(str, Enum): POSITIVE = "positive" NEGATIVE = "negative" NEUTRAL = "neutral" class Review(BaseModel): sentiment: Sentiment confidence: float = Field(ge=0.0, le=1.0) review = client.messages.create( model="claude-sonnet-4-5-20250929", max_tokens=1024, messages=[{"role": "user", "content": "This product is amazing!"}], response_model=Review ) ``` ## Multi-Entity Extraction ```python class Person(BaseModel): name: str role: str class Entities(BaseModel): people: list[Person] organizations: list[str] locations: list[str] entities = client.messages.create( model="claude-sonnet-4-5-20250929", max_tokens=1024, messages=[{"role": "user", "content": "Tim Cook, CEO of Apple, spoke in Cupertino..."}], response_model=Entities ) ``` ## Structured Analysis ```python class Analysis(BaseModel): summary: str key_points: list[str] sentiment: Sentiment actionable_items: list[str] analysis = client.messages.create( model="claude-sonnet-4-5-20250929", max_tokens=1024, messages=[{"role": "user", "content": "Analyze: [long text]"}], response_model=Analysis ) ``` ## Batch Processing ```python texts = ["text1", "text2", "text3"] results = [ client.messages.create( model="claude-sonnet-4-5-20250929", max_tokens=1024, messages=[{"role": "user", "content": text}], response_model=YourModel ) for text in texts ] ``` ## Streaming ```python for partial in client.messages.create_partial( model="claude-sonnet-4-5-20250929", max_tokens=1024, messages=[{"role": "user", "content": "Generate report..."}], response_model=Report ): print(f"Progress: {partial.title}") # Update UI in real-time ``` # Provider Configuration Guide to using Instructor with different LLM providers. ## Anthropic Claude ```python import instructor from anthropic import Anthropic # Basic setup client = instructor.from_anthropic(Anthropic()) # With API key client = instructor.from_anthropic( Anthropic(api_key="your-api-key") ) # Recommended mode client = instructor.from_anthropic( Anthropic(), mode=instructor.Mode.ANTHROPIC_TOOLS ) # Usage result = client.messages.create( model="claude-sonnet-4-5-20250929", max_tokens=1024, messages=[{"role": "user", "content": "..."}], response_model=YourModel ) ``` ## OpenAI ```python from openai import OpenAI client = instructor.from_openai(OpenAI()) result = client.chat.completions.create( model="gpt-4o-mini", response_model=YourModel, messages=[{"role": "user", "content": "..."}] ) ``` ## Local Models (Ollama) ```python client = instructor.from_openai( OpenAI( base_url="http://localhost:11434/v1", api_key="ollama" ), mode=instructor.Mode.JSON ) result = client.chat.completions.create( model="llama3.1", response_model=YourModel, messages=[...] ) ``` ## Modes - `Mode.ANTHROPIC_TOOLS`: Recommended for Claude - `Mode.TOOLS`: OpenAI function calling - `Mode.JSON`: Fallback for unsupported providers # Advanced Validation Patterns Complete guide to validation in Instructor using Pydantic. ## Table of Contents - Built-in Validators - Custom Field Validators - Model-Level Validation - Complex Validation Patterns - Error Handling ## Built-in Validators ### Numeric Constraints ```python from pydantic import BaseModel, Field class Product(B