Class: Admin::EmbeddingsController

Inherits:
CrmController show all
Defined in:
app/controllers/admin/embeddings_controller.rb

Overview

Admin controller for managing content embeddings and semantic search.

Provides tools for viewing embedding statistics, triggering batch generation,
refreshing stale embeddings, searching the embedding database, and managing
embedding lifecycle (cleanup, regeneration).

Constant Summary collapse

EMBEDDABLE_TYPES =

Base embeddable types (Item split into subtypes below)

%w[Post Article Showcase Video Image SiteMap ReviewsIo Item ProductLine CallRecord Activity Communication AssistantBrainEntry].freeze
ITEM_SUBTYPES =

Item subtypes for distinguishing publications from regular items

{
  'publication' => 'Publication (PDF)',
  'product' => 'Product (Regular Item)'
}.freeze
ARTICLE_SUBTYPES =

Article subtypes.

{
  'ArticleFaq' => 'FAQ',
  'ArticleTechnical' => 'Technical',
  'ArticleTraining' => 'Training',
  'ArticleProcedure' => 'Procedure'
}.freeze

Constants included from Controllers::ReferenceFindable

Controllers::ReferenceFindable::ID_EMBEDDED_PATTERNS

Constants included from Controllers::AnalyticsEvents

Controllers::AnalyticsEvents::MAX_QUEUED_EVENTS, Controllers::AnalyticsEvents::SESSION_KEY

Constants included from Controllers::ErrorRendering

Controllers::ErrorRendering::NON_CONTENT_PATH_PREFIXES

Instance Method Summary collapse

Methods inherited from CrmController

#access_denied, #context_id, #context_object, #crm_home_path, #current_ability, #default_url_options, #download_temp, #get_tempfile_path_for_download, #init_status_job_collector, #initialize_crm_lazy_chunks, #persist_enqueued_status_jobs, #record_not_found, #redirect_to_job_or_fallback, #render_edit_action, #set_context, #set_download_path, #stash_file_for_temp_download, #sync_admin_presence_cookie, #touch_employee_last_seen

Methods inherited from ApplicationController

#account_impersonated?, #add_to_flash, #after_sign_in_path_for, #bypass_forgery_protection?, #chat_enabled?, #cloudflare_cleared?, #default_catalog, #default_url_options, #enable_turbo_frames, #find_publication, #fix_invalid_accept_header, #init_js_utils, #is_globals_call?, #layout_by_resource, #locale_store, #redirect_to, #require_employee_for_crm, #set_base_host, #set_real_ip, #set_report_errors_for, #should_render_layout?, #skip_layout_for_turbo_frame?, #stamp_impersonation_context, #tab_frame_breakout_request?, #warmlyyours_canada_ip?, #warmlyyours_ip?, #y

Methods included from Controllers::ReturnPathHandling

#check_for_return_path, #redirect_to_return_path_or_default

Methods included from Controllers::AnalyticsEvents

#consume_queued_analytics_events, #registration_lead_type, #track_event

Methods included from Controllers::DeviceDetection

#device_detector, #is_ie?

Methods included from Controllers::SubdomainDetection

#is_crm_request?, #is_www_request?, #json_request?

Methods included from Controllers::TurboSafeRedirect

#redirect_to

Methods included from Controllers::TrackingDetection

#bot_request?, #gdpr_country?, #gdpr_country_data, #prevent_bots, #set_tracking_cookie, #track_visitor?

Methods included from Controllers::AcceleratedFileSending

#send_file_accelerated, #send_upload_accelerated

Methods included from Controllers::ErrorRendering

#excp_string, #mail_to_for_error_reporting, #render_400, #render_404, #render_406, #render_410, #render_500, #render_invalid_authenticity_token, #render_ip_spoof_error, #render_unpermitted_parameters, #safe_referer_or_fallback

Methods included from Controllers::TurnstileVerification

#load_turnstile_script_tag, #turnstile_lazy_widget, #turnstile_script_tag, #turnstile_widget, #validate_turnstile!

Methods included from Controllers::CloudflareCaching

edge_cached, #edge_cached_action?, #reset_cloudflare_cache, #set_cloudflare_cache, #skip_edge_cache!, #skip_session

Methods included from Controllers::Webpackable

#preload_webpack_fonts, #webpack_css_include, #webpack_css_url, #webpack_js_include, #wpd_is_running?

Methods included from Controllers::Localizable

#cloudflare_country_locale, #determine_request_locale, #geocoder_locale, #guest_user_locale_check, #locale_optional_www_auth_path?, #param_locale, #set_locale, #set_request_locale, #skip_localization?, #warmlyyours_ip_locale

Methods included from Controllers::Authenticable

