ConverTA / docs /overview.md
MikelWL's picture
Add config view and shared-password gate
ca1ff64

System Overview

Purpose

The AI Survey Simulator orchestrates AI-to-AI healthcare survey conversations so researchers can explore interviewer and patient persona behavior without involving real participants.

Architecture at a Glance

  • Web UI (frontend/react_gradio_hybrid.py)
    Serves a browser UI (React rendered in-page) and provides a small WebSocket bridge from the UI to the backend conversation WebSocket. This is the primary demo/UI path (including analysis panels).

  • FastAPI Backend (backend/api/)
    Hosts REST endpoints for conversation control, WebSocket endpoints for live streaming, and the conversation service that manages active sessions.

  • Core Logic (backend/core/)
    Contains reusable building blocks: persona loading (persona_system.py), conversation flow management (conversation_manager.py), and LLM client adapters (llm_client.py).

  • LLM Backend (Ollama by default)
    The backend uses LLM_HOST/LLM_MODEL from .env to reach a local Ollama server. Other providers can be integrated by extending llm_client.py.

  • Data Assets (data/)
    Persona definitions live in YAML files (patient_personas.yaml, surveyor_personas.yaml). Update these to add or refine personas.

Runtime Flow

  1. Browser loads the Web UI (may require login if APP_PASSWORD is set) and opens ws://.../ws/frontend/{conversation_id}.
  2. The Web UI server bridges that connection to the backend conversation socket at /api/ws/conversation/{conversation_id}.
  3. Backend spawns a ConversationManager, which alternates surveyor/patient turns using the configured LLM.
  4. Generated messages stream back to the browser over the bridged WebSocket connection.
  5. When the conversation completes, the backend runs a post-conversation analysis pass and returns:
    • Bottom-up findings (emergent themes) with evidence pointers
    • Top-down coding (care experience rubric + codebook categories) with evidence pointers

Configuration UI

The UI includes a Configuration view (same page, no reload) that lets you:

  • Select surveyor + patient personas (loaded from GET /api/personas)
  • Add optional prompt additions for each role (sent with start_conversation)

These settings are currently stored in the browser (local-only) and apply to the next run.

Access Control (Prototype)

If APP_PASSWORD is set, the Space is gated behind a simple login page:

  • The browser receives a signed session cookie after login
  • All /api/* endpoints and the backend WebSocket require either:
    • that cookie, or
    • an internal header (x-internal-auth) used by the UI server when bridging sockets

Repository Map (Key Paths)

backend/
  api/
    main.py              # FastAPI entry point
    routes.py            # REST endpoints
    conversation_service.py
    conversation_ws.py
  core/
    conversation_manager.py
    persona_system.py
    llm_client.py
frontend/
  gradio_app.py          # legacy/optional local UI
  react_gradio_hybrid.py # primary demo UI (web)
  websocket_manager.py
data/
  patient_personas.yaml
  surveyor_personas.yaml
config/
  settings.py            # Shared configuration loader
.env.example
run_local.sh

Keep this mental model in mind when extending the simulator—it highlights where to plug in new personas, swap LLMs, or modify UI behavior.