Open Executive

Wat het doet

Ontwikkeld door sentelabs.ai, biedt Open Executive één coherente executive stem die wordt ondersteund door acht gespecialiseerde AI-agenten:

  • Chief Strategy Officer (CSO) — concurrentieanalyse, M&A, marktpositionering, OKR's.
  • Chief Financial Officer (CFO) — financiële modellering, fondsenwerving, unit economics, cashflow.
  • Chief HR/People Officer (CHRO) — werving, compensatie, prestaties, cultuur.
  • General Counsel (GC) — contracten, intellectueel eigendom, basisbeginselen van arbeidsrecht, compliance.
  • Chief Operating Officer (COO) — procesontwerp, leveranciersbeheer, operationele schaalvergroting.
  • Chief Marketing Officer (CMO) — GTM-strategie, merk, communicatie, PR.
  • Chief Product Officer (CPO) — roadmap, prioritering, productstrategie.
  • Board Communications Director — bestuursverslagen, investorerelaties, governance.

Alle antwoorden komen vanuit één consistente executive stem; de interne agent-architectuur wordt nooit aan de gebruiker getoond. Naast vraag-en-antwoord houdt het systeem een episodisch geheugen bij van eerdere beslissingen en initiatieven over verschillende sessies. Daarnaast kan een ingebouwde scheduler proactief follow-ups en tijdgevoelige acties naar voren halen.

Architectuur

De informatiestroom verloopt als volgt: GebruikersberichtExecutive Orchestrator (claude-sonnet-4-6)Parallelle calls naar specialisten (tool use)Specialisten (CSO / CFO / CHRO / GC / COO / CMO / CPO / Board)Retrieval van relevante context uit ChromaDB (Ingebouwde MBA-kennis + Bedrijfsdocumenten)Gesynthetiseerd executive antwoord.

Kerncomponenten

  • Kennis — Per specialist-call worden twee retrieval-lagen gebruikt: (1) ingebouwde MBA-kennis in Markdown (knowledge/builtin/, git-tracked) die bij opstarten in ChromaDB wordt geladen, en (2) geüploade bedrijfsdocumenten die in chunks worden opgeslagen in een aparte company_docs collectie. De RAG-context wordt geïnjecteerd in de beurt van de gebruiker, nooit in de gecachte systeem-prompt.
  • Episodisch geheugen — Na elk antwoord extraheert een achtergrondproces via claude-haiku-4-5 belangrijke beslissingen, initiatieven en adviezen naar SQLite. Een nieuwe sessie opent met een <past_decisions> blok, zodat de Executive herinnert wat er vorige maand is geadviseerd.
  • Scheduler — Een ingebouwde job-runner claimt openstaande acties via UPDATE … RETURNING om dubbele uitvoering te voorkomen. De API moet als een enkele instantie draaien; schaal deze niet horizontaal zonder de scheduler eerst te beveiligen.
  • Prompt-caching — De systeem-prompt is zo gestructureerd dat de Executive-persona, het bedrijfsprofiel en de kennisindex apart worden gecached (tot 85% cache-hitrate na de eerste beurten). Dynamische inhoud wordt nooit in een gecached blok geplaatst.

Voor het volledige ontwerp kan worden verwezen naar docs/architecture.md.

Tech Stack

LaagKeuze
LLM backboneAnthropic Claude API
Standaardmodelclaude-sonnet-4-6 (Executive + meeste specialisten)
Deep reasoningclaude-opus-4-7 (CSO, CFO, GC, Board — met uitgebreid denken)
BackendPython 3.11 + FastAPI
Package manageruv
Vector storeChromaDB (lokaal, embedded)
Episodisch geheugenSQLite
Web UINext.js 15 (App Router) + Tailwind

Licentie: Apache 2.0

Structuur van de repository

