Class: DSPy::LM::Strategies::GeminiStructuredOutputStrategy

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

Overview

Strategy for using Gemini’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)


14
15
16
17
18
19
20
# File 'lib/dspy/lm/strategies/gemini_structured_output_strategy.rb', line 14

def available?
  # Check if adapter is Gemini and supports structured outputs
  return false unless adapter.is_a?(DSPy::LM::GeminiAdapter)
  return false unless adapter.instance_variable_get(:@structured_outputs_enabled)
  
  DSPy::LM::Adapters::Gemini::SchemaConverter.supports_structured_outputs?(adapter.model)
end

#extract_json(response) ⇒ Object



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

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

#handle_error(error) ⇒ Object



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/dspy/lm/strategies/gemini_structured_output_strategy.rb', line 52

def handle_error(error)
  # Handle Gemini-specific structured output errors
  error_msg = error.message.to_s.downcase
  
  # Check for permanent errors that shouldn't be retried
  permanent_error_patterns = [
    "schema",
    "generation_config", 
    "response_schema",
    "unknown name \"response_mime_type\"",
    "unknown name \"response_schema\"",
    "invalid json payload",
    "no matching sse interaction found",  # VCR test configuration issue
    "cannot find field"
  ]
  
  if permanent_error_patterns.any? { |pattern| error_msg.include?(pattern) }
    # These are permanent errors - no point retrying
    DSPy.logger.debug("Gemini structured output failed (permanent error, skipping retries): #{error.message}")
    true # Skip retries and try next strategy
  else
    # Unknown error - let retry logic handle it
    false
  end
end

#nameObject



28
29
30
# File 'lib/dspy/lm/strategies/gemini_structured_output_strategy.rb', line 28

def name
  "gemini_structured_output"
end

#prepare_request(messages, request_params) ⇒ Object



33
34
35
36
37
38
39
40
41
42
# File 'lib/dspy/lm/strategies/gemini_structured_output_strategy.rb', line 33

def prepare_request(messages, request_params)
  # Convert signature to Gemini JSON Schema format (supports oneOf/anyOf for unions)
  schema = DSPy::LM::Adapters::Gemini::SchemaConverter.to_gemini_format(signature_class)
  
  # Add generation_config for structured output using JSON Schema format
  request_params[:generation_config] = {
    response_mime_type: "application/json",
    response_json_schema: schema  # Use JSON Schema format for proper union support
  }
end

#priorityObject



23
24
25
# File 'lib/dspy/lm/strategies/gemini_structured_output_strategy.rb', line 23

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