$provider_obj) { $provider_names[ $id ] = $provider_obj->get_name(); } $embedder = new RSVL_Embedder(); $upgrade_available = $embedder->is_upgrade_available(); return [ 'is_active' => $is_active, 'providers' => $provider_names, 'current_provider' => $provider_id, 'provider_connected' => RSVL_Settings_Page::is_provider_connected($provider_id), 'available_models' => $provider ? $provider->get_available_models() : [], 'current_model' => $settings['chat_model'] ?? '', 'embedding_provider' => $embedding, 'embedding_model' => $embedder->get_model(), 'embedding_connected' => RSVL_Settings_Page::is_provider_connected($embedding), 'api_keys_url' => admin_url('options-connectors.php'), 'embedding_upgrade_available' => $upgrade_available, ]; } /** * What the Model tab shows of a save made in place (admin-model.js), given * the settings before and after it. See RSVL_Admin::ajax_save_settings(). */ public function saved_response(array $before, array $after): array { return [ 'embedding_provider' => $after['embedding_provider'], 'embedding_model' => $this->get_tab_data(true)['embedding_model'], 'training_running' => RSVL_Indexing_Status::is_running(), // The switch has started retraining everything: see RSVL_Admin::ajax_save_settings(). 'retraining' => RSVL_Settings::is_embedding_provider_switch($before['embedding_provider'], $after['embedding_provider']), ]; } public function ajax_upgrade_embedding_model() { $embedder = new RSVL_Embedder(); if (! $embedder->is_upgrade_available()) { wp_send_json_error(['message' => __('Already on the latest embedding model.', 'resolver-ai-chatbot')]); } // Check before switching the model setting: if the reindex below were // rejected by the lock after the switch, searches would run against // embeddings from the old model until a manual retrain. if (RSVL_Indexer::is_indexing_locked()) { wp_send_json_error(['message' => __('Training is already in progress. Please wait for it to finish before upgrading.', 'resolver-ai-chatbot')]); } $provider = $embedder->get_provider(); $latest_model = $embedder->get_latest_model(); $setting_key = 'embedding_model_' . $provider; resolver_update_setting($setting_key, $latest_model); $count = (new RSVL_Indexer())->start_full_reindex(); if (false === $count) { wp_send_json_error(['message' => __('Training is already in progress. Please wait for it to finish, then retrain all pages to finish the model upgrade.', 'resolver-ai-chatbot')]); } wp_send_json_success([ /* translators: %s: number of items being re-embedded. */ 'message' => sprintf(_n('Upgrading embedding model. Re-indexing %s item.', 'Upgrading embedding model. Re-indexing %s items.', $count, 'resolver-ai-chatbot'), number_format_i18n($count)), 'total' => $count, ]); } public function admin_notice_model_deprecation(): void { if (! current_user_can('manage_options')) { return; } $embedder = new RSVL_Embedder(); $dep_date = $embedder->get_deprecation_date(); if (! $dep_date) { return; } $model_url = RSVL_Admin::tab_url('model'); $is_past = strtotime($dep_date) <= time(); $notice_type = $is_past ? 'notice-error rsvl-notice' : 'notice-warning rsvl-notice'; if ($is_past) { $message = __('Your current embedding model has been deprecated and the chatbot has been disabled.', 'resolver-ai-chatbot'); } else { $message = __('Your current embedding model is being deprecated.', 'resolver-ai-chatbot'); } printf( '
Resolver: %s %s
%s %s