fix(honcho): preserve delayed and rewritten recall context

This commit is contained in:
Erosika 2026-07-10 16:22:48 -04:00 committed by Teknium
parent f4669f34cf
commit 1c051d1df9
3 changed files with 58 additions and 2 deletions

View file

@ -754,9 +754,12 @@ class HonchoMemoryProvider(MemoryProvider):
def _fetch_base() -> None:
try:
_ctx_holder["ctx"] = self._manager.get_prefetch_context(
ctx = self._manager.get_prefetch_context(
self._session_key, query or None
) or {}
_ctx_holder["ctx"] = ctx
if ctx:
self._manager.set_context_result(self._session_key, ctx)
except Exception as e:
logger.debug("Honcho first-turn base context failed: %s", e)
@ -773,6 +776,7 @@ class HonchoMemoryProvider(MemoryProvider):
_bt.join(timeout=_base_wait)
_ctx = _ctx_holder.get("ctx")
if _ctx:
self._manager.pop_context_result(self._session_key)
formatted = self._format_first_turn_context(_ctx)
if formatted:
with self._base_context_lock:
@ -1248,7 +1252,9 @@ class HonchoMemoryProvider(MemoryProvider):
# nothing.
logger.debug("Honcho dialectic depth %d: pass %d has no non-empty prior — "
"falling back to base prompt", self._dialectic_depth, i)
prompt = self._build_dialectic_prompt(0, prior_results, is_cold)
prompt = rewritten_query or self._build_dialectic_prompt(
0, prior_results, is_cold
)
else:
prompt = self._build_dialectic_prompt(i, prior_results, is_cold)

View file

@ -147,6 +147,17 @@ def test_query_rewriter_runs_once_for_a_multi_pass_dialectic_cycle():
assert provider._manager.dialectic_query.call_count == 2
def test_empty_first_pass_retries_with_rewritten_query():
rewritten = "What prior deployment decisions did the user make?"
provider = _provider(lambda message: rewritten, depth=2)
provider._manager.dialectic_query.side_effect = ["", "grounded synthesis"]
provider._run_dialectic_depth("What should we deploy?")
prompts = [call.args[1] for call in provider._manager.dialectic_query.call_args_list]
assert prompts == [rewritten, rewritten]
def test_session_prewarm_can_skip_query_rewrite():
rewriter = MagicMock(return_value="unused")
provider = _provider(rewriter)

View file

@ -1115,6 +1115,45 @@ class TestBaseContextSummary:
formatted = provider._format_first_turn_context(ctx)
assert "Session Summary" not in formatted
def test_timed_out_first_turn_context_surfaces_next_turn(self):
import threading
import time
ready = threading.Event()
cached = {}
manager = MagicMock()
def get_context(*args, **kwargs):
ready.wait(timeout=1)
return {"representation": "late user context", "card": ""}
manager.get_prefetch_context.side_effect = get_context
manager.set_context_result.side_effect = (
lambda session_key, result: cached.__setitem__(session_key, result)
)
manager.pop_context_result.side_effect = (
lambda session_key: cached.pop(session_key, {})
)
provider = HonchoMemoryProvider()
provider._manager = manager
provider._config = SimpleNamespace(timeout=0.01, context_tokens=0)
provider._session_key = "test"
provider._session_initialized = True
provider._recall_mode = "context"
provider._turn_count = 1
provider._last_dialectic_turn = 0
assert provider.prefetch("first question") == ""
ready.set()
deadline = time.monotonic() + 1
while "test" not in cached and time.monotonic() < deadline:
time.sleep(0.01)
provider._turn_count = 2
assert "late user context" in provider.prefetch("follow-up question")
class TestDialecticDepth:
"""Tests for the dialecticDepth multi-pass system."""