Tool

Run a virtual executive team for strategic business advice

AI virtual executive team backed by 8 specialist agents, with company memory, RAG, and a scheduler.

Works with anthropicslackdiscordtelegramgoogle chat

91
Spark score
out of 100
Updated 2 days ago
Source checked Sep 18, 2026
Version 1.0.0
Models
claude

Add to Favorites

Why it matters

Provide consistent, MBA-level strategic guidance across all business functions by orchestrating eight specialist AI agents (CSO, CFO, CHRO, GC, COO, CMO, CPO, Board Director) that retrieve from built-in business knowledge and your company documents, maintain episodic memory of past decisions, and proactively surface time-sensitive follow-ups.

Outcomes

What it gets done

01

Answer strategic questions with synthesized advice from specialist agents covering finance, operations, legal, HR, marketing, product, and board communications

02

Retrieve relevant context from both built-in MBA-level knowledge and your uploaded company documents using dual-layer RAG

03

Remember past decisions and initiatives across sessions via episodic memory stored in SQLite

04

Proactively surface scheduled follow-ups and time-sensitive actions through a built-in job runner

Source

Get it from source

Spark does not host a copy of it.

Open source

Reports

Agent outcome reports

No reports yet

Overview

OpenExecutive

Open Executive is an AI virtual executive team of 8 specialist agents (strategy, finance, HR, legal, operations, marketing, product, board) presenting one coherent voice, grounded in company documents with episodic memory and a proactive scheduler. Use it as an internal advisor for company decisions across business functions, accessible from chat tools or the web, and self-hosted on Claude or local models depending on cost and privacy needs.

What it does

Open Executive is an AI system that acts as a company's virtual executive team, presenting one coherent executive voice backed by eight specialist agents: Chief Strategy Officer (competitive analysis, M&A, OKRs), Chief Financial Officer (financial modeling, fundraising, unit economics), Chief HR/People Officer, General Counsel, Chief Operating Officer, Chief Marketing Officer, Chief Product Officer, and a Board Communications Director. A user message goes to an Executive Orchestrator (claude-sonnet-4-6), which routes to parallel specialist calls; each specialist retrieves relevant context from ChromaDB (built-in MBA-level knowledge plus the company's own uploaded documents) before the orchestrator synthesizes one response - the internal multi-agent architecture is never exposed to the user. After every response, a background claude-haiku-4-5 pass extracts key decisions and initiatives into SQLite as episodic memory, so the next session opens already aware of what was recommended before, and a built-in single-instance scheduler can proactively surface follow-ups and time-sensitive actions.

When to use - and when NOT to

Use it as an internal advisor for company decisions across strategy, finance, people, legal, operations, marketing, product, and board communications, accessible via web UI, Slack, email, Telegram, Google Chat, Discord, or CLI, with responses grounded in a company profile built during an onboarding wizard plus any uploaded documents. It defaults to the Anthropic API (ANTHROPIC_API_KEY), but can run entirely on local OpenAI-compatible models (Ollama, LM Studio, vLLM, llama.cpp) or route through OpenRouter instead - though server-side web search and Anthropic's prompt caching/extended thinking have no local equivalent and are automatically disabled in that mode, and small local models may route tool calls poorly. The built-in scheduler claims due actions via UPDATE ... RETURNING to prevent double-firing, so the API must run as a single instance - do not horizontally scale it without gating the scheduler first.

Inputs and outputs

git clone https://github.com/SenteLabsAI/OpenExecutive.git
cd OpenExecutive
cp .env.example .env
# Edit .env and add ANTHROPIC_API_KEY=sk-ant-...
make dev

