Use previous context in summarization

This commit is contained in:
Yiorgis Gozadinos 2026-01-23 13:24:50 +02:00
parent 3214160fe7
commit 93737852a8
No known key found for this signature in database
4 changed files with 141 additions and 2 deletions

View file

@ -11,12 +11,15 @@ from haiku.rag.utils import get_model
async def summarize_session(
qa_history: list[QAResponse],
config: AppConfig,
current_context: str | None = None,
) -> str:
"""Summarize qa_history into compact context.
Args:
qa_history: List of Q&A pairs from the conversation.
config: AppConfig for model selection.
current_context: Previous context to incorporate (background_context or
previous session_context.summary). The summarizer will build upon this.
Returns:
Markdown summary of the conversation history.
@ -33,6 +36,8 @@ async def summarize_session(
)
history_text = _format_qa_history(qa_history)
if current_context:
history_text = f"## Current Context\n{current_context}\n\n{history_text}"
result = await agent.run(history_text)
return result.output
@ -49,7 +54,18 @@ async def update_session_context(
config: AppConfig for model selection.
session_state: The session state to update.
"""
summary = await summarize_session(qa_history, config)
# Determine current context to incorporate:
# 1. If session_context already exists, use its summary
# 2. Otherwise, use background_context (if available)
current_context: str | None = None
if session_state.session_context and session_state.session_context.summary:
current_context = session_state.session_context.summary
elif session_state.background_context:
current_context = session_state.background_context
summary = await summarize_session(
qa_history, config, current_context=current_context
)
session_state.session_context = SessionContext(
summary=summary,
last_updated=datetime.now(),

View file

@ -39,7 +39,9 @@ You can optionally specify a limit parameter (default 5).
IMPORTANT: You must make actual tool calls. Do not output "run_search(...)" as text."""
SESSION_SUMMARY_PROMPT = """You are a session summarizer. Given a conversation history of Q&A pairs, produce a structured summary that captures key information for future context.
SESSION_SUMMARY_PROMPT = """You are a session summarizer. Given a conversation history of Q&A pairs (and optionally existing context), produce a structured summary that captures key information for future context.
If a "Current Context" section is provided at the start of the input, incorporate that context into your summary. This might be initial background context from the user or a previous summary - build upon it rather than discard it.
Your summary should be concise (aim for 500-1500 tokens) and include:
@ -49,6 +51,7 @@ Your summary should be concise (aim for 500-1500 tokens) and include:
Rules:
- Extract only high-signal information that would help answer follow-up questions
- When building on existing context, merge new information with prior context
- Omit small talk, greetings, or low-confidence answers
- Use bullet points for clarity
- Keep technical details but compress verbose explanations

View file

@ -172,6 +172,37 @@ class TestSummarizeSession:
assert "key facts" in result_lower or "established" in result_lower
assert "documents" in result_lower or "sources" in result_lower
@pytest.mark.asyncio
@pytest.mark.vcr()
async def test_summarize_session_with_current_context(self, allow_model_requests):
"""Test summarize_session incorporates current_context into the summary."""
from haiku.rag.agents.chat.context import summarize_session
qa_history = [
QAResponse(
question="What's the rate limit?",
answer="100 requests per minute.",
confidence=0.9,
)
]
# Provide current_context (e.g., background_context or previous summary)
current_context = "Focus on Python APIs. User is building a web application."
result = await summarize_session(
qa_history=qa_history,
config=Config,
current_context=current_context,
)
# Summary should be non-empty and ideally incorporate context about Python/web
assert len(result) > 0
# The context about "Python" or "web application" should influence the summary
result_lower = result.lower()
assert (
"rate" in result_lower or "limit" in result_lower or "100" in result_lower
)
class TestUpdateSessionContext:
"""Tests for update_session_context function."""

View file

@ -0,0 +1,89 @@
interactions:
- request:
headers:
accept:
- application/json
accept-encoding:
- gzip, deflate, zstd
connection:
- keep-alive
content-length:
- '1581'
content-type:
- application/json
host:
- localhost:11434
method: POST
parsed_body:
messages:
- content: |-
You are a session summarizer. Given a conversation history of Q&A pairs (and optionally existing context), produce a structured summary that captures key information for future context.
If a "Current Context" section is provided at the start of the input, incorporate that context into your summary. This might be initial background context from the user or a previous summary - build upon it rather than discard it.
Your summary should be concise (aim for 500-1500 tokens) and include:
1. **Key Facts Established** - Specific facts, data, or conclusions learned during the conversation
2. **Documents Referenced** - Documents or sources that were cited, with brief notes on what they contain
3. **Current Focus** - What topic or question thread the user is currently exploring
Rules:
- Extract only high-signal information that would help answer follow-up questions
- When building on existing context, merge new information with prior context
- Omit small talk, greetings, or low-confidence answers
- Use bullet points for clarity
- Keep technical details but compress verbose explanations
- Preserve document names/titles when mentioned in sources
Output the summary directly in markdown format. Do not include meta-commentary about the summary itself.
role: system
- content: |
## Current Context
Focus on Python APIs. User is building a web application.
## Q1: What's the rate limit?
**Answer** (confidence: 90%):
100 requests per minute.
role: user
model: gpt-oss
reasoning_effort: low
stream: false
uri: http://localhost:11434/v1/chat/completions
response:
headers:
content-length:
- '682'
content-type:
- application/json
parsed_body:
choices:
- finish_reason: stop
index: 0
message:
content: |-
## Summary
- **Key Facts Established**
- The user is building a web application and is focused on Python APIs.
- The relevant rate limit is **100 requests per minute** (confidence 90%).
- **Documents Referenced**
- None cited in this exchange.
- **Current Focus**
- Understanding and managing API rate limits for the Python-based web application.
reasoning: We need summary.
role: assistant
created: 1769164539
id: chatcmpl-369
model: gpt-oss
object: chat.completion
system_fingerprint: fp_ollama
usage:
completion_tokens: 91
prompt_tokens: 362
total_tokens: 453
status:
code: 200
message: OK
version: 1