Class: SmartPrompt::OpenAIAdapter

Inherits:
LLMAdapter show all
Defined in:
lib/smart_prompt/openai_adapter.rb

Instance Method Summary collapse

Constructor Details

#initialize(config) ⇒ OpenAIAdapter

Returns a new instance of OpenAIAdapter.



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/smart_prompt/openai_adapter.rb', line 5

def initialize(config)
  super
  api_key = @config['api_key']
  if api_key.is_a?(String) && api_key.start_with?('ENV[') && api_key.end_with?(']')
    api_key = eval(api_key)
  end
  begin
    @client = OpenAI::Client.new(
      access_token: api_key,
      uri_base: @config['url'],
      request_timeout: 240
    )        
  rescue OpenAI::ConfigurationError => e
    SmartPrompt.logger.error "Failed to initialize OpenAI client: #{e.message}"
    raise LLMAPIError, "Invalid OpenAI configuration: #{e.message}"
  rescue OpenAI::AuthenticationError => e
    SmartPrompt.logger.error "Failed to initialize OpenAI client: #{e.message}"
    raise LLMAPIError, "OpenAI authentication failed: #{e.message}"
  rescue SocketError => e
    SmartPrompt.logger.error "Failed to initialize OpenAI client: #{e.message}"
    raise LLMAPIError, "Network error: Unable to connect to OpenAI API"
  rescue => e
    SmartPrompt.logger.error "Failed to initialize OpenAI client: #{e.message}"
    raise Error, "Unexpected error initializing OpenAI client: #{e.message}"
  ensure
    SmartPrompt.logger.info "Successful creation an OpenAI client."
  end
end

Instance Method Details

#send_request(messages, model = nil) ⇒ 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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/smart_prompt/openai_adapter.rb', line 34

def send_request(messages, model=nil)
  SmartPrompt.logger.info "OpenAIAdapter: Sending request to OpenAI"
  if model
    model_name = model
  else
    model_name = @config['model']        
  end
  SmartPrompt.logger.info "OpenAIAdapter: Using model #{model_name}"
  begin
    response = @client.chat(
      parameters: {
        model: model_name,
        messages: messages,
        temperature: @config['temperature'] || 0.7
      }
    )
  rescue OpenAI::APIError => e
    SmartPrompt.logger.error "OpenAI API error: #{e.message}"
    raise LLMAPIError, "OpenAI API error: #{e.message}"
  rescue OpenAI::APIConnectionError => e
    SmartPrompt.logger.error "Connection error: Unable to reach OpenAI API"
    raise LLMAPIError, "Connection error: Unable to reach OpenAI API"
  rescue OpenAI::APITimeoutError => e
    SmartPrompt.logger.error "Request to OpenAI API timed out"
    raise LLMAPIError, "Request to OpenAI API timed out"
  rescue OpenAI::InvalidRequestError => e
    SmartPrompt.logger.error "Invalid request to OpenAI API: #{e.message}"
    raise LLMAPIError, "Invalid request to OpenAI API: #{e.message}"
  rescue OpenAI::AuthenticationError => e
    SmartPrompt.logger.error "Authentication error with OpenAI API: #{e.message}"
    raise LLMAPIError, "Authentication error with OpenAI API: #{e.message}"
  rescue OpenAI::RateLimitError => e
    SmartPrompt.logger.error "Rate limit exceeded for OpenAI API"
    raise LLMAPIError, "Rate limit exceeded for OpenAI API"
  rescue JSON::ParserError => e
    SmartPrompt.logger.error "Failed to parse OpenAI API response"
    raise LLMAPIError, "Failed to parse OpenAI API response"
  rescue => e
    SmartPrompt.logger.error "Unexpected error during OpenAI request: #{e.message}"
    raise Error, "Unexpected error during OpenAI request: #{e.message}"
  ensure
    SmartPrompt.logger.info "Successful send a message"
  end
  SmartPrompt.logger.info "OpenAIAdapter: Received response from OpenAI"
  response.dig("choices", 0, "message", "content")
end