Simplex has moved to commercial development. The open-source lineage (v0.17, AGPL-3.0) is archived on GitHub; these pages document the archived release. Commercial enquiries

What is CHAI?

Cognitive Hive AI (CHAI) orchestrates multiple specialized Small Language Models working together. Instead of one large model doing everything, you have:

  • Specialists - Fine-tuned models for specific tasks
  • Router - Directs requests to the right specialist
  • Shared Memory - Common context accessible to all specialists

Defining Specialists

Specialists wrap SLMs with task-specific behavior:

specialists.sx
// Summarization specialist
specialist Summarizer {
    model: "summarization-7b",
    domain: "text summarization",
    temperature: 0.3,

    receive Summarize(text: String, style: SummaryStyle) -> String {
        let prompt = match style {
            SummaryStyle::Brief => "Summarize in 1-2 sentences: {text}",
            SummaryStyle::Detailed => "Provide a detailed summary: {text}",
            SummaryStyle::Bullets => "Summarize as bullet points: {text}"
        }
        infer(prompt)
    }
}

// Entity extraction specialist
specialist EntityExtractor {
    model: "ner-7b",
    domain: "named entity recognition",
    temperature: 0.1,

    receive Extract(text: String) -> List<Entity> {
        infer_structured<List<Entity>>(
            "Extract all named entities: {text}"
        )
    }
}

// Sentiment analysis specialist
specialist SentimentAnalyzer {
    model: "sentiment-3b",
    domain: "sentiment analysis",
    temperature: 0.0,

    receive Analyze(text: String) -> SentimentResult {
        infer_structured<SentimentResult>(
            "Analyze sentiment: {text}"
        )
    }
}

Creating a Hive

Combine specialists into a hive with routing:

content-hive.sx
hive ContentHive {
    // Specialists in this hive
    specialists: [
        Summarizer,
        EntityExtractor,
        SentimentAnalyzer,
        TopicClassifier,
        LanguageDetector
    ],

    // How to route requests
    router: SemanticRouter {
        embeddings: "routing-embeddings",
        fallback: Summarizer
    },

    // Shared context
    memory: SharedMemory {
        capacity: 10000,
        ttl: Duration::hours(24)
    }
}

Using the Hive

Send requests to the hive - it routes automatically:

using-hive.sx
fn main() {
    let hive = spawn ContentHive

    let article = "Apple Inc. announced today that CEO Tim Cook
                   will present the new iPhone 16 at their Cupertino
                   headquarters next month. Analysts expect strong sales."

    // Direct specialist call
    let summary = ask(hive, Summarize(article, SummaryStyle::Brief))

    // Route based on intent
    let result = ask(hive, Process("What companies are mentioned?", article))
    // Router sends to EntityExtractor

    // Parallel analysis
    let analysis = ask(hive, FullAnalysis(article))
    // Runs all relevant specialists
}

Routing Strategies

Choose how requests get to the right specialist:

Strategy How It Works Best For
SemanticRouter Embeds request, finds closest specialist Natural language queries
KeywordRouter Matches keywords to specialists Known task types
ClassifierRouter Uses a classifier model to route Complex routing needs
RoundRobinRouter Distributes evenly Load balancing identical workers

Shared Memory

Specialists can share context through the hive's memory:

shared-memory.sx
specialist ContextAwareResponder {
    model: "chat-7b",

    receive Respond(query: String, context_key: String) -> String {
        // Access shared memory
        let context = memory::get(context_key)

        let prompt = match context {
            Some(ctx) => "Context: {ctx}\n\nQuery: {query}",
            None => query
        }

        let response = infer(prompt)

        // Store interaction in memory
        memory::append(context_key, "Q: {query}\nA: {response}")

        response
    }
}

Complete Example: Support Bot

Let's build a customer support hive:

support-hive.sx
// Specialist definitions
specialist IntentClassifier {
    model: "intent-3b",
    receive Classify(msg: String) -> Intent { ... }
}

specialist TechnicalSupport {
    model: "tech-support-7b",
    receive Help(issue: String) -> String { ... }
}

specialist BillingSupport {
    model: "billing-7b",
    receive Help(issue: String) -> String { ... }
}

specialist GeneralAssistant {
    model: "assistant-7b",
    receive Chat(msg: String) -> String { ... }
}

// The hive
hive SupportHive {
    specialists: [
        IntentClassifier,
        TechnicalSupport,
        BillingSupport,
        GeneralAssistant
    ],

    router: IntentRouter {
        classifier: IntentClassifier,
        routes: {
            Intent::Technical => TechnicalSupport,
            Intent::Billing => BillingSupport,
            Intent::General => GeneralAssistant
        }
    },

    memory: ConversationMemory {
        per_user: true,
        max_turns: 10
    }
}

// Using it
fn handle_message(hive: HiveRef, user_id: String, message: String) -> String {
    ask(hive, HandleSupport {
        user_id,
        message,
        include_history: true
    })
}

Cost Comparison

This hive uses 5 specialized SLMs (3-7B parameters each) instead of one large model. Result: ~90% cost reduction with better task-specific performance.

Final Project

Build a content moderation hive with:

  1. A ToxicityDetector specialist
  2. A SpamClassifier specialist
  3. A PIIDetector for personal information
  4. A ContentSummarizer for reports
  5. Shared memory for tracking repeat offenders

Summary

Congratulations! You've completed the Simplex tutorial series. You learned:

  • Simplex basics: variables, functions, control flow
  • The type system: structs, enums, pattern matching
  • The actor model: spawning, messages, supervision
  • AI integration: extraction, classification, embeddings
  • CHAI: specialists, routing, shared memory

What's Next?