Class: DSPy::LM::Strategies::OpenAIStructuredOutputStrategy

Inherits:
BaseStrategy
  • Object
show all
Extended by:
T::Sig
Defined in:
lib/dspy/lm/strategies/openai_structured_output_strategy.rb

Overview

Strategy for using OpenAI’s native structured output feature

Instance Method Summary collapse

Methods inherited from BaseStrategy

#initialize

Constructor Details

This class inherits a constructor from DSPy::LM::Strategies::BaseStrategy

Instance Method Details

#available?Boolean

Returns:

  • (Boolean)


13
14
15
16
17
18
19
20
21
22
23
24
# File 'lib/dspy/lm/strategies/openai_structured_output_strategy.rb', line 13

def available?
  # Check if adapter is OpenAI or Ollama and supports structured outputs
  return false unless adapter.is_a?(DSPy::LM::OpenAIAdapter) || adapter.is_a?(DSPy::LM::OllamaAdapter)
  return false unless adapter.instance_variable_get(:@structured_outputs_enabled)
  
  # For Ollama, we assume it supports basic structured outputs
  if adapter.is_a?(DSPy::LM::OllamaAdapter)
    return true
  end
  
  DSPy::LM::Adapters::OpenAI::SchemaConverter.supports_structured_outputs?(adapter.model)
end

#extract_json(response) ⇒ Object



44
45
46
47
48
# File 'lib/dspy/lm/strategies/openai_structured_output_strategy.rb', line 44

def extract_json(response)
  # With structured outputs, the response should already be valid JSON
  # Just return the content as-is
  response.content
end

#handle_error(error) ⇒ Object



51
52
53
54
55
56
57
58
59
60
61
# File 'lib/dspy/lm/strategies/openai_structured_output_strategy.rb', line 51

def handle_error(error)
  # Handle OpenAI-specific structured output errors
  if error.message.include?("response_format") || error.message.include?("Invalid schema")
    # Log the error and return true to indicate we handled it
    # This allows fallback to another strategy
    DSPy.logger.warn("OpenAI structured output failed: #{error.message}")
    true
  else
    false
  end
end

#nameObject



32
33
34
# File 'lib/dspy/lm/strategies/openai_structured_output_strategy.rb', line 32

def name
  "openai_structured_output"
end

#prepare_request(messages, request_params) ⇒ Object



37
38
39
40
41
# File 'lib/dspy/lm/strategies/openai_structured_output_strategy.rb', line 37

def prepare_request(messages, request_params)
  # Add structured output format to request
  response_format = DSPy::LM::Adapters::OpenAI::SchemaConverter.to_openai_format(signature_class)
  request_params[:response_format] = response_format
end

#priorityObject



27
28
29
# File 'lib/dspy/lm/strategies/openai_structured_output_strategy.rb', line 27

def priority
  100 # Highest priority - native structured outputs are most reliable
end