Module: Insika::Harvest::MinerFactory

Defined in:
lib/insika/harvest.rb

Overview

Resolves WHICH model mines, and builds the ask. Profile -> platform utility_model -> nil (D12 — nil means "feature inert", never a guess). ask_factory/llm injectable (specs).

Class Method Summary collapse

Class Method Details

.build(config, utility_model: nil, ask_factory: nil, llm: nil) ⇒ Object

config: the agent's harvest hash. -> Miner | nil



212
213
214
215
216
217
218
219
# File 'lib/insika/harvest.rb', line 212

def build(config, utility_model: nil, ask_factory: nil, llm: nil)
  ref = Coercion.presence(config && config.dig("miner", "model")) || Coercion.presence(utility_model)
  return nil if ref.nil?

  provider, model = split_ref(ref)
  factory = ask_factory || ->(m, p) { ruby_llm_ask(m, p, llm: llm) }
  Miner.new(ask: factory.call(model, provider), model: ref)
end

.ruby_llm_ask(model, provider, llm: nil) ⇒ Object

Temperature 0: a rejected skill must be re-proposable deterministically. ruby_llm is required lazily so nothing loads a provider gem until a miner is actually configured (load_guard stays green).



231
232
233
234
235
236
237
238
# File 'lib/insika/harvest.rb', line 231

def ruby_llm_ask(model, provider, llm: nil)
  require "ruby_llm"
  llm ||= RubyLLM
  lambda do |prompt|
    llm.chat(model: model, provider: provider, assume_model_exists: true)
       .with_temperature(0).ask(prompt)
  end
end

.split_ref(ref) ⇒ Object

"provider/model" -> [provider, model]; "model" -> [nil, model] — the ProposerFactory reading, one syntax for "which model" across features.



223
224
225
226
# File 'lib/insika/harvest.rb', line 223

def split_ref(ref)
  prov, name = ref.to_s.split("/", 2)
  name ? [prov, name] : [nil, prov]
end