60 lines
1.9 KiB
Ruby
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
|