chatwoot-develop/app/controllers/api/v1/accounts/integrations/llm_models_controller.rb

60 lines
1.9 KiB
Ruby

class Api::V1::Accounts::Integrations::LlmModelsController < Api::V1::Accounts::BaseController
before_action :check_authorization
def test
provider = params.require(:provider)
model = params.require(:model)
return render json: { error: 'Unsupported provider' }, status: :unprocessable_entity unless %w[openai gemini].include?(provider)
hook = Current.account.hooks.find_by(app_id: provider)
return render json: { error: 'Integration not configured' }, status: :unprocessable_entity if hook.blank?
api_key = hook.settings['api_key'].to_s.strip
return render json: { error: 'API key is missing' }, status: :unprocessable_entity if api_key.blank?
result = Llm::ModelTestService.new(
provider: provider,
model: model,
api_key: api_key
).perform
update_hook_results(hook, model, result)
if result[:success]
render json: { success: true }
else
render json: { error: result[:error] || 'Model test failed' }, status: :unprocessable_entity
end
end
private
def check_authorization
authorize(:hook, :update?)
end
def update_hook_results(hook, model, result)
settings = hook.settings.to_h.deep_stringify_keys
model_tests = settings['model_tests'] || {}
model_tests[model] = {
'success' => result[:success],
'error' => result[:error],
'tested_at' => Time.current.iso8601
}
validated_models = model_tests.filter_map do |name, entry|
name if entry['success']
end
settings['model_tests'] = model_tests
settings['validated_models'] = validated_models
hook.update!(settings: settings)
rescue ActiveRecord::RecordInvalid
Rails.logger.error(
"[LLM][ModelTest] Failed to persist model test results hook_id=#{hook.id} errors=#{hook.errors.full_messages.join(', ')}"
)
hook.update_columns(settings: settings) # rubocop:disable Rails/SkipsModelValidations
end
end