DSPy.rb Expert
Overview
DSPy.rb is a Ruby framework that enables developers to program LLMs, not prompt them. Instead of manually crafting prompts, define application requirements through type-safe, composable modules that can be tested, optimized, and version-controlled like regular code.
Mode Detection
Determine what the user needs, then read ONLY the relevant reference files before proceeding.
| User Intent |
Reference Files to Read |
| Signatures, modules, predictors, type safety |
core-concepts.md |
| LLM provider setup, API keys, configuration |
providers.md |
| Testing, optimization, observability |
optimization.md |
| Getting started, Rails integration |
quickstart.md |
| Common patterns, agents, pipelines, vision |
patterns.md |
All reference files are in ~/.claude/skills/dspy-ruby/references/.
Core Capabilities (Quick Reference)
1. Type-Safe Signatures
class EmailClassificationSignature < DSPy::Signature
description "Classify customer support emails"
input do
const :email_subject, String
const :email_body, String
end
output do
const :category, T.enum(["Technical", "Billing", "General"])
const :priority, T.enum(["Low", "Medium", "High"])
end
end
Best practices: Clear descriptions, enums for constrained outputs, desc: parameter for fields, specific types over generic String. Full docs: core-concepts.md.
2. Composable Modules
class EmailProcessor < DSPy::Module
def initialize
super
@classifier = DSPy::Predict.new(EmailClassificationSignature)
end
def forward(email_subject:, email_body:)
@classifier.forward(email_subject: email_subject, email_body: email_body)
end
end
Chain modules for complex workflows. Full docs: core-concepts.md.
3. Predictor Types
| Predictor |
Use For |
Key Feature |
| Predict |
Simple tasks, classification, extraction |
Basic type-safe inference |
| ChainOfThought |
Complex reasoning, analysis |
Automatic reasoning step |
| ReAct |
Tasks requiring external tools |
Iterative tool-using agent |
| CodeAct |
Tasks best solved with code |
Dynamic code generation (dspy-code_act gem) |
Full docs: core-concepts.md.
4. LLM Provider Configuration
# OpenAI
DSPy.configure { |c| c.lm = DSPy::LM.new('openai/gpt-4o-mini', api_key: ENV['OPENAI_API_KEY']) }
# Anthropic Claude
DSPy.configure { |c| c.lm = DSPy::LM.new('anthropic/claude-3-5-sonnet-20241022', api_key: ENV['ANTHROPIC_API_KEY']) }
# Google Gemini
DSPy.configure { |c| c.lm = DSPy::LM.new('gemini/gemini-1.5-pro', api_key: ENV['GOOGLE_API_KEY']) }
# Local Ollama (free, private)
DSPy.configure { |c| c.lm = DSPy::LM.new('ollama/llama3.1') }
Provider compatibility matrix:
| Feature |
OpenAI |
Anthropic |
Gemini |
Ollama |
| Structured Output |
yes |
yes |
yes |
yes |
| Vision (Images) |
yes |
yes |
yes |
limited |
| Image URLs |
yes |
no |
no |
no |
| Tool Calling |
yes |
yes |
yes |
varies |
Cost optimization: Dev = Ollama/gpt-4o-mini, Test = gpt-4o-mini (temp=0), Prod simple = gpt-4o-mini/haiku/flash, Prod complex = gpt-4o/sonnet/pro. Full docs: providers.md.
5. Testing
RSpec.describe EmailClassifier do
before do
DSPy.configure { |c| c.lm = DSPy::LM.new('openai/gpt-4o-mini', api_key: ENV['OPENAI_API_KEY']) }
end
it 'classifies technical emails correctly' do
result = EmailClassifier.new.forward(email_subject: "Can't log in", email_body: "Unable to access account")
expect(result[:category]).to eq('Technical')
end
end
Full docs: optimization.md.
Reference Files Index
| File |
Content |
core-concepts.md |
Signatures, modules, predictors, multimodal support, best practices |
providers.md |
All LLM provider configs, compatibility matrix, cost optimization, troubleshooting |
optimization.md |
Testing patterns, MIPROv2 optimization, observability, monitoring |
quickstart.md |
Step-by-step new project setup, Rails integration |
patterns.md |
Multi-step pipelines, agents with tools, conditional routing, retry/fallback, vision, observability |
Assets (templates for quick starts)
assets/signature-template.rb -- Examples of signatures including basic, vision, sentiment, code gen
assets/module-template.rb -- Module patterns including pipelines, agents, error handling, caching
assets/config-template.rb -- Configuration for all providers, environments, observability, production
When to Use This Skill
- Implementing LLM-powered features in Ruby applications
- Creating type-safe interfaces for AI operations
- Building agent systems with tool usage
- Setting up or troubleshooting LLM providers
- Optimizing prompts and improving accuracy
- Testing LLM functionality
- Adding observability to AI applications
- Converting from manual prompt engineering to programmatic approach
- Debugging DSPy.rb code or configuration issues
1---2name: dspy-ruby3description: This skill should be used when working with DSPy.rb, a Ruby framework for building type-safe, composable LLM applications. Use this when implementing predictable AI features, creating LLM signatures and modules, configuring language model providers (OpenAI, Anthropic, Gemini, Ollama), building agent systems with tools, optimizing prompts, or testing LLM-powered functionality in Ruby applications.4---56# DSPy.rb Expert78## Overview910DSPy.rb is a Ruby framework that enables developers to **program LLMs, not prompt them**. Instead of manually crafting prompts, define application requirements through type-safe, composable modules that can be tested, optimized, and version-controlled like regular code.1112## Mode Detection1314Determine what the user needs, then read ONLY the relevant reference files before proceeding.1516| User Intent | Reference Files to Read |17|-------------|------------------------|18| Signatures, modules, predictors, type safety | `core-concepts.md` |19| LLM provider setup, API keys, configuration | `providers.md` |20| Testing, optimization, observability | `optimization.md` |21| Getting started, Rails integration | `quickstart.md` |22| Common patterns, agents, pipelines, vision | `patterns.md` |2324All reference files are in `~/.claude/skills/dspy-ruby/references/`.2526---2728## Core Capabilities (Quick Reference)2930### 1. Type-Safe Signatures3132```ruby33class EmailClassificationSignature < DSPy::Signature34 description "Classify customer support emails"3536 input do37 const :email_subject, String38 const :email_body, String39 end4041 output do42 const :category, T.enum(["Technical", "Billing", "General"])43 const :priority, T.enum(["Low", "Medium", "High"])44 end45end46```4748**Best practices**: Clear descriptions, enums for constrained outputs, `desc:` parameter for fields, specific types over generic String. Full docs: `core-concepts.md`.4950### 2. Composable Modules5152```ruby53class EmailProcessor < DSPy::Module54 def initialize55 super56 @classifier = DSPy::Predict.new(EmailClassificationSignature)57 end5859 def forward(email_subject:, email_body:)60 @classifier.forward(email_subject: email_subject, email_body: email_body)61 end62end63```6465Chain modules for complex workflows. Full docs: `core-concepts.md`.6667### 3. Predictor Types6869| Predictor | Use For | Key Feature |70|-----------|---------|-------------|71| **Predict** | Simple tasks, classification, extraction | Basic type-safe inference |72| **ChainOfThought** | Complex reasoning, analysis | Automatic reasoning step |73| **ReAct** | Tasks requiring external tools | Iterative tool-using agent |74| **CodeAct** | Tasks best solved with code | Dynamic code generation (`dspy-code_act` gem) |7576Full docs: `core-concepts.md`.7778### 4. LLM Provider Configuration7980```ruby81# OpenAI82DSPy.configure { |c| c.lm = DSPy::LM.new('openai/gpt-4o-mini', api_key: ENV['OPENAI_API_KEY']) }8384# Anthropic Claude85DSPy.configure { |c| c.lm = DSPy::LM.new('anthropic/claude-3-5-sonnet-20241022', api_key: ENV['ANTHROPIC_API_KEY']) }8687# Google Gemini88DSPy.configure { |c| c.lm = DSPy::LM.new('gemini/gemini-1.5-pro', api_key: ENV['GOOGLE_API_KEY']) }8990# Local Ollama (free, private)91DSPy.configure { |c| c.lm = DSPy::LM.new('ollama/llama3.1') }92```9394**Provider compatibility matrix**:9596| Feature | OpenAI | Anthropic | Gemini | Ollama |97|---------|--------|-----------|--------|--------|98| Structured Output | yes | yes | yes | yes |99| Vision (Images) | yes | yes | yes | limited |100| Image URLs | yes | no | no | no |101| Tool Calling | yes | yes | yes | varies |102103**Cost optimization**: Dev = Ollama/gpt-4o-mini, Test = gpt-4o-mini (temp=0), Prod simple = gpt-4o-mini/haiku/flash, Prod complex = gpt-4o/sonnet/pro. Full docs: `providers.md`.104105### 5. Testing106107```ruby108RSpec.describe EmailClassifier do109 before do110 DSPy.configure { |c| c.lm = DSPy::LM.new('openai/gpt-4o-mini', api_key: ENV['OPENAI_API_KEY']) }111 end112113 it 'classifies technical emails correctly' do114 result = EmailClassifier.new.forward(email_subject: "Can't log in", email_body: "Unable to access account")115 expect(result[:category]).to eq('Technical')116 end117end118```119120Full docs: `optimization.md`.121122---123124## Reference Files Index125126| File | Content |127|------|---------|128| `core-concepts.md` | Signatures, modules, predictors, multimodal support, best practices |129| `providers.md` | All LLM provider configs, compatibility matrix, cost optimization, troubleshooting |130| `optimization.md` | Testing patterns, MIPROv2 optimization, observability, monitoring |131| `quickstart.md` | Step-by-step new project setup, Rails integration |132| `patterns.md` | Multi-step pipelines, agents with tools, conditional routing, retry/fallback, vision, observability |133134### Assets (templates for quick starts)135136- `assets/signature-template.rb` -- Examples of signatures including basic, vision, sentiment, code gen137- `assets/module-template.rb` -- Module patterns including pipelines, agents, error handling, caching138- `assets/config-template.rb` -- Configuration for all providers, environments, observability, production139140## When to Use This Skill141142- Implementing LLM-powered features in Ruby applications143- Creating type-safe interfaces for AI operations144- Building agent systems with tool usage145- Setting up or troubleshooting LLM providers146- Optimizing prompts and improving accuracy147- Testing LLM functionality148- Adding observability to AI applications149- Converting from manual prompt engineering to programmatic approach150- Debugging DSPy.rb code or configuration issues