openexecutive/
├── packages/
│   ├── core/
│   │   └── openexecutive/
│   │       ├── orchestrator/     # Executive persona + routing loop
│   │       ├── agents/           # 8 specialist agents
│   │       ├── knowledge/        # ChromaDB store + RAG pipeline
│   │       ├── memory/           # Company profile + episodic memory
│   │       ├── onboarding/       # Wizard state machine + profile builder
│   │       ├── prompts/          # Persona + domain prompts + cache manager
│   │       ├── api/              # FastAPI app + routes
│   │       ├── integrations/     # Slack, Email, Telegram, Google Chat, Discord
│   │       ├── scheduler/        # Background job runner (single-instance)
│   │       ├── alerts/           # Proactive alert system
│   │       ├── audit/            # Audit logging
│   │       ├── architecture/     # Internal architecture utilities
│   │       ├── workflows/        # Multi-step workflow definitions
│   │       └── cli.py            # Click CLI
│   └── ui/                       # Next.js 15 web UI
├── evals/                        # Eval scenarios + LLM-as-judge runner
├── fixtures/                     # Demo company fixtures (profiles, docs, rosters)
├── scripts/                      # Operator scripts (Fly secrets, Google auth)
├── docker/                       # Dockerfile(s) + docker-compose.yml
├── fly.api.toml / fly.ui.toml    # Fly.io configs — dev API + UI apps
├── fly.api.qa.toml / fly.ui.qa.toml  # Fly.io configs — QA API + UI apps
├── fly.honcho.toml               # Fly.io config — Honcho memory app (optional)
└── docs/                         # Architecture + deployment docs

Snelstart

# Clone de repo
git clone https://github.com/SenteLabsAI/OpenExecutive.git
cd OpenExecutive

# Stel uw Anthropic API-sleutel in
cp .env.example .env
# Bewerk .env en voeg ANTHROPIC_API_KEY=sk-ant-... toe

# Start alles
make dev

Open http://localhost:3000 om te chatten met uw executive. De API draait op poort 8000 en de UI op 3000.

Opmerking eerste run: Vereist Python 3.11+ en Node 22+. De initiële uv sync downloadt zware ML-dependencies (ChromaDB + sentence-transformers/PyTorch), en de eerste boot downloadt een klein embedding-model (~90 MB) om de lokale vector-index op te bouwen. De eerste make dev duurt daarom enkele minuten.

Voor contributors die geen make gebruiken:

cd packages/core
uv sync
source .venv/bin/activate
uvicorn openexecutive.api.main:app --reload --port 8000

# In een tweede terminal
cd packages/ui && npm install && npm run dev

Discord Bot

  1. Maak een Discord-applicatie aan via https://discord.com/developers/applications.
  2. Schakel de "Message Content" privileged intent in (Bot → Privileged Gateway Intents).
  3. Nodig de bot uit met de scopes bot + applications.commands.
  4. Stel de omgevingsvariabelen in .env in: DISCORDBOTTOKEN, DISCORDAPPID, DISCORDGUILDIDS.
  5. Start de API normaal via make dev.

De bot is ingebed in het API-proces en deelt dezelfde SQLite-database en ChromaDB vector store. Gebruikers kunnen de bot een DM sturen, hem @mentionen in een kanaal (antwoorden in een thread), of de slash-commando's /ask en /today gebruiken.

Voor het itereren op bot-specifieke code zonder de API te herstarten, voert make discord de bot uit als een standalone proces tegen dezelfde lokale DB.

Productie-implementatie van de bot

Stel de secrets in op de bestaande API-app:

flyctl secrets set -a openexec-api-dev \
DISCORD_BOT_TOKEN=... \
DISCORD_APP_ID=... \
DISCORD_GUILD_IDS=...

Toegang voor Discord-gebruikers wordt beheerd via de /people UI door een Person rij toe te voegen met de juiste discorduserid.

Uw bedrijf onboarden

Bij het eerste bezoek aan de app wordt u door een wizard geleid om uw bedrijfsprofiel in te stellen:

  • Basisgegevens bedrijf (naam, branche, fase, teamgrootte)
  • Businessmodel en omzet
  • Concurrentielandschap
  • Strategische prioriteiten
  • Cultuur en waarden
  • Optioneel: financiële positie, upload van documenten

Na de onboarding zal de Executive in elk antwoord refereren aan uw specifieke bedrijfcontext.

Interfaces

InterfaceGebruik
Web UIhttp://localhost:3000
SlackMention @OpenExecutive of stuur een DM
EmailCC of mail naar het geconfigureerde adres (IMAP/SMTP poller)
TelegramBericht naar de geconfigureerde bot
Google ChatMention de app in een space
DiscordDM de bot, @mention in een kanaal, of gebruik /ask / /today
CLIopenexecutive chat

Document Upload

