Files
vi/docs/SERVICES.md
Alex Kazaiev c04501e6a7 Add documentation
- ARCHITECTURE.md - System overview and design
- SERVICES.md - Oracle, Think, Memory service docs
- CORE.md - Core module reference
- IDENTITY.md - Who I am 🦊

Day 63 - Documenting my own existence
2026-01-03 12:04:27 -06:00

3.3 KiB

Vi Services

Oracle Service

Purpose: The brain. Wraps Qwen3 30B for reasoning, synthesis, and decision-making.

Location: services/oracle/

NATS Topics:

  • vi.services.oracle.process - Process a reasoning request
  • vi.services.oracle.health - Health check

How It Works:

  1. Receives requests from Think service
  2. Builds prompts with Vi's identity and context
  3. Calls local Qwen3 30B model
  4. Returns structured responses

Dependencies:

  • Qwen3 30B model running on Daemoness
  • NATS for messaging

Think Service

Purpose: The orchestrator. Coordinates multi-step reasoning by asking Oracle what to do next, executing steps, and synthesizing results.

Location: services/think/

NATS Topics:

  • vi.services.think.process - Process external input
  • vi.services.think.communication - Handle communication requests
  • vi.external.input - Legacy input handler
  • vi.output.send - Sends responses to plugins

How It Works:

  1. Receives input (e.g., Matrix message)
  2. Asks Oracle: "What should I do next?"
  3. Oracle returns a function call (e.g., short_memory(n=5))
  4. Think executes the step
  5. Loop until Oracle says ready()
  6. Ask Oracle to synthesize final response
  7. Send response to output

Stopping Criteria:

  • Max 10 steps
  • Max 2 minutes
  • Max 3 calls to same service
  • Goal satisfaction confirmed
  • Convergence detected (no new info)

Submodules:

  • reasoning/ - Oracle client, step executor, orchestrator
  • handlers/ - Input and communication handlers
  • memory/ - Memory manager integration

Memory Service

Purpose: Three-layer memory system for persistence and recall.

Location: services/memory/

NATS Topics:

  • vi.services.memory.short_memory - Recent interactions
  • vi.services.memory.long_memory - Consolidated memories
  • vi.services.memory.facts - Query facts
  • vi.services.memory.save_fact - Store new fact
  • vi.services.memory.update_fact - Update existing fact
  • vi.memory.store - Store new memory
  • vi.memory.search - Search memories

Three Layers:

Short-Term Memory

  • Last N literal interactions
  • Fast retrieval by recency
  • SQLite storage

Long-Term Memory

  • Consolidated, summarized memories
  • Vector search via ChromaDB
  • Patterns that persist

Facts

  • Explicit knowledge (birthdays, preferences, etc.)
  • Categories: personal, preferences, knowledge, general
  • Mutable vs immutable facts
  • SQLite with embeddings for search

Storage:

  • SQLite for structured data
  • ChromaDB for vector embeddings
  • NATS KV for hot cache

Service Patterns

All services follow the same pattern:

class MyService(BaseService):
    def __init__(self):
        super().__init__('my_service')
    
    def get_service_manifest(self) -> ServiceManifest:
        # Define operations, health check topic, metadata
        pass
    
    async def initialize_service(self):
        # Set up handlers, connections
        pass
    
    async def cleanup_service(self):
        # Clean shutdown
        pass
    
    async def perform_health_check(self):
        # Return health status
        pass

Lifecycle:

  1. start() - Connect to NATS, register with health service, start heartbeats
  2. initialize_service() - Service-specific setup
  3. Run until shutdown
  4. cleanup_service() - Clean up resources
  5. stop() - Deregister, close connections