dspy 0.4.0 → 0.5.0

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,106 @@
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 :trace_level, default: :standard
31
+ setting :async_processing, default: false
32
+ setting :buffer_size, default: 1000
33
+ setting :flush_interval, default: 30
34
+ setting :error_reporting, default: false
35
+ setting :error_service, default: nil
36
+ setting :sampling_rules, default: {}
37
+ setting :timestamp_format, default: TimestampFormat::ISO8601
38
+
39
+ # Nested correlation ID configuration
40
+ setting :correlation_id do
41
+ setting :enabled, default: false
42
+ setting :header, default: 'X-Correlation-ID'
43
+ setting :generator, default: -> { SecureRandom.uuid }
44
+ end
45
+
46
+ # Nested logger configuration
47
+ setting :logger do
48
+ setting :level, default: :info
49
+ setting :include_payloads, default: true
50
+ setting :correlation_id, default: true
51
+ setting :sampling, default: {}
52
+ setting :sampling_conditions, default: {}
53
+ end
54
+
55
+ # Nested OpenTelemetry configuration
56
+ setting :otel do
57
+ setting :tracer_name, default: 'dspy-ruby'
58
+ setting :service_name, default: 'dspy-application'
59
+ setting :service_version, default: DSPy::VERSION
60
+ setting :endpoint, default: -> { ENV['OTEL_EXPORTER_OTLP_ENDPOINT'] }
61
+ end
62
+
63
+ # Nested New Relic configuration
64
+ setting :newrelic do
65
+ setting :app_name, default: 'DSPy Application'
66
+ setting :license_key, default: -> { ENV['NEW_RELIC_LICENSE_KEY'] }
67
+ setting :custom_attributes, default: {}
68
+ end
69
+
70
+ # Nested Langfuse configuration
71
+ setting :langfuse do
72
+ setting :public_key, default: -> { ENV['LANGFUSE_PUBLIC_KEY'] }
73
+ setting :secret_key, default: -> { ENV['LANGFUSE_SECRET_KEY'] }
74
+ setting :host, default: -> { ENV['LANGFUSE_HOST'] }
75
+ setting :track_tokens, default: true
76
+ setting :track_costs, default: true
77
+ setting :track_prompts, default: true
78
+ end
79
+ end
12
80
 
13
81
  def self.logger
14
82
  config.logger
15
83
  end
84
+
85
+ # Validation methods for instrumentation configuration
86
+ def self.validate_instrumentation!
87
+ config = self.config.instrumentation
88
+
89
+ raise ArgumentError, "Sampling rate must be between 0.0 and 1.0" unless config.sampling_rate.between?(0.0, 1.0)
90
+ raise ArgumentError, "Buffer size must be positive" unless config.buffer_size > 0
91
+ raise ArgumentError, "Flush interval must be positive" unless config.flush_interval > 0
92
+ raise ArgumentError, "Invalid trace level" unless [:minimal, :standard, :detailed].include?(config.trace_level)
93
+ raise ArgumentError, "Invalid timestamp format" unless config.timestamp_format.is_a?(TimestampFormat)
94
+
95
+ if config.enabled && config.subscribers.empty?
96
+ raise ArgumentError, "Must specify at least one subscriber when instrumentation is enabled"
97
+ end
98
+
99
+ # Validate subscribers are valid symbols
100
+ invalid_subscribers = config.subscribers - [:logger, :otel, :newrelic, :langfuse]
101
+ unless invalid_subscribers.empty?
102
+ raise ArgumentError, "Invalid subscribers: #{invalid_subscribers.join(', ')}"
103
+ end
104
+ end
16
105
  end
17
106
 
18
107
  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.0
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