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: Gebruikersbericht → Executive 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 apartecompany_docscollectie. 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-5belangrijke 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 … RETURNINGom 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
| Laag | Keuze |
|---|---|
| LLM backbone | Anthropic Claude API |
| Standaardmodel | claude-sonnet-4-6 (Executive + meeste specialisten) |
| Deep reasoning | claude-opus-4-7 (CSO, CFO, GC, Board — met uitgebreid denken) |
| Backend | Python 3.11 + FastAPI |
| Package manager | uv |
| Vector store | ChromaDB (lokaal, embedded) |
| Episodisch geheugen | SQLite |
| Web UI | Next.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
- Maak een Discord-applicatie aan via
https://discord.com/developers/applications. - Schakel de "Message Content" privileged intent in (Bot → Privileged Gateway Intents).
- Nodig de bot uit met de scopes
bot+applications.commands. - Stel de omgevingsvariabelen in
.envin:DISCORDBOTTOKEN,DISCORDAPPID,DISCORDGUILDIDS. - 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
| Interface | Gebruik |
|---|---|
| Web UI | http://localhost:3000 |
| Slack | Mention @OpenExecutive of stuur een DM |
| CC of mail naar het geconfigureerde adres (IMAP/SMTP poller) | |
| Telegram | Bericht naar de geconfigureerde bot |
| Google Chat | Mention de app in een space |
| Discord | DM de bot, @mention in een kanaal, of gebruik /ask / /today |
| CLI | openexecutive 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:
| Omgeving | Trigger | Workflow | Apps |
|---|---|---|---|
| dev | push/merge naar main | .github/workflows/deploy.yml | openexec-api-dev, openexec-ui-dev |
| qa | push/merge naar qa | .github/workflows/deploy-qa.yml | openexec-api-qa, openexec-ui-qa |
Topologie
| App | Doel | Status |
|---|---|---|
openexec-api-{dev,qa} | FastAPI + scheduler | Persistent volume executive_data op /data |
openexec-ui-{dev,qa} | Next.js 15 | Stateless |
openexec-honcho-dev | Per-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(vooropenexec-api-dev)FLYAPITOKEN_UI(vooropenexec-ui-dev)FLYAPITOKEN_HONCHO(vooropenexec-honcho-dev)FLYAPITOKENAPIQA(vooropenexec-api-qa)FLYAPITOKENUIQA(vooropenexec-ui-qa)
Runtime secrets (zoals ANTHROPICAPIKEY) worden direct op elke Fly-app ingesteld.
Eenmalige bootstrap (dev)
- 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
- Stel de vereiste secret in:
flyctl secrets set -a openexec-api-dev ANTHROPICAPIKEY=sk-ant-...
- Maak deploy tokens aan en voeg deze toe als GitHub secrets.
- 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).
| Variabele | Verplicht | Standaard | Beschrijving |
|---|---|---|---|
ANTHROPICAPIKEY | Ja¹ | — | Anthropic API-sleutel |
DEFAULT_MODEL | Nee | claude-sonnet-4-6 | Executive + meeste specialisten |
DEEPREASONINGMODEL | Nee | claude-opus-4-7 | CSO, CFO, GC, Board |
VECTORSTOREPATH | Nee | ./chroma_db | ChromaDB directory |
EPISODICDBPATH | Nee | ./episodic_memory.db | SQLite voor episodisch geheugen |
COMPANYPROFILEPATH | Nee | ./company/profile.yaml | Bedrijfsprofiel |
ENABLE_CACHING | Nee | true | Anthropic prompt caching |
ROUTING_MODEL | Nee | claude-haiku-4-5-20251001 | Model voor intent routing |
SLACKBOTTOKEN | Nee | — | Slack bot OAuth token |
SLACKAPPTOKEN | Nee | — | Slack socket mode token |
EXECEMAILADDRESS | Nee | — | Executive Gmail adres |
EMAILPOLLINTERVAL_SECONDS | Nee | 60 | Frequentie email polling |
TELEGRAMBOTTOKEN | Nee | — | Telegram bot token |
TELEGRAMWEBHOOKSECRET | Nee | — | String voor webhook validatie |
DISCORDBOTTOKEN | Nee | — | Discord bot token |
DISCORDAPPID | Nee | — | Discord applicatie ID |
DISCORDGUILDIDS | Nee | — | Guild ID's voor slash-commands |
DISCORDNOTIFYCHANNEL_ID | Nee | — | Kanaal ID voor notificaties |
GOOGLECHATPROJECT_NUMBER | Nee | — | GCP projectnummer |
GOOGLECHATSERVICEACCOUNTFILE | Nee | — | Pad naar service account JSON |
GOOGLEOAUTHCLIENT_ID | Nee | — | Google OAuth client ID |
GOOGLEOAUTHCLIENT_SECRET | Nee | — | Google OAuth client secret |
OPENROUTER_ENABLED | Nee | false | Gebruik OpenRouter voor Claude calls |
OPENROUTERAPIKEY | Nee | — | Vereist bij OPENROUTER_ENABLED=true |
LOCALMODELSENABLED | Nee | false | Route naar lokale OpenAI-compatible server |
LOCALBASEURL | Nee | — | URL lokale server (bijv. Ollama) |
LOCALAPIKEY | Nee | — | Optionele bearer token |
LOCAL_MODELS | Nee | — | Lijst lokale model slugs |
LOCALTIMEOUTS | Nee | 300 | Timeout voor lokale generatie |
HONCHO_ENABLED | Nee | false | Per-persoon geheugen laag |
HONCHOAPIKEY | Nee | — | Vereist bij HONCHO_ENABLED=true |
HONCHOBASEURL | Nee | — | Self-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).
- Pull een model (bijv. via Ollama):
ollama pull llama3.3. - Configureer
.env:
LOCALMODELSENABLED=true LOCALBASEURL=http://localhost:11434/v1 LOCAL_MODELS=llama3.3
- Optioneel: Stel lokale modellen in als standaard door
DEFAULTMODEL,DEEPREASONINGMODELenROUTINGMODELopllama3.3te 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:
- Maak
packages/core/openexecutive/agents/your_agent.pyaan (extendsBaseAgent). - Voeg een system prompt constante toe in
packages/core/openexecutive/prompts/domain_prompts.py. - Registreer de agent in
packages/core/openexecutive/orchestrator/router.py(voeg toe aanSPECIALISTREGISTRYen deSPECIALISTTOOLSenum). - Voeg een domein-alias toe aan
DOMAIN_ALIASESinpackages/core/openexecutive/knowledge/retriever.py. - Voeg kennisdocumenten toe aan
knowledge/builtin/your_domain/. - Voeg minimaal 2 evaluatiescenario's toe aan
evals/scenarios/.
Ontwikkeling en evaluatiesysteem
Ontwikkelcommando's
make dev— Start FastAPI + Next.jsmake test— Voert Python tests uitmake eval— Voert de evaluatiesuite uitmake lint— Voert ruff + mypy uitmake docker— Bouwt en start de Docker stackpytest 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.
Groetjes,