OpenExecutive

SenteLabsAIApache-2.0活跃维护

用 8 个专家 Agent 组成一个统一的虚拟高管团队,对外呈现一致的高管人格,基于 FastAPI 和 Next.js 搭建,适合做多智能体协作与 RAG 决策辅助。

AI-powered virtual executive team — a single coherent executive persona backed by 8 specialist agents (FastAPI + Next.js).

v0.7.0发布于 2026-11-07 17:42 UTC5,787star +18 / 7 天627fork同步于 2026-11-10 11:35 UTC

怎么上手

由 README 提炼,执行前请确认
make install
cp .env.example .env
make dev
硬件要求按 README 说明

README 未说明显存或 GPU 要求;首次 uv sync 会拉取 ChromaDB 与 sentence-transformers/PyTorch 等重型依赖,首次启动需下载约 90 MB 的嵌入模型。

有 Docker 镜像
下载:源码 zip·GitHub Releases(安装包)本站不镜像安装包

项目说明

由 README 自动翻译提炼

开源虚拟高管团队,用统一高管人格加九位专家代理帮你做管理与决策

用 8 个专家 Agent 组成一个统一的虚拟高管团队,对外呈现一致的高管人格,基于 FastAPI 和 Next.js 搭建,适合做多智能体协作与 RAG 决策辅助。

核心能力

  • 由总控编排器统一发声,内部调度九位专家代理并行作答
  • 每位专家从 ChromaDB 检索内置 MBA 知识与公司文档做 RAG
  • 后台用轻量模型抽取决策与倡议写入 SQLite 形成跨会话记忆
  • 内置调度器用 UPDATE…RETURNING 抢占任务避免重复触发
  • 支持 Slack、Discord、Telegram、邮件与 MCP 等外部集成

容易踩的坑

需 Python 3.11+ 与 Node 22.6+,首次 make dev 因装依赖和下载嵌入模型要等几分钟;必须在 .env 填 ANTHROPIC_API_KEY,否则无法调用模型;API 只能单实例运行,横向扩容前需先给调度器加锁;Windows 需在 Git Bash 或 WSL 下跑 make,且 make stop 不可用。

内容由模型根据 README 生成,可能不完整或不准确,以官方文档为准。看原文 README

最近发版

