Class: Glancer::Configuration

Inherits:
Object
  • Object
show all
Defined in:
lib/glancer/configuration.rb

Constant Summary collapse

ADAPTERS_SUPPORTED =
%i[postgres mysql mysql2 sqlite].freeze
LLM_PROVIDERS =
%i[gemini openai openrouter].freeze
LOG_VERBOSITY_LEVELS =
%i[silent none info debug].freeze
QUERY_MODES =
%i[sql activerecord].freeze
EMBEDDING_DEFAULTS =

Default embedding models per provider. OpenRouter does not expose a native embedding API; the recommended approach is to set embedding_provider to :gemini or :openai and only use openrouter for chat/sql roles.

{
  gemini: "text-embedding-004",
  openai: "text-embedding-3-large",
  openrouter: "openai/text-embedding-3-small"
}.freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeConfiguration

Returns a new instance of Configuration.



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/glancer/configuration.rb', line 20

def initialize
  self.adapter = Glancer::Configuration.infer_adapter || :mysql2
  self.read_only_db = nil
  self.llm_provider = :gemini
  self.llm_model = "gemini-2.0-flash"
  self.schema_permission = false
  self.models_permission = false
  self.workflow_cache_ttl = 5.minutes
  self.context_file_path = "config/glancer/llm_context.glancer.md"
  self.api_key = nil
  self.gemini_api_key = nil
  self.openai_api_key = nil
  self.openrouter_api_key = nil
  self.log_output_path = nil
  self.log_verbosity = :info
  self.k = 5
  self.min_score = 0.6
  self.schema_documents_weight = 1.3
  self.context_documents_weight = 1.2
  self.models_documents_weight = 1.1
  self.chunk_size = 1000
  self.chunk_overlap = 150
  self.history_limit = 6
  self.statement_timeout = 30.seconds
  self.embedding_provider = nil  # nil → uses llm_provider
  self.embedding_model = nil     # nil → uses provider default
  self.code_provider = nil        # nil → uses llm_provider (for SQL generation)
  self.code_model = nil           # nil → uses llm_model (for SQL generation)
  self.chat_provider = nil       # nil → uses llm_provider (for humanized responses)
  self.chat_model = nil          # nil → uses llm_model (for humanized responses)
  self.blazer_path = nil         # nil → auto-detected if Blazer::Engine is mounted
  self.query_mode = :sql         # :sql (default) or :activerecord
  self.query_enrichment_enabled = false # enrich question with table names before retrieval
  self.enrichment_provider = nil        # nil → falls back to llm_provider
  self.enrichment_model = nil           # nil → falls back to llm_model
  self.max_llm_retries = 3             # retries on rate-limit errors
  self.llm_retry_delay = 60            # base delay in seconds (fallback when no retry-after hint)
end

Instance Attribute Details

#adapterObject

READERS ===



60
61
62
# File 'lib/glancer/configuration.rb', line 60

def adapter
  @adapter
end

#api_keyObject

READERS ===



60
61
62
# File 'lib/glancer/configuration.rb', line 60

def api_key
  @api_key
end

#blazer_pathObject

READERS ===



60
61
62
# File 'lib/glancer/configuration.rb', line 60

def blazer_path
  @blazer_path
end

#chat_modelObject

READERS ===



60
61
62
# File 'lib/glancer/configuration.rb', line 60

def chat_model
  @chat_model
end

#chat_providerObject

READERS ===



60
61
62
# File 'lib/glancer/configuration.rb', line 60

def chat_provider
  @chat_provider
end

#chunk_overlapObject

READERS ===



60
61
62
# File 'lib/glancer/configuration.rb', line 60

def chunk_overlap
  @chunk_overlap
end

#chunk_sizeObject

READERS ===



60
61
62
# File 'lib/glancer/configuration.rb', line 60

def chunk_size
  @chunk_size
end

#code_modelObject

READERS ===



60
61
62
# File 'lib/glancer/configuration.rb', line 60

def code_model
  @code_model
end

#code_providerObject

READERS ===



60
61
62
# File 'lib/glancer/configuration.rb', line 60

def code_provider
  @code_provider
end

#context_documents_weightObject

READERS ===



60
61
62
# File 'lib/glancer/configuration.rb', line 60

def context_documents_weight
  @context_documents_weight
end

#context_file_pathObject

READERS ===



60
61
62
# File 'lib/glancer/configuration.rb', line 60

def context_file_path
  @context_file_path
end

#embedding_modelObject

READERS ===



60
61
62
# File 'lib/glancer/configuration.rb', line 60

def embedding_model
  @embedding_model
end

#embedding_providerObject

READERS ===



60
61
62
# File 'lib/glancer/configuration.rb', line 60

def embedding_provider
  @embedding_provider
end

#enrichment_modelObject

READERS ===



60
61
62
# File 'lib/glancer/configuration.rb', line 60

def enrichment_model
  @enrichment_model
end

#enrichment_providerObject

READERS ===



60
61
62
# File 'lib/glancer/configuration.rb', line 60

def enrichment_provider
  @enrichment_provider
end

#gemini_api_keyObject

READERS ===



60
61
62
# File 'lib/glancer/configuration.rb', line 60

def gemini_api_key
  @gemini_api_key
end

#history_limitObject

READERS ===



60
61
62
# File 'lib/glancer/configuration.rb', line 60

def history_limit
  @history_limit
end

#kObject

READERS ===



60
61
62
# File 'lib/glancer/configuration.rb', line 60

def k
  @k
end

#llm_modelObject

READERS ===



60
61
62
# File 'lib/glancer/configuration.rb', line 60

def llm_model
  @llm_model
end

#llm_providerObject

READERS ===



