Class: CompletionKit::AzureFoundryClient
- Defined in:
- app/services/completion_kit/azure_foundry_client.rb
Instance Method Summary collapse
- #available_models ⇒ Object
- #configuration_errors ⇒ Object
- #configured? ⇒ Boolean
- #foundry_project? ⇒ Boolean
- #generate_completion(prompt, options = {}) ⇒ Object
- #temperature_dropped? ⇒ Boolean
Methods inherited from LlmClient
for_model, for_provider, #initialize
Constructor Details
This class inherits a constructor from CompletionKit::LlmClient
Instance Method Details
#available_models ⇒ Object
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
# File 'app/services/completion_kit/azure_foundry_client.rb', line 57 def available_models return [] unless configured? return [] unless ProviderEndpoint.safe?(api_endpoint) path = foundry_project? ? "#{azure_base_url}/deployments?api-version=v1" : models_path response = build_connection(azure_base_url).get(path) do |req| req.headers["api-key"] = api_key end return [] unless response.success? body = JSON.parse(response.body) if foundry_project? body.fetch("value", []).map { |d| { id: d["name"], name: d["name"] } } else body.fetch("data", []).map { |entry| { id: entry["id"], name: entry["id"] } } end rescue StandardError [] end |
#configuration_errors ⇒ Object
85 86 87 88 89 90 |
# File 'app/services/completion_kit/azure_foundry_client.rb', line 85 def configuration_errors errors = [] errors << "Azure endpoint is not configured" if api_endpoint.blank? errors << "Azure API key is not configured" if api_key.blank? errors end |
#configured? ⇒ Boolean
81 82 83 |
# File 'app/services/completion_kit/azure_foundry_client.rb', line 81 def configured? configuration_errors.empty? end |
#foundry_project? ⇒ Boolean
77 78 79 |
# File 'app/services/completion_kit/azure_foundry_client.rb', line 77 def foundry_project? api_endpoint.to_s.include?("/api/projects/") end |
#generate_completion(prompt, options = {}) ⇒ Object
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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
# File 'app/services/completion_kit/azure_foundry_client.rb', line 7 def generate_completion(prompt, = {}) @temperature_dropped = false return "Error: Azure provider is not fully configured" unless configured? return "Error: API endpoint resolves to a private address" unless ProviderEndpoint.safe?(api_endpoint) model = [:model] max_tokens = [:max_tokens] || 1000 temperature = [:temperature] || 0.7 max_completion = false response = post_chat(model: model, prompt: prompt, max_tokens: max_tokens, temperature: temperature, max_completion: max_completion) 2.times do break unless response.status == 400 if !max_completion && max_tokens_unsupported?(response.body) max_completion = true elsif !temperature.nil? && temperature_unsupported?(response.body) @temperature_dropped = true temperature = nil else break end response = post_chat(model: model, prompt: prompt, max_tokens: max_tokens, temperature: temperature, max_completion: max_completion) end if response.status == 429 raise CompletionKit::RateLimitError.new( response.body.to_s.truncate(500), provider: "azure_foundry", status: 429, retry_after: response.headers["Retry-After"]&.to_i ) end if response.success? data = JSON.parse(response.body) content = data.dig("choices", 0, "message", "content").to_s.strip return "Error: model returned empty content" if content.empty? content else "Error: #{response.status} - #{response.body}" end rescue CompletionKit::RateLimitError raise rescue Faraday::Error raise rescue => e "Error: #{e.}" end |
#temperature_dropped? ⇒ Boolean
3 4 5 |
# File 'app/services/completion_kit/azure_foundry_client.rb', line 3 def temperature_dropped? @temperature_dropped == true end |