Plugin Directory

Changeset 3448781


Ignore:
Timestamp:
01/28/2026 02:26:23 PM (3 weeks ago)
Author:
mxchat
Message:

3.0.5 - January 28, 2026

Minor update: Updated Gemini embedding model to stable version, fixed notification settings on new installs, improved save indicators visibility, and added WordPress database warning for large knowledge bases.

Location:
mxchat-basic
Files:
127 added
8 edited

Legend:

Unmodified
Added
Removed
  • mxchat-basic/trunk/admin/class-ajax-handler.php

    r3446370 r3448781  
    251251                    $serialized = maybe_serialize($transcripts_options);
    252252
    253                     // Direct database update
    254                     $result = $wpdb->update(
    255                         $wpdb->options,
    256                         array('option_value' => $serialized),
    257                         array('option_name' => 'mxchat_transcripts_options'),
    258                         array('%s'),
    259                         array('%s')
    260                     );
     253                    // Check if the option already exists in the database
     254                    $existing = $wpdb->get_var("SELECT option_id FROM {$wpdb->options} WHERE option_name = 'mxchat_transcripts_options'");
     255
     256                    if ($existing) {
     257                        // Option exists, do an update
     258                        $result = $wpdb->update(
     259                            $wpdb->options,
     260                            array('option_value' => $serialized),
     261                            array('option_name' => 'mxchat_transcripts_options'),
     262                            array('%s'),
     263                            array('%s')
     264                        );
     265                    } else {
     266                        // Option doesn't exist (new install), do an insert
     267                        $result = $wpdb->insert(
     268                            $wpdb->options,
     269                            array(
     270                                'option_name' => 'mxchat_transcripts_options',
     271                                'option_value' => $serialized,
     272                                'autoload' => 'yes'
     273                            ),
     274                            array('%s', '%s', '%s')
     275                        );
     276                    }
    261277
    262278                    // Clear all caches after direct DB update
     
    264280                    wp_cache_delete('alloptions', 'options');
    265281                    wp_cache_flush();
    266 
    267                     // Verify the save worked by reading directly from database
    268                     $db_value = $wpdb->get_var("SELECT option_value FROM {$wpdb->options} WHERE option_name = 'mxchat_transcripts_options'");
    269 
    270                     // Log for debugging
    271                     error_log('MXChat Transcripts Save: field=' . $field_name . ', value=' . $value . ', db_result=' . var_export($result, true));
    272                     error_log('MXChat Transcripts Save: saved options=' . print_r($transcripts_options, true));
    273                     error_log('MXChat Transcripts Verify: DB direct after save=' . $db_value);
    274282
    275283                    wp_send_json_success(['message' => esc_html__('Setting saved', 'mxchat')]);
  • mxchat-basic/trunk/css/admin-sidebar.css

    r3442157 r3448781  
    19501950}
    19511951
    1952 /* Position feedback near inputs */
    1953 .mxch-admin-wrapper input + .feedback-container,
    1954 .mxch-admin-wrapper select + .feedback-container,
    1955 .mxch-admin-wrapper textarea + .feedback-container {
     1952/* Position feedback near inputs - use inline for form-table context */
     1953.mxch-admin-wrapper .form-table input + .feedback-container,
     1954.mxch-admin-wrapper .form-table select + .feedback-container,
     1955.mxch-admin-wrapper .form-table textarea + .feedback-container {
     1956    position: relative;
     1957    display: inline-flex;
     1958    vertical-align: middle;
     1959    margin-left: 10px;
     1960    right: auto;
     1961    top: auto;
     1962    transform: none;
     1963}
     1964
     1965/* Position feedback near inputs - absolute for card layouts with field-control */
     1966.mxch-admin-wrapper .mxch-field-control input + .feedback-container,
     1967.mxch-admin-wrapper .mxch-field-control select + .feedback-container,
     1968.mxch-admin-wrapper .mxch-field-control textarea + .feedback-container {
    19561969    position: absolute;
    19571970    right: -30px;
  • mxchat-basic/trunk/css/admin-style.css

    r3442157 r3448781  
    32293229   background-color: #f0f6fc;
    32303230   transition: all 0.3s ease;
     3231   position: relative;
     3232}
     3233
     3234/* API Key save indicator positioning */
     3235.api-key-wrapper .feedback-container {
     3236   position: relative;
     3237   display: inline-flex;
     3238   vertical-align: middle;
     3239   margin-left: 10px;
     3240   right: auto;
     3241   top: auto;
     3242   transform: none;
     3243}
     3244
     3245/* Generic field wrapper for save indicator positioning */
     3246.mxchat-field-wrapper {
     3247   position: relative;
     3248   display: inline-block;
     3249}
     3250
     3251.mxchat-field-wrapper .feedback-container {
     3252   position: relative;
     3253   display: inline-flex;
     3254   vertical-align: middle;
     3255   margin-left: 10px;
     3256   right: auto;
     3257   top: auto;
     3258   transform: none;
    32313259}
    32323260
  • mxchat-basic/trunk/includes/admin-knowledge-page.php

    r3442157 r3448781  
    403403    $options = $admin_instance->options ?? get_option('mxchat_options', array());
    404404
     405    // Check if user is using WordPress database (not Pinecone or OpenAI Vector Store)
     406    $pinecone_options = get_option('mxchat_pinecone_addon_options', array());
     407    $is_pinecone_active = ($pinecone_options['mxchat_use_pinecone'] ?? '0') === '1';
     408    $vectorstore_options = get_option('mxchat_openai_vectorstore_options', array());
     409    $is_vectorstore_active = ($vectorstore_options['mxchat_use_openai_vectorstore'] ?? '0') === '1';
     410    $is_using_wordpress_db = !$is_pinecone_active && !$is_vectorstore_active;
     411
    405412    // Check embedding API key
    406413    $embedding_model = isset($options['embedding_model']) ? esc_attr($options['embedding_model']) : 'text-embedding-ada-002';
     
    454461            </div>
    455462        </div>
     463
     464        <?php if ($is_using_wordpress_db): ?>
     465        <!-- WordPress Database Caution Notice -->
     466        <div class="mxch-notice mxch-notice-warning" style="margin-bottom: 24px;">
     467            <svg class="mxch-notice-icon" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
     468                <path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z"/><line x1="12" y1="9" x2="12" y2="13"/><line x1="12" y1="17" x2="12.01" y2="17"/>
     469            </svg>
     470            <div>
     471                <strong><?php esc_html_e('Using WordPress Database:', 'mxchat'); ?></strong>
     472                <?php esc_html_e('The WordPress database is not optimized for vector search with large datasets. If you plan to have more than 500 knowledge entries, we highly recommend using Pinecone for better performance and scalability.', 'mxchat'); ?>
     473            </div>
     474        </div>
     475        <?php endif; ?>
    456476
    457477        <div class="mxch-card">
  • mxchat-basic/trunk/includes/class-mxchat-admin.php

    r3446370 r3448781  
    53735373public function api_key_callback() {
    53745374    $apiKey = isset($this->options['api_key']) ? esc_attr($this->options['api_key']) : '';
     5375    $nonce = wp_create_nonce('mxchat_autosave_nonce');
    53755376
    53765377    echo '<div class="api-key-wrapper">';
    5377     echo '<input type="password" id="api_key" name="api_key" value="' . $apiKey . '" class="regular-text" autocomplete="off" />';
     5378    echo '<input type="password" id="api_key" name="api_key" value="' . $apiKey . '" class="regular-text mxchat-autosave-field" autocomplete="off" data-nonce="' . $nonce . '" />';
    53785379    echo '<button type="button" id="toggleApiKeyVisibility">' . esc_html__('Show', 'mxchat') . '</button>';
    53795380    echo '<p class="description">' . esc_html__('Required for OpenAI GPT models and OpenAI embeddings. Get your API key from OpenAI Platform.', 'mxchat') . '</p>';
     
    53845385public function xai_api_key_callback() {
    53855386    $xaiApiKey = isset($this->options['xai_api_key']) ? esc_attr($this->options['xai_api_key']) : '';
     5387    $nonce = wp_create_nonce('mxchat_autosave_nonce');
    53865388
    53875389    echo '<div class="api-key-wrapper">';
    5388     echo '<input type="password" id="xai_api_key" name="xai_api_key" value="' . $xaiApiKey . '" class="regular-text" autocomplete="off" />';
     5390    echo '<input type="password" id="xai_api_key" name="xai_api_key" value="' . $xaiApiKey . '" class="regular-text mxchat-autosave-field" autocomplete="off" data-nonce="' . $nonce . '" />';
    53895391    echo '<button type="button" id="toggleXaiApiKeyVisibility">' . esc_html__('Show', 'mxchat') . '</button>';
    53905392    echo '<p class="description">' . esc_html__('Required for X.AI Grok models. Get your API key from X.AI Console.', 'mxchat') . '</p>';
     
    53945396public function claude_api_key_callback() {
    53955397    $claudeApiKey = isset($this->options['claude_api_key']) ? esc_attr($this->options['claude_api_key']) : '';
     5398    $nonce = wp_create_nonce('mxchat_autosave_nonce');
    53965399
    53975400    echo '<div class="api-key-wrapper">';
    5398     echo '<input type="password" id="claude_api_key" name="claude_api_key" value="' . $claudeApiKey . '" class="regular-text" autocomplete="off" />';
     5401    echo '<input type="password" id="claude_api_key" name="claude_api_key" value="' . $claudeApiKey . '" class="regular-text mxchat-autosave-field" autocomplete="off" data-nonce="' . $nonce . '" />';
    53995402    echo '<button type="button" id="toggleClaudeApiKeyVisibility">' . esc_html__('Show', 'mxchat') . '</button>';
    54005403    echo '<p class="description">' . esc_html__('Required for Anthropic Claude models. Get your API key from Anthropic Console.', 'mxchat') . '</p>';
     
    54055408public function deepseek_api_key_callback() {
    54065409    $apiKey = isset($this->options['deepseek_api_key']) ? esc_attr($this->options['deepseek_api_key']) : '';
     5410    $nonce = wp_create_nonce('mxchat_autosave_nonce');
    54075411
    54085412    echo '<div class="api-key-wrapper">';
    5409     echo '<input type="password" id="deepseek_api_key" name="deepseek_api_key" value="' . $apiKey . '" class="regular-text" autocomplete="off" />';
     5413    echo '<input type="password" id="deepseek_api_key" name="deepseek_api_key" value="' . $apiKey . '" class="regular-text mxchat-autosave-field" autocomplete="off" data-nonce="' . $nonce . '" />';
    54105414    echo '<button type="button" id="toggleDeepSeekApiKeyVisibility">' . esc_html__('Show', 'mxchat') . '</button>';
    54115415    echo '<p class="description">' . esc_html__('Required for DeepSeek models. Get your API key from DeepSeek Platform.', 'mxchat') . '</p>';
     
    54165420public function gemini_api_key_callback() {
    54175421    $geminiApiKey = isset($this->options['gemini_api_key']) ? esc_attr($this->options['gemini_api_key']) : '';
     5422    $nonce = wp_create_nonce('mxchat_autosave_nonce');
    54185423
    54195424    echo '<div class="api-key-wrapper">';
    5420     echo '<input type="password" id="gemini_api_key" name="gemini_api_key" value="' . $geminiApiKey . '" class="regular-text" autocomplete="off" />';
     5425    echo '<input type="password" id="gemini_api_key" name="gemini_api_key" value="' . $geminiApiKey . '" class="regular-text mxchat-autosave-field" autocomplete="off" data-nonce="' . $nonce . '" />';
    54215426    echo '<button type="button" id="toggleGeminiApiKeyVisibility">' . esc_html__('Show', 'mxchat') . '</button>';
    54225427    echo '<p class="description">' . esc_html__('Required for Google Gemini models and embeddings. Get your API key from Google AI Studio.', 'mxchat') . '</p>';
     
    54285433public function openrouter_api_key_callback() {
    54295434    $openrouterApiKey = isset($this->options['openrouter_api_key']) ? esc_attr($this->options['openrouter_api_key']) : '';
     5435    $nonce = wp_create_nonce('mxchat_autosave_nonce');
     5436
    54305437    echo '<div class="api-key-wrapper">';
    5431     echo '<input type="password" id="openrouter_api_key" name="openrouter_api_key" value="' . $openrouterApiKey . '" class="regular-text" autocomplete="off" />';
     5438    echo '<input type="password" id="openrouter_api_key" name="openrouter_api_key" value="' . $openrouterApiKey . '" class="regular-text mxchat-autosave-field" autocomplete="off" data-nonce="' . $nonce . '" />';
    54325439    echo '<button type="button" id="toggleOpenRouterApiKeyVisibility">' . esc_html__('Show', 'mxchat') . '</button>';
    54335440    echo '<p class="description">' . esc_html__('Required for OpenRouter models. Get your API key from OpenRouter.ai', 'mxchat') . '</p>';
     
    54385445public function voyage_api_key_callback() {
    54395446    $apiKey = isset($this->options['voyage_api_key']) ? esc_attr($this->options['voyage_api_key']) : '';
     5447    $nonce = wp_create_nonce('mxchat_autosave_nonce');
    54405448
    54415449    echo '<div class="api-key-wrapper">';
    5442     echo '<input type="password" id="voyage_api_key" name="voyage_api_key" value="' . $apiKey . '" class="regular-text" autocomplete="off" />';
     5450    echo '<input type="password" id="voyage_api_key" name="voyage_api_key" value="' . $apiKey . '" class="regular-text mxchat-autosave-field" autocomplete="off" data-nonce="' . $nonce . '" />';
    54435451    echo '<button type="button" id="toggleVoyageAPIKeyVisibility">' . esc_html__('Show', 'mxchat') . '</button>';
    54445452    echo '<p class="description">' . esc_html__('Required for Voyage AI embedding models. Get your API key from Voyage AI.', 'mxchat') . '</p>';
     
    54485456public function mxchat_loops_api_key_callback() {
    54495457    $loops_api_key = isset($this->options['loops_api_key']) ? esc_attr($this->options['loops_api_key']) : '';
     5458    $nonce = wp_create_nonce('mxchat_autosave_nonce');
    54505459
    54515460    // Hidden fields to "trap" autofill
     
    54555464    echo '<div class="api-key-wrapper">';
    54565465    echo sprintf(
    5457         '<input type="password" id="loops_api_key" name="loops_api_key" value="%s" class="regular-text" autocomplete="new-password" />',
    5458         $loops_api_key
     5466        '<input type="password" id="loops_api_key" name="loops_api_key" value="%s" class="regular-text mxchat-autosave-field" autocomplete="new-password" data-nonce="%s" />',
     5467        $loops_api_key,
     5468        $nonce
    54595469    );
    54605470    echo '<button type="button" id="toggleLoopsApiKeyVisibility">' . esc_html__('Show', 'mxchat') . '</button>';
     
    54665476    $loops_api_key = '';
    54675477    $selected_list = '';
     5478    $nonce = wp_create_nonce('mxchat_autosave_nonce');
    54685479
    54695480    // Safely get the API key
     
    54805491        $lists = $this->mxchat_fetch_loops_mailing_lists($loops_api_key);
    54815492        if (is_array($lists) && !empty($lists)) {
    5482             echo '<select id="loops_mailing_list" name="loops_mailing_list">';
     5493            echo '<div class="mxchat-field-wrapper">';
     5494            echo '<select id="loops_mailing_list" name="loops_mailing_list" class="mxchat-autosave-field" data-nonce="' . $nonce . '">';
    54835495
    54845496            // Add a default "Select a list" option
     
    54965508            }
    54975509            echo '</select>';
     5510            echo '</div>';
    54985511            echo '<p class="description">' . esc_html__('Please select a mailing list to use with Loops.', 'mxchat') . '</p>';
    54995512        } else {
     
    55095522        ? $this->options['triggered_phrase_response']
    55105523        : $default_response;
     5524    $nonce = wp_create_nonce('mxchat_autosave_nonce');
     5525
     5526    echo '<div class="mxchat-field-wrapper">';
    55115527    echo sprintf(
    5512         '<textarea id="triggered_phrase_response" name="triggered_phrase_response" rows="3" cols="50">%s</textarea>',
     5528        '<textarea id="triggered_phrase_response" name="triggered_phrase_response" rows="3" cols="50" class="mxchat-autosave-field" data-nonce="%s">%s</textarea>',
     5529        $nonce,
    55135530        esc_textarea($triggered_response)
    55145531    );
     5532    echo '</div>';
    55155533    echo '<p class="description">' . esc_html__('Enter the instruction for the AI when a trigger keyword is detected. The AI will use this as guidance to naturally ask for the user\'s email in a conversational way.', 'mxchat') . '</p>';
    55165534}
     
    55215539        ? $this->options['email_capture_response']
    55225540        : $default_response;
     5541    $nonce = wp_create_nonce('mxchat_autosave_nonce');
     5542
     5543    echo '<div class="mxchat-field-wrapper">';
    55235544    echo sprintf(
    5524         '<textarea id="email_capture_response" name="email_capture_response" rows="3" cols="50">%s</textarea>',
     5545        '<textarea id="email_capture_response" name="email_capture_response" rows="3" cols="50" class="mxchat-autosave-field" data-nonce="%s">%s</textarea>',
     5546        $nonce,
    55255547        esc_textarea($email_capture_response)
    55265548    );
     5549    echo '</div>';
    55275550    echo '<p class="description">' . esc_html__('Enter the instruction for the AI when a user provides their email. The AI will use this as guidance to naturally confirm the email capture in a conversational way.', 'mxchat') . '</p>';
    55285551}
     
    59055928        ),
    59065929        esc_html__('Google Gemini Embeddings', 'mxchat') => array(
    5907             'gemini-embedding-exp-03-07' => esc_html__('Gemini Embedding (1536, Experimental)', 'mxchat'),
     5930            'gemini-embedding-001' => esc_html__('Gemini Embedding (1536, Stable)', 'mxchat'),
    59085931        )
    59095932    );
     
    68066829public function mxchat_brave_api_key_callback() {
    68076830    $brave_api_key = isset($this->options['brave_api_key']) ? esc_attr($this->options['brave_api_key']) : '';
     6831    $nonce = wp_create_nonce('mxchat_autosave_nonce');
    68086832
    68096833    echo '<div class="api-key-wrapper">';
    68106834    echo sprintf(
    6811         '<input type="password" id="brave_api_key" name="brave_api_key" value="%s" class="regular-text" />',
    6812         $brave_api_key
     6835        '<input type="password" id="brave_api_key" name="brave_api_key" value="%s" class="regular-text mxchat-autosave-field" data-nonce="%s" />',
     6836        $brave_api_key,
     6837        $nonce
    68136838    );
    68146839    echo '<button type="button" id="toggleBraveApiKeyVisibility">' . esc_html__('Show', 'mxchat') . '</button>';
     
    68216846        ? intval($this->options['brave_image_count'])
    68226847        : 4;
    6823 
     6848    $nonce = wp_create_nonce('mxchat_autosave_nonce');
     6849
     6850    echo '<div class="mxchat-field-wrapper">';
    68246851    echo sprintf(
    68256852        '<input type="number" id="brave_image_count" name="brave_image_count"
    6826                value="%d" min="1" max="6" class="small-text" />',
    6827         $brave_image_count
    6828     );
     6853               value="%d" min="1" max="6" class="small-text mxchat-autosave-field" data-nonce="%s" />',
     6854        $brave_image_count,
     6855        $nonce
     6856    );
     6857    echo '</div>';
    68296858    echo '<p class="description">' . __('Select the number of images to return (1-6).', 'mxchat') . '</p>';
    68306859}
     
    68346863        ? esc_attr($this->options['brave_safe_search'])
    68356864        : 'strict';
    6836 
    6837     echo '<select id="brave_safe_search" name="brave_safe_search">';
     6865    $nonce = wp_create_nonce('mxchat_autosave_nonce');
     6866
     6867    echo '<div class="mxchat-field-wrapper">';
     6868    echo '<select id="brave_safe_search" name="brave_safe_search" class="mxchat-autosave-field" data-nonce="' . $nonce . '">';
    68386869    echo sprintf(
    68396870        '<option value="strict" %s>%s</option>',
     
    68476878    );
    68486879    echo '</select>';
     6880    echo '</div>';
    68496881    echo '<p class="description">' .
    68506882         esc_html__('Set the Safe Search level for image searches. Brave Search only supports "Strict" and "Off" options.', 'mxchat') .
     
    68566888        ? intval($this->options['brave_news_count'])
    68576889        : 3;
    6858 
     6890    $nonce = wp_create_nonce('mxchat_autosave_nonce');
     6891
     6892    echo '<div class="mxchat-field-wrapper">';
    68596893    echo sprintf(
    68606894        '<input type="number" id="brave_news_count" name="brave_news_count"
    6861                value="%d" min="1" max="10" class="small-text" />',
    6862         $brave_news_count
    6863     );
     6895               value="%d" min="1" max="10" class="small-text mxchat-autosave-field" data-nonce="%s" />',
     6896        $brave_news_count,
     6897        $nonce
     6898    );
     6899    echo '</div>';
    68646900    echo '<p class="description">' . esc_html__('Select the number of news articles to retrieve (1-10).', 'mxchat') . '</p>';
    68656901}
     
    68696905        ? esc_attr($this->options['brave_country'])
    68706906        : 'us';
    6871 
     6907    $nonce = wp_create_nonce('mxchat_autosave_nonce');
     6908
     6909    echo '<div class="mxchat-field-wrapper">';
    68726910    echo sprintf(
    68736911        '<input type="text" id="brave_country" name="brave_country"
    6874                value="%s" maxlength="2" class="small-text" />',
    6875         $brave_country
    6876     );
     6912               value="%s" maxlength="2" class="small-text mxchat-autosave-field" data-nonce="%s" />',
     6913        $brave_country,
     6914        $nonce
     6915    );
     6916    echo '</div>';
    68776917    echo '<p class="description">' . esc_html__('Enter the country code (e.g., "us" for United States).', 'mxchat') . '</p>';
    68786918}
     
    68826922        ? esc_attr($this->options['brave_language'])
    68836923        : 'en';
    6884 
     6924    $nonce = wp_create_nonce('mxchat_autosave_nonce');
     6925
     6926    echo '<div class="mxchat-field-wrapper">';
    68856927    echo sprintf(
    68866928        '<input type="text" id="brave_language" name="brave_language"
    6887                value="%s" maxlength="2" class="small-text" />',
    6888         $brave_language
    6889     );
     6929               value="%s" maxlength="2" class="small-text mxchat-autosave-field" data-nonce="%s" />',
     6930        $brave_language,
     6931        $nonce
     6932    );
     6933    echo '</div>';
    68906934    echo '<p class="description">' . esc_html__('Enter the language code (e.g., "en" for English).', 'mxchat') . '</p>';
    68916935}
     
    76647708            'text-embedding-3-large',
    76657709            'voyage-3-large',
    7666             'gemini-embedding-exp-03-07'
     7710            'gemini-embedding-001'
    76677711        );
    76687712        if (in_array($input['embedding_model'], $allowed_models)) {
  • mxchat-basic/trunk/js/mxchat-admin.js

    r3446370 r3448781  
    16941694            gemini: [
    16951695                {
    1696                     value: 'gemini-embedding-exp-03-07',
    1697                     label: 'Gemini Embedding', 
    1698                     description: 'Experimental SOTA embeddings (1536 dimensions, 8K context)'
     1696                    value: 'gemini-embedding-001',
     1697                    label: 'Gemini Embedding',
     1698                    description: 'Stable SOTA embeddings (1536 dimensions, 8K context)'
    16991699                }
    17001700            ]
  • mxchat-basic/trunk/mxchat-basic.php

    r3446370 r3448781  
    44 * Plugin URI: https://mxchat.ai/
    55 * Description: AI chatbot for WordPress with OpenAI, Claude, xAI, DeepSeek, live agent, PDF uploads, WooCommerce, and training on website data.
    6  * Version: 3.0.4
     6 * Version: 3.0.5
    77 * Author: MxChat
    88 * Author URI: https://mxchat.ai
     
    768768            }
    769769
     770            // 3.0.5: Migrate deprecated Gemini embedding model
     771            if (version_compare($current_version, '3.0.5', '<')) {
     772                mxchat_migrate_gemini_embedding_model();
     773            }
     774
    770775            // Run full activation to ensure everything is up to date
    771776            mxchat_activate();
     
    10541059}
    10551060
     1061/**
     1062 * Migration: Update deprecated Gemini embedding model (v3.0.5)
     1063 * Updates gemini-embedding-exp-03-07 to gemini-embedding-001 for users who had it selected
     1064 */
     1065function mxchat_migrate_gemini_embedding_model() {
     1066    $options = get_option('mxchat_options', array());
     1067
     1068    if (isset($options['embedding_model']) && $options['embedding_model'] === 'gemini-embedding-exp-03-07') {
     1069        $options['embedding_model'] = 'gemini-embedding-001';
     1070        update_option('mxchat_options', $options);
     1071    }
     1072}
     1073
    10561074// Register activation hook
    10571075register_activation_hook(__FILE__, 'mxchat_activate');
  • mxchat-basic/trunk/readme.txt

    r3446370 r3448781  
    66Tested up to: 6.9
    77Requires PHP: 7.2
    8 Stable tag: 3.0.4
     8Stable tag: 3.0.5
    99License: GPLv2 or later
    1010License URI: https://www.gnu.org/licenses/gpl-2.0.html
     
    3838👉 [Visit our website to view all add-ons](https://mxchat.ai)
    3939
    40 ## 🔥 What's New in Version 3.0.4
    41 
    42 🤖 **New Google Gemini Models**
    43 - New: Added latest Google Gemini models (3 Pro Preview, 3 Flash Preview, 2.5 Pro, 2.5 Flash, 2.5 Flash-Lite)
    44 
    45 🌍 **Transcript Translation**
    46 - New: Auto-translate chat transcripts to any language
    47 
    48 📊 **Action Scores in Transcripts**
    49 - New: View action similarity scores in the chat transcripts sources modal
    50 - See which documents ranked highest for each response
    51 - Track which actions triggered or almost triggered during conversations
     40## 🔥 What's New in Version 3.0.5
     41
     42🔧 **Gemini Embedding Model Update**
     43- Fixed: Updated Gemini embedding model from deprecated `gemini-embedding-exp-03-07` to stable `gemini-embedding-001`
    5244
    5345🐛 **Bug Fixes**
    54 - Fixed: Lead capture forms not working with multi-bot class IDs
     46- Fixed: Notification settings not saving on new installations
     47- Fixed: Save indicators not visible on settings fields (API keys, Slack, Telegram, Loops, Brave Search)
     48
     49✨ **Improvements**
     50- Added: Warning notice for WordPress database users recommending Pinecone for large knowledge bases (500+ entries)
     51- Improved: Minor admin UI updates for better user experience
    5552
    5653## Core Features That Set MxChat Apart
     
    270267== Changelog ==
    271268
     269= 3.0.5 - January 28, 2026 =
     270- Fixed: Updated Gemini embedding model from deprecated `gemini-embedding-exp-03-07` to stable `gemini-embedding-001`
     271- Fixed: Notification settings not saving on new installations
     272- Fixed: Save indicators not visible on settings fields (API keys, Slack, Telegram, Loops, Brave Search)
     273- Added: Warning notice for WordPress database users recommending Pinecone for large knowledge bases
     274- Improved: Minor admin UI updates for better user experience
     275
    272276= 3.0.4 - January 24, 2026 =
    273277- New: Added latest Google Gemini models (3 Pro Preview, 3 Flash Preview, 2.5 Pro, 2.5 Flash, 2.5 Flash-Lite)
     
    532536= 2.2.1 =
    533537- Added Claude Sonnet 4 and Claude Opus 4 chat models.
    534 - Integrated Google Gemini embedding model (gemini-embedding-exp-03-07).
     538- Integrated Google Gemini embedding model (gemini-embedding-001).
    535539- Built Pinecone vector database support directly into core plugin.
    536540- Removed dependency on separate Pinecone add-on.
     
    786790== Upgrade Notice ==
    787791
    788 = 3.0.4 - January 23, 2026 =
    789 New Gemini models (3 Pro, 3 Flash, 2.5 Pro, 2.5 Flash, 2.5 Flash-Lite), transcript translation, action scores in transcript sources modal, and lead capture fix for multi-bot setups.
     792= 3.0.5 - January 28, 2026 =
     793Minor update: Updated Gemini embedding model to stable version, fixed notification settings on new installs, improved save indicators visibility, and added WordPress database warning for large knowledge bases.
    790794
    791795== License & Warranty ==
Note: See TracChangeset for help on using the changeset viewer.