Bases:
BaseConversationMemory
Source Code in griptape/memory/structure/summary_conversation_memory.py
@define class SummaryConversationMemory(BaseConversationMemory): offset: int = field(default=1, kw_only=True, metadata={"serializable": True}) prompt_driver: BasePromptDriver = field( kw_only=True, default=Factory(lambda: Defaults.drivers_config.prompt_driver) ) summary: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) summary_index: int = field(default=0, kw_only=True, metadata={"serializable": True}) summary_get_template: J2 = field(default=Factory(lambda: J2("memory/conversation/summary.j2")), kw_only=True) summarize_conversation_get_template: J2 = field( default=Factory(lambda: J2("memory/conversation/summarize_conversation.j2")), kw_only=True, ) def to_prompt_stack(self, last_n: Optional[int] = None) -> PromptStack: stack = PromptStack() if self.summary: stack.add_user_message(self.summary_get_template.render(summary=self.summary)) for r in self.unsummarized_runs(last_n): stack.add_user_message(r.input) stack.add_assistant_message(r.output) return stack def unsummarized_runs(self, last_n: Optional[int] = None) -> list[Run]: summary_index_runs = self.runs[self.summary_index :] if last_n: last_n_runs = self.runs[-last_n:] if len(summary_index_runs) > len(last_n_runs): return last_n_runs return summary_index_runs return summary_index_runs def try_add_run(self, run: Run) -> None: self.runs.append(run) unsummarized_runs = self.unsummarized_runs() runs_to_summarize = unsummarized_runs[: max(0, len(unsummarized_runs) - self.offset)] if len(runs_to_summarize) > 0: self.summary = self.summarize_runs(self.summary, runs_to_summarize) self.summary_index = 1 + self.runs.index(runs_to_summarize[-1]) def summarize_runs(self, previous_summary: str | None, runs: list[Run]) -> str | None: try: if len(runs) > 0: summary = self.summarize_conversation_get_template.render(summary=previous_summary, runs=runs) return self.prompt_driver.run( PromptStack(messages=[Message(summary, role=Message.USER_ROLE)]), ).to_text() return previous_summary except Exception as e: logging.exception("Error summarizing memory: %s(%s)", type(e).__name__, e) return previous_summary
offset = field(default=1, kw_only=True, metadata={'serializable': True})class-attribute instance-attributeprompt_driver = field(kw_only=True, default=Factory(lambda: Defaults.drivers_config.prompt_driver))class-attribute instance-attributesummarize_conversation_get_template = field(default=Factory(lambda: J2('memory/conversation/summarize_conversation.j2')), kw_only=True)class-attribute instance-attributesummary = field(default=None, kw_only=True, metadata={'serializable': True})class-attribute instance-attributesummary_get_template = field(default=Factory(lambda: J2('memory/conversation/summary.j2')), kw_only=True)class-attribute instance-attributesummary_index = field(default=0, kw_only=True, metadata={'serializable': True})class-attribute instance-attribute
summarize_runs(previous_summary, runs)
Source Code in griptape/memory/structure/summary_conversation_memory.py
def summarize_runs(self, previous_summary: str | None, runs: list[Run]) -> str | None: try: if len(runs) > 0: summary = self.summarize_conversation_get_template.render(summary=previous_summary, runs=runs) return self.prompt_driver.run( PromptStack(messages=[Message(summary, role=Message.USER_ROLE)]), ).to_text() return previous_summary except Exception as e: logging.exception("Error summarizing memory: %s(%s)", type(e).__name__, e) return previous_summary
to_prompt_stack(last_n=None)
Source Code in griptape/memory/structure/summary_conversation_memory.py
def to_prompt_stack(self, last_n: Optional[int] = None) -> PromptStack: stack = PromptStack() if self.summary: stack.add_user_message(self.summary_get_template.render(summary=self.summary)) for r in self.unsummarized_runs(last_n): stack.add_user_message(r.input) stack.add_assistant_message(r.output) return stack
try_add_run(run)
Source Code in griptape/memory/structure/summary_conversation_memory.py
def try_add_run(self, run: Run) -> None: self.runs.append(run) unsummarized_runs = self.unsummarized_runs() runs_to_summarize = unsummarized_runs[: max(0, len(unsummarized_runs) - self.offset)] if len(runs_to_summarize) > 0: self.summary = self.summarize_runs(self.summary, runs_to_summarize) self.summary_index = 1 + self.runs.index(runs_to_summarize[-1])
unsummarized_runs(last_n=None)
Source Code in griptape/memory/structure/summary_conversation_memory.py
def unsummarized_runs(self, last_n: Optional[int] = None) -> list[Run]: summary_index_runs = self.runs[self.summary_index :] if last_n: last_n_runs = self.runs[-last_n:] if len(summary_index_runs) > len(last_n_runs): return last_n_runs return summary_index_runs return summary_index_runs