01 · ApplicationFlutter / Dart · Riverpod · GoRouter
Onboarding, conversation, voice and profiles
02 · BackendFastAPI · async SQLAlchemy · model SDKs
Tool calls, streaming and session lifecycle
03 · Data & retrievalPostgreSQL / JSONB · Qdrant
Application records, factual memory and conversation search
Structured memory + semantic retrieval
PostgreSQL JSONB stores factual memory alongside application data. Qdrant supports searching prior conversations. Separating these responsibilities keeps an explicit distinction between stored facts and context selected by relevance.
Trade-off: retrieval adds flexibility, but requires relevance checks and context management. More retrieved text is not automatically a better answer.
Custom orchestration
Python services connect model SDKs, tool calls, streaming and summaries. This gives direct control over how conversation state and tool results enter the model context.
Trade-off: control also means owning failure handling, integration behavior and regression checks as model APIs evolve.
Containerized services
A Python 3.12 Docker image packages the API. Docker Compose defines the API, PostgreSQL and Qdrant, persistent database volumes and service health checks. Startup code coordinates database migrations and vector-collection initialization.
Design concern: startup order, persistent data and service readiness must be handled independently from the application image.
Tests and operating costs
The repository includes tests for authenticated session creation, invalid resource handling and text/voice usage-cost calculations. Voice interactions connect transcription and speech synthesis to the same product experience.
Evaluation focus: retrieval relevance, separation between users, latency, cost per interaction and behavior when a tool or model call fails.
Validation included 50+ users. The test examples above describe checks implemented in the repository; performance measurements are a separate evaluation task.