Skip to content

Sympozium — Simplified Architecture

Historical record

An early simplified diagram, kept for reference. It predates Celln, AgentHarness and the memory server; see Architecture for the current system.

flowchart TB
    subgraph social["Social Media Channels"]
        direction LR
        discord["Discord"]
        slack["Slack"]
        telegram["Telegram"]
        whatsapp["WhatsApp"]
    end

    subgraph k8s["Kubernetes Cluster"]

        subgraph ctrl["Control Plane"]
            cm["Controller Manager"]
            router["Channel Router"]
        end

        nats["NATS JetStream<br/>Event Bus"]

        subgraph channels["Channel Pods"]
            dp["discord-pod"]
            sp["slack-pod"]
            tp["telegram-pod"]
            wp["whatsapp-pod"]
        end

        subgraph crds["Custom Resources (CRDs)"]
            ensemble["Ensemble<br/><i>multi-agent team</i>"]
            instance["Agent<br/><i>agent deployment</i>"]
            agentrun["AgentRun<br/><i>single execution</i>"]
            policy["SympoziumPolicy<br/><i>governance</i>"]
            skillpack["SkillPack<br/><i>tool bundles</i>"]
            schedule["SympoziumSchedule<br/><i>cron triggers</i>"]
            mcpserver["MCPServer<br/><i>tool provider</i>"]
            model["Model<br/><i>cluster-local inference</i>"]
        end

        subgraph localinf["Local Model Inference"]
            llamasrv["llama-server<br/><i>OpenAI-compatible API</i>"]
            modelpvc[("PVC<br/><i>GGUF weights</i>")]
            llamasrv --- modelpvc
        end

        subgraph exec["Agent Execution Pod"]
            runner["Agent Runner<br/><i>LLM provider ↔ tool loop</i>"]
            sidecars["Skill Sidecars<br/><i>kubectl, gh, custom</i>"]
            mcp["MCP Bridge<br/><i>JSON-RPC 2.0</i>"]
            memory["Persistent Memory<br/><i>SQLite + FTS5</i>"]
        end

        subgraph security["K8s-Native Security"]
            rbac["Ephemeral RBAC<br/><i>per-run least-privilege</i>"]
            netpol["NetworkPolicy<br/><i>deny-all + allow-list</i>"]
            sandbox["Agent Sandbox<br/><i>gVisor / Kata</i>"]
            secrets["K8s Secrets<br/><i>auth credentials</i>"]
            secctx["SecurityContext<br/><i>non-root, read-only fs</i>"]
        end

        subgraph workflow["Multi-Agent Workflows"]
            spawner["Spawner<br/><i>orchestrator</i>"]
            delegation["Delegation<br/><i>request + await</i>"]
            sequential["Sequential<br/><i>pipeline</i>"]
            autonomous["Autonomous<br/><i>scheduled</i>"]
        end
    end

    subgraph providers["Bring Your Own Provider"]
        direction LR
        openai["OpenAI"]
        anthropic["Anthropic"]
        azure["Azure OpenAI"]
        bedrock["AWS Bedrock"]
        local["Local<br/><i>Ollama / LM Studio / vLLM</i>"]
    end

    %% Social → Channel Pods
    discord --- dp
    slack --- sp
    telegram --- tp
    whatsapp --- wp

    %% Channel Pods ↔ Event Bus
    channels <-->|"messages"| nats

    %% Control Plane ↔ Event Bus
    router <-->|"route messages<br/>↔ AgentRuns"| nats
    cm -->|"reconcile CRDs"| crds

    %% CRDs drive execution
    ensemble -->|"stamps out"| instance
    instance -->|"creates"| agentrun
    schedule -->|"triggers"| agentrun
    agentrun -->|"launches"| exec
    policy -->|"enforces"| exec
    skillpack -->|"injects"| sidecars

    %% Execution ↔ Event Bus
    runner <-->|"events + streaming"| nats

    %% Multi-agent
    spawner <-->|"spawn requests"| nats
    ensemble -->|"persona<br/>relationships"| workflow

    %% Security applied to execution
    security -.->|"applied to"| exec

    %% Provider connection
    runner <-->|"LLMProvider<br/>interface"| providers

    %% MCP
    mcpserver -->|"registers"| mcp

    %% Local Model Inference
    model -->|"deploys"| localinf
    runner <-->|"modelRef<br/>OpenAI-compat"| llamasrv

    %% Styling
    classDef social fill:#7289da,stroke:#5b6eae,color:#fff
    classDef k8native fill:#326ce5,stroke:#2457b5,color:#fff
    classDef provider fill:#10a37f,stroke:#0d8a6a,color:#fff
    classDef security fill:#e8553d,stroke:#c4432e,color:#fff
    classDef workflow fill:#9b59b6,stroke:#7d3c98,color:#fff
    classDef exec fill:#f39c12,stroke:#d68910,color:#fff

    class discord,slack,telegram,whatsapp social
    class dp,sp,tp,wp social
    classDef localmodel fill:#059669,stroke:#047857,color:#fff
    class cm,router,nats,ensemble,instance,agentrun,policy,skillpack,schedule,mcpserver,model k8native
    class llamasrv,modelpvc localmodel
    class openai,anthropic,azure,bedrock,local provider
    class rbac,netpol,sandbox,secrets,secctx security
    class spawner,delegation,sequential,autonomous workflow
    class runner,sidecars,mcp,memory exec

Key Callouts

Multi-Agent Workflows

Ensembles define persona relationships — directed edges between agents with three workflow types: - Delegation — agent A spawns agent B, awaits result - Sequential — ordered pipeline execution across personas - Autonomous — independent cron-scheduled execution

The Spawner orchestrates runtime delegation via the NATS event bus, validating relationships before allowing cross-agent calls.

Kubernetes-Native Primitives & Security

Every component is a CRD reconciled by standard controllers: - Ephemeral RBAC — per-run Role/RoleBinding with least-privilege, auto-deleted on completion - NetworkPolicy — deny-all default + explicit allow-list for DNS, event bus, and external APIs - Agent Sandbox — optional gVisor/Kata kernel isolation via the agent-sandbox CRD - SecurityContext — non-root, read-only root filesystem, dropped capabilities - K8s Secrets — auth credentials mounted as volumes, never embedded in CRD specs

Bring Your Own Provider

A single LLMProvider interface (Chat, AddToolResults, Name, Model) abstracts all backends: - Cloud: OpenAI, Anthropic, Azure OpenAI, AWS Bedrock - Local: Ollama, LM Studio, vLLM, llama-server

Configured per-agent via ModelSpec — just set provider, model, and point an authSecretRef at a K8s Secret.

Cluster-Local Model Inference

The Model CRD makes local inference declarative — apply a Model and the controller handles everything: - Downloads GGUF weights to a PVC - Deploys a llama-server with GPU resources - Exposes an OpenAI-compatible endpoint as a ClusterIP Service - AgentRuns reference models via modelRef — no API key needed

Models appear automatically as provider options in the web UI onboarding wizard. Deploy via kubectl apply, the web UI, or Helm values.