5 个版本v0.7.0
  1. v0.7.0最新正式版2026-11-07 · 2026-11-07 17:42 UTC

    0.7.0 (2026-11-07)

    Added

    • alerts: let a card ask for an answer, a pick, an OK, or nothing (#718) (12bc909)
    • briefing: fold old Needs you cards and group a request's approvals (#709) (5f87e70)
    • briefing: show Home as Needs you and Done for you, each item once (#710) (8194ba5)
    • briefing: show Right now as a plain list of what's waiting (#708) (a0824c3)
    • chat: answer Needs you cards by saying yes, no or an answer (#722) (9ed0447)
    • chat: change an email draft on its chat card in place (#704) (16910ca)
    • memory: keep decisions as standing facts and stop extracting advice (5ea6ad5)
    • memory: keep the figures it works out, with source and date (#697) (49e75c8)
    • memory: let lessons learn from what people actually say (#693) (9a32ae5)
    • memory: let mail chats teach the owner's own memory (#695) (71f2d6f)
    • memory: let people edit or remove what it keeps about them (#700) (40c918c)
    • memory: show when memory changes, with Undo (#705) (3c07b75)
    • memory: sort standing facts by the question and date the old ones (#698) (5892d79)
    • monitoring: make watches report real changes and watch for awaited email (#703) (05b8e3e)
    • orchestrator: make Approvals the one gate on every channel (#706) (e8919b3)
    • ui: put a Settings menu beside every Settings page (#732) (e7feb67)
    • ui: replace Pulse with one Memory page (#702) ([2310dd1](https://github.com/SenteLabsAI/
  2. v0.6.92026-11-03 · 2026-11-03 16:52 UTC
    查看更新说明

    0.6.9 (2026-11-03)

    Added

    • chat: show a long turn's plan up front (#680) (a1f81d2)
    • chat: show a long turn's steps with Stop and I'll finish it (#677) (5168b28)
    • chat: show what a long turn is doing and has found, not a step list (#688) (aa62c5e)
    • delegation: send tables in Act as me drafts as real HTML tables (#670) (dad574e)
    • integrations: ask on a card before saving into a Drive folder shared outside the team (#672) (c047872)
    • people: add search, sort and a Changes tab to the People page (#674) (48ab97d)

    Fixed

  3. v0.6.82026-10-30 · 2026-10-30 20:52 UTC
    查看更新说明

    0.6.8 (2026-10-30)

    Added

    • briefing: dismiss a Right now point and drop mail whose sender you wrote to (#665) (24e577b)
    • chat: attach, split and save any file by one handle (#663) (6cd7d4c)
    • chat: search the speaker's own earlier chats before looking things up again (#660) (1ff8263)
    • delegation: take replaced chat drafts out of the person's Drafts (#655) (622211c)
    • integrations: decide every waiting card from a chat app (#658) (49c27bb)

    Fixed

    • chat: book on the company clock and stop false holds and flags (#659) (ac38ef1)
    • chat: stop flagging the Executive's own tool notes as email instructions (#662) (8261476)
    • people: fill contact details from signatures and add the right contacts (#657) (d89c1b7)
    • workflows: send Gemini's reasoning back in action steps and the designer (#664) (d77a9c0)
  4. v0.6.72026-10-28 · 2026-10-28 20:46 UTC
    查看更新说明

    0.6.7 (2026-10-27)

    Added

    • briefing: open and reply to Right now's email points from Home (#651) (ddc4429)
    • briefing: show your own inbox in Right now and message you when it changes (#640) (428456a)
    • delegation: open reply cards as a conversation and redraft on newer mail (#639) (bd293a7)
    • orchestrator: answer on a pushback model after the person pushes back (#653) (3eb8242)
    • ui: warn when the host's user isn't who is signed in, and let hosts read who that is (#638) (4c5e154)

    Fixed

    • attunement: raise the open-loop caps (#642) (fc0ea3c)
    • briefing: drop answered mail from Right now and show its steps while it updates (#652) (297cbe0)
    • evals: give MCP scenarios a gateway so they can reach their tools (#563) (d9c629e)
    • people: read a contact's signature from their newest signed mail, again on new mail (#649) (d27ff6e)
    • people: time the contact keeper's next run from its last run, not a restart (#650) (787d070)
  5. v0.6.62026-10-26 · 2026-10-26 14:00 UTC
    查看更新说明

    0.6.6 (2026-10-26)

    Added

    • ui: a nonce Content-Security-Policy on every page (#623) (85b5945)
    • ui: confirm changes inside a frame once the browser reports the question seen (#635) (9d9ca16)
    • ui: let host origins frame the UI and call a short host list (#628) (42b626d)
    • ui: sum up Home under At a glance with more tiles (#633) (6d20d9c)

    Fixed

    • briefing: stop first-week nudges for steps already done (#632) (c04bd42)
    • chat: stop the host chat list growing once the mark is stored (#634) (efe9dd4)
    • integrations: save briefs and digests into the chat-app conversation (#636) (e500883)
    • ui: count done optional rows and make adding the team optional (#631) (f211b96)
    • workflows: let chat fix a saved workflow on a card and say whose calendar a step reads (#629) (582449d)

用户点评

登录用户的真实使用记录,可按版本和硬件筛选
共 0 条

    还没有人点评。第一个说出真实体验的人最有价值。

    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 act as a busy leader's digital twin: with Act as me switched on, it drafts email in their own voice, from their own Gmail, for them to review and send—so leaders can truly scale their impact through AI without giving up the final say.

    It meets people where they already work, with integrations for Slack, Discord, Telegram, Google Chat, email, Google Workspace, Microsoft 365 (Outlook mail and calendar, OneDrive), Notion, Confluence 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 nine 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
    • Head of Sales — pipeline and qualification, founder-led sales, pricing conversations, proposals, forecasting
    • 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-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-5-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.

    Always in the loop — Each person can turn on "Keep track of what happens" (Settings → Memory). The Executive then keeps private, dated notes of what they said, in chat where it can confirm it's them (the web app signed in, their own Slack or Discord, Telegram with a webhook secret) and in Act as me replies they send. Every note rests on their own words, checked word for word. Only they see it, in Memories → History, where they can correct, pin or forget it. Notes are read back only to them, in a private chat, and expire after 90 days by default (the owner can change this). The owner's morning brief and evening digest include what the owner's own notes say is due, and anyone with notes on gets a short reminder on the day something they promised by email is due. It needs no setup and no extra service.

    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

    LayerChoice
    LLM backboneAnthropic Claude API
    Default modelclaude-sonnet-5-5 (Executive + most specialists)
    Deep reasoningclaude-opus-5-5 (CSO, CFO, GC, Board — with adaptive thinking)
    Other modelsPick any agent's model in the Agent Council, including claude-fable-5-1
    BackendPython 3.11 + FastAPI
    Package manageruv
    Vector storeChromaDB (local, embedded)
    Episodic memorySQLite
    Web UINext.js 15 (App Router) + Tailwind
    LicenseApache 2.0

    Repo Layout

    openexecutive/
    ├── packages/
    │   ├── core/
    │   │   └── openexecutive/
    │   │       ├── orchestrator/     # Executive persona + routing loop
    │   │       ├── agents/           # 9 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 (Gmail or Outlook), 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
    
    # Install the backend and web app dependencies
    make install
    
    # Set your Anthropic API key
    cp .env.example .env
    # Edit .env and add ANTHROPIC_API_KEY=sk-ant-...
    
    # Start everything
    make dev
    

    Trying it on your own computer needs no sign-in setup. While AUTH_GOOGLE_ID and AUTH_OIDC_ISSUER are blank, make dev uses local login: the web app only accepts connections from this computer, you click Open, and you are the owner. To invite your team, or to run it on a server or with make docker, set up Google or SSO sign-in by filling in the AUTH_* block (see docs/auth.md for the Google Cloud Console and SSO steps).

    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.

    To check everything is working, open Settings → Setup status. It tests the AI key and each chat app's token, then shows a green, amber or red light for each part of your setup, with what to do about anything that isn't green.

    First run: requires Python 3.11+ and Node 22.6+. 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.) The packages/ui commands are listed one per line rather than chained with && so that they run in every shell too: Windows PowerShell 5.1, the version that ships with Windows, has no && operator and rejects the chained form with The token '&&' is not a valid statement separator in this version.

    Set Up Integrations

    Every integration is optional and off until you configure it. Each one has a setup guide:

    IntegrationWhat it doesSetup
    SlackAnswers mentions and DMsSet SLACK_BOT_TOKEN and SLACK_APP_TOKEN (socket mode), or SLACK_SIGNING_SECRET to take events over HTTP at /webhook/slack
    DiscordAnswers DMs, mentions and slash commandsRun the Discord Bot
    TelegramAnswers messages to your botdocs/telegram_setup.md
    Google ChatAnswers mentions in a spacedocs/google_chat_setup.md
    Email and calendar (Google Workspace)Reads and sends the Executive's Gmail, books on its calendarGoogle Workspace credentials
    Email and calendar (Microsoft 365)The same with Outlook mail and calendarMicrosoft 365 credentials
    Act as meDrafts replies in the owner's own Gmail for them to sendYour own Gmail
    Google Drive foldersSyncs shared folders into the knowledge base (read-only)docs/drive_sync_setup.md
    OneDrive foldersSyncs chosen OneDrive or SharePoint folders into the knowledge base, as the Executive's Microsoft 365 sign-indocs/onedrive_sync_setup.md
    OneDrive in chatSearch, read, upload, move, copy and share OneDrive files (no delete, no anonymous links)Set MS365_MCP_ONEDRIVE=true and sign in again (docs/onedrive_sync_setup.md)
    ConfluenceSyncs chosen spaces into the knowledge base (read-only, Cloud or Server/Data Center)docs/confluence_sync_setup.md
    NotionSyncs the pages shared with an internal integration into the knowledge baseSet NOTION_SYNC_ENABLED=true and NOTION_API_KEY (see .env.example)
    MCP toolsGives the Executive tools from other MCP servers, with deny rules for destructive onesCopy packages/core/mcp_servers.json.example to company/mcp_servers.json and list your servers under mcpServers; MCP turns on when the file exists (Docker keeps it on /data, see docs/deployment.md)
    MCP clientsLets any MCP client talk to the ExecutiveConnect as an MCP Server

    Synced Drive, OneDrive, Confluence and Notion content is kept apart from your uploaded documents and labelled as unreviewed, so it ranks below them.

    Web search for any model

    ENABLE_WEB_SEARCH uses Anthropic's server-side web_search tool, so only Claude models get it. Any model that can use tools, local ones included, can search the web through a search MCP server under MCP tools instead. For example, Keenable needs no account or API key. Add it under mcpServers in company/mcp_servers.json (Docker: /data/company/mcp_servers.json):

    "keenable": {
      "url": "https://api.keenable.ai/mcp?keenable_title=openexecutive"
    }
    

    Restart the API. The Executive finds keenable__search_web_pages and keenable__fetch_page_content with search_tools and runs them with call_tool, like every other MCP tool.

    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. Use it instead of the embedded bot, not alongside it: stop the API, or start it without DISCORD_BOT_TOKEN, first — two processes on one token each open a gateway connection and every message gets answered twice.

    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

    InterfaceHow to Use
    Web UIhttp://localhost:3000
    SlackMention @OpenExecutive or DM the app
    EmailCC or email the configured address (Gmail via the Google Workspace MCP, or Outlook via the Microsoft 365 MCP)
    TelegramMessage the configured bot
    Google ChatMention the app in a space
    DiscordDM the bot, @mention it in a channel, or use /ask / /today slash commands
    CLIopenexecutive chat
    MCPPoint any MCP client at http://localhost:8000/mcp (see Connect as an MCP Server)

    Connect as an MCP Server

    Open Executive exposes its company context and specialist council to external MCP clients (Claude Code, Claude Desktop, Cursor, or any other agent), so they can ground themselves in your company without being re-briefed. There is no separate server process to start: the server is mounted into the FastAPI app at /mcp over Streamable HTTP, so running the API is running the MCP server.

    The endpoint is http://localhost:8000/mcp, or https://<your-host>/mcp once deployed. Authentication is the same shared-secret gate as every other route, so clients send x-api-key: $BACKEND_SHARED_SECRET. With that variable unset locally the gate is off and the header can be omitted.

    On any internet-reachable instance set both BACKEND_SHARED_SECRET and OE_PUBLIC_DEPLOYMENT=1, which makes the API refuse to start without a secret rather than serving /mcp unauthenticated. See Deployment.

    {
      "mcpServers": {
        "open-executive": {
          "type": "http",
          "url": "http://localhost:8000/mcp",
          "headers": {
            "x-api-key": "YOUR_BACKEND_SHARED_SECRET"
          }
        }
      }
    }
    

    Claude Code can write that entry for you:

    claude mcp add --transport http open-executive http://localhost:8000/mcp \
      --header "x-api-key: YOUR_BACKEND_SHARED_SECRET"
    

    Connected clients get eight read-only resources (company profile, today's briefing and activity, people roster, department state, and episodic memory for decisions, initiatives and advice) and four tools: consult_specialist (domain analysis from any of the ten specialists, each grounded in your company's knowledge base), search_knowledge, list_workflows and ask_executive. The full inventory is on the MCP Server section of the /architecture page.

    /mcp answers as the caller the API verified, by the web app's rules. With no x-caller-email (open mode) the client is the owner, as the CLI is. A request that carries a signed-in person (a deployment that puts its own sign-in in front of /mcp and stamps the caller as the web UI's proxy does; see signed callers) gets that person's answers: the owner's episodic memory and recent activity go to the owner alone, the briefing and roster to someone on the roster (the briefing narrowed as the web app narrows it), and the company profile, departments, specialists, knowledge and workflow catalog to anyone. With signed callers on, a client holding only the shared secret is a service: never the owner, and ask_executive asks as no one. By default ask_executive only reads and advises: on its turn the Executive is not offered anything that sends, posts, books, schedules, runs or changes stored data, and of the connected MCP servers' tools only the reads.

    A client can let it act by sending x-mcp-client-actions: on (honored only on a request the BACKEND_SHARED_SECRET authenticated; with no secret set the header is ignored and MCP_CLIENT_ACTIONS=true turns it on for every request). Then it makes the person's own changes inside Open Executive (alerts, open loops, follow-ups, the watch list, goals, decision outcomes, remembered facts and the company profile), each under the same permissions as in the web app. It never changes the People list; a new contact goes on a card that always waits. A message or a meeting is left on an approval card instead of sent: it waits for the person's tap on the web, or goes on its own when their Handle it for me is on, everyone on it has been on the People list for at least a week, and nothing on it is sensitive. It still never runs scripts or workflows, loads MCP servers or reads their mailbox, and every action is recorded as coming from the AI app. On a server without signed callers (CALLER_ASSERTION_PUBLIC_KEYS), acting mode trusts whoever holds the shared secret to say who is asking.

    This is the inverse of the MCP_ENABLED and MCP_SERVERS_CONFIG_PATH settings under Configuration, which configure the MCP gateway: Open Executive consuming other servers' tools. The server side needs no configuration beyond BACKEND_SHARED_SECRET. If a client errors on connect, try /mcp/ with the trailing slash, since the endpoint 307-redirects and not every client follows the redirect.

    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 "[email protected]" \
      -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, except that the compose UI runs as a dev server rather than the production image.

    Versioned images are published to GitHub Container Registry on every release, so a deployment can pull instead of building:

    docker pull ghcr.io/sentelabsai/openexecutive-api:<version>
    docker pull ghcr.io/sentelabsai/openexecutive-ui:<version>
    

    Tags: X.Y.Z and X.Y for a release, latest for the most recently published release, and main for the current head of main. The available versions are listed on each package's page under the repository's Packages. See docs/deployment.md for how releases are cut.

    Upgrading. Settings → About shows the running version and says when a newer release is out (UPDATE_CHECK_ENABLED=false turns the check off). To upgrade, back up, then rebuild or pull the new tag; see docs/deployment.md.

    ⚠️ 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 or SSO sign-in (any OpenID Connect provider, such as Keycloak, Okta or Entra ID) 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 and SSO 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.

    VariableRequiredDefaultDescription
    ANTHROPIC_API_KEYYes¹—Anthropic API key
    ANTHROPIC_WORKSPACE_IDNo—Required only for an organisation-scoped Anthropic key; sent as the anthropic-workspace-id header. Workspace-scoped keys need no value
    DEFAULT_MODELNoclaude-sonnet-5-5Executive + most specialists
    DEEP_REASONING_MODELNoclaude-sonnet-5-5CSO, CFO, GC, Board (deep reasoning on)
    VECTOR_STORE_PATHNo./chroma_dbChromaDB directory
    EPISODIC_DB_PATHNo./episodic_memory.dbSQLite for episodic memory
    COMPANY_PROFILE_PATHNo./company/profile.yamlCompany profile
    ENABLE_CACHINGNotrueAnthropic prompt caching
    ROUTING_MODELNoclaude-haiku-5-5Model for intent routing
    SLACK_BOT_TOKENNo—Slack bot OAuth token
    SLACK_APP_TOKENNo—Slack socket mode token
    SLACK_SIGNING_SECRETNo—Slack signing secret: hear Slack over HTTP at /webhook/slack instead of socket mode
    EXEC_EMAIL_ADDRESSNo—The Executive's own mailbox (Gmail via Google Workspace MCP, or Outlook via Microsoft 365 MCP)
    EMAIL_POLL_INTERVAL_SECONDSNo60How often to poll for new email
    TELEGRAM_BOT_TOKENNo—Telegram bot token (from @BotFather)
    TELEGRAM_WEBHOOK_SECRETNo—Random string for webhook validation
    DISCORD_BOT_TOKENNo—Discord bot token (Developer Portal → Bot tab)
    DISCORD_APP_IDNo—Discord application ID (General Information tab)
    DISCORD_GUILD_IDSNo—Comma-separated guild IDs for dev slash-command registration
    DISCORD_NOTIFY_CHANNEL_IDNo—Default channel ID for outbound notifications
    GOOGLE_CHAT_PROJECT_NUMBERNo—GCP project number for Google Chat
    GOOGLE_CHAT_SERVICE_ACCOUNT_FILENo—Path to service account JSON key
    GOOGLE_OAUTH_CLIENT_IDNo—Google OAuth client ID (Gmail MCP)
    GOOGLE_OAUTH_CLIENT_SECRETNo—Google OAuth client secret (Gmail MCP)
    MS365_MCP_CLIENT_IDNo—Entra app registration client ID (Microsoft 365 MCP: Outlook mail + calendar)
    MS365_MCP_TENANT_IDNocommonEntra tenant ID for the Microsoft 365 MCP sign-in
    MS365_MCP_CLIENT_SECRETNo—Entra client secret (only for a confidential app registration)
    MS365_MCP_EXPECTED_USERNAMENo—Pin the Microsoft 365 sign-in to this mailbox UPN
    MS365_MCP_ONEDRIVENofalseAdd the OneDrive tools (and the file permissions they need) to the Microsoft 365 sign-in; run --login again after turning it on
    MCP_ENABLEDNoon when the config file existsMCP gateway (the Executive using other servers' tools); false keeps it off with the file in place
    MCP_SERVERS_CONFIG_PATHNo./company/mcp_servers.jsonMCP gateway server list and tool filters (see mcp_servers.json.example)
    EMAIL_PROVIDERNogoogleBackend for the inbound mailbox poller + alert email: google or microsoft
    CALENDAR_PROVIDERNogoogleBackend for the typed calendar booking tools: google or microsoft
    DELEGATION_GOOGLE_CREDENTIALS_DIRNo—Where the owner's own Gmail credential for Act as me lives (see docs/deployment.md)
    DRIVE_SYNC_ENABLEDNofalseSync shared Google Drive folders into the knowledge base
    DRIVE_SYNC_SERVICE_ACCOUNT_FILENo—Service account key with drive.readonly
    DRIVE_SYNC_FOLDER_IDSNo—Comma-separated Drive folder IDs to sync
    ONEDRIVE_SYNC_ENABLEDNofalseSync OneDrive or SharePoint folders into the knowledge base, as the Microsoft 365 sign-in
    ONEDRIVE_SYNC_FOLDERSNo—Comma-separated <drive id>/<item id> entries (openexecutive onedrive-folder <sharing link> prints one)
    CONFLUENCE_SYNC_ENABLEDNofalseSync Confluence spaces into the knowledge base
    CONFLUENCE_URLNo—Confluence base URL (Cloud or Server/Data Center)
    CONFLUENCE_USERNAME / CONFLUENCE_API_TOKENNo—Confluence Cloud sign-in (email + API token)
    CONFLUENCE_PERSONAL_TOKENNo—Confluence Server/Data Center personal access token
    CONFLUENCE_SYNC_SPACE_KEYSNo—Comma-separated space keys to sync
    NOTION_SYNC_ENABLEDNofalseSync the Notion pages shared with your integration into the knowledge base
    NOTION_API_KEYNo—Notion internal integration token
    OPENROUTER_ENABLEDNofalseRoute Claude calls through OpenRouter and unlock non-Anthropic models per-agent in the Council UI
    OPENROUTER_API_KEYNo—Required when OPENROUTER_ENABLED=true
    OPENROUTER_CATALOG_ENABLEDNotrueFetch OpenRouter's live /models catalog at startup to populate the Council dropdown; falls back to a built-in list on failure
    OPENROUTER_CATALOG_PROVIDERSNoopenai,google,anthropic,meta-llama,deepseek,x-aiVendor prefixes surfaced from the live catalog
    OPENROUTER_CATALOG_PER_PROVIDERNo6Newest tool-capable paid models per vendor (0 = no cap)
    OPENROUTER_CATALOG_REFRESH_SNo21600Background re-fetch cadence in seconds (0 = startup only)
    LOCAL_MODELS_ENABLEDNofalseRoute selected slugs to a local OpenAI-compatible server (Ollama, LM Studio, vLLM, llama.cpp)
    LOCAL_BASE_URLNo—Local server URL incl. version path, e.g. http://localhost:11434/v1. Required when LOCAL_MODELS_ENABLED=true
    LOCAL_API_KEYNo—Optional bearer token (vLLM / gateways); Ollama & LM Studio need none
    LOCAL_MODELSNo—Comma-separated local model slugs to surface in the Council UI and route locally, e.g. llama3.3,qwen2.5
    LOCAL_TIMEOUT_SNo300Per-call timeout for local generation, in seconds
    LOCAL_REASONING_EFFORTNo—reasoning_effort sent on every local request: none, minimal, low, medium or high. Set it for thinking-only models (GLM on Fireworks) that otherwise spend the whole token budget reasoning
    HONCHO_ENABLEDNofalsePer-person memory layer (honcho.dev) — a peer card shared across all channels; on the Memories page each person sees only their own
    HONCHO_API_KEYNo—Required when HONCHO_ENABLED=true
    HONCHO_BASE_URLNo—Self-hosted Honcho endpoint
    ENABLE_WEB_SEARCHNotrue²Let the Executive and specialists answer with live web results (news, market data, competitor moves) alongside your uploaded documents
    WEB_SEARCH_MAX_USESNo2Max 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 packages/core/openexecutive/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-5-5 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.

    Privacy

    Everything in company/ is gitignored — the profile YAML, uploaded documents, and the ChromaDB vector store. None of this leaves your local machine (or your own volume in cloud deployments) except as part of prompts sent to the Anthropic API. Anthropic does not train on API data.

    Inside the app, what the Executive keeps about a person is theirs: Always in the loop notes and the peer memory card are shown only to that person, the owner included.

    Contributing

    See .github/CONTRIBUTING.md. All PRs must include:

    • Working implementation (no stubs)
    • Tests for new behavior
    • Eval scenarios for new agents or prompt changes

    License

    Apache 2.0 — free to use commercially, requires attribution.