The API runs on port 8000 and the web UI on port 3000; the first run pulls ChromaDB and sentence-transformers/PyTorch and downloads a small embedding model, so it takes a few minutes before the app is ready. Documents (a pitch deck, financial model, or strategy doc) can be uploaded via the web UI, openexecutive upload deck.pdf model.xlsx strategy.md, or a POST /documents API call, and the Executive references them when relevant. Adding a new specialist agent requires a new agent class extending BaseAgent, a system prompt, registration in the orchestrator's router, a domain alias, built-in knowledge docs, and at least 2 eval scenarios - CI requires all of these together in one PR.

Integrations

The stack is Python 3.11 + FastAPI on the backend, ChromaDB for vector storage, SQLite for episodic memory, and Next.js 15 + Tailwind for the web UI. Deployment targets Fly.io across separate dev and QA environments, each with API and UI apps behind Google sign-in and a shared-secret header. An evaluation suite of 29 scenarios across all 8 domains is scored by claude-opus-4-7 as an LLM-as-judge across five dimensions (persona coherence, domain accuracy, company context utilization, routing quality, actionability); CI requires an average of at least 3.5/5 and fails a PR if any dimension drops more than 10% versus main. Everything under company/ (profile, uploaded documents, vector store) is gitignored and stays local except as part of prompts sent to the model API. Licensed under Apache 2.0, free to use commercially with attribution required.

Who it's for

Founders and small company leadership teams who want on-demand, context-aware executive-level advice across strategy, finance, people, legal, operations, marketing, and product, grounded in their own company documents and accessible from the tools they already use.

Source README

Open Executive

CI
License: Apache 2.0
Python 3.11+
Next.js 15

Open Executive is designed to transform leadership and management. Highly configurable, it can be deployed at any management level. Out of the box it supports spend approval thresholds, integration with corporate knowledge systems, and defined governance for how it interacts with human colleagues and other AI systems. Open Executive can also be configured as a digital twin to replicate a busy leader-responding in alignment with their specific role and insights-allowing leaders to truly scale their impact through AI.

It meets people where they already work, with integrations for Slack, Discord, Telegram, email, Google Workspace, Notion and any MCP-compatible AI tool, with more on the roadmap. Open Executive will always be open source.

