Class: SqlChatbot::LLM::Client
- Inherits:
-
Object
- Object
- SqlChatbot::LLM::Client
- Defined in:
- lib/sql_chatbot/llm/client.rb
Constant Summary collapse
- MAX_RETRIES =
3- RETRY_BASE_DELAY =
seconds
2
Instance Method Summary collapse
- #call(messages, json_mode: false, temperature: 0.1, model: nil) ⇒ Object
-
#initialize(api_key:, base_url:, model:) ⇒ Client
constructor
A new instance of Client.
- #stream(messages, temperature: 0.3, model: nil, &block) ⇒ Object
- #stream_enum(messages, **opts) ⇒ Object
Constructor Details
#initialize(api_key:, base_url:, model:) ⇒ Client
Returns a new instance of Client.
8 9 10 11 |
# File 'lib/sql_chatbot/llm/client.rb', line 8 def initialize(api_key:, base_url:, model:) @client = OpenAI::Client.new(access_token: api_key, uri_base: base_url) @model = model end |
Instance Method Details
#call(messages, json_mode: false, temperature: 0.1, model: nil) ⇒ Object
16 17 18 19 20 21 22 23 24 25 26 27 28 |
# File 'lib/sql_chatbot/llm/client.rb', line 16 def call(, json_mode: false, temperature: 0.1, model: nil) params = { model: model || @model, messages: , temperature: temperature, } params[:response_format] = { type: "json_object" } if json_mode with_retry do response = @client.chat(parameters: params) response.dig("choices", 0, "message", "content") || "" end end |
#stream(messages, temperature: 0.3, model: nil, &block) ⇒ Object
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
# File 'lib/sql_chatbot/llm/client.rb', line 30 def stream(, temperature: 0.3, model: nil, &block) params = { model: model || @model, messages: , temperature: temperature, stream: proc do |chunk, _bytesize| content = chunk.dig("choices", 0, "delta", "content") block.call(content) if content && !content.empty? end, } with_retry do @client.chat(parameters: params) end end |
#stream_enum(messages, **opts) ⇒ Object
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
# File 'lib/sql_chatbot/llm/client.rb', line 66 def stream_enum(, **opts) queue = Queue.new Thread.new do stream(, **opts) { |chunk| queue.push(chunk) } queue.push(:done) rescue => e queue.push(e) end Enumerator.new do |yielder| loop do item = queue.pop break if item == :done raise item if item.is_a?(Exception) yielder.yield(item) end end end |