From 84e94f825788fb56f68a81060d883ba7c7fcf351 Mon Sep 17 00:00:00 2001 From: Yiorgis Gozadinos Date: Wed, 24 Sep 2025 14:00:31 +0300 Subject: [PATCH] Wire gaps that were forgotten --- src/haiku/rag/research/models.py | 3 +++ src/haiku/rag/research/nodes/evaluate.py | 6 ++++++ tests/test_research_graph_integration.py | 2 ++ 3 files changed, 11 insertions(+) diff --git a/src/haiku/rag/research/models.py b/src/haiku/rag/research/models.py index 30cb97d1..ab16601d 100644 --- a/src/haiku/rag/research/models.py +++ b/src/haiku/rag/research/models.py @@ -37,6 +37,9 @@ class EvaluationResult(BaseModel): max_length=3, default=[], ) + gaps: list[str] = Field( + description="Concrete information gaps that remain", default_factory=list + ) confidence_score: float = Field( description="Confidence level in the completeness of research (0-1)", ge=0.0, diff --git a/src/haiku/rag/research/nodes/evaluate.py b/src/haiku/rag/research/nodes/evaluate.py index 46634b52..6289934e 100644 --- a/src/haiku/rag/research/nodes/evaluate.py +++ b/src/haiku/rag/research/nodes/evaluate.py @@ -57,6 +57,8 @@ class EvaluateNode(BaseNode[ResearchState, ResearchDeps, ResearchReport]): for new_q in output.new_questions: if new_q not in state.context.sub_questions: state.context.sub_questions.append(new_q) + for gap in output.gaps: + state.context.add_gap(gap) state.last_eval = output state.iterations += 1 @@ -65,6 +67,10 @@ class EvaluateNode(BaseNode[ResearchState, ResearchDeps, ResearchReport]): log(deps, state, " [bold]Key insights:[/bold]") for ins in output.key_insights: log(deps, state, f" • {ins}") + if output.gaps: + log(deps, state, " [bold yellow]Remaining gaps:[/bold yellow]") + for gap in output.gaps: + log(deps, state, f" • {gap}") log( deps, state, diff --git a/tests/test_research_graph_integration.py b/tests/test_research_graph_integration.py index 64863f9f..d869af7d 100644 --- a/tests/test_research_graph_integration.py +++ b/tests/test_research_graph_integration.py @@ -53,11 +53,13 @@ async def test_graph_end_to_end_with_patched_nodes(monkeypatch): ctx.state.last_eval = EvaluationResult( key_insights=["ok"], new_questions=[], + gaps=["gap"], confidence_score=1.0, is_sufficient=True, reasoning="done", ) ctx.state.iterations += 1 + ctx.state.context.add_gap("gap") ctx.deps.emit_log("evaluated", ctx.state) return SynthesizeNode(self.provider, self.model)