feat: add config for OpenAI endpoint (#12051)
Co-authored-by: Muhsin Keloth <muhsinkeramam@gmail.com>
This commit is contained in:
@@ -170,6 +170,10 @@
|
|||||||
display_title: 'OpenAI Model'
|
display_title: 'OpenAI Model'
|
||||||
description: 'The OpenAI model configured for use in Captain AI. Default: gpt-4o-mini'
|
description: 'The OpenAI model configured for use in Captain AI. Default: gpt-4o-mini'
|
||||||
locked: false
|
locked: false
|
||||||
|
- name: CAPTAIN_OPEN_AI_ENDPOINT
|
||||||
|
display_title: 'OpenAI API Endpoint (optional)'
|
||||||
|
description: 'The OpenAI endpoint configured for use in Captain AI. Default: https://api.openai.com/'
|
||||||
|
locked: false
|
||||||
- name: CAPTAIN_FIRECRAWL_API_KEY
|
- name: CAPTAIN_FIRECRAWL_API_KEY
|
||||||
display_title: 'FireCrawl API Key (optional)'
|
display_title: 'FireCrawl API Key (optional)'
|
||||||
description: 'The FireCrawl API key for the Captain AI service'
|
description: 'The FireCrawl API key for the Captain AI service'
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ module Enterprise::SuperAdmin::AppConfigsController
|
|||||||
when 'internal'
|
when 'internal'
|
||||||
@allowed_configs = internal_config_options
|
@allowed_configs = internal_config_options
|
||||||
when 'captain'
|
when 'captain'
|
||||||
@allowed_configs = %w[CAPTAIN_OPEN_AI_API_KEY CAPTAIN_OPEN_AI_MODEL CAPTAIN_FIRECRAWL_API_KEY]
|
@allowed_configs = %w[CAPTAIN_OPEN_AI_API_KEY CAPTAIN_OPEN_AI_MODEL CAPTAIN_OPEN_AI_ENDPOINT CAPTAIN_FIRECRAWL_API_KEY]
|
||||||
else
|
else
|
||||||
super
|
super
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ class Llm::BaseOpenAiService
|
|||||||
def initialize
|
def initialize
|
||||||
@client = OpenAI::Client.new(
|
@client = OpenAI::Client.new(
|
||||||
access_token: InstallationConfig.find_by!(name: 'CAPTAIN_OPEN_AI_API_KEY').value,
|
access_token: InstallationConfig.find_by!(name: 'CAPTAIN_OPEN_AI_API_KEY').value,
|
||||||
|
uri_base: uri_base,
|
||||||
log_errors: Rails.env.development?
|
log_errors: Rails.env.development?
|
||||||
)
|
)
|
||||||
setup_model
|
setup_model
|
||||||
@@ -13,6 +14,10 @@ class Llm::BaseOpenAiService
|
|||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
def uri_base
|
||||||
|
InstallationConfig.find_by(name: 'CAPTAIN_OPEN_AI_ENDPOINT')&.value || 'https://api.openai.com/'
|
||||||
|
end
|
||||||
|
|
||||||
def setup_model
|
def setup_model
|
||||||
config_value = InstallationConfig.find_by(name: 'CAPTAIN_OPEN_AI_MODEL')&.value
|
config_value = InstallationConfig.find_by(name: 'CAPTAIN_OPEN_AI_MODEL')&.value
|
||||||
@model = (config_value.presence || DEFAULT_MODEL)
|
@model = (config_value.presence || DEFAULT_MODEL)
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ RSpec.describe Captain::Copilot::ChatService do
|
|||||||
|
|
||||||
before do
|
before do
|
||||||
create(:installation_config, name: 'CAPTAIN_OPEN_AI_API_KEY', value: 'test-key')
|
create(:installation_config, name: 'CAPTAIN_OPEN_AI_API_KEY', value: 'test-key')
|
||||||
|
create(:installation_config, name: 'CAPTAIN_OPEN_AI_ENDPOINT', value: 'https://api.openai.com/')
|
||||||
allow(OpenAI::Client).to receive(:new).and_return(mock_openai_client)
|
allow(OpenAI::Client).to receive(:new).and_return(mock_openai_client)
|
||||||
allow(mock_openai_client).to receive(:chat).and_return({
|
allow(mock_openai_client).to receive(:chat).and_return({
|
||||||
choices: [{ message: { content: '{ "content": "Hey" }' } }]
|
choices: [{ message: { content: '{ "content": "Hey" }' } }]
|
||||||
@@ -47,6 +48,48 @@ RSpec.describe Captain::Copilot::ChatService do
|
|||||||
expect(messages.second[:role]).to eq('system')
|
expect(messages.second[:role]).to eq('system')
|
||||||
expect(messages.second[:content]).to include(account.id.to_s)
|
expect(messages.second[:content]).to include(account.id.to_s)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'initializes OpenAI client with configured endpoint' do
|
||||||
|
expect(OpenAI::Client).to receive(:new).with(
|
||||||
|
access_token: 'test-key',
|
||||||
|
uri_base: 'https://api.openai.com/',
|
||||||
|
log_errors: Rails.env.development?
|
||||||
|
)
|
||||||
|
|
||||||
|
described_class.new(assistant, config)
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when CAPTAIN_OPEN_AI_ENDPOINT is not configured' do
|
||||||
|
before do
|
||||||
|
InstallationConfig.find_by(name: 'CAPTAIN_OPEN_AI_ENDPOINT')&.destroy
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'uses default OpenAI endpoint' do
|
||||||
|
expect(OpenAI::Client).to receive(:new).with(
|
||||||
|
access_token: 'test-key',
|
||||||
|
uri_base: 'https://api.openai.com/',
|
||||||
|
log_errors: Rails.env.development?
|
||||||
|
)
|
||||||
|
|
||||||
|
described_class.new(assistant, config)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when custom endpoint is configured' do
|
||||||
|
before do
|
||||||
|
InstallationConfig.find_by(name: 'CAPTAIN_OPEN_AI_ENDPOINT').update!(value: 'https://custom.azure.com/')
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'uses custom endpoint for OpenAI client' do
|
||||||
|
expect(OpenAI::Client).to receive(:new).with(
|
||||||
|
access_token: 'test-key',
|
||||||
|
uri_base: 'https://custom.azure.com/',
|
||||||
|
log_errors: Rails.env.development?
|
||||||
|
)
|
||||||
|
|
||||||
|
described_class.new(assistant, config)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe '#generate_response' do
|
describe '#generate_response' do
|
||||||
|
|||||||
Reference in New Issue
Block a user