From 3a9ded2218052137d110a73d9f356d638c21faab Mon Sep 17 00:00:00 2001 From: Lawrence Akka Date: Mon, 17 Aug 2026 20:17:17 +0200 Subject: [PATCH] Display all chunk metadata in inspector --- .../rag/inspector/widgets/detail_view.py | 10 ++++ tests/test_inspector.py | 57 +++++++++++++++++++ 2 files changed, 67 insertions(+) diff --git a/haiku_rag_slim/haiku/rag/inspector/widgets/detail_view.py b/haiku_rag_slim/haiku/rag/inspector/widgets/detail_view.py index 5b9c4e14..15026c8c 100644 --- a/haiku_rag_slim/haiku/rag/inspector/widgets/detail_view.py +++ b/haiku_rag_slim/haiku/rag/inspector/widgets/detail_view.py @@ -93,6 +93,10 @@ class DetailView(VerticalScroll): chunk_meta = chunk.get_chunk_metadata() content_parts.extend(self._format_provenance(chunk_meta)) + if chunk.metadata: + metadata_str = "\n".join(f" - {k}: {v}" for k, v in chunk.metadata.items()) + content_parts.append(f"**Metadata:**\n{metadata_str}") + if chunk.embedding: content_parts.append(f"**Embedding:** {len(chunk.embedding)} dimensions") @@ -121,6 +125,12 @@ class DetailView(VerticalScroll): content_parts.extend(self._format_provenance(search_result)) + if search_result.chunk_meta: + metadata_str = "\n".join( + f" - {k}: {v}" for k, v in search_result.chunk_meta.items() + ) + content_parts.append(f"**Metadata:**\n{metadata_str}") + if chunk.embedding: content_parts.append(f"**Embedding:** {len(chunk.embedding)} dimensions") diff --git a/tests/test_inspector.py b/tests/test_inspector.py index 9ee6d476..7d432821 100644 --- a/tests/test_inspector.py +++ b/tests/test_inspector.py @@ -165,6 +165,63 @@ async def test_document_list_tracks_has_more(): assert doc_list.has_more is False +@pytest.mark.asyncio +async def test_detail_view_shows_chunk_metadata(): + """show_chunk renders the raw chunk.metadata dict verbatim, not just the + typed provenance fields _format_provenance already covers.""" + from textual.app import App + + from haiku.rag.inspector.widgets.detail_view import DetailView + + chunk = Chunk( + id="chunk-1", + document_id="doc-1", + content="raw chunk text", + metadata={"headings": ["Chapter 1"], "para_no": "12"}, + ) + + class TestApp(App): + def compose(self): + yield DetailView(id="detail") + + app = TestApp() + async with app.run_test(): + detail_view = app.query_one(DetailView) + await detail_view.show_chunk(chunk) + source = detail_view.content_widget.source + assert "**Metadata:**" in source + assert "para_no: 12" in source + + +@pytest.mark.asyncio +async def test_detail_view_shows_search_result_chunk_meta(): + """show_search_result renders SearchResult.chunk_meta, the anchor + chunk's raw metadata carried through search/expansion.""" + from textual.app import App + + from haiku.rag.inspector.widgets.detail_view import DetailView + + chunk = Chunk(id="chunk-1", document_id="doc-1", content="raw chunk text") + search_result = SearchResult( + content="raw chunk text", + score=0.5, + chunk_id="chunk-1", + chunk_meta={"para_no": "12"}, + ) + + class TestApp(App): + def compose(self): + yield DetailView(id="detail") + + app = TestApp() + async with app.run_test(): + detail_view = app.query_one(DetailView) + await detail_view.show_search_result(chunk, search_result) + source = detail_view.content_widget.source + assert "**Metadata:**" in source + assert "para_no: 12" in source + + @pytest.mark.asyncio async def test_context_modal_renders_pictures_when_vision_enabled(): """ContextModal must mount one TextualImage per attached picture