[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-70945":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":18,"stars30d":19,"stars90d":16,"forks30d":16,"starsTrendScore":20,"compositeScore":21,"rankGlobal":10,"rankLanguage":10,"license":22,"archived":23,"fork":23,"defaultBranch":24,"hasWiki":25,"hasPages":23,"topics":26,"createdAt":10,"pushedAt":10,"updatedAt":33,"readmeContent":34,"aiSummary":35,"trendingCount":16,"starSnapshotCount":16,"syncStatus":36,"lastSyncTime":37,"discoverSource":38},70945,"instructor","567-labs\u002Finstructor","567-labs","structured outputs for llms ","https:\u002F\u002Fpython.useinstructor.com\u002F",null,"Python",13135,1077,54,11,0,23,57,187,69,119.1,"MIT License",false,"main",true,[27,28,29,30,31,32],"openai","openai-function-calli","openai-functions","pydantic-v2","python","validation","2026-06-12 04:00:58","# Instructor: Structured Outputs for LLMs\n\nGet reliable JSON from any LLM. Built on Pydantic for validation, type safety, and IDE support.\n\n```python\nimport instructor\nfrom pydantic import BaseModel\n\n\n# Define what you want\nclass User(BaseModel):\n    name: str\n    age: int\n\n\n# Extract it from natural language\nclient = instructor.from_provider(\"openai\u002Fgpt-4o-mini\")\nuser = client.chat.completions.create(\n    response_model=User,\n    messages=[{\"role\": \"user\", \"content\": \"John is 25 years old\"}],\n)\n\nprint(user)  # User(name='John', age=25)\n```\n\n**That's it.** No JSON parsing, no error handling, no retries. Just define a model and get structured data.\n\n[![PyPI](https:\u002F\u002Fimg.shields.io\u002Fpypi\u002Fv\u002Finstructor?style=flat-square)](https:\u002F\u002Fpypi.org\u002Fproject\u002Finstructor\u002F)\n[![Downloads](https:\u002F\u002Fimg.shields.io\u002Fpypi\u002Fdm\u002Finstructor?style=flat-square)](https:\u002F\u002Fpypi.org\u002Fproject\u002Finstructor\u002F)\n[![GitHub Stars](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fstars\u002F567-labs\u002Finstructor?style=flat-square)](https:\u002F\u002Fgithub.com\u002F567-labs\u002Finstructor)\n[![Discord](https:\u002F\u002Fimg.shields.io\u002Fdiscord\u002F1192334452110659664?style=flat-square)](https:\u002F\u002Fdiscord.gg\u002FbD9YE9JArw)\n[![Twitter](https:\u002F\u002Fimg.shields.io\u002Ftwitter\u002Ffollow\u002Fjxnlco?style=flat-square)](https:\u002F\u002Ftwitter.com\u002Fjxnlco)\n\n> **Use Instructor for fast extraction, reach for PydanticAI when you need agents.** Instructor keeps schema-first flows simple and cheap. If your app needs richer agent runs, built-in observability, or shareable traces, try [PydanticAI](https:\u002F\u002Fai.pydantic.dev\u002F). PydanticAI is the official agent runtime from the Pydantic team, adding typed tools, replayable datasets, evals, and production dashboards while using the same Pydantic models. Dive into the [PydanticAI docs](https:\u002F\u002Fai.pydantic.dev\u002F) to see how it extends Instructor-style workflows.\n\n## Why Instructor?\n\nGetting structured data from LLMs is hard. You need to:\n\n1. Write complex JSON schemas\n2. Handle validation errors  \n3. Retry failed extractions\n4. Parse unstructured responses\n5. Deal with different provider APIs\n\n**Instructor handles all of this with one simple interface:**\n\n\u003Ctable>\n\u003Ctr>\n\u003Ctd>\u003Cb>Without Instructor\u003C\u002Fb>\u003C\u002Ftd>\n\u003Ctd>\u003Cb>With Instructor\u003C\u002Fb>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\n\n```python\nresponse = openai.chat.completions.create(\n    model=\"gpt-4\",\n    messages=[{\"role\": \"user\", \"content\": \"...\"}],\n    tools=[\n        {\n            \"type\": \"function\",\n            \"function\": {\n                \"name\": \"extract_user\",\n                \"parameters\": {\n                    \"type\": \"object\",\n                    \"properties\": {\n                        \"name\": {\"type\": \"string\"},\n                        \"age\": {\"type\": \"integer\"},\n                    },\n                },\n            },\n        }\n    ],\n)\n\n# Parse response\ntool_call = response.choices[0].message.tool_calls[0]\nuser_data = json.loads(tool_call.function.arguments)\n\n# Validate manually\nif \"name\" not in user_data:\n    # Handle error...\n    pass\n```\n\n\u003C\u002Ftd>\n\u003Ctd>\n\n```python\nclient = instructor.from_provider(\"openai\u002Fgpt-4\")\n\nuser = client.chat.completions.create(\n    response_model=User,\n    messages=[{\"role\": \"user\", \"content\": \"...\"}],\n)\n\n# That's it! user is validated and typed\n```\n\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftable>\n\n## Install in seconds\n\n```bash\npip install instructor\n```\n\nOr with your package manager:\n```bash\nuv add instructor\npoetry add instructor\n```\n\n## Works with every major provider\n\nUse the same code with any LLM provider:\n\n```python\n# OpenAI\nclient = instructor.from_provider(\"openai\u002Fgpt-4o\")\n\n# Anthropic\nclient = instructor.from_provider(\"anthropic\u002Fclaude-3-5-sonnet\")\n\n# Google\nclient = instructor.from_provider(\"google\u002Fgemini-pro\")\n\n# Ollama (local)\nclient = instructor.from_provider(\"ollama\u002Fllama3.2\")\n\n# With API keys directly (no environment variables needed)\nclient = instructor.from_provider(\"openai\u002Fgpt-4o\", api_key=\"sk-...\")\nclient = instructor.from_provider(\"anthropic\u002Fclaude-3-5-sonnet\", api_key=\"sk-ant-...\")\nclient = instructor.from_provider(\"groq\u002Fllama-3.1-8b-instant\", api_key=\"gsk_...\")\n\n# All use the same API!\nuser = client.chat.completions.create(\n    response_model=User,\n    messages=[{\"role\": \"user\", \"content\": \"...\"}],\n)\n```\n\n## Production-ready features\n\n### Automatic retries\n\nFailed validations are automatically retried with the error message:\n\n```python\nfrom pydantic import BaseModel, field_validator\n\n\nclass User(BaseModel):\n    name: str\n    age: int\n\n    @field_validator('age')\n    def validate_age(cls, v):\n        if v \u003C 0:\n            raise ValueError('Age must be positive')\n        return v\n\n\n# Instructor automatically retries when validation fails\nuser = client.chat.completions.create(\n    response_model=User,\n    messages=[{\"role\": \"user\", \"content\": \"...\"}],\n    max_retries=3,\n)\n```\n\n### Streaming support\n\nStream partial objects as they're generated:\n\n```python\nfrom instructor import Partial\n\nfor partial_user in client.chat.completions.create(\n    response_model=Partial[User],\n    messages=[{\"role\": \"user\", \"content\": \"...\"}],\n    stream=True,\n):\n    print(partial_user)\n    # User(name=None, age=None)\n    # User(name=\"John\", age=None)\n    # User(name=\"John\", age=25)\n```\n\n### Nested objects\n\nExtract complex, nested data structures:\n\n```python\nfrom typing import List\n\n\nclass Address(BaseModel):\n    street: str\n    city: str\n    country: str\n\n\nclass User(BaseModel):\n    name: str\n    age: int\n    addresses: List[Address]\n\n\n# Instructor handles nested objects automatically\nuser = client.chat.completions.create(\n    response_model=User,\n    messages=[{\"role\": \"user\", \"content\": \"...\"}],\n)\n```\n\n## Used in production by\n\nTrusted by over 100,000 developers and companies building AI applications:\n\n- **3M+ monthly downloads**\n- **10K+ GitHub stars**  \n- **1000+ community contributors**\n\nCompanies using Instructor include teams at OpenAI, Google, Microsoft, AWS, and many YC startups.\n\n## Get started\n\n### Basic extraction\n\nExtract structured data from any text:\n\n```python\nfrom pydantic import BaseModel\nimport instructor\n\nclient = instructor.from_provider(\"openai\u002Fgpt-4o-mini\")\n\n\nclass Product(BaseModel):\n    name: str\n    price: float\n    in_stock: bool\n\n\nproduct = client.chat.completions.create(\n    response_model=Product,\n    messages=[{\"role\": \"user\", \"content\": \"iPhone 15 Pro, $999, available now\"}],\n)\n\nprint(product)\n# Product(name='iPhone 15 Pro', price=999.0, in_stock=True)\n```\n\n### Multiple languages\n\nInstructor's simple API is available in many languages:\n\n- [Python](https:\u002F\u002Fpython.useinstructor.com) - The original\n- [TypeScript](https:\u002F\u002Fjs.useinstructor.com) - Full TypeScript support\n- [Ruby](https:\u002F\u002Fruby.useinstructor.com) - Ruby implementation  \n- [Go](https:\u002F\u002Fgo.useinstructor.com) - Go implementation\n- [Elixir](https:\u002F\u002Fhex.pm\u002Fpackages\u002Finstructor) - Elixir implementation\n- [Rust](https:\u002F\u002Frust.useinstructor.com) - Rust implementation\n\n### Learn more\n\n- [Documentation](https:\u002F\u002Fpython.useinstructor.com) - Comprehensive guides\n- [Examples](https:\u002F\u002Fpython.useinstructor.com\u002Fexamples\u002F) - Copy-paste recipes  \n- [Blog](https:\u002F\u002Fpython.useinstructor.com\u002Fblog\u002F) - Tutorials and best practices\n- [Discord](https:\u002F\u002Fdiscord.gg\u002FbD9YE9JArw) - Get help from the community\n\n## Why use Instructor over alternatives?\n\n**vs Raw JSON mode**: Instructor provides automatic validation, retries, streaming, and nested object support. No manual schema writing.\n\n**vs LangChain\u002FLlamaIndex**: Instructor is focused on one thing - structured extraction. It's lighter, faster, and easier to debug.\n\n**vs Custom solutions**: Battle-tested by thousands of developers. Handles edge cases you haven't thought of yet.\n\n## Contributing\n\nWe welcome contributions! Check out our [good first issues](https:\u002F\u002Fgithub.com\u002F567-labs\u002Finstructor\u002Flabels\u002Fgood%20first%20issue) to get started.\n\n## License\n\nMIT License - see [LICENSE](https:\u002F\u002Fgithub.com\u002F567-labs\u002Finstructor\u002Fblob\u002Fmain\u002FLICENSE) for details.\n\n---\n\n\u003Cp align=\"center\">\nBuilt by the Instructor community. Special thanks to \u003Ca href=\"https:\u002F\u002Ftwitter.com\u002Fjxnlco\">Jason Liu\u003C\u002Fa> and all \u003Ca href=\"https:\u002F\u002Fgithub.com\u002F567-labs\u002Finstructor\u002Fgraphs\u002Fcontributors\">contributors\u003C\u002Fa>.\n\u003C\u002Fp>","Instructor 是一个用于从大型语言模型（LLMs）中提取结构化输出的库。它基于 Pydantic 构建，提供验证、类型安全和IDE支持，能够直接从自然语言中解析出定义好的数据模型而无需手动处理JSON解析或错误重试。通过简单的接口定义期望的数据结构，Instructor 能够自动完成复杂的数据提取与格式化过程。该项目适用于需要快速且可靠地从文本生成中获取结构化信息的应用场景，如自动化文档处理、聊天机器人开发等，尤其适合那些希望简化与OpenAI等API交互流程的开发者。",2,"2026-06-11 03:35:05","high_star"]