docs/overrides/home.html
{% extends "main.html" %} {# Hide the site-wide announcement banner on the landing page only #} {% block announce %}{% endblock %} {% block styles %} {{ super() }} {% endblock %} {% block content %}
DSPy {{ config.extra.stats.release_version }} — {{ config.extra.stats.release_blurb }} ·learn more →
DSPy is a Python framework for building AI systems. Express your tasks as structured signatures, not prompts, to produce maintainable, modular, and optimizable programs.
$ pip install -U dspyGetting Started →
python ≥ 3.10MIT licenseStanford NLPgithub.com/stanfordnlp/dspy
Change LLMAdd a FieldMake it an Agent
extract_events.py
12345678910
lm = dspy.LM("openai/gpt-5.4-nano")
class ExtractEvent(dspy.Signature):
"""Extract event details from an email."""
email: str = dspy.InputField()
event_name: str = dspy.OutputField()
date: str = dspy.OutputField()
extract = dspy.Predict(ExtractEvent)
extract(email=inbox_message)
output
Prediction(
event_name="Team Offsite",
date="Thursday, June 5"
)
{{ config.extra.stats.monthly_downloads }}
monthly downloads
{{ config.extra.stats.contributors }}
contributors
{{ config.extra.stats.stars }}
github stars
in production at
Declare your task.
Define your task as typed inputs and outputs instead of managing messy prompts. Portable, maintainable, and easy to iterate on.
class Triage(dspy.Signature):
"""Route a support ticket."""
ticket: str = dspy.InputField()
urgency: Literal["low", "high"] = dspy.OutputField()
team: str = dspy.OutputField()
Same interface, different strategy.
Modules control how your signature executes. Reason, run ensembles, use tools, add a REPL, and more without rewriting your task.
classify = dspy.Predict(Triage)
classify = dspy.ChainOfThought(Triage)
classify = dspy.ReAct(Triage, tools=[search])
Compile your program against a metric.
Give DSPy examples and a scoring function. It tunes your prompts automatically until quality converges.
tp = dspy.GEPA(
metric=semantic_f1,
auto="medium")
opt = tp.compile(rag, trainset)
opt.save("rag.v2.json")
ExtractAgentPipelineMultimodalOptimize
class Extract(dspy.Signature):
"""Extract contact info."""
message: str = dspy.InputField()
name: str = dspy.OutputField()
email: Optional[str] = dspy.OutputField()
intent: Literal[
"meeting", "intro", "follow-up"
] = dspy.OutputField()
extract = dspy.Predict(Extract)
extract(message="I'm Sarah"
"([email protected]). Meet Thursday?")
outputstdout
Prediction(
name="Sarah",
email="[email protected]",
intent="meeting"
)
def search(query: str) -> list[str]:
"""Search a knowledge base."""
return kb.query(query, k=3)
def calc(expr: str) -> float:
"""Evaluate a math expression."""
return dspy.PythonInterpreter({}).execute(expr)
agent = dspy.ReAct(
"question -> answer",
tools=[search, calc])
agent(question="GDP per capita of France?")
outputstdout
Prediction(answer="$46,029")
class FactCheck(dspy.Module):
def __init__(self):
self.find = dspy.ChainOfThought(
"article -> claims: list[str]")
self.verify = dspy.ChainOfThought(
"claim, source -> verdict")
def forward(self, article):
found = self.find(article=article)
return [
self.verify(claim=c, source=article)
for c in found.claims]
outputstdout
[Prediction(verdict="supported"),
Prediction(verdict="unsupported"),
Prediction(verdict="supported")]
class AnalyzeChart(dspy.Signature):
"""Describe the trend and key data points in a chart."""
chart: dspy.Image = dspy.InputField()
title: str = dspy.OutputField()
trend: str = dspy.OutputField()
data_points: list[dict] = dspy.OutputField()
analyze = dspy.Predict(AnalyzeChart)
analyze(chart=dspy.Image("quarterly_revenue.png"))
outputstdout
Prediction(
title="Quarterly Revenue (2024)",
trend="Steady growth, Q3 dip, strong Q4 recovery",
data_points=[{"q": "Q1", "rev": "$4.2M"}, ...]
)
optimizer = dspy.GEPA(
metric=accuracy, auto="medium")
optimized = optimizer.compile(
extract, trainset=labeled_emails)
optimized.save("extract_v2.json")
outputstdout
Signatures define tasks and enforce output types Define tools as functions and pass them to a ReAct module Compose multiple Signatures into new modules with plain Python control flow Images are a Signature field types, enabling multimodal tasks Optimizers improve your program against a defined metric Learn more about Signatures → Learn how to add tools → Learn how to compose modules → Learn how to build multimodal programs → Learn how to write metrics and optimize →
DSPy started at Stanford NLP and grew into a research community. New optimizers and module types land here first — then show up in production systems at companies you’ve heard of.
Dec 2025
Recursive Language Models
Jul 2025
GEPA: Reflective Prompt Evolution
Jul 2024
BetterTogether: Fine-Tuning + Prompt Opt.
Jun 2024
MIPROv2: Optimizing Instructions & Demos
Feb 2024
STORM: Writing Wikipedia-like Articles
Oct 2023
DSPy: Compiling Declarative LM Calls
Dec 2022
Demonstrate-Search-Predict
Metadata extraction across all shops; ~550× cost reduction
Optimized Dash relevance judge for ranking and evaluation
Prompt migration from larger to smaller models on Amazon Nova
Multiple chatbot use cases on Databricks
Code repair pipeline using code LLMs to synthesize diffs
LM judges, RAG, classification, and customer solutions
Evolutionary self-improvement for the Hermes agent
See all companies using DSPy in production
Community
{{ config.extra.stats.contributors }}
contributors
{{ config.extra.stats.discord_members }}
discord members
{{ config.extra.stats.merged_prs_yr }}
merged PRs / yr
60+
tutorials & recipes
{% endblock %}