{"id":14678880,"url":"https://github.com/dottxt-ai/outlines","last_synced_at":"2026-02-06T09:11:42.473Z","repository":{"id":166459221,"uuid":"615403340","full_name":"dottxt-ai/outlines","owner":"dottxt-ai","description":"Structured Text Generation","archived":false,"fork":false,"pushed_at":"2025-04-14T16:49:56.000Z","size":17823,"stargazers_count":11373,"open_issues_count":212,"forks_count":586,"subscribers_count":52,"default_branch":"main","last_synced_at":"2025-04-17T15:30:03.510Z","etag":null,"topics":["cfg","generative-ai","json","llms","prompt-engineering","regex","structured-generation","symbolic-ai"],"latest_commit_sha":null,"homepage":"https://dottxt-ai.github.io/outlines/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dottxt-ai.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2023-03-17T16:01:18.000Z","updated_at":"2025-04-17T13:35:36.000Z","dependencies_parsed_at":"2023-09-29T02:08:44.479Z","dependency_job_id":"7b963c36-31e2-4527-a684-b1e1cc444295","html_url":"https://github.com/dottxt-ai/outlines","commit_stats":null,"previous_names":["normal-computing/outlines","outlines-dev/outlines","dottxt-ai/outlines"],"tags_count":65,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dottxt-ai%2Foutlines","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dottxt-ai%2Foutlines/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dottxt-ai%2Foutlines/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dottxt-ai%2Foutlines/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dottxt-ai","download_url":"https://codeload.github.com/dottxt-ai/outlines/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249421425,"owners_count":21269055,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cfg","generative-ai","json","llms","prompt-engineering","regex","structured-generation","symbolic-ai"],"created_at":"2024-09-12T10:01:46.241Z","updated_at":"2026-02-06T09:11:42.467Z","avatar_url":"https://github.com/dottxt-ai.png","language":"Python","funding_links":[],"categories":["Python","*Ops for AI","Autonomous Research \u0026 Content Generation","Projects","json","generative-ai","A01_文本生成_文本对话","Design Primitives","Large Language Models (LLMs)","\u003ca id=\"tools\"\u003e\u003c/a\u003e🛠️ Tools","4. Agentic AI \u0026 Multi-Agent Systems","Tools \u0026 Libraries","3. **Real-World Applications**","\u003ca name=\"Python\"\u003e\u003c/a\u003ePython","10. Model Preparation \u0026 Quantization","Tools","🛠️ Developer Infrastructure","LLM Application / RAG","Agent SDKs \u0026 Frameworks","Other AI Tools","🤖 AI \u0026 Machine Learning","Inference","LLM Tools"],"sub_categories":["LLMOps","Prompt Libraries","AI and Agents","大语言对话模型及数据","Tool Design","LLM Tools \u0026 Frameworks","Bleeding Edge ⚗️","Voice \u0026 Realtime Agents","Data \u0026 Alignment Tools","Models","LLM Frameworks \u0026 Orchestration","Structured Output \u0026 Multi-Provider","Output"],"readme":"\u003cdiv align=\"center\" style=\"margin-bottom: 1em;\"\u003e\n\n\u003cimg src=\"./docs/assets/images/logo-light-mode.svg#gh-light-mode-only\" alt=\"Outlines Logo\" width=300\u003e\u003c/img\u003e\n\u003cimg src=\"./docs/assets/images/logo-dark-mode.svg#gh-dark-mode-only\" alt=\"Outlines Logo\" width=300\u003e\u003c/img\u003e\n\n\n 🗒️ *Structured outputs for LLMs* 🗒️\n\nMade with ❤👷️ by the team at [.txt](https://dottxt.co)\n\u003cbr\u003eTrusted by NVIDIA, Cohere, HuggingFace, vLLM, etc.\n\n\u003c!-- Project Badges --\u003e\n[![PyPI Version][pypi-version-badge]][pypi]\n[![Downloads][downloads-badge]][pypistats]\n[![Stars][stars-badge]][stars]\n\n\u003c!-- Community Badges --\u003e\n[![Discord][discord-badge]][discord]\n[![Blog][dottxt-blog-badge]][dottxt-blog]\n[![Twitter][twitter-badge]][twitter]\n\n\u003c/div\u003e\n\n## 🚀 Building the future of structured generation\n\nWe're working with select partners to develop new interfaces to structured generation.\n\nNeed XML, FHIR, custom schemas or grammars? Let's talk.\n\n[Become a design partner](mailto:contact@dottxt.ai)\n\n## Table of Contents\n\n- [Why Outlines?](#why-outlines)\n- [Quickstart](#quickstart)\n- [Real-World Examples](#real-world-examples)\n  - [🙋‍♂️ Customer Support Triage](#customer-support-triage)\n  - [📦 E-commerce Product Categorization](#e-commerce-product-categorization)\n  - [📊 Parse Event Details with Incomplete Data](#parse-event-details-with-incomplete-data)\n  - [🗂️ Categorize Documents into Predefined Types](#categorize-documents-into-predefined-types)\n  - [📅 Schedule a Meeting with Function Calling](#schedule-a-meeting-with-function-calling)\n  - [📝 Dynamically Generate Prompts with Re-usable Templates](#dynamically-generate-prompts-with-re-usable-templates)\n- [They Use Outlines](#they-use-outlines)\n- [Model Integrations](#model-integrations)\n- [Core Features](#core-features)\n- [Other Features](#other-features)\n- [About .txt](#about-txt)\n- [Community](#community)\n\n\u003cdiv align=\"center\"\u003e\u003cimg src=\"./docs/assets/images/install.png\" width=300\u003e\u003c/img\u003e\u003c/div\u003e\n\n## Why Outlines?\n\nLLMs are powerful but their outputs are unpredictable. Most solutions attempt to fix bad outputs after generation using parsing, regex, or fragile code that breaks easily.\n\nOutlines guarantees structured outputs during generation — directly from any LLM.\n\n- **Works with any model** - Same code runs across OpenAI, Ollama, vLLM, and more\n- **Simple integration** - Just pass your desired output type: `model(prompt, output_type)`\n- **Guaranteed valid structure** - No more parsing headaches or broken JSON\n- **Provider independence** - Switch models without changing code\n\n\n### The Outlines Philosophy\n\n\u003cdiv align=\"center\"\u003e\u003cimg src=\"./docs/assets/images/use_philosophy.png\" width=300\u003e\u003c/img\u003e\u003c/div\u003e\n\nOutlines follows a simple pattern that mirrors Python's own type system. Simply specify the desired output type, and Outlines will ensure your data matches that structure exactly:\n\n- For a yes/no response, use `Literal[\"Yes\", \"No\"]`\n- For numerical values, use `int`\n- For complex objects, define a structure with a [Pydantic model](https://docs.pydantic.dev/latest/)\n\n## Quickstart\n\nGetting started with outlines is simple:\n\n### 1. Install outlines\n\n``` shell\npip install outlines\n```\n\n### 2. Connect to your preferred model\n\n``` python\nimport outlines\nfrom transformers import AutoTokenizer, AutoModelForCausalLM\n\n\nMODEL_NAME = \"microsoft/Phi-3-mini-4k-instruct\"\nmodel = outlines.from_transformers(\n    AutoModelForCausalLM.from_pretrained(MODEL_NAME, device_map=\"auto\"),\n    AutoTokenizer.from_pretrained(MODEL_NAME)\n)\n```\n\n### 3. Start with simple structured outputs\n\n``` python\nfrom typing import Literal\nfrom pydantic import BaseModel\n\n\n# Simple classification\nsentiment = model(\n    \"Analyze: 'This product completely changed my life!'\",\n    Literal[\"Positive\", \"Negative\", \"Neutral\"]\n)\nprint(sentiment)  # \"Positive\"\n\n# Extract specific types\ntemperature = model(\"What's the boiling point of water in Celsius?\", int)\nprint(temperature)  # 100\n```\n\n### 4. Create complex structures\n\n``` python\nfrom pydantic import BaseModel\nfrom enum import Enum\n\nclass Rating(Enum):\n    poor = 1\n    fair = 2\n    good = 3\n    excellent = 4\n\nclass ProductReview(BaseModel):\n    rating: Rating\n    pros: list[str]\n    cons: list[str]\n    summary: str\n\nreview = model(\n    \"Review: The XPS 13 has great battery life and a stunning display, but it runs hot and the webcam is poor quality.\",\n    ProductReview,\n    max_new_tokens=200,\n)\n\nreview = ProductReview.model_validate_json(review)\nprint(f\"Rating: {review.rating.name}\")  # \"Rating: good\"\nprint(f\"Pros: {review.pros}\")           # \"Pros: ['great battery life', 'stunning display']\"\nprint(f\"Summary: {review.summary}\")     # \"Summary: Good laptop with great display but thermal issues\"\n```\n\n## Real-world examples\n\nHere are production-ready examples showing how Outlines solves common problems:\n\n\u003cdetails id=\"customer-support-triage\"\u003e\u003csummary\u003e\u003cb\u003e🙋‍♂️ Customer Support Triage\u003c/b\u003e\n\u003cbr\u003eThis example shows how to convert a free-form customer email into a structured service ticket. By parsing attributes like priority, category, and escalation flags, the code enables automated routing and handling of support issues.\n\u003c/summary\u003e\n\n``` python\nimport outlines\nfrom enum import Enum\nfrom pydantic import BaseModel\nfrom transformers import AutoTokenizer, AutoModelForCausalLM\nfrom typing import List\n\n\nMODEL_NAME = \"microsoft/Phi-3-mini-4k-instruct\"\nmodel = outlines.from_transformers(\n    AutoModelForCausalLM.from_pretrained(MODEL_NAME, device_map=\"auto\"),\n    AutoTokenizer.from_pretrained(MODEL_NAME)\n)\n\n\ndef alert_manager(ticket):\n    print(\"Alert!\", ticket)\n\n\nclass TicketPriority(str, Enum):\n    low = \"low\"\n    medium = \"medium\"\n    high = \"high\"\n    urgent = \"urgent\"\n\nclass ServiceTicket(BaseModel):\n    priority: TicketPriority\n    category: str\n    requires_manager: bool\n    summary: str\n    action_items: List[str]\n\n\ncustomer_email = \"\"\"\nSubject: URGENT - Cannot access my account after payment\n\nI paid for the premium plan 3 hours ago and still can't access any features.\nI've tried logging out and back in multiple times. This is unacceptable as I\nhave a client presentation in an hour and need the analytics dashboard.\nPlease fix this immediately or refund my payment.\n\"\"\"\n\nprompt = f\"\"\"\n\u003c|im_start|\u003euser\nAnalyze this customer email:\n\n{customer_email}\n\u003c|im_end|\u003e\n\u003c|im_start|\u003eassistant\n\"\"\"\n\nticket = model(\n    prompt,\n    ServiceTicket,\n    max_new_tokens=500\n)\n\n# Use structured data to route the ticket\nticket = ServiceTicket.model_validate_json(ticket)\nif ticket.priority == \"urgent\" or ticket.requires_manager:\n    alert_manager(ticket)\n```\n\u003c/details\u003e\n\n\u003cdetails id=\"e-commerce-product-categorization\"\u003e\u003csummary\u003e\u003cb\u003e📦 E-commerce product categorization\u003c/b\u003e\n\u003cbr\u003eThis use case demonstrates how outlines can transform product descriptions into structured categorization data (e.g., main category, sub-category, and attributes) to streamline tasks such as inventory management. Each product description is processed automatically, reducing manual categorization overhead.\n\u003c/summary\u003e\n\n```python\nimport outlines\nfrom pydantic import BaseModel\nfrom transformers import AutoTokenizer, AutoModelForCausalLM\nfrom typing import List, Optional\n\n\nMODEL_NAME = \"microsoft/Phi-3-mini-4k-instruct\"\nmodel = outlines.from_transformers(\n    AutoModelForCausalLM.from_pretrained(MODEL_NAME, device_map=\"auto\"),\n    AutoTokenizer.from_pretrained(MODEL_NAME)\n)\n\n\ndef update_inventory(product, category, sub_category):\n    print(f\"Updated {product.split(',')[0]} in category {category}/{sub_category}\")\n\n\nclass ProductCategory(BaseModel):\n    main_category: str\n    sub_category: str\n    attributes: List[str]\n    brand_match: Optional[str]\n\n# Process product descriptions in batches\nproduct_descriptions = [\n    \"Apple iPhone 15 Pro Max 256GB Titanium, 6.7-inch Super Retina XDR display with ProMotion\",\n    \"Organic Cotton T-Shirt, Men's Medium, Navy Blue, 100% Sustainable Materials\",\n    \"KitchenAid Stand Mixer, 5 Quart, Red, 10-Speed Settings with Dough Hook Attachment\"\n]\n\ntemplate = outlines.Template.from_string(\"\"\"\n\u003c|im_start|\u003euser\nCategorize this product:\n\n{{ description }}\n\u003c|im_end|\u003e\n\u003c|im_start|\u003eassistant\n\"\"\")\n\n# Get structured categorization for all products\ncategories = model(\n    [template(description=desc) for desc in product_descriptions],\n    ProductCategory,\n    max_new_tokens=200\n)\n\n# Use categorization for inventory management\ncategories = [\n    ProductCategory.model_validate_json(category) for category in categories\n]\nfor product, category in zip(product_descriptions, categories):\n    update_inventory(product, category.main_category, category.sub_category)\n```\n\u003c/details\u003e\n\n\u003cdetails id=\"parse-event-details-with-incomplete-data\"\u003e\u003csummary\u003e\u003cb\u003e📊 Parse event details with incomplete data\u003c/b\u003e\n\u003cbr\u003eThis example uses outlines to parse event descriptions into structured information (like event name, date, location, type, and topics), even handling cases where the data is incomplete. It leverages union types to return either structured event data or a fallback “I don’t know” answer, ensuring robust extraction in varying scenarios.\n\u003c/summary\u003e\n\n```python\nimport outlines\nfrom typing import Union, List, Literal\nfrom pydantic import BaseModel\nfrom enum import Enum\nfrom transformers import AutoTokenizer, AutoModelForCausalLM\n\n\nMODEL_NAME = \"microsoft/Phi-3-mini-4k-instruct\"\nmodel = outlines.from_transformers(\n    AutoModelForCausalLM.from_pretrained(MODEL_NAME, device_map=\"auto\"),\n    AutoTokenizer.from_pretrained(MODEL_NAME)\n)\n\nclass EventType(str, Enum):\n    conference = \"conference\"\n    webinar = \"webinar\"\n    workshop = \"workshop\"\n    meetup = \"meetup\"\n    other = \"other\"\n\n\nclass EventInfo(BaseModel):\n    \"\"\"Structured information about a tech event\"\"\"\n    name: str\n    date: str\n    location: str\n    event_type: EventType\n    topics: List[str]\n    registration_required: bool\n\n# Create a union type that can either be a structured EventInfo or \"I don't know\"\nEventResponse = Union[EventInfo, Literal[\"I don't know\"]]\n\n# Sample event descriptions\nevent_descriptions = [\n    # Complete information\n    \"\"\"\n    Join us for DevCon 2023, the premier developer conference happening on November 15-17, 2023\n    at the San Francisco Convention Center. Topics include AI/ML, cloud infrastructure, and web3.\n    Registration is required.\n    \"\"\",\n\n    # Insufficient information\n    \"\"\"\n    Tech event next week. More details coming soon!\n    \"\"\"\n]\n\n# Process events\nresults = []\nfor description in event_descriptions:\n    prompt = f\"\"\"\n\u003c|im_start\u003esystem\nYou are a helpful assistant\n\u003c|im_end|\u003e\n\u003c|im_start\u003euser\nExtract structured information about this tech event:\n\n{description}\n\nIf there is enough information, return a JSON object with the following fields:\n\n- name: The name of the event\n- date: The date where the event is taking place\n- location: Where the event is taking place\n- event_type: either 'conference', 'webinar', 'workshop', 'meetup' or 'other'\n- topics: a list of topics of the conference\n- registration_required: a boolean that indicates whether registration is required\n\nIf the information available does not allow you to fill this JSON, and only then, answer 'I don't know'.\n\u003c|im_end|\u003e\n\u003c|im_start|\u003eassistant\n\"\"\"\n    # Union type allows the model to return structured data or \"I don't know\"\n    result = model(prompt, EventResponse, max_new_tokens=200)\n    results.append(result)\n\n# Display results\nfor i, result in enumerate(results):\n    print(f\"Event {i+1}:\")\n    if isinstance(result, str):\n        print(f\"  {result}\")\n    else:\n        # It's an EventInfo object\n        print(f\"  Name: {result.name}\")\n        print(f\"  Type: {result.event_type}\")\n        print(f\"  Date: {result.date}\")\n        print(f\"  Topics: {', '.join(result.topics)}\")\n    print()\n\n# Use structured data in downstream processing\nstructured_count = sum(1 for r in results if isinstance(r, EventInfo))\nprint(f\"Successfully extracted data for {structured_count} of {len(results)} events\")\n```\n\u003c/details\u003e\n\n\u003cdetails id=\"categorize-documents-into-predefined-types\"\u003e\u003csummary\u003e\u003cb\u003e🗂️ Categorize documents into predefined types\u003c/b\u003e\n\u003cbr\u003eIn this case, outlines classifies documents into predefined categories (e.g., “Financial Report,” “Legal Contract”) using a literal type specification. The resulting classifications are displayed in both a table format and through a category distribution summary, illustrating how structured outputs can simplify content management.\n\u003c/summary\u003e\n\n```python\nimport outlines\nfrom typing import Literal, List\nimport pandas as pd\nfrom transformers import AutoTokenizer, AutoModelForCausalLM\n\n\nMODEL_NAME = \"microsoft/Phi-3-mini-4k-instruct\"\nmodel = outlines.from_transformers(\n    AutoModelForCausalLM.from_pretrained(MODEL_NAME, device_map=\"auto\"),\n    AutoTokenizer.from_pretrained(MODEL_NAME)\n)\n\n\n# Define classification categories using Literal\nDocumentCategory = Literal[\n    \"Financial Report\",\n    \"Legal Contract\",\n    \"Technical Documentation\",\n    \"Marketing Material\",\n    \"Personal Correspondence\"\n]\n\n# Sample documents to classify\ndocuments = [\n    \"Q3 Financial Summary: Revenue increased by 15% year-over-year to $12.4M. EBITDA margin improved to 23% compared to 19% in Q3 last year. Operating expenses...\",\n\n    \"This agreement is made between Party A and Party B, hereinafter referred to as 'the Parties', on this day of...\",\n\n    \"The API accepts POST requests with JSON payloads. Required parameters include 'user_id' and 'transaction_type'. The endpoint returns a 200 status code on success.\"\n]\n\ntemplate = outlines.Template.from_string(\"\"\"\n\u003c|im_start|\u003euser\nClassify the following document into exactly one category among the following categories:\n- Financial Report\n- Legal Contract\n- Technical Documentation\n- Marketing Material\n- Personal Correspondence\n\nDocument:\n{{ document }}\n\u003c|im_end|\u003e\n\u003c|im_start|\u003eassistant\n\"\"\")\n\n# Classify documents\ndef classify_documents(texts: List[str]) -\u003e List[DocumentCategory]:\n    results = []\n\n    for text in texts:\n        prompt = template(document=text)\n        # The model must return one of the predefined categories\n        category = model(prompt, DocumentCategory, max_new_tokens=200)\n        results.append(category)\n\n    return results\n\n# Perform classification\nclassifications = classify_documents(documents)\n\n# Create a simple results table\nresults_df = pd.DataFrame({\n    \"Document\": [doc[:50] + \"...\" for doc in documents],\n    \"Classification\": classifications\n})\n\nprint(results_df)\n\n# Count documents by category\ncategory_counts = pd.Series(classifications).value_counts()\nprint(\"\\nCategory Distribution:\")\nprint(category_counts)\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary id=\"schedule-a-meeting-with-function-calling\"\u003e\u003cb\u003e📅 Schedule a meeting from requests with Function Calling\u003c/b\u003e\n\u003cbr\u003eThis example demonstrates how outlines can interpret a natural language meeting request and translate it into a structured format matching a predefined function’s parameters. Once the meeting details are extracted (e.g., title, date, duration, attendees), they are used to automatically schedule the meeting.\n\u003c/summary\u003e\n\n```python\nimport outlines\nimport json\nfrom typing import List, Optional\nfrom datetime import date\nfrom transformers import AutoTokenizer, AutoModelForCausalLM\n\n\nMODEL_NAME = \"microsoft/phi-4\"\nmodel = outlines.from_transformers(\n    AutoModelForCausalLM.from_pretrained(MODEL_NAME, device_map=\"auto\"),\n    AutoTokenizer.from_pretrained(MODEL_NAME)\n)\n\n\n# Define a function with typed parameters\ndef schedule_meeting(\n    title: str,\n    date: date,\n    duration_minutes: int,\n    attendees: List[str],\n    location: Optional[str] = None,\n    agenda_items: Optional[List[str]] = None\n):\n    \"\"\"Schedule a meeting with the specified details\"\"\"\n    # In a real app, this would create the meeting\n    meeting = {\n        \"title\": title,\n        \"date\": date,\n        \"duration_minutes\": duration_minutes,\n        \"attendees\": attendees,\n        \"location\": location,\n        \"agenda_items\": agenda_items\n    }\n    return f\"Meeting '{title}' scheduled for {date} with {len(attendees)} attendees\"\n\n# Natural language request\nuser_request = \"\"\"\nI need to set up a product roadmap review with the engineering team for next\nTuesday at 2pm. It should last 90 minutes. Please invite john@example.com,\nsarah@example.com, and the product team at product@example.com.\n\"\"\"\n\n# Outlines automatically infers the required structure from the function signature\nprompt = f\"\"\"\n\u003c|im_start|\u003euser\nExtract the meeting details from this request:\n\n{user_request}\n\u003c|im_end|\u003e\n\u003c|im_start|\u003eassistant\n\"\"\"\nmeeting_params = model(prompt, schedule_meeting, max_new_tokens=200)\n\n# The result is a dictionary matching the function parameters\nmeeting_params = json.loads(meeting_params)\nprint(meeting_params)\n\n# Call the function with the extracted parameters\nresult = schedule_meeting(**meeting_params)\nprint(result)\n# \"Meeting 'Product Roadmap Review' scheduled for 2023-10-17 with 3 attendees\"\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary id=\"dynamically-generate-prompts-with-re-usable-templates\"\u003e\u003cb\u003e📝 Dynamically generate prompts with re-usable templates\u003c/b\u003e\n\u003cbr\u003eUsing Jinja-based templates, this example shows how to generate dynamic prompts for tasks like sentiment analysis. It illustrates how to easily re-use and customize prompts—including few-shot learning strategies—for different content types while ensuring the outputs remain structured.\n\u003c/summary\u003e\n\n```python\nimport outlines\nfrom typing import List, Literal\nfrom transformers import AutoTokenizer, AutoModelForCausalLM\n\n\nMODEL_NAME = \"microsoft/phi-4\"\nmodel = outlines.from_transformers(\n    AutoModelForCausalLM.from_pretrained(MODEL_NAME, device_map=\"auto\"),\n    AutoTokenizer.from_pretrained(MODEL_NAME)\n)\n\n\n# 1. Create a reusable template with Jinja syntax\nsentiment_template = outlines.Template.from_string(\"\"\"\n\u003c|im_start\u003euser\nAnalyze the sentiment of the following {{ content_type }}:\n\n{{ text }}\n\nProvide your analysis as either \"Positive\", \"Negative\", or \"Neutral\".\n\u003c|im_end\u003e\n\u003c|im_start\u003eassistant\n\"\"\")\n\n# 2. Generate prompts with different parameters\nreview = \"This restaurant exceeded all my expectations. Fantastic service!\"\nprompt = sentiment_template(content_type=\"review\", text=review)\n\n# 3. Use the templated prompt with structured generation\nresult = model(prompt, Literal[\"Positive\", \"Negative\", \"Neutral\"])\nprint(result)  # \"Positive\"\n\n# Templates can also be loaded from files\nexample_template = outlines.Template.from_file(\"templates/few_shot.txt\")\n\n# Use with examples for few-shot learning\nexamples = [\n    (\"The food was cold\", \"Negative\"),\n    (\"The staff was friendly\", \"Positive\")\n]\nfew_shot_prompt = example_template(examples=examples, query=\"Service was slow\")\nprint(few_shot_prompt)\n```\n\u003c/details\u003e\n\n## They use outlines\n\n\u003cdiv align=\"center\"\u003e\n\u003cimg src=\"./docs/assets/images/readme-light.png#gh-light-mode-only\" alt=\"Users Logo\"\u003e\u003c/img\u003e\n\u003cimg src=\"./docs/assets/images/readme-dark.png#gh-dark-mode-only\" alt=\"Users Logo\"\u003e\u003c/img\u003e\n\u003c/div\u003e\n\n## Model Integrations\n\n| Model type | Description | Documentation |\n|---------|-------------|:-------------:|\n| **Server Support** | vLLM and Ollama | [Server Integrations →](https://dottxt-ai.github.io/outlines/latest/features/models/) |\n| **Local Model Support** | transformers and llama.cpp | [Model Integrations →](https://dottxt-ai.github.io/outlines/latest/features/models/) |\n| **API Support** | OpenAI and Gemini | [API Integrations →](https://dottxt-ai.github.io/outlines/latest/features/models/) |\n\n## Core Features\n\n| Feature | Description | Documentation |\n|---------|-------------|:-------------:|\n| **Multiple Choices** | Constrain outputs to predefined options | [Multiple Choices Guide →](https://dottxt-ai.github.io/outlines/latest/features/core/output_types/#multiple-choices) |\n| **Function Calls** | Infer structure from function signatures | [Function Guide →](https://dottxt-ai.github.io/outlines/latest/features/core/output_types/#json-schemas) |\n| **JSON/Pydantic** | Generate outputs matching JSON schemas | [JSON Guide →](https://dottxt-ai.github.io/outlines/latest/features/core/output_types/#json-schemas) |\n| **Regular Expressions** | Generate text following a regex pattern | [Regex Guide →](https://dottxt-ai.github.io/outlines/latest/features/core/output_types/#regex-patterns) |\n| **Grammars** | Enforce complex output structures | [Grammar Guide →](https://dottxt-ai.github.io/outlines/latest/features/core/output_types/#context-free-grammars) |\n\n## Other Features\n\n| Feature | Description | Documentation |\n|---------|-------------|:-------------:|\n| **Prompt templates** | Separate complex prompts from code | [Template Guide →](https://dottxt-ai.github.io/outlines/latest/features/utility/template/) |\n| **Custome types** | Intuitive interface to build complex types | [Python Types Guide →](https://dottxt-ai.github.io/outlines/latest/features/core/output_types/#basic-python-types) |\n| **Applications** | Encapsulate templates and types into functions | [Application Guide →](https://dottxt-ai.github.io/outlines/latest/features/utility/application/) |\n\n## About .txt\n\n\u003cdiv align=\"center\"\u003e\n\u003cimg src=\"./docs/assets/images/dottxt-light.svg#gh-light-mode-only\" alt=\"dottxt logo\" width=100\u003e\u003c/img\u003e\n\u003cimg src=\"./docs/assets/images/dottxt-dark.svg#gh-dark-mode-only\" alt=\"dottxt logo\" width=100\u003e\u003c/img\u003e\n\u003c/div\u003e\n\nOutlines is developed and maintained by [.txt](https://dottxt.co), a company dedicated to making LLMs more reliable for production applications.\n\nOur focus is on advancing structured generation technology through:\n\n- 🧪 **Cutting-edge Research**: We publish our findings on [structured generation](http://blog.dottxt.co/performance-gsm8k.html)\n- 🚀 **Enterprise-grade solutions**: You can license [our enterprise-grade libraries](https://docs.dottxt.co).\n- 🧩 **Open Source Collaboration**: We believe in building in public and contributing to the community\n\nFollow us on [Twitter](https://twitter.com/dottxtai) or check out our [blog](https://blog.dottxt.co/) to stay updated on our latest work in making LLMs more reliable.\n\n## Community\n\n\u003cdiv align=\"center\" style=\"margin-bottom: 1em;\"\u003e\n\n[![Contributors][contributors-badge]][contributors]\n[![Stars][stars-badge]][stars]\n[![Downloads][downloads-badge]][pypistats]\n[![Discord badge][discord-badge]][discord]\n\n\u003c/div\u003e\n\n- 💡 **Have an idea?** Come chat with us on [Discord][discord]\n- 🐞 **Found a bug?** Open an [issue](https://github.com/dottxt-ai/outlines/issues)\n- 🧩  **Want to contribute?** Consult our [contribution guide](https://dottxt-ai.github.io/outlines/latest/community/contribute/).\n\n\n## Cite Outlines\n\n```\n@article{willard2023efficient,\n  title={Efficient Guided Generation for Large Language Models},\n  author={Willard, Brandon T and Louf, R{\\'e}mi},\n  journal={arXiv preprint arXiv:2307.09702},\n  year={2023}\n}\n```\n\n[contributors]: https://github.com/dottxt-ai/outlines/graphs/contributors\n[contributors-badge]: https://img.shields.io/github/contributors/dottxt-ai/outlines?style=flat-square\u0026logo=github\u0026logoColor=white\u0026color=ECEFF4\n[dottxt-blog]: https://blog.dottxt.co/\n[dottxt-blog-badge]: https://img.shields.io/badge/dottxt%20blog-a6b4a3\n[dottxt-twitter]: https://twitter.com/dottxtai\n[dottxt-twitter-badge]: https://img.shields.io/twitter/follow/dottxtai?style=social\n[discord]: https://discord.gg/R9DSu34mGd\n[discord-badge]: https://img.shields.io/discord/1182316225284554793?color=ddb8ca\u0026logo=discord\u0026logoColor=white\u0026style=flat-square\n[downloads-badge]: https://img.shields.io/pypi/dm/outlines?color=A6B4A3\u0026logo=python\u0026logoColor=white\u0026style=flat-square\n[pypistats]: https://pypistats.org/packages/outlines\n[pypi-version-badge]: https://img.shields.io/pypi/v/outlines?style=flat-square\u0026logoColor=white\u0026color=ddb8ca\n[pypi]: https://pypi.org/project/outlines/\n[stars]: https://github.com/dottxt-ai/outlines/stargazers\n[stars-badge]: https://img.shields.io/github/stars/dottxt-ai/outlines?style=flat-square\u0026logo=github\u0026color=BD932F\u0026logoColor=white\n[twitter-badge]: https://img.shields.io/twitter/follow/dottxtai?style=flat-square\u0026logo=x\u0026logoColor=white\u0026color=bd932f\n[twitter]: https://x.com/dottxtai\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdottxt-ai%2Foutlines","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdottxt-ai%2Foutlines","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdottxt-ai%2Foutlines/lists"}