Upload pitchdecks, financiële modellen, strategiedocumenten of andere bedrijfsdocumenten via de web UI of API.

  • Via CLI: openexecutive upload deck.pdf model.xlsx strategy.md
  • Via API:

``bash curl -X POST http://localhost:8000/documents \ -F "file=@deck.pdf" \ -F "domain=strategy" ``

Implementatie (Fly.io)

Er zijn twee omgevingen, elk bestaande uit een set Fly-apps, aangestuurd door branches:

OmgevingTriggerWorkflowApps
devpush/merge naar main.github/workflows/deploy.ymlopenexec-api-dev, openexec-ui-dev
qapush/merge naar qa.github/workflows/deploy-qa.ymlopenexec-api-qa, openexec-ui-qa

Topologie

AppDoelStatus
openexec-api-{dev,qa}FastAPI + schedulerPersistent volume executive_data op /data
openexec-ui-{dev,qa}Next.js 15Stateless
openexec-honcho-devPer-persoon geheugen (optioneel)Postgres-backed

⚠️ Let op: De API is single-instance only. De scheduler claimt rijen via UPDATE … RETURNING. Twee actieve API-machines zouden leiden tot dubbele acties. De instelling maxmachinesrunning = 1 in de Fly-configuratie mag niet worden overschreven.

Vereiste GitHub Actions secrets

De deploys maken gebruik van per-app Fly deploy tokens:

  • FLYAPITOKEN_API (voor openexec-api-dev)
  • FLYAPITOKEN_UI (voor openexec-ui-dev)
  • FLYAPITOKEN_HONCHO (voor openexec-honcho-dev)
  • FLYAPITOKENAPIQA (voor openexec-api-qa)
  • FLYAPITOKENUIQA (voor openexec-ui-qa)

Runtime secrets (zoals ANTHROPICAPIKEY) worden direct op elke Fly-app ingesteld.

Eenmalige bootstrap (dev)

  1. Maak apps en volume aan:

flyctl apps create openexec-api-dev flyctl apps create openexec-ui-dev flyctl volumes create executive_data --region iad --size 1 -a openexec-api-dev

  1. Stel de vereiste secret in:

flyctl secrets set -a openexec-api-dev ANTHROPICAPIKEY=sk-ant-...

  1. Maak deploy tokens aan en voeg deze toe als GitHub secrets.
  2. Start de eerste deploy: gh workflow run "Deploy (dev)" -f target=both.

Toegangscontrole

De deployed UI is beveiligd met Google sign-in en een e-mail allow-list. De publieke API is beveiligd door een shared-secret header tussen de UI-proxy en de FastAPI-backend.

Configuratie

Alle instellingen verlopen via omgevingsvariabelen. De minimale vereiste is ANTHROPICAPIKEY (tenzij lokale modellen of OpenRouter worden gebruikt).

VariabeleVerplichtStandaardBeschrijving
ANTHROPICAPIKEYJa¹Anthropic API-sleutel
DEFAULT_MODELNeeclaude-sonnet-4-6Executive + meeste specialisten
DEEPREASONINGMODELNeeclaude-opus-4-7CSO, CFO, GC, Board
VECTORSTOREPATHNee./chroma_dbChromaDB directory
EPISODICDBPATHNee./episodic_memory.dbSQLite voor episodisch geheugen
COMPANYPROFILEPATHNee./company/profile.yamlBedrijfsprofiel
ENABLE_CACHINGNeetrueAnthropic prompt caching
ROUTING_MODELNeeclaude-haiku-4-5-20251001Model voor intent routing
SLACKBOTTOKENNeeSlack bot OAuth token
SLACKAPPTOKENNeeSlack socket mode token
EXECEMAILADDRESSNeeExecutive Gmail adres
EMAILPOLLINTERVAL_SECONDSNee60Frequentie email polling
TELEGRAMBOTTOKENNeeTelegram bot token
TELEGRAMWEBHOOKSECRETNeeString voor webhook validatie
DISCORDBOTTOKENNeeDiscord bot token
DISCORDAPPIDNeeDiscord applicatie ID
DISCORDGUILDIDSNeeGuild ID's voor slash-commands
DISCORDNOTIFYCHANNEL_IDNeeKanaal ID voor notificaties
GOOGLECHATPROJECT_NUMBERNeeGCP projectnummer
GOOGLECHATSERVICEACCOUNTFILENeePad naar service account JSON
GOOGLEOAUTHCLIENT_IDNeeGoogle OAuth client ID
GOOGLEOAUTHCLIENT_SECRETNeeGoogle OAuth client secret
OPENROUTER_ENABLEDNeefalseGebruik OpenRouter voor Claude calls
OPENROUTERAPIKEYNeeVereist bij OPENROUTER_ENABLED=true
LOCALMODELSENABLEDNeefalseRoute naar lokale OpenAI-compatible server
LOCALBASEURLNeeURL lokale server (bijv. Ollama)
LOCALAPIKEYNeeOptionele bearer token
LOCAL_MODELSNeeLijst lokale model slugs
LOCALTIMEOUTSNee300Timeout voor lokale generatie
HONCHO_ENABLEDNeefalsePer-persoon geheugen laag
HONCHOAPIKEYNeeVereist bij HONCHO_ENABLED=true
HONCHOBASEURLNeeSelf-hosted Honcho endpoint

