Skip to content

Commit c91d52c

Browse files
committed
feat: better error handling
1 parent 2f527ae commit c91d52c

File tree

3 files changed

+58
-18
lines changed

3 files changed

+58
-18
lines changed

.rspec_status

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,21 @@
11
example_id | status | run_time |
22
--------------------------------------------- | ------ | --------------- |
3-
./spec/dspy/chain_of_thought_spec.rb[1:1:1] | passed | 0.04216 seconds |
4-
./spec/dspy/chain_of_thought_spec.rb[1:1:2] | passed | 0.00218 seconds |
5-
./spec/dspy/colbertv2_rag_spec.rb[1:1] | passed | 0.00095 seconds |
6-
./spec/dspy/colbertv2_rag_spec.rb[1:2] | passed | 0.00295 seconds |
7-
./spec/dspy/ext/dry_schema_ext_spec.rb[1:1] | passed | 0.00091 seconds |
8-
./spec/dspy/ext/dry_schema_ext_spec.rb[1:2] | passed | 0.00007 seconds |
9-
./spec/dspy/ext/dry_schema_ext_spec.rb[1:3] | passed | 0.00109 seconds |
10-
./spec/dspy/ext/dry_schema_ext_spec.rb[1:4] | passed | 0.00008 seconds |
11-
./spec/dspy/multi_stage_pipeline_spec.rb[1:1] | passed | 0.00207 seconds |
12-
./spec/dspy/multi_stage_pipeline_spec.rb[1:2] | passed | 0.00164 seconds |
13-
./spec/dspy/multi_stage_pipeline_spec.rb[1:3] | passed | 0.00417 seconds |
14-
./spec/dspy/multi_stage_pipeline_spec.rb[1:4] | passed | 0.00632 seconds |
15-
./spec/dspy/predict_spec.rb[1:1:1] | passed | 0.0016 seconds |
16-
./spec/dspy/predict_spec.rb[1:1:2] | passed | 0.00161 seconds |
3+
./spec/dspy/chain_of_thought_spec.rb[1:1:1] | passed | 0.02183 seconds |
4+
./spec/dspy/chain_of_thought_spec.rb[1:1:2] | passed | 0.00196 seconds |
5+
./spec/dspy/colbertv2_rag_spec.rb[1:1] | passed | 0.00097 seconds |
6+
./spec/dspy/colbertv2_rag_spec.rb[1:2] | passed | 0.0029 seconds |
7+
./spec/dspy/ext/dry_schema_ext_spec.rb[1:1] | passed | 0.00101 seconds |
8+
./spec/dspy/ext/dry_schema_ext_spec.rb[1:2] | passed | 0.00006 seconds |
9+
./spec/dspy/ext/dry_schema_ext_spec.rb[1:3] | passed | 0.00104 seconds |
10+
./spec/dspy/ext/dry_schema_ext_spec.rb[1:4] | passed | 0.00009 seconds |
11+
./spec/dspy/multi_stage_pipeline_spec.rb[1:1] | passed | 0.00361 seconds |
12+
./spec/dspy/multi_stage_pipeline_spec.rb[1:2] | passed | 0.00173 seconds |
13+
./spec/dspy/multi_stage_pipeline_spec.rb[1:3] | passed | 0.00429 seconds |
14+
./spec/dspy/multi_stage_pipeline_spec.rb[1:4] | passed | 0.00631 seconds |
15+
./spec/dspy/predict_spec.rb[1:1:1] | passed | 0.00183 seconds |
16+
./spec/dspy/predict_spec.rb[1:1:2] | passed | 0.00318 seconds |
17+
./spec/dspy/predict_validation_spec.rb[1:1:1] | passed | 0.00302 seconds |
1718
./spec/dspy/signature_spec.rb[1:1] | passed | 0.00006 seconds |
1819
./spec/dspy/signature_spec.rb[1:2] | passed | 0.00005 seconds |
19-
./spec/dspy_spec.rb[1:1:1] | passed | 0.00045 seconds |
20-
./spec/dspy_spec.rb[1:1:2] | passed | 0.00004 seconds |
20+
./spec/dspy_spec.rb[1:1:1] | passed | 0.00031 seconds |
21+
./spec/dspy_spec.rb[1:1:2] | passed | 0.00003 seconds |

lib/dspy/predict.rb

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
11
# frozen_string_literal: true
22

33
module DSPy
4+
class PredictionInvalidError < RuntimeError
5+
attr_accessor :errors
6+
def initialize(errors)
7+
@errors = errors
8+
super("Prediction invalid")
9+
end
10+
end
411
class Predict < DSPy::Module
512
attr_reader :signature_class
613

@@ -59,8 +66,7 @@ def forward(**input_values)
5966
poro_class = Data.define(*output_attributes.keys)
6067
return poro_class.new(*output_attributes.values)
6168
end
62-
63-
raise result.errors
69+
raise PredictionInvalidError, result.errors
6470
end
6571
end
6672
end
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
require 'spec_helper'
2+
3+
RSpec.describe DSPy::Predict do
4+
before do
5+
DSPy.configure do |c|
6+
c.lm = DSPy::LM.new('openai/gpt-4o-mini', api_key: ENV['OPENAI_API_KEY'])
7+
end
8+
end
9+
10+
describe 'sentiment classification example' do
11+
it 'raises an exception when sending wrong params' do
12+
VCR.use_cassette('openai/gpt4o-mini/predict_validation') do
13+
class Classify < DSPy::Signature
14+
description "Classify sentiment of a given sentence."
15+
16+
input do
17+
required(:sentence).value(:string).meta(description: 'The sentence whose sentiment you are analyzing')
18+
end
19+
20+
output do
21+
required(:sentiment).value(included_in?: %w(positive negative neutral))
22+
.meta(description: 'The allowed values to classify sentences')
23+
required(:confidence).value(:float).meta(description: 'The confidence score for the classification')
24+
end
25+
end
26+
# Create the predictor
27+
@classify = DSPy::Predict.new(Classify)
28+
29+
expect { @classify.call(sentence: 1337) }.to raise_error(DSPy::PredictionInvalidError)
30+
end
31+
end
32+
end
33+
end

0 commit comments

Comments
 (0)