diff --git a/navi/core/agent.py b/navi/core/agent.py index 9ff833a..225b536 100644 --- a/navi/core/agent.py +++ b/navi/core/agent.py @@ -85,9 +85,11 @@ tool_schemas = [t.schema() for t in tools] llm = self._get_backend(profile.llm_backend) - # System prompt only goes into context (not display history) - if not session.context: - session.context.append(Message( + # System prompt only goes into context (not display history). + # Use role check rather than empty check: backward-compat sessions have + # context initialised from messages (which never contain a system message). + if not any(m.role == "system" for m in session.context): + session.context.insert(0, Message( role="system", content=self._build_system_prompt(profile.system_prompt), )) @@ -152,9 +154,11 @@ tool_schemas = [t.schema() for t in tools] llm = self._get_backend(profile.llm_backend) - # System prompt only goes into context (not display history) - if not session.context: - session.context.append(Message( + # System prompt only goes into context (not display history). + # Use role check rather than empty check: backward-compat sessions have + # context initialised from messages (which never contain a system message). + if not any(m.role == "system" for m in session.context): + session.context.insert(0, Message( role="system", content=self._build_system_prompt(profile.system_prompt), )) diff --git a/navi/core/session.py b/navi/core/session.py index 4b5a7e8..790815a 100644 --- a/navi/core/session.py +++ b/navi/core/session.py @@ -14,6 +14,7 @@ profile_id: str messages: list[Message] = Field(default_factory=list) # full display history (never compressed) context: list[Message] = Field(default_factory=list) # LLM context (may be compressed) + context_token_count: int = 0 # accumulated total; reset to 0 after compression pinned: bool = False created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc)) last_active: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))