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-ruby3user-invocable: true4description: 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.5allowed-tools:6 - Bash7 - Read8 - Write9 - Edit10 - Grep11 - Glob12model: inherit13---1415# DSPy.rb Expert1617## Overview1819DSPy.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.2021## Mode Detection2223Determine what the user needs, then read ONLY the relevant reference files before proceeding.2425| User Intent | Reference Files to Read |26|-------------|------------------------|27| Signatures, modules, predictors, type safety | `core-concepts.md` |28| LLM provider setup, API keys, configuration | `providers.md` |29| Testing, optimization, observability | `optimization.md` |30| Getting started, Rails integration | `quickstart.md` |31| Common patterns, agents, pipelines, vision | `patterns.md` |3233All reference files are in `~/.claude/skills/dspy-ruby/references/`.3435---3637## Core Capabilities (Quick Reference)3839### 1. Type-Safe Signatures4041```ruby42class EmailClassificationSignature < DSPy::Signature43 description "Classify customer support emails"4445 input do46 const :email_subject, String47 const :email_body, String48 end4950 output do51 const :category, T.enum(["Technical", "Billing", "General"])52 const :priority, T.enum(["Low", "Medium", "High"])53 end54end55```5657**Best practices**: Clear descriptions, enums for constrained outputs, `desc:` parameter for fields, specific types over generic String. Full docs: `core-concepts.md`.5859### 2. Composable Modules6061```ruby62class EmailProcessor < DSPy::Module63 def initialize64 super65 @classifier = DSPy::Predict.new(EmailClassificationSignature)66 end6768 def forward(email_subject:, email_body:)69 @classifier.forward(email_subject: email_subject, email_body: email_body)70 end71end72```7374Chain modules for complex workflows. Full docs: `core-concepts.md`.7576### 3. Predictor Types7778| Predictor | Use For | Key Feature |79|-----------|---------|-------------|80| **Predict** | Simple tasks, classification, extraction | Basic type-safe inference |81| **ChainOfThought** | Complex reasoning, analysis | Automatic reasoning step |82| **ReAct** | Tasks requiring external tools | Iterative tool-using agent |83| **CodeAct** | Tasks best solved with code | Dynamic code generation (`dspy-code_act` gem) |8485Full docs: `core-concepts.md`.8687### 4. LLM Provider Configuration8889```ruby90# OpenAI91DSPy.configure { |c| c.lm = DSPy::LM.new('openai/gpt-4o-mini', api_key: ENV['OPENAI_API_KEY']) }9293# Anthropic Claude94DSPy.configure { |c| c.lm = DSPy::LM.new('anthropic/claude-3-5-sonnet-20241022', api_key: ENV['ANTHROPIC_API_KEY']) }9596# Google Gemini97DSPy.configure { |c| c.lm = DSPy::LM.new('gemini/gemini-1.5-pro', api_key: ENV['GOOGLE_API_KEY']) }9899# Local Ollama (free, private)100DSPy.configure { |c| c.lm = DSPy::LM.new('ollama/llama3.1') }101```102103**Provider compatibility matrix**:104105| Feature | OpenAI | Anthropic | Gemini | Ollama |106|---------|--------|-----------|--------|--------|107| Structured Output | yes | yes | yes | yes |108| Vision (Images) | yes | yes | yes | limited |109| Image URLs | yes | no | no | no |110| Tool Calling | yes | yes | yes | varies |111112**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`.113114### 5. Testing115116```ruby117RSpec.describe EmailClassifier do118 before do119 DSPy.configure { |c| c.lm = DSPy::LM.new('openai/gpt-4o-mini', api_key: ENV['OPENAI_API_KEY']) }120 end121122 it 'classifies technical emails correctly' do123 result = EmailClassifier.new.forward(email_subject: "Can't log in", email_body: "Unable to access account")124 expect(result[:category]).to eq('Technical')125 end126end127```128129Full docs: `optimization.md`.130131---132133## Reference Files Index134135| File | Content |136|------|---------|137| `core-concepts.md` | Signatures, modules, predictors, multimodal support, best practices |138| `providers.md` | All LLM provider configs, compatibility matrix, cost optimization, troubleshooting |139| `optimization.md` | Testing patterns, MIPROv2 optimization, observability, monitoring |140| `quickstart.md` | Step-by-step new project setup, Rails integration |141| `patterns.md` | Multi-step pipelines, agents with tools, conditional routing, retry/fallback, vision, observability |142143### Assets (templates for quick starts)144145- `assets/signature-template.rb` -- Examples of signatures including basic, vision, sentiment, code gen146- `assets/module-template.rb` -- Module patterns including pipelines, agents, error handling, caching147- `assets/config-template.rb` -- Configuration for all providers, environments, observability, production148149## When to Use This Skill150151- Implementing LLM-powered features in Ruby applications152- Creating type-safe interfaces for AI operations153- Building agent systems with tool usage154- Setting up or troubleshooting LLM providers155- Optimizing prompts and improving accuracy156- Testing LLM functionality157- Adding observability to AI applications158- Converting from manual prompt engineering to programmatic approach159- Debugging DSPy.rb code or configuration issues