Class: Llmemory::Actions::Reason
- Inherits:
-
Object
- Object
- Llmemory::Actions::Reason
- Defined in:
- lib/llmemory/actions/reason.rb
Overview
CoALA's "reasoning" action: read working memory, call the LLM, write the result back to working memory. Unlike retrieval (long-term -> working) or learning (working -> long-term), reasoning reads from and writes to working memory, producing new information for the current decision.
It is a small, composable primitive — agents can chain reason -> retrieve -> reason — and deliberately does NOT touch long-term memory.
Llmemory::Actions::Reason.call(
working_memory: wm,
template: "Given goals {{goals}}, what is the next step?",
into: :intermediate_reasoning
)
template is either a String (with {slot} placeholders filled from
working memory) or a callable that receives the WorkingMemory and returns
the prompt. parse optionally transforms the raw LLM output before it is
stored. into is the slot to write to (nil to reason without writing).
Returns the parsed result.
Constant Summary collapse
- DEFAULT_SLOT =
:intermediate_reasoning
Class Method Summary collapse
- .call(working_memory:, template:, into: DEFAULT_SLOT, parse: nil, llm: nil) ⇒ Object
- .interpolate(text, slots) ⇒ Object
- .render(template, working_memory) ⇒ Object
Class Method Details
.call(working_memory:, template:, into: DEFAULT_SLOT, parse: nil, llm: nil) ⇒ Object
27 28 29 30 31 32 33 34 |
# File 'lib/llmemory/actions/reason.rb', line 27 def self.call(working_memory:, template:, into: DEFAULT_SLOT, parse: nil, llm: nil) client = llm || Llmemory::LLM.client prompt = render(template, working_memory) output = client.invoke(prompt).to_s result = parse ? parse.call(output) : output working_memory.set(into, result) unless into.nil? result end |
.interpolate(text, slots) ⇒ Object
41 42 43 44 45 46 |
# File 'lib/llmemory/actions/reason.rb', line 41 def self.interpolate(text, slots) text.gsub(/\{\{(\w+)\}\}/) do key = Regexp.last_match(1).to_sym slots.key?(key) ? slots[key].to_s : "" end end |
.render(template, working_memory) ⇒ Object
36 37 38 39 |
# File 'lib/llmemory/actions/reason.rb', line 36 def self.render(template, working_memory) return template.call(working_memory).to_s if template.respond_to?(:call) interpolate(template.to_s, working_memory.to_h) end |