Class: Rubino::Context::SummaryBuilder

Inherits:
Object
  • Object
show all
Defined in:
lib/rubino/context/summary_builder.rb

Overview

Builds structured summaries from compressible message segments. Uses the LLM to generate a comprehensive summary following the template.

Constant Summary collapse

SUMMARY_TEMPLATE =
<<~TEMPLATE
  ## Goal
  Current user objective.

  ## Constraints & Preferences
  Technical constraints, preferences, conventions.

  ## Progress

  ### Done
  Completed items.

  ### In Progress
  Work in progress.

  ### Blocked
  Open blockers or errors.

  ## Key Decisions
  Technical decisions made and their rationale.

  ## Relevant Files
  Files read, modified, or created.

  ## Tool Results
  Important tool execution results.

  ## Current State
  Current session state.

  ## Next Steps
  Planned next actions.

  ## Critical Context
  Information that must not be lost.
TEMPLATE

Instance Method Summary collapse

Constructor Details

#initialize(session_id:, config: nil) ⇒ SummaryBuilder

Returns a new instance of SummaryBuilder.



45
46
47
48
# File 'lib/rubino/context/summary_builder.rb', line 45

def initialize(session_id:, config: nil)
  @session_id = session_id
  @config = config || Rubino.configuration
end

Instance Method Details

#build(messages:, previous_summary: nil) ⇒ Object

Builds a summary from messages, optionally incorporating a previous summary



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/rubino/context/summary_builder.rb', line 51

def build(messages:, previous_summary: nil)
  content = format_messages_for_summary(messages)

  prompt = build_summary_prompt(content, previous_summary)
  @config.compression_max_summary_tokens

  # Use the auxiliary compression model if configured
  model = compression_model
  adapter = LLM::RubyLLMAdapter.new(model_id: model)

  response = adapter.chat(messages: [
                            { role: "system", content: summary_system_prompt },
                            { role: "user", content: prompt }
                          ])

  response&.content || fallback_summary(messages, previous_summary)
rescue StandardError
  # If LLM fails, produce a basic extractive summary
  fallback_summary(messages, previous_summary)
end

#build_and_save!Object

Builds and saves the summary to the database



73
74
75
76
77
78
79
80
# File 'lib/rubino/context/summary_builder.rb', line 73

def build_and_save!
  message_store = Session::Store.new
  messages = message_store.for_session(@session_id)
  return if messages.size < 10

  summary = build(messages: messages, previous_summary: load_previous_summary)
  save!(summary)
end