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
# 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
end

Instance Attribute Details

#adapterObject

READERS ===



58
59
60
# File 'lib/glancer/configuration.rb', line 58

def adapter
  @adapter
end

#api_keyObject

READERS ===



58
59
60
# File 'lib/glancer/configuration.rb', line 58

def api_key
  @api_key
end

#blazer_pathObject

READERS ===



58
59
60
# File 'lib/glancer/configuration.rb', line 58

def blazer_path
  @blazer_path
end

#chat_modelObject

READERS ===



58
59
60
# File 'lib/glancer/configuration.rb', line 58

def chat_model
  @chat_model
end

#chat_providerObject

READERS ===



58
59
60
# File 'lib/glancer/configuration.rb', line 58

def chat_provider
  @chat_provider
end

#chunk_overlapObject

READERS ===



58
59
60
# File 'lib/glancer/configuration.rb', line 58

def chunk_overlap
  @chunk_overlap
end

#chunk_sizeObject

READERS ===



58
59
60
# File 'lib/glancer/configuration.rb', line 58

def chunk_size
  @chunk_size
end

#code_modelObject

READERS ===



58
59
60
# File 'lib/glancer/configuration.rb', line 58

def code_model
  @code_model
end

#code_providerObject

READERS ===



58
59
60
# File 'lib/glancer/configuration.rb', line 58

def code_provider
  @code_provider
end

#context_documents_weightObject

READERS ===



58
59
60
# File 'lib/glancer/configuration.rb', line 58

def context_documents_weight
  @context_documents_weight
end

#context_file_pathObject

READERS ===



58
59
60
# File 'lib/glancer/configuration.rb', line 58

def context_file_path
  @context_file_path
end

#embedding_modelObject

READERS ===



58
59
60
# File 'lib/glancer/configuration.rb', line 58

def embedding_model
  @embedding_model
end

#embedding_providerObject

READERS ===



58
59
60
# File 'lib/glancer/configuration.rb', line 58

def embedding_provider
  @embedding_provider
end

#enrichment_modelObject

READERS ===



58
59
60
# File 'lib/glancer/configuration.rb', line 58

def enrichment_model
  @enrichment_model
end

#enrichment_providerObject

READERS ===



58
59
60
# File 'lib/glancer/configuration.rb', line 58

def enrichment_provider
  @enrichment_provider
end

#gemini_api_keyObject

READERS ===



58
59
60
# File 'lib/glancer/configuration.rb', line 58

def gemini_api_key
  @gemini_api_key
end

#history_limitObject

READERS ===



58
59
60
# File 'lib/glancer/configuration.rb', line 58

def history_limit
  @history_limit
end

#kObject

READERS ===



58
59
60
# File 'lib/glancer/configuration.rb', line 58

def k
  @k
end

#llm_modelObject

READERS ===



58
59
60
# File 'lib/glancer/configuration.rb', line 58

def llm_model
  @llm_model
end

#llm_providerObject

READERS ===



58
59
60
# File 'lib/glancer/configuration.rb', line 58

def llm_provider
  @llm_provider
end

#log_output_pathObject

READERS ===



58
59
60
# File 'lib/glancer/configuration.rb', line 58

def log_output_path
  @log_output_path
end

#log_verbosityObject

READERS ===



58
59
60
# File 'lib/glancer/configuration.rb', line 58

def log_verbosity
  @log_verbosity
end

#min_scoreObject

READERS ===



58
59
60
# File 'lib/glancer/configuration.rb', line 58

def min_score
  @min_score
end

#models_documents_weightObject

READERS ===



58
59
60
# File 'lib/glancer/configuration.rb', line 58

def models_documents_weight
  @models_documents_weight
end

#models_permissionObject

READERS ===



58
59
60
# File 'lib/glancer/configuration.rb', line 58

def models_permission
  @models_permission
end

#openai_api_keyObject

READERS ===



58
59
60
# File 'lib/glancer/configuration.rb', line 58

def openai_api_key
  @openai_api_key
end

#openrouter_api_keyObject

READERS ===



58
59
60
# File 'lib/glancer/configuration.rb', line 58

def openrouter_api_key
  @openrouter_api_key
end

#query_enrichment_enabledObject

READERS ===



58
59
60
# File 'lib/glancer/configuration.rb', line 58

def query_enrichment_enabled
  @query_enrichment_enabled
end

#query_modeObject

READERS ===



58
59
60
# File 'lib/glancer/configuration.rb', line 58

def query_mode
  @query_mode
end

#read_only_dbObject

READERS ===



58
59
60
# File 'lib/glancer/configuration.rb', line 58

def read_only_db
  @read_only_db
end

#schema_documents_weightObject

READERS ===



58
59
60
# File 'lib/glancer/configuration.rb', line 58

def schema_documents_weight
  @schema_documents_weight
end

#schema_permissionObject

READERS ===



58
59
60
# File 'lib/glancer/configuration.rb', line 58

def schema_permission
  @schema_permission
end

#statement_timeoutObject

READERS ===



58
59
60
# File 'lib/glancer/configuration.rb', line 58

def statement_timeout
  @statement_timeout
end

#workflow_cache_ttlObject

READERS ===



58
59
60
# File 'lib/glancer/configuration.rb', line 58

def workflow_cache_ttl
  @workflow_cache_ttl
end

Class Method Details

.infer_adapterObject

Auxiliary methods ===



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

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)


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

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.



352
353
354
355
# File 'lib/glancer/configuration.rb', line 352

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.



344
345
346
347
348
# File 'lib/glancer/configuration.rb', line 344

def resolved_blazer_path
  return @blazer_path unless @blazer_path.nil?

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

#resolved_chat_modelObject



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

def resolved_chat_model
  chat_model || llm_model
end

#resolved_chat_providerObject



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

def resolved_chat_provider
  chat_provider || llm_provider
end

#resolved_code_modelObject



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

def resolved_code_model
  code_model || llm_model
end

#resolved_code_providerObject



287
288
289
# File 'lib/glancer/configuration.rb', line 287

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.



255
256
257
# File 'lib/glancer/configuration.rb', line 255

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).



249
250
251
# File 'lib/glancer/configuration.rb', line 249

def resolved_embedding_provider
  embedding_provider || llm_provider
end

#resolved_enrichment_modelObject



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

def resolved_enrichment_model
  enrichment_model || llm_model
end

#resolved_enrichment_providerObject



323
324
325
# File 'lib/glancer/configuration.rb', line 323

def resolved_enrichment_provider
  enrichment_provider || llm_provider
end