DeepCritical / docs /bugs /005_services_not_integrated.md
VibecoderMcSwaggins's picture
fix: wire EmbeddingService to simple orchestrator + improve search quality
2e4a760
|
raw
history blame
5.15 kB

Bug 005: Embedding Services Built But Not Wired to Default Orchestrator

Date: November 26, 2025 Severity: CRITICAL Status: Open

1. The Problem

Two complete semantic search services exist but are NOT USED by the default orchestrator:

Service Location Status
EmbeddingService src/services/embeddings.py BUILT, not wired to simple mode
LlamaIndexRAGService src/services/llamaindex_rag.py BUILT, not wired to simple mode

2. Root Cause: Two Orchestrators

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ orchestrator.py (SIMPLE MODE - DEFAULT)                         β”‚
β”‚ - Basic search β†’ judge β†’ loop                                   β”‚
β”‚ - NO embeddings                                                 β”‚
β”‚ - NO semantic search                                            β”‚
β”‚ - Hand-rolled keyword matching                                  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ orchestrator_magentic.py (MAGENTIC MODE)                        β”‚
β”‚ - Multi-agent architecture                                      β”‚
β”‚ - USES EmbeddingService                                         β”‚
β”‚ - USES semantic search                                          β”‚
β”‚ - Requires agent-framework (optional dep)                       β”‚
β”‚ - OpenAI only                                                   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

The UI defaults to simple mode, which bypasses all the semantic search infrastructure.

3. What's Built (Not Wired)

EmbeddingService (NO API KEY NEEDED)

# src/services/embeddings.py
class EmbeddingService:
    async def embed(text) -> list[float]
    async def search_similar(query) -> list[dict]  # SEMANTIC SEARCH
    async def deduplicate(evidence) -> list        # DEDUPLICATION
  • Uses local sentence-transformers
  • ChromaDB vector store
  • Works without API keys

LlamaIndexRAGService

# src/services/llamaindex_rag.py
class LlamaIndexRAGService:
    def ingest_evidence(evidence_list)
    def retrieve(query) -> list[dict]  # Semantic retrieval
    def query(query_str) -> str        # Synthesized response

4. Where Services ARE Used

src/orchestrator_magentic.py    ← Uses EmbeddingService
src/agents/search_agent.py      ← Uses EmbeddingService
src/agents/report_agent.py      ← Uses EmbeddingService
src/agents/hypothesis_agent.py  ← Uses EmbeddingService
src/agents/analysis_agent.py    ← Uses EmbeddingService

All in magentic mode agents, NOT in simple orchestrator.

5. The Fix Options

Option A: Add Embeddings to Simple Orchestrator (RECOMMENDED)

Modify src/orchestrator.py to optionally use EmbeddingService:

class Orchestrator:
    def __init__(self, ..., use_embeddings: bool = True):
        if use_embeddings:
            from src.services.embeddings import get_embedding_service
            self.embeddings = get_embedding_service()
        else:
            self.embeddings = None

    async def run(self, query):
        # ... search phase ...

        if self.embeddings:
            # Semantic ranking
            all_evidence = await self._rank_by_relevance(all_evidence, query)
            # Deduplication
            all_evidence = await self.embeddings.deduplicate(all_evidence)

Option B: Make Magentic Mode Default

Change app.py to default to "magentic" mode when deps available.

Option C: Merge Best of Both

Create a new orchestrator that:

  • Has the simplicity of simple mode
  • Uses embeddings for ranking/dedup
  • Doesn't require agent-framework

6. Implementation Plan

Phase 1: Wire EmbeddingService to Simple Orchestrator

  1. Import EmbeddingService in orchestrator.py
  2. Add semantic ranking after search
  3. Add deduplication before judge
  4. Test end-to-end

Phase 2: Add Relevance to Evidence

  1. Use embedding similarity as relevance score
  2. Sort evidence by relevance
  3. Only send top-K to judge

7. Files to Modify

src/orchestrator.py           ← Add embedding integration
src/orchestrator_factory.py   ← Pass embeddings flag
src/app.py                    ← Enable embeddings by default

8. Success Criteria

  • Default mode uses semantic search
  • Evidence ranked by relevance
  • Duplicates removed
  • No new API keys required (sentence-transformers is local)
  • Magentic mode still works as before