60
61
62
# File 'lib/glancer/configuration.rb', line 60

def llm_provider
  @llm_provider
end

#llm_retry_delayObject

READERS ===



60
61
62
# File 'lib/glancer/configuration.rb', line 60

def llm_retry_delay
  @llm_retry_delay
end

#log_output_pathObject

READERS ===



60
61
62
# File 'lib/glancer/configuration.rb', line 60

def log_output_path
  @log_output_path
end

#log_verbosityObject

READERS ===



60
61
62
# File 'lib/glancer/configuration.rb', line 60

def log_verbosity
  @log_verbosity
end

#max_llm_retriesObject

READERS ===



60
61
62
# File 'lib/glancer/configuration.rb', line 60

def max_llm_retries
  @max_llm_retries
end

#min_scoreObject

READERS ===



60
61
62
# File 'lib/glancer/configuration.rb', line 60

def min_score
  @min_score
end

#models_documents_weightObject

READERS ===



60
61
62
# File 'lib/glancer/configuration.rb', line 60

def models_documents_weight
  @models_documents_weight
end

#models_permissionObject

READERS ===



60
61
62
# File 'lib/glancer/configuration.rb', line 60

def models_permission
  @models_permission
end

#openai_api_keyObject

READERS ===



60
61
62
# File 'lib/glancer/configuration.rb', line 60

def openai_api_key
  @openai_api_key
end

#openrouter_api_keyObject

READERS ===



60
61
62
# File 'lib/glancer/configuration.rb', line 60

def openrouter_api_key
  @openrouter_api_key
end

#query_enrichment_enabledObject

READERS ===



60
61
62
# File 'lib/glancer/configuration.rb', line 60

def query_enrichment_enabled
  @query_enrichment_enabled
end

#query_modeObject

READERS ===



60
61
62
# File 'lib/glancer/configuration.rb', line 60

def query_mode
  @query_mode
end

#read_only_dbObject

READERS ===



60
61
62
# File 'lib/glancer/configuration.rb', line 60

def read_only_db
  @read_only_db
end

#schema_documents_weightObject

READERS ===



60
61
62
# File 'lib/glancer/configuration.rb', line 60

def schema_documents_weight
  @schema_documents_weight
end

#schema_permissionObject

READERS ===



60
61
62
# File 'lib/glancer/configuration.rb', line 60

def schema_permission
  @schema_permission
end

#statement_timeoutObject

READERS ===



60
61
62
# File 'lib/glancer/configuration.rb', line 60

def statement_timeout
  @statement_timeout
end

#workflow_cache_ttlObject

READERS ===



60
61
62
# File 'lib/glancer/configuration.rb', line 60

def workflow_cache_ttl
  @workflow_cache_ttl
end

Class Method Details

.infer_adapterObject

Auxiliary methods ===



374
375
376
377
378
379
# File 'lib/glancer/configuration.rb', line 374

def self.infer_adapter
  raw = ActiveRecord::Base.connection.adapter_name.downcase.to_sym
  raw.to_s == "postgresql" ? :postgres : raw
rescue StandardError
  nil
end

.valid_table_name?(table_name) ⇒ Boolean

Returns:

  • (Boolean)


381
382
383
384
385
# File 'lib/glancer/configuration.rb', line 381

def self.valid_table_name?(table_name)
  ActiveRecord::Base.connection.tables.include?(table_name.to_s)
rescue StandardError
  false
end

Instance Method Details

#resolved_adapterObject

Returns the adapter in use, auto-detecting from ActiveRecord when nil. Normalizes “postgresql” → :postgres so callers don’t need to handle both.



367
368
369
370
# File 'lib/glancer/configuration.rb', line 367

def resolved_adapter
  raw = adapter || self.class.infer_adapter || :mysql2
  raw.to_s == "postgresql" ? :postgres : raw
end

#resolved_blazer_pathObject

Returns the Blazer base path if Blazer is available, nil otherwise.



359
360
361
362
363
# File 'lib/glancer/configuration.rb', line 359

def resolved_blazer_path
  return @blazer_path unless @blazer_path.nil?

  defined?(Blazer::Engine) ? "/blazer" : nil
end

#resolved_chat_modelObject



302
303
304
# File 'lib/glancer/configuration.rb', line 302

def resolved_chat_model
  chat_model || llm_model
end

#resolved_chat_providerObject



298
299
300
# File 'lib/glancer/configuration.rb', line 298

def resolved_chat_provider
  chat_provider || llm_provider
end

#resolved_code_modelObject



294
295
296
# File 'lib/glancer/configuration.rb', line 294

def resolved_code_model
  code_model || llm_model
end

#resolved_code_providerObject



290
291
292
# File 'lib/glancer/configuration.rb', line 290

def resolved_code_provider
  code_provider || llm_provider
end

#resolved_embedding_modelObject

Returns the model to use for embedding calls. Falls back to EMBEDDING_DEFAULTS for the resolved provider.



258
259
260
# File 'lib/glancer/configuration.rb', line 258

def resolved_embedding_model
  embedding_model || EMBEDDING_DEFAULTS[resolved_embedding_provider] || "text-embedding-004"
end

#resolved_embedding_providerObject

Returns the provider to use for embedding calls (falls back to llm_provider).



252
253
254
# File 'lib/glancer/configuration.rb', line 252

def resolved_embedding_provider
  embedding_provider || llm_provider
end

#resolved_enrichment_modelObject



330
331
332
# File 'lib/glancer/configuration.rb', line 330

def resolved_enrichment_model
  enrichment_model || llm_model
end

#resolved_enrichment_providerObject



326
327
328
# File 'lib/glancer/configuration.rb', line 326

def resolved_enrichment_provider
  enrichment_provider || llm_provider
end