Class: DSPy::LM::JSONStrategy

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

Overview

JSON extraction strategy with provider-specific handling

Instance Method Summary collapse

Constructor Details

#initialize(adapter, signature_class) ⇒ JSONStrategy

Returns a new instance of JSONStrategy.



12
13
14
15
# File 'lib/dspy/lm/json_strategy.rb', line 12

def initialize(adapter, signature_class)
  @adapter = adapter
  @signature_class = signature_class
end

Instance Method Details

#extract_json(response) ⇒ Object



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/dspy/lm/json_strategy.rb', line 34

def extract_json(response)
  adapter_class_name = adapter.class.name

  if adapter_class_name.include?('OpenAIAdapter') || adapter_class_name.include?('OllamaAdapter')
    # OpenAI/Ollama: try to extract JSON from various formats
    extract_json_from_content(response.content)
  elsif adapter_class_name.include?('AnthropicAdapter')
    # Anthropic: try tool use first if structured_outputs enabled, else use content extraction
    structured_outputs_enabled = adapter.instance_variable_get(:@structured_outputs_enabled)
    structured_outputs_enabled = true if structured_outputs_enabled.nil?  # Default to true

    if structured_outputs_enabled
      extracted = extract_anthropic_tool_json(response)
      extracted || extract_json_from_content(response.content)
    else
      # Skip tool extraction, use enhanced prompting extraction
      extract_json_from_content(response.content)
    end
  elsif adapter_class_name.include?('GeminiAdapter')
    # Gemini: try to extract JSON from various formats
    extract_json_from_content(response.content)
  else
    # Unknown provider: try to extract JSON
    extract_json_from_content(response.content)
  end
end

#nameObject



62
63
64
# File 'lib/dspy/lm/json_strategy.rb', line 62

def name
  'json'
end

#prepare_request(messages, request_params) ⇒ Object



19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/dspy/lm/json_strategy.rb', line 19

def prepare_request(messages, request_params)
  adapter_class_name = adapter.class.name

  if adapter_class_name.include?('OpenAIAdapter') || adapter_class_name.include?('OllamaAdapter')
    prepare_openai_request(request_params)
  elsif adapter_class_name.include?('AnthropicAdapter')
    prepare_anthropic_request(messages, request_params)
  elsif adapter_class_name.include?('GeminiAdapter')
    prepare_gemini_request(request_params)
  end
  # Unknown provider - no special handling
end