From ef0e13d33224585c780e176b1008057a66faff2e Mon Sep 17 00:00:00 2001 From: Paul Walko Date: Fri, 26 Dec 2025 03:51:15 +0100 Subject: [PATCH] remove history past user message --- web/agent/src/agent.py | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/web/agent/src/agent.py b/web/agent/src/agent.py index 2f69c4f..1bedf94 100644 --- a/web/agent/src/agent.py +++ b/web/agent/src/agent.py @@ -26,7 +26,7 @@ logfire.configure( logfire.instrument_pydantic_ai() logfire.instrument_httpx() -from pydantic_ai import Agent, RunContext +from pydantic_ai import Agent, ModelMessage, RunContext from pydantic_ai.settings import ModelSettings from pydantic_ai.mcp import CallToolFunc @@ -35,6 +35,25 @@ CAVE_MCP_URL = os.getenv("CAVE_MCP_URL", "https://mcp.caving.dev/mcp") logger.info(f"Initializing Cavepedia agent with CAVE_MCP_URL={CAVE_MCP_URL}") +def limit_history(ctx: RunContext[None], messages: list[ModelMessage]) -> list[ModelMessage]: + """Keep only the current turn - from last user text message onward.""" + from pydantic_ai.messages import ModelRequest, UserPromptPart + + if not messages: + return messages + + # Find the last user message with actual text (not just tool results) + for i in range(len(messages) - 1, -1, -1): + msg = messages[i] + if isinstance(msg, ModelRequest): + has_text = any(isinstance(part, UserPromptPart) for part in msg.parts) + if has_text: + return messages[i:] + + # Fallback: return all messages if no user text found + return messages + + def check_mcp_available(url: str, timeout: float = 5.0) -> bool: """Check if MCP server is reachable via health endpoint.""" try: @@ -126,6 +145,7 @@ def create_agent(user_roles: list[str] | None = None, sources_only: bool = False model="anthropic:claude-sonnet-4-5", toolsets=toolsets if toolsets else None, instructions=instructions, + history_processors=[limit_history], model_settings=ModelSettings(max_tokens=4096), )