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.
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.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-01 00:00:00.000000000 Z
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