How lazyfetch/locus works
Locus is a conversational mutual-fund research application. A user submits a question in the chat UI; the backend plans and runs structured and document retrieval, assembles a token-budgeted context with conversation history, and asks an LLM to produce an answer with sources. The tree also shows fund-data ingestion and separate entity-resolution/NER capabilities. The README is empty, and excerpts are partial, so some endpoint wiring and unsampled subsystem relationships are intentionally not inferred.
Main entry points: RagService.java RAG orchestration · HybridSearchService.java Hybrid retrieval · ChatPage.tsx Chat interface · PgVectorService.java Vector search
Components 23
Chat experience
- Chat interface
frontend/src/pages/ChatPage.tsx - Chat components
frontend/src/components/MessageInput.tsx
Question answering
- Search API
backend/src/main/java/com/lazyfetch/locus/search/controller/SearchController.java - RAG orchestration
backend/src/main/java/com/lazyfetch/locus/search/rag/RagService.java - Context budgeting
backend/src/main/java/com/lazyfetch/locus/search/context/ContextBudgetAllocator.java - Context compression
backend/src/main/java/com/lazyfetch/locus/search/context/ContextCompressor.java - Context assembly
backend/src/main/java/com/lazyfetch/locus/search/context/ContextAssembler.java - Conversation memory
backend/src/main/java/com/lazyfetch/locus/search/conversation/MemoryManager.java - Conversation state
backend/src/main/java/com/lazyfetch/locus/search/conversation/ConversationService.java - LLM client
backend/src/main/java/com/lazyfetch/locus/search/llm/LlmClient.java
Fund retrieval
- Hybrid retrieval
backend/src/main/java/com/lazyfetch/locus/search/hybrid/HybridSearchService.java - Query planning
backend/src/main/java/com/lazyfetch/locus/search/planner/MfQueryPlanner.java - Vector search
backend/src/main/java/com/lazyfetch/locus/search/pgvector/PgVectorService.java - Query embeddings
backend/src/main/java/com/lazyfetch/locus/search/embedding/EmbeddingService.java - Chunk text search
backend/src/main/java/com/lazyfetch/locus/search/lucene/LuceneChunkService.java
Fund data
- Fund data access
backend/src/main/java/com/lazyfetch/locus/search/data/MfDataService.java - Fund resolution
backend/src/main/java/com/lazyfetch/locus/search/data/FundResolver.java - Entity linking
backend/src/main/java/com/lazyfetch/locus/search/data/EntityLinker.java - Named entities
backend/src/main/java/com/lazyfetch/locus/search/ner/NerService.java - PostgreSQL data
Data ingestion
- Fund data pipeline
data_pipeline
Other components
- Research user
- OpenRouter
Connections 25
- Research user → Chat interface: asks
- Chat interface → Chat components: renders
- Chat interface → Search API: submits query
- Search API → RAG orchestration: invokes
- RAG orchestration → Conversation state: reads history
- RAG orchestration → Conversation state: creates conversation
- RAG orchestration → Hybrid retrieval: retrieves results
- RAG orchestration → Context budgeting: allocates tokens
- RAG orchestration → Conversation memory: gets prompt history
- RAG orchestration → Context compression: compresses results
- RAG orchestration → Context assembly: assembles context
- RAG orchestration → LLM client: requests answer
- LLM client → OpenRouter: calls model
- Hybrid retrieval → Query planning: plans query
- Hybrid retrieval → Fund data access: queries fund data
- Hybrid retrieval → Vector search: searches vectors
- Hybrid retrieval → Chunk text search: searches chunks
- Vector search → Query embeddings: embeds query
- Vector search → PostgreSQL data: queries vectors
- Chunk text search → PostgreSQL data: loads chunk rows
- Fund data access → PostgreSQL data: queries fund tables
- Fund data pipeline → PostgreSQL data: loads fund data
- Fund resolution → Fund data access: resolves funds
- Entity linking → Fund resolution: links entities
- Entity linking → Named entities: extracts entities