#access_denied, #authenticate_account, #authenticate_account!, #authenticate_account_from_login_token!, #check_is_a_manager, #check_is_a_sales_manager, #check_is_an_admin, #check_is_an_employee, #check_party, #clear_mismatched_guest_user, #create_guest_user, #credentials?, #current_or_guest_user, #current_or_guest_user_id_read_only, #current_user, #devise_mapping, #fully_logged_in?, #generate_bot_id, #guest_user, #identifiable?, #init_current_user, #initialize_guest, #load_context_user, #logging_in, #resource, #resource_name, #restrict_access_for_non_employees, #scrubbed_request_path, #user_object, #warn_on_session_guest_id_leak

Methods included from UrlsHelper

#catalog_breadcrumb_links, #catalog_link, #catalog_link_for_product_line, #catalog_link_for_sku, #cms_link, #delocalized_path, #path_to_sales_product_sku, #path_to_sales_product_sku_for_product_line, #path_to_sales_product_sku_for_product_line_slug, #product_line_from_catalog_link, #protocol_neutral_url, #sanitize_external_url, #valid_external_url?

Instance Method Details

#cleanupvoid

This method returns an undefined value.

Triggers cleanup of orphan embeddings.

Removes embeddings for records that are unpublished, inactive, or deleted.



96
97
98
99
100
# File 'app/controllers/admin/embeddings_controller.rb', line 96

def cleanup
  ServiceRunner.perform_async('Maintenance::EmbeddingOrphanCleanup')
  flash[:info] = 'Orphan embedding cleanup has been queued'
  redirect_to admin_embeddings_path
end

#generatevoid

This method returns an undefined value.

Queues batch embedding generation for a specific record type.

Enqueues EmbeddingBatchQueueWorker to generate embeddings for all records of the
specified type. Supports article subtypes (FAQ, Technical, etc.) and image fingerprints.



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'app/controllers/admin/embeddings_controller.rb', line 59

def generate
  type = generate_params[:type]

  if ARTICLE_SUBTYPES.key?(type)
    EmbeddingBatchQueueWorker.perform_async('Article', article_type: type)
    flash[:info] = "Queued batch worker for #{ARTICLE_SUBTYPES[type]} articles. Check Sidekiq for progress."
  elsif EMBEDDABLE_TYPES.include?(type)
    EmbeddingBatchQueueWorker.perform_async(type)
    flash[:info] = "Queued batch worker for #{type} records. Check Sidekiq for progress."
  elsif type == 'ImageFingerprints'
    # pHash fingerprint generation (separate from full analysis)
    EmbeddingBatchQueueWorker.perform_async(type)
    flash[:info] = 'Queued batch worker for pHash fingerprints. Check Sidekiq for progress.'
  else
    flash[:error] = "Invalid type: #{type}"
  end

  redirect_to admin_embeddings_path
end

#generate_onevoid

This method returns an undefined value.

Generates an embedding for a single record.

Accepts a record type and ID, and queues EmbeddingWorker to generate or
regenerate the embedding with forced refresh.



108
109
110
111
112
113
114
115
116
117
118
119
120
121
# File 'app/controllers/admin/embeddings_controller.rb', line 108

def generate_one
  permitted = generate_one_params
  type = permitted[:type]
  id = permitted[:id]

  unless EMBEDDABLE_TYPES.include?(type)
    flash[:error] = "Invalid type: #{type}"
    redirect_to admin_embeddings_path and return
  end

  EmbeddingWorker.perform_async(type, id.to_i, force: true)
  flash[:info] = "Queued #{type}##{id} for embedding generation"
  redirect_to admin_embeddings_path
end

#indexvoid

This method returns an undefined value.

Renders the embeddings index page with coverage statistics and recent embeddings.



31
32
33
34
# File 'app/controllers/admin/embeddings_controller.rb', line 31

def index
  @stats = build_stats
  @recent_embeddings = ContentEmbedding.order(updated_at: :desc).limit(10).includes(:embeddable)
end

#refreshvoid

This method returns an undefined value.

Triggers a refresh of stale embeddings.

Queues EmbeddingRefreshWorker to scan and refresh any embeddings that are stale
or need updating.



85
86
87
88
89
# File 'app/controllers/admin/embeddings_controller.rb', line 85

def refresh
  EmbeddingRefreshWorker.perform_async
  flash[:info] = 'Embedding refresh worker has been queued'
  redirect_to admin_embeddings_path
end

#searchvoid

This method returns an undefined value.

Renders the semantic/hybrid search results page.

Performs hybrid or semantic search against the embedding database using user-supplied
query and optional type/similarity filters. Supports both vector similarity and full-text.



42
43
44
45
46
47
48
49
50
51
# File 'app/controllers/admin/embeddings_controller.rb', line 42

def search
  permitted = search_params
  @query = permitted[:query]
  @types = permitted[:types].presence
  @limit = (permitted[:limit] || 10).to_i.clamp(1, 50)
  @use_hybrid = permitted[:hybrid] != '0'
  @min_similarity = (permitted[:min_similarity] || 0).to_f.clamp(0, 1)

  @results = perform_search if @query.present?
end