Platform
Request flow
The same story, but drawn: every service a message touches from Slack to the model provider.
Below is the path of a single message from the moment you hit send in Slack to the moment the reply lands in your DM. Each box is a separate Luna-owned service; each arrow is an internal call.
What each service does
- Slack — your interface. Sends signed webhook events for every message it sees that involves Basal.
luna-slack-dm— verifies the webhook signature, checks your email domain, and passes the message on.luna-router— picks the agent. Today it’s always Basal. Tomorrow it could be the Data Agent or any new agent we add.luna-agent-basal— holds your private conversation history and builds the model request with the right context.luna-ai-proxy— the single egress point for every model call. Injects credentials, strips identifying headers, adds audit metadata.- AI Gateway — Cloudflare’s layer for rate limits, cost caps, and the authoritative audit log.
- Model provider — actually generates the response. Claude (Anthropic) today, but the proxy is model-agnostic: this endpoint can be swapped — to another Anthropic model, Google AI Studio, or a Workers AI model — without changing a single agent.
Internal hops between Luna services stay inside Cloudflare’s private network — they don’t traverse the public internet. The only external call is the last step, from the AI Gateway out to the model provider (Anthropic today).