dspy 0.4.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +15 -20
- data/lib/dspy/chain_of_thought.rb +84 -104
- data/lib/dspy/instrumentation/token_tracker.rb +6 -6
- data/lib/dspy/instrumentation.rb +109 -17
- data/lib/dspy/lm.rb +63 -29
- data/lib/dspy/mixins/instrumentation_helpers.rb +119 -0
- data/lib/dspy/mixins/struct_builder.rb +133 -0
- data/lib/dspy/mixins/type_coercion.rb +67 -0
- data/lib/dspy/predict.rb +51 -94
- data/lib/dspy/re_act.rb +242 -173
- data/lib/dspy/subscribers/logger_subscriber.rb +60 -5
- data/lib/dspy/version.rb +1 -1
- data/lib/dspy.rb +87 -0
- metadata +5 -2
data/lib/dspy.rb
CHANGED
@@ -2,17 +2,104 @@
|
|
2
2
|
require 'sorbet-runtime'
|
3
3
|
require 'dry-configurable'
|
4
4
|
require 'dry/logger'
|
5
|
+
require 'securerandom'
|
5
6
|
|
6
7
|
require_relative 'dspy/version'
|
7
8
|
|
8
9
|
module DSPy
|
9
10
|
extend Dry::Configurable
|
11
|
+
|
12
|
+
# Timestamp format options for instrumentation events
|
13
|
+
class TimestampFormat < T::Enum
|
14
|
+
enums do
|
15
|
+
ISO8601 = new('iso8601')
|
16
|
+
RFC3339_NANO = new('rfc3339_nano')
|
17
|
+
UNIX_NANO = new('unix_nano')
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
10
21
|
setting :lm
|
11
22
|
setting :logger, default: Dry.Logger(:dspy, formatter: :string)
|
23
|
+
|
24
|
+
# Nested instrumentation configuration using proper dry-configurable syntax
|
25
|
+
setting :instrumentation do
|
26
|
+
# Core settings
|
27
|
+
setting :enabled, default: false
|
28
|
+
setting :subscribers, default: []
|
29
|
+
setting :sampling_rate, default: 1.0
|
30
|
+
setting :async_processing, default: false
|
31
|
+
setting :buffer_size, default: 1000
|
32
|
+
setting :flush_interval, default: 30
|
33
|
+
setting :error_reporting, default: false
|
34
|
+
setting :error_service, default: nil
|
35
|
+
setting :sampling_rules, default: {}
|
36
|
+
setting :timestamp_format, default: TimestampFormat::ISO8601
|
37
|
+
|
38
|
+
# Nested correlation ID configuration
|
39
|
+
setting :correlation_id do
|
40
|
+
setting :enabled, default: false
|
41
|
+
setting :header, default: 'X-Correlation-ID'
|
42
|
+
setting :generator, default: -> { SecureRandom.uuid }
|
43
|
+
end
|
44
|
+
|
45
|
+
# Nested logger configuration
|
46
|
+
setting :logger do
|
47
|
+
setting :level, default: :info
|
48
|
+
setting :include_payloads, default: true
|
49
|
+
setting :correlation_id, default: true
|
50
|
+
setting :sampling, default: {}
|
51
|
+
setting :sampling_conditions, default: {}
|
52
|
+
end
|
53
|
+
|
54
|
+
# Nested OpenTelemetry configuration
|
55
|
+
setting :otel do
|
56
|
+
setting :tracer_name, default: 'dspy-ruby'
|
57
|
+
setting :service_name, default: 'dspy-application'
|
58
|
+
setting :service_version, default: DSPy::VERSION
|
59
|
+
setting :endpoint, default: -> { ENV['OTEL_EXPORTER_OTLP_ENDPOINT'] }
|
60
|
+
end
|
61
|
+
|
62
|
+
# Nested New Relic configuration
|
63
|
+
setting :newrelic do
|
64
|
+
setting :app_name, default: 'DSPy Application'
|
65
|
+
setting :license_key, default: -> { ENV['NEW_RELIC_LICENSE_KEY'] }
|
66
|
+
setting :custom_attributes, default: {}
|
67
|
+
end
|
68
|
+
|
69
|
+
# Nested Langfuse configuration
|
70
|
+
setting :langfuse do
|
71
|
+
setting :public_key, default: -> { ENV['LANGFUSE_PUBLIC_KEY'] }
|
72
|
+
setting :secret_key, default: -> { ENV['LANGFUSE_SECRET_KEY'] }
|
73
|
+
setting :host, default: -> { ENV['LANGFUSE_HOST'] }
|
74
|
+
setting :track_tokens, default: true
|
75
|
+
setting :track_costs, default: true
|
76
|
+
setting :track_prompts, default: true
|
77
|
+
end
|
78
|
+
end
|
12
79
|
|
13
80
|
def self.logger
|
14
81
|
config.logger
|
15
82
|
end
|
83
|
+
|
84
|
+
# Validation methods for instrumentation configuration
|
85
|
+
def self.validate_instrumentation!
|
86
|
+
config = self.config.instrumentation
|
87
|
+
|
88
|
+
raise ArgumentError, "Sampling rate must be between 0.0 and 1.0" unless config.sampling_rate.between?(0.0, 1.0)
|
89
|
+
raise ArgumentError, "Buffer size must be positive" unless config.buffer_size > 0
|
90
|
+
raise ArgumentError, "Flush interval must be positive" unless config.flush_interval > 0
|
91
|
+
raise ArgumentError, "Invalid timestamp format" unless config.timestamp_format.is_a?(TimestampFormat)
|
92
|
+
|
93
|
+
if config.enabled && config.subscribers.empty?
|
94
|
+
raise ArgumentError, "Must specify at least one subscriber when instrumentation is enabled"
|
95
|
+
end
|
96
|
+
|
97
|
+
# Validate subscribers are valid symbols
|
98
|
+
invalid_subscribers = config.subscribers - [:logger, :otel, :newrelic, :langfuse]
|
99
|
+
unless invalid_subscribers.empty?
|
100
|
+
raise ArgumentError, "Invalid subscribers: #{invalid_subscribers.join(', ')}"
|
101
|
+
end
|
102
|
+
end
|
16
103
|
end
|
17
104
|
|
18
105
|
require_relative 'dspy/module'
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dspy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vicente Reig Rincón de Arellano
|
8
8
|
bindir: bin
|
9
9
|
cert_chain: []
|
10
|
-
date: 2025-07-
|
10
|
+
date: 2025-07-04 00:00:00.000000000 Z
|
11
11
|
dependencies:
|
12
12
|
- !ruby/object:Gem::Dependency
|
13
13
|
name: dry-configurable
|
@@ -159,6 +159,9 @@ files:
|
|
159
159
|
- lib/dspy/lm/adapters/openai_adapter.rb
|
160
160
|
- lib/dspy/lm/errors.rb
|
161
161
|
- lib/dspy/lm/response.rb
|
162
|
+
- lib/dspy/mixins/instrumentation_helpers.rb
|
163
|
+
- lib/dspy/mixins/struct_builder.rb
|
164
|
+
- lib/dspy/mixins/type_coercion.rb
|
162
165
|
- lib/dspy/module.rb
|
163
166
|
- lib/dspy/predict.rb
|
164
167
|
- lib/dspy/prompt.rb
|