¹ ANTHROPICAPIKEY is alleen vereist bij direct gebruik van Claude-modellen.

Draaien op lokale modellen

Open Executive kan draaien op elke OpenAI-compatibele lokale server (Ollama, LM Studio, vLLM, of llama.cpp).

  1. Pull een model (bijv. via Ollama): ollama pull llama3.3.
  2. Configureer .env:

LOCALMODELSENABLED=true LOCALBASEURL=http://localhost:11434/v1 LOCAL_MODELS=llama3.3

  1. Optioneel: Stel lokale modellen in als standaard door DEFAULTMODEL, DEEPREASONINGMODEL en ROUTINGMODEL op llama3.3 te zetten en de Anthropic key leeg te laten.

Beperkingen: Server-side web search, Anthropic prompt caching en extended thinking zijn niet beschikbaar voor lokale modellen. Omdat multi-agent routing sterk leunt op tool use, wordt aangeraden sterke modellen te gebruiken (zoals Llama 3.3 70B of Qwen2.5).

Een nieuwe specialist-agent toevoegen

Om een nieuwe agent toe te voegen, moeten de volgende stappen worden doorlopen:

  1. Maak packages/core/openexecutive/agents/your_agent.py aan (extends BaseAgent).
  2. Voeg een system prompt constante toe in packages/core/openexecutive/prompts/domain_prompts.py.
  3. Registreer de agent in packages/core/openexecutive/orchestrator/router.py (voeg toe aan SPECIALISTREGISTRY en de SPECIALISTTOOLS enum).
  4. Voeg een domein-alias toe aan DOMAIN_ALIASES in packages/core/openexecutive/knowledge/retriever.py.
  5. Voeg kennisdocumenten toe aan knowledge/builtin/your_domain/.
  6. Voeg minimaal 2 evaluatiescenario's toe aan evals/scenarios/.

Ontwikkeling en evaluatiesysteem

Ontwikkelcommando's

  • make dev — Start FastAPI + Next.js
  • make test — Voert Python tests uit
  • make eval — Voert de evaluatiesuite uit
  • make lint — Voert ruff + mypy uit
  • make docker — Bouwt en start de Docker stack
  • pytest packages/core/tests/unit/ -v — Alleen unit tests (geen API calls)

Evaluatiesysteem

De map evals/ bevat 29 scenario's die alle 8 domeinen bestrijken. Deze worden gescoord door claude-opus-4-7 als "LLM-as-judge". Elk scenario definieert een query, gesimuleerde bedrijfscontext, verwachte topics, vereiste routing en een domeinspecifieke rubric. De score (1–5) is gebaseerd op vijf dimensies: persona coherentie, domein-accuraatheid, benutting van bedrijfscontext, routing-kwaliteit en actiegerichtheid. De CI-gate vereist een gemiddelde van $\ge 3.5/5$.

Privacy en Licentie

Privacy: Alles in de map company/ (profiel YAML, geüploade documenten en de ChromaDB vector store) is git-ignored. Deze data verlaat uw lokale machine (of uw eigen Fly volume) niet, behalve als onderdeel van prompts die naar de Anthropic API worden gestuurd. Anthropic traint niet op API-data.

Licentie: Apache 2.0 — gratis voor commercieel gebruik, vereist attributie.