Skip to main content

Architecture

Request Flow

Clients access the platform through KrakenD, which maps friendly REST paths to internal Restate services: POST /api/v1/<domain>/<service>/<method> with a JSON (protojson) request body.

Gateway Routing

Component Types

Gateways

Stateless Restate services that extract auth context from request headers (x-user-id, x-user-email) and route to downstream actors, services, or workflows via the Restate SDK.

GatewayDomainDownstream
LLM GatewayConversationsConversationManagerActor, MCPService, MemoryService
Socayo GatewayHealth CoachingSocayoUserActor
Storage GatewayStorageStorageManagerActor
Integrations GatewayIntegrationsPipedreamService
Webhook GatewayWebhooksWebhookService
Notification GatewayNotificationsNotificationService → Novu REST API
Auth GatewayAuthApiKeyService

Actors

Stateful components keyed by ID. Each actor instance maintains its own state via Restate's durable state.

ActorKeyPurpose
ConversationActorconversation_keyIndividual conversation state and message history
ConversationManagerActoruser_idPer-user conversation management (list, create, delete)
SocayoUserActoruser_idUser profile and onboarding data
StorageManagerActoruser_idPer-user file storage operations and quota
FirebaseBridgeActoruser_idFirebase Auth token bridge

Services

Stateless processors that handle specific integrations or computations.

  • OpenRouter — LLM inference via OpenRouter API
  • MCP — Model Context Protocol tool server management
  • Pinecone — Vector database operations
  • Memory — Mem0 memory search and management
  • Storage — Object storage backend (S3-compatible)
  • OpenFGA — Fine-grained authorization checks
  • Pipedream — Third-party app integrations
  • NotificationService — Multi-channel notification delivery via Novu
  • Pipecat / Daily / Cerebrium — Voice AI pipeline

Workflows

Long-running orchestrations that coordinate multiple services.

WorkflowPurpose
SocayoPlanGeneratorWorkflowGenerate coaching plans from user profiles
GenerationWorkflowContent generation with LLM
DeploymentWorkflowService deployment orchestration

Error Handling

All services use a standardized RpcError structure for error responses and event payloads. Errors are classified as terminal (non-retryable, returned to the client) or retryable (Restate will retry automatically).

{
"error": {
"code": "MODEL_INVALID",
"message": "The requested model is not available",
"isTerminal": true,
"details": {
"upstreamError": { "statusCode": 404, "body": "..." },
"helpLink": { "url": "https://docs.yocaso.dev/guides/model-routing" }
}
}
}

The ErrorCode enum defines ~25 standardized codes (e.g., INVALID_ARGUMENT, UNAUTHENTICATED, RATE_LIMITED, MODEL_INVALID, TOOL_EXECUTION_FAILED) that map to HTTP status codes at the gateway boundary. Structured ErrorDetails can include upstream error context, model errors, retry info, field violations, and help links.

Infrastructure

Deployment

Services are built with ko (Go) or Docker, pushed to GHCR, and automatically deployed via Flux image automation policies.