A support assistant is not just a model call. It is a controlled path from an incoming message to retrieval, a response, or a human.

Context

At COMPUMAX, I built a support-automation stack that connected Chatwoot conversations to retrieval and backend services. The goal was to structure automation as a controlled path while preserving a clear route back to a human operator.

The stack brought together FastAPI, Chatwoot, Qdrant, PostgreSQL with pgvector, Redis, and Docker Compose around one controlled request path.

Request path

An incoming request moved through intent routing before the system decided whether to retrieve an FAQ response, escalate to a human, or enter a human-only fallback. Internal adapters kept service-specific behavior at the boundaries rather than mixing it into the orchestration logic.

Logging made processed user-message paths inspectable. A kill switch and human-only path provided explicit operational controls for cases where automation should not answer.

SYSTEM MAP / 01One message, three controlled outcomes.Retrieval and human handoff remain explicit branches of the same support path.
EDGE / 01

Chatwoot

Conversation intake

Incoming support conversation
CONTROL / 02

FastAPI orchestration

Intent routing and internal adapters select the next path.

Intent routingInternal adapters
OUTCOME / A

Retrieval response

Retrieve an FAQ response.

FAQ retrieval path
OUTCOME / B

Human escalation

Route the conversation to a human.

Human handoff path
OUTCOME / C

Human-only fallback

Bypass automated answers when the control path requires it.

Fallback + kill switch
INTEGRATED / 01QdrantSystem service
INTEGRATED / 02PostgreSQL / pgvectorSystem service
INTEGRATED / 03RedisSystem service
INTEGRATED / 04Docker ComposeContainerized services
TRACEProcessed-path logging
CONTROLKill switch + human-only path
BOUNDARYInternal service adapters

Architecture lessons

Escalation is part of the product path

Human escalation should not be treated as an exception around the system. It is a first-class outcome with explicit state, ownership, and recovery behavior.

Retrieval is only one failure surface

Even a relevant passage can lead to a bad support outcome if routing, conversation state, permissions, or downstream adapters fail. The system path therefore has to remain inspectable from end to end.

Control paths need first-class interfaces

The kill switch, human-only mode, processed-path logging, and service adapters were part of the architecture itself. Keeping them explicit made routing behavior easier to inspect and change.

Takeaway

The central engineering lesson was to treat retrieval, orchestration, state, and human ownership as one system. The useful unit of design was the complete path from an incoming conversation to an answer or a handoff.