From 93737852a818b8354707a09e260cf3b31353b150 Mon Sep 17 00:00:00 2001 From: Yiorgis Gozadinos Date: Fri, 23 Jan 2026 13:24:50 +0200 Subject: [PATCH] Use previous context in summarization --- .../haiku/rag/agents/chat/context.py | 18 +++- .../haiku/rag/agents/chat/prompts.py | 5 +- tests/agents/chat/test_context.py | 31 +++++++ ...ummarize_session_with_current_context.yaml | 89 +++++++++++++++++++ 4 files changed, 141 insertions(+), 2 deletions(-) create mode 100644 tests/cassettes/test_chat_context/TestSummarizeSession.test_summarize_session_with_current_context.yaml diff --git a/haiku_rag_slim/haiku/rag/agents/chat/context.py b/haiku_rag_slim/haiku/rag/agents/chat/context.py index c96ce71c..473cd168 100644 --- a/haiku_rag_slim/haiku/rag/agents/chat/context.py +++ b/haiku_rag_slim/haiku/rag/agents/chat/context.py @@ -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(), diff --git a/haiku_rag_slim/haiku/rag/agents/chat/prompts.py b/haiku_rag_slim/haiku/rag/agents/chat/prompts.py index ebf17c5d..7ede72de 100644 --- a/haiku_rag_slim/haiku/rag/agents/chat/prompts.py +++ b/haiku_rag_slim/haiku/rag/agents/chat/prompts.py @@ -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 diff --git a/tests/agents/chat/test_context.py b/tests/agents/chat/test_context.py index 3da1be4c..e5f8ed71 100644 --- a/tests/agents/chat/test_context.py +++ b/tests/agents/chat/test_context.py @@ -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.""" diff --git a/tests/cassettes/test_chat_context/TestSummarizeSession.test_summarize_session_with_current_context.yaml b/tests/cassettes/test_chat_context/TestSummarizeSession.test_summarize_session_with_current_context.yaml new file mode 100644 index 00000000..df3a653d --- /dev/null +++ b/tests/cassettes/test_chat_context/TestSummarizeSession.test_summarize_session_with_current_context.yaml @@ -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