Class: Phronomy::Context::Assembler
- Inherits:
-
Object
- Object
- Phronomy::Context::Assembler
- Defined in:
- lib/phronomy/context/assembler.rb
Overview
Assembler collects all four context regions and produces the final messages: hash consumed by Agent::Base.
Regions:
- Instruction — system prompt text set via #add_instruction
- Capability — tool definitions (handled by RubyLLM, not here)
- Knowledge — external facts injected via #add_knowledge (generates XML tags)
- Conversation — historical messages added via #add_messages
Token budgeting: When a budget is given, conversation messages are trimmed from oldest to newest until they fit. Knowledge chunks are always included in full (they are assumed to be pre-screened by the caller). When no budget is given all messages are passed through unchanged.
Class Method Summary collapse
-
.xml_tag(text, type:, trusted: false) ⇒ String
Builds a single XML context tag string.
Instance Method Summary collapse
-
#add_instruction(text) ⇒ self
Set the system instruction text (Region 1).
-
#add_knowledge(text, type:, trusted: false, source: nil) ⇒ self
Append a knowledge chunk (Region 3).
-
#add_messages(messages) ⇒ self
Set conversation messages (Region 4).
-
#build ⇒ Hash{Symbol => Object}
Assemble the context.
-
#initialize(budget: nil) ⇒ Assembler
constructor
A new instance of Assembler.
Constructor Details
#initialize(budget: nil) ⇒ Assembler
Returns a new instance of Assembler.
42 43 44 45 46 47 |
# File 'lib/phronomy/context/assembler.rb', line 42 def initialize(budget: nil) @budget = budget @instruction = nil @knowledge_chunks = [] @messages = [] end |
Class Method Details
.xml_tag(text, type:, trusted: false) ⇒ String
Builds a single XML context tag string. Exposed as a class method so callers (e.g. Agent::Base) can build static knowledge XML tags independently of an Assembler instance.
36 37 38 |
# File 'lib/phronomy/context/assembler.rb', line 36 def self.xml_tag(text, type:, trusted: false) "<context type=\"#{type}\" trusted=\"#{trusted}\">\n#{text}\n</context>" end |
Instance Method Details
#add_instruction(text) ⇒ self
Set the system instruction text (Region 1). Calling this multiple times replaces the previous value.
54 55 56 57 |
# File 'lib/phronomy/context/assembler.rb', line 54 def add_instruction(text) @instruction = text.to_s self end |
#add_knowledge(text, type:, trusted: false, source: nil) ⇒ self
Append a knowledge chunk (Region 3). The chunk is wrapped in an XML context tag automatically.
68 69 70 71 |
# File 'lib/phronomy/context/assembler.rb', line 68 def add_knowledge(text, type:, trusted: false, source: nil) @knowledge_chunks << {text: text.to_s, type: type.to_s, trusted: trusted, source: source} self end |
#add_messages(messages) ⇒ self
Set conversation messages (Region 4). Replaces any previously set messages.
77 78 79 80 |
# File 'lib/phronomy/context/assembler.rb', line 77 def () @messages = Array() self end |
#build ⇒ Hash{Symbol => Object}
Assemble the context.
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
# File 'lib/phronomy/context/assembler.rb', line 87 def build knowledge_text = @knowledge_chunks.map { |c| xml_context_tag(c) }.join("\n\n") system_parts = [@instruction, knowledge_text.empty? ? nil : knowledge_text].compact system_text = system_parts.join("\n\n") = if @budget (@messages, system_text) else @messages end { system: system_text.empty? ? nil : system_text, messages: } end |