fix(captain): read OpenAI key from InstallationConfig in article search terms (#14915)
generate_article_search_terms still pulled ENV['OPENAI_API_KEY'], left over from before the Jan 2025 Captain migration moved the key into InstallationConfig as CAPTAIN_OPEN_AI_API_KEY. Every other Captain LLM call site got updated then; this one (used by Portal::ArticleIndexingJob for help center article embedding search terms) didn't, so it sent a blank bearer token unless you also happened to have the old env var set. Also drops the stale OPENAI_API_KEY line from .env.example and points to where the key actually lives now (Super Admin > App Configs > Captain). --------- Co-authored-by: Sony Mathew <2040199+sony-mathew@users.noreply.github.com> Co-authored-by: Sony Mathew <sony@chatwoot.com>
This commit is contained in:
co-authored by
Sony Mathew
Sony Mathew
parent
90b9dba9f9
commit
8818d276b9
+3
-3
@@ -272,9 +272,9 @@ AZURE_APP_SECRET=
|
|||||||
# ENABLE_SIDEKIQ_DEQUEUE_LOGGER=false
|
# ENABLE_SIDEKIQ_DEQUEUE_LOGGER=false
|
||||||
|
|
||||||
|
|
||||||
# AI powered features
|
# AI powered features (Captain)
|
||||||
## OpenAI key
|
# The OpenAI API key and endpoint for Captain are not configured via .env.
|
||||||
# OPENAI_API_KEY=
|
# Set them at Super Admin > App Configs > Captain (CAPTAIN_OPEN_AI_API_KEY, CAPTAIN_OPEN_AI_ENDPOINT).
|
||||||
|
|
||||||
# Housekeeping/Performance related configurations
|
# Housekeeping/Performance related configurations
|
||||||
# Set to true if you want to remove stale contact inboxes
|
# Set to true if you want to remove stale contact inboxes
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ module Enterprise::Concerns::Article
|
|||||||
{ role: 'system', content: article_to_search_terms_prompt },
|
{ role: 'system', content: article_to_search_terms_prompt },
|
||||||
{ role: 'user', content: "title: #{title} \n description: #{description} \n content: #{content}" }
|
{ role: 'user', content: "title: #{title} \n description: #{description} \n content: #{content}" }
|
||||||
]
|
]
|
||||||
headers = { 'Content-Type' => 'application/json', 'Authorization' => "Bearer #{ENV.fetch('OPENAI_API_KEY', nil)}" }
|
headers = { 'Content-Type' => 'application/json', 'Authorization' => "Bearer #{openai_api_key}" }
|
||||||
body = { model: 'gpt-4o', messages: messages, response_format: { type: 'json_object' } }.to_json
|
body = { model: 'gpt-4o', messages: messages, response_format: { type: 'json_object' } }.to_json
|
||||||
Rails.logger.info "Requesting Chat GPT with body: #{body}"
|
Rails.logger.info "Requesting Chat GPT with body: #{body}"
|
||||||
response = HTTParty.post(openai_api_url, headers: headers, body: body)
|
response = HTTParty.post(openai_api_url, headers: headers, body: body)
|
||||||
@@ -77,8 +77,12 @@ module Enterprise::Concerns::Article
|
|||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
def openai_api_key
|
||||||
|
InstallationConfig.find_by(name: 'CAPTAIN_OPEN_AI_API_KEY')&.value.presence || raise(I18n.t('captain.api_key_missing'))
|
||||||
|
end
|
||||||
|
|
||||||
def openai_api_url
|
def openai_api_url
|
||||||
endpoint = InstallationConfig.find_by(name: 'CAPTAIN_OPEN_AI_ENDPOINT')&.value || 'https://api.openai.com/'
|
endpoint = InstallationConfig.find_by(name: 'CAPTAIN_OPEN_AI_ENDPOINT')&.value.presence || 'https://api.openai.com/'
|
||||||
endpoint = endpoint.chomp('/')
|
endpoint = endpoint.chomp('/')
|
||||||
"#{endpoint}/v1/chat/completions"
|
"#{endpoint}/v1/chat/completions"
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -144,7 +144,8 @@ RSpec.describe 'Applied SLAs API', type: :request do
|
|||||||
csv_data = CSV.parse(response.body)
|
csv_data = CSV.parse(response.body)
|
||||||
csv_data.reject! { |row| row.all?(&:nil?) }
|
csv_data.reject! { |row| row.all?(&:nil?) }
|
||||||
expect(csv_data.size).to eq(3)
|
expect(csv_data.size).to eq(3)
|
||||||
expect(csv_data[1][0].to_i).to eq(conversation1.display_id)
|
conversation_ids = csv_data.drop(1).map { |row| row[0].to_i }
|
||||||
|
expect(conversation_ids).to contain_exactly(conversation1.display_id, conversation2.display_id)
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'excludes conversations with blocked contacts from the CSV file' do
|
it 'excludes conversations with blocked contacts from the CSV file' do
|
||||||
|
|||||||
Reference in New Issue
Block a user