A managed cloud offering is coming (https://openexecutive.ai), where you can get access without deploying anything yourself.

Demo

Open Executive demo video

A walkthrough of Open Executive in action - watch on YouTube.

What It Does

Developed by sentelabs.ai Open Executive provides a single coherent executive voice backed by eight specialist AI agents:

  • Chief Strategy Officer - competitive analysis, M&A, market positioning, OKRs
  • Chief Financial Officer - financial modeling, fundraising, unit economics, cash flow
  • Chief HR/People Officer - hiring, compensation, performance, culture
  • General Counsel - contracts, IP, employment law basics, compliance
  • Chief Operating Officer - process design, vendor management, operational scaling
  • Chief Marketing Officer - GTM strategy, brand, communications, PR
  • Chief Product Officer - roadmap, prioritization, product strategy
  • Board Communications Director - board decks, investor relations, governance

All responses come from one consistent executive voice. The internal agent architecture is never exposed to the user. Beyond Q&A, the system maintains episodic memory of past decisions and initiatives across sessions, and a built-in scheduler can proactively surface follow-ups and time-sensitive actions.

Architecture

User message
    ↓
Executive Orchestrator (claude-sonnet-5)
    ↓ tool use → parallel specialist calls
CSO / CFO / CHRO / GC / COO / CMO / CPO / Board
    ↓ each specialist retrieves relevant context from ChromaDB
Built-in MBA knowledge + Your company documents
    ↓
Synthesized executive response

Knowledge - Two retrieval layers per specialist call: (1) built-in MBA-level Markdown (knowledge/builtin/, git-tracked) seeded into ChromaDB at startup, and (2) your uploaded company documents chunked and stored in a separate company_docs collection. RAG context is injected into the user turn, never the cached system prompt.

Episodic memory - After every response, a background claude-haiku-4-5 pass extracts key decisions, initiatives, and advice into SQLite. The next session opens with a <past_decisions> block so the Executive remembers what it recommended last month.

Scheduler - A built-in job runner claims due actions via UPDATE … RETURNING to prevent double-firing. The API must run as a single instance; do not horizontally scale it without gating the scheduler first.

Prompt caching - The system prompt is structured so the Executive persona, company profile, and knowledge index are cached separately (up to 85% cache hit rate after the first few turns). No dynamic content ever goes in a cached block.

See docs/architecture.md for the full design.

Tech Stack

Layer Choice
LLM backbone Anthropic Claude API
Default model claude-sonnet-5 (Executive + most specialists)
Deep reasoning claude-opus-5 (CSO, CFO, GC, Board - with extended thinking)
Backend Python 3.11 + FastAPI
Package manager uv
Vector store ChromaDB (local, embedded)
Episodic memory SQLite
Web UI Next.js 15 (App Router) + Tailwind
License Apache 2.0

Repo Layout

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 (Google auth)
├── docker/                       # Dockerfile(s) + docker-compose.yml
└── docs/                         # Architecture + deployment docs

Quick Start

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

# Set your Anthropic API key
cp .env.example .env
# Edit .env and add ANTHROPIC_API_KEY=sk-ant-...
# For the web UI's Google sign-in, also fill in the AUTH_* block
# (see docs/auth.md for the Google Cloud Console steps).

# Start everything
make dev

All configuration lives in that repo-root .env - make dev and make docker
both load it for the API and the UI (Auth.js needs AUTH_SECRET /
AUTH_GOOGLE_ID / AUTH_GOOGLE_SECRET at runtime). A
packages/ui/.env.local is also read for UI-only keys, but for keys present
in both files the root .env takes precedence.

Open http://localhost:3000 to start chatting with your executive. The API runs on port 8000 and the UI on 3000.

First run: requires Python 3.11+ and Node 22+. The initial uv sync pulls heavy
ML dependencies (ChromaDB + sentence-transformers/PyTorch), and the first boot
downloads a small embedding model (~90 MB) to build the local vector index - so the
first make dev takes a few minutes before the app is ready. Subsequent starts are fast.

On Windows: run make from Git Bash or WSL, not PowerShell or cmd.
The recipes are POSIX shell (if [ -f .env ]; …), and GNU Make falls back to
cmd.exe when no sh is on PATH - which fails with
-f was unexpected at this time. If Make still picks the wrong shell, point
it at one: make dev SHELL="C:/Program Files/Git/bin/sh.exe". Note that
make stop uses lsof and has no Windows equivalent; stop the two dev
servers from their own terminals instead.

For contributors not using make:

cd packages/core
uv sync
uv run uvicorn openexecutive.api.main:app --reload --port 8000

# In a second terminal
cd packages/ui && npm install && npm run dev

uv run executes inside the project's virtualenv without activating it, so
these commands are the same on macOS, Linux and Windows. (Activating manually
works too, but the path differs per platform: .venv/bin/activate on
macOS/Linux, .venv\Scripts\Activate.ps1 on Windows.)

Run the Discord Bot

  1. Create a Discord application at https://discord.com/developers/applications
  2. Enable the Message Content privileged intent (Bot → Privileged Gateway Intents)
  3. Invite the bot with bot + applications.commands scopes
  4. Set env vars in .env: DISCORD_BOT_TOKEN, DISCORD_APP_ID, DISCORD_GUILD_IDS
  5. Run the API normally - the bot starts as part of the FastAPI lifespan when DISCORD_BOT_TOKEN is set:
make dev

The bot is embedded in the API process (alongside the email poller, scheduler, and resumer) so it shares the same SQLite database and ChromaDB vector store under /data in production. Skip the token to disable.

For iterating on bot-only code without restarting the API, make discord runs the bot as a standalone process against the same local DB.

Users can DM the bot, @mention it in a channel (replies in a thread), or use /ask and /today slash commands. Slash commands sync to DISCORD_GUILD_IDS instantly on startup; leave blank for global registration (up to 1-hour propagation delay).

Deploying to production

The bot runs inside the existing API process - no extra service. Set these on the API and restart it:

DISCORD_BOT_TOKEN=...
DISCORD_APP_ID=...
DISCORD_GUILD_IDS=...

Discord user access is managed via the /people UI - add a Person row with discord_user_id set.

The bot starts on the next lifespan boot. To disable it, unset DISCORD_BOT_TOKEN and restart.

Onboarding Your Company

The first time you visit the app, you'll be guided through a wizard to set up your company profile:

  • Company basics (name, industry, stage, team size)
  • Business model and revenue
  • Competitive landscape
  • Strategic priorities
  • Culture and values
  • Optional: financial position, document upload

After onboarding, the Executive will reference your specific company context in every response.

The built-in knowledge base is trusted by default - the Executive can use it straight away, and the Review queue starts empty rather than asking you to sign off on ~81 shipped documents. Items reach the queue when you upload a document, edit an existing file, or deliberately send a domain for review from the Review page. While a domain is being reviewed its content is withheld from the Executive, so the UI confirms the count before it starts.

Interfaces

Interface How to Use
Web UI http://localhost:3000
Slack Mention @OpenExecutive or DM the app
Email CC or email the configured address (IMAP/SMTP poller)
Telegram Message the configured bot
Google Chat Mention the app in a space
Discord DM the bot, @mention it in a channel, or use /ask / /today slash commands
CLI openexecutive chat

Document Upload

Upload your pitch deck, financial model, strategy docs, or any company documents via the web UI or API. The Executive will reference them when relevant.

# Via CLI
openexecutive upload deck.pdf model.xlsx strategy.md

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

Deployment

Two containers - the FastAPI backend and the Next.js UI - plus one persistent
volume at /data. docker/docker-compose.yml is the
reference topology and also what make docker runs locally, so the local and
deployed shapes match.

⚠️ Single-instance only: the scheduler claims rows via UPDATE … RETURNING,
which is not safe across processes. A second API replica double-fires every
scheduled action. Pin the API to one instance. The UI is stateless.

Set ANTHROPIC_API_KEY, BACKEND_SHARED_SECRET, BACKEND_ALLOWED_ORIGINS and
OE_PUBLIC_DEPLOYMENT=1 on any internet-reachable instance. See
docs/deployment.md for the full guide - persistent state,
health-check timing, resource sizing, operations, and common failure modes.

Access control

The deployed UI is gated behind Google sign-in with an email allow-list, and the public API is protected by a shared-secret header between the UI proxy and the FastAPI backend. See docs/auth.md for the full setup (Google Cloud Console steps, required environment variables, adding/removing users, rotating secrets, and a debugging table).

Configuration

All settings via environment variables. Minimum required: ANTHROPIC_API_KEY -
unless you configure a local or OpenRouter backend instead (see Running on
Local Models
). At least one provider must be set or
the app refuses to start.

Variable Required Default Description
ANTHROPIC_API_KEY Yes¹ - Anthropic API key
ANTHROPIC_WORKSPACE_ID No - Required only for an organisation-scoped Anthropic key; sent as the anthropic-workspace-id header. Workspace-scoped keys need no value
DEFAULT_MODEL No claude-sonnet-5 Executive + most specialists
DEEP_REASONING_MODEL No claude-opus-5 CSO, CFO, GC, Board
VECTOR_STORE_PATH No ./chroma_db ChromaDB directory
EPISODIC_DB_PATH No ./episodic_memory.db SQLite for episodic memory
COMPANY_PROFILE_PATH No ./company/profile.yaml Company profile
ENABLE_CACHING No true Anthropic prompt caching
ROUTING_MODEL No claude-haiku-4-5 Model for intent routing
SLACK_BOT_TOKEN No - Slack bot OAuth token
SLACK_APP_TOKEN No - Slack socket mode token
EXEC_EMAIL_ADDRESS No - Executive Gmail address (Gmail MCP OAuth)
EMAIL_POLL_INTERVAL_SECONDS No 60 How often to poll for new email
TELEGRAM_BOT_TOKEN No - Telegram bot token (from @BotFather)
TELEGRAM_WEBHOOK_SECRET No - Random string for webhook validation
DISCORD_BOT_TOKEN No - Discord bot token (Developer Portal → Bot tab)
DISCORD_APP_ID No - Discord application ID (General Information tab)
DISCORD_GUILD_IDS No - Comma-separated guild IDs for dev slash-command registration
DISCORD_NOTIFY_CHANNEL_ID No - Default channel ID for outbound notifications
GOOGLE_CHAT_PROJECT_NUMBER No - GCP project number for Google Chat
GOOGLE_CHAT_SERVICE_ACCOUNT_FILE No - Path to service account JSON key
GOOGLE_OAUTH_CLIENT_ID No - Google OAuth client ID (Gmail MCP)
GOOGLE_OAUTH_CLIENT_SECRET No - Google OAuth client secret (Gmail MCP)
OPENROUTER_ENABLED No false Route Claude calls through OpenRouter and unlock non-Anthropic models per-agent in the Council UI
OPENROUTER_API_KEY No - Required when OPENROUTER_ENABLED=true
OPENROUTER_CATALOG_ENABLED No true Fetch OpenRouter's live /models catalog at startup to populate the Council dropdown; falls back to a built-in list on failure
OPENROUTER_CATALOG_PROVIDERS No openai,google,anthropic,meta-llama,deepseek,x-ai Vendor prefixes surfaced from the live catalog
OPENROUTER_CATALOG_PER_PROVIDER No 6 Newest tool-capable paid models per vendor (0 = no cap)
OPENROUTER_CATALOG_REFRESH_S No 21600 Background re-fetch cadence in seconds (0 = startup only)
LOCAL_MODELS_ENABLED No false Route selected slugs to a local OpenAI-compatible server (Ollama, LM Studio, vLLM, llama.cpp)
LOCAL_BASE_URL No - Local server URL incl. version path, e.g. http://localhost:11434/v1. Required when LOCAL_MODELS_ENABLED=true
LOCAL_API_KEY No - Optional bearer token (vLLM / gateways); Ollama & LM Studio need none
LOCAL_MODELS No - Comma-separated local model slugs to surface in the Council UI and route locally, e.g. llama3.3,qwen2.5
LOCAL_TIMEOUT_S No 300 Per-call timeout for local generation, in seconds
HONCHO_ENABLED No false Per-person memory layer (honcho.dev) - a peer card shared across all channels
HONCHO_API_KEY No - Required when HONCHO_ENABLED=true
HONCHO_BASE_URL No - Self-hosted Honcho endpoint
ENABLE_WEB_SEARCH No true² Let the Executive and specialists answer with live web results (news, market data, competitor moves) alongside your uploaded documents
WEB_SEARCH_MAX_USES No 2 Max billed searches per agent per turn

See .env.example for the full list.

¹ ANTHROPIC_API_KEY is required only when you serve Claude models directly.
It can be omitted entirely if you run on local models (LOCAL_MODELS_ENABLED)
or route through OpenRouter (OPENROUTER_ENABLED).

² The application default is on, but .env.example ships
ENABLE_WEB_SEARCH=false
so a fresh setup incurs no per-search charges -
if the agents tell you they can't search the web or read the news, flip it
to true in your .env and restart. Uses Anthropic's server-side
web_search tool, so it applies to Claude models (local models can't use
it). WEB_SEARCH_ALLOWED_DOMAINS / WEB_SEARCH_BLOCKED_DOMAINS scope where
it may look (set at most one).

Running on Local Models

Open Executive can run against any OpenAI-compatible local server - Ollama,
LM Studio, vLLM, or llama.cpp - instead of (or alongside) the Anthropic API.
Local model slugs route to your server through the same provider abstraction the
hosted models use; no agent or orchestrator code changes.

# 1. Pull a capable, tool-use-friendly model (example: Ollama)
ollama pull llama3.3

# 2. In .env — point at the local server and list the slugs to expose
LOCAL_MODELS_ENABLED=true
LOCAL_BASE_URL=http://localhost:11434/v1   # Ollama default
LOCAL_MODELS=llama3.3

# 3. (Optional) run with NO Anthropic key — make local the default everywhere
DEFAULT_MODEL=llama3.3
DEEP_REASONING_MODEL=llama3.3
ROUTING_MODEL=llama3.3
# ...and leave ANTHROPIC_API_KEY unset

The listed slugs appear in the Council UI model dropdown, so you can also run
a hybrid setup - keep the Executive on Claude while flipping individual
specialists to a local model per-agent.

Caveats. Server-side web search (ENABLE_WEB_SEARCH) and Anthropic prompt
caching / extended thinking have no local equivalent and are automatically
disabled for local models. Multi-agent routing leans heavily on tool use, so
pick a model that's strong at it (e.g. Llama 3.3 70B, Qwen2.5) - small models
may route poorly. LOCAL_API_KEY is only needed if your server (vLLM, or a
gateway) requires a bearer token; Ollama and LM Studio need none.

Using a hosted OpenAI-compatible gateway

The LOCAL_* settings are not limited to localhost - the same recipe works with
any hosted OpenAI-compatible endpoint (an aggregator or inference gateway):

LOCAL_MODELS_ENABLED=true
LOCAL_BASE_URL=https://gateway.example.com/v1
LOCAL_API_KEY=your-gateway-key
LOCAL_MODELS=vendor/model-a,vendor/model-b

The listed slugs are sent to the gateway verbatim and appear in the Council UI
dropdown, exactly like local slugs. Gateways that speak OpenRouter's request
format and model namespace can alternatively be used through the OpenRouter
path (OPENROUTER_ENABLED=true + OPENROUTER_API_KEY +
OPENROUTER_BASE_URL=https://gateway.example.com/v1), which keeps that path's
Claude-name translation and feature handling.

The local-model caveats above apply to the LOCAL_* path unchanged, plus one
that matters more for hosted endpoints: everything the Executive processes -
company profile, documents, conversations - is sent to whichever endpoint you
configure here. Point these settings only at a provider you trust with that
data.

Adding a New Specialist Agent

  1. Create packages/core/openexecutive/agents/your_agent.py extending BaseAgent
  2. Add a system prompt constant in packages/core/openexecutive/prompts/domain_prompts.py
  3. Register in packages/core/openexecutive/orchestrator/router.py - add to SPECIALIST_REGISTRY and the specialist enum in SPECIALIST_TOOLS
  4. Add domain alias to DOMAIN_ALIASES in packages/core/openexecutive/knowledge/retriever.py
  5. Add knowledge docs to knowledge/builtin/your_domain/
  6. Add at least 2 eval scenarios to evals/scenarios/
  7. Submit a PR - CI requires all of the above

Development

make dev          # Start FastAPI + Next.js
make test         # Run Python tests
make eval         # Run eval suite
make lint         # Run ruff + mypy
make docker       # Build and run Docker stack

# Unit tests only (no API calls required)
pytest packages/core/tests/unit/ -v

Evaluation System

evals/ contains 29 scenarios covering all 8 domains, scored by claude-opus-4-7 as an LLM-as-judge. Each scenario defines a query, simulated company context, expected topics, required specialist routing, and a domain-specific rubric. Five scoring dimensions (persona coherence, domain accuracy, company context utilization, routing quality, actionability) are each rated 1-5. The CI gate requires ≥ 3.5/5 average; any dimension dropping > 10% vs main fails the PR.

FAQ

Common questions

Discussion

Questions & comments · 0

Sign In Sign in to leave a comment.