Demonstrations of how AI coding and business agents work
Project description
Codemoo - Demonstrate how coding agents work under the hood
Requirements:
uv- An API key for at least one LLM provider (Mistral, OpenAI, Google, OpenRouter, or Anthropic), or a running Ollama server for local use
- Microsoft Graph access is required for
businessmode
Installation
You should install Codemoo as a tool:
uv tool install . --editable
Important: Some of the demo bots can run destructable commands without any confirmation. Be careful with your prompts!
Configuration
Codemoo can run in two different modes:
codeis the default mode where it is your friendly coding assistant (similar to Claude Code, OpenCode, Codex, and GitHub Copilot).businessrequires access to Microsoft Graph and gives Codemoo access to your E-mail, Teams, Calendar and Sharepoint, very much like M365 Copilot.
General Setup
| Variable | Default | Description |
|---|---|---|
CODEMOO_LANGUAGE |
English |
Language for commentary, error messages, and demo slides and prompts |
LLM Backends
| Variable | Default | Description |
|---|---|---|
CODEMOO_BACKEND |
mistral |
Active backend: mistral, ollama, openrouter, google, anthropic, or openai |
MISTRAL_API_KEY |
— | Mistral API key (required for mistral backend) |
CODEMOO_MISTRAL_MODEL |
mistral-small-latest |
Mistral model override |
OLLAMA_API_KEY |
ollama |
Ollama API key (optional; defaults to ollama for unauthenticated local servers) |
CODEMOO_OLLAMA_MODEL |
llama3.2 |
Ollama model override |
OPENROUTER_API_KEY |
— | OpenRouter API key (required for openrouter backend) |
CODEMOO_OPENROUTER_MODEL |
z-ai/glm-4.5-air:free |
OpenRouter model override |
GOOGLE_API_KEY |
— | Google AI API key (required for google backend) |
CODEMOO_GOOGLE_MODEL |
gemini-2.0-flash |
Google model override |
ANTHROPIC_API_KEY |
— | Anthropic API key (required for anthropic backend) |
CODEMOO_ANTHROPIC_MODEL |
claude-haiku-4-5-20251001 |
Anthropic model override |
OPENAI_API_KEY |
— | OpenAI API key (required for openai backend) |
CODEMOO_OPENAI_MODEL |
gpt-4o-mini |
OpenAI model override |
The fallback order when the primary backend is unavailable is: mistral → ollama → openrouter → google → anthropic → openai.
For local Ollama usage, install Ollama, pull a model (ollama pull llama3.2), and set CODEMOO_BACKEND=ollama. No API key is required. The base_url for each provider can also be overridden in a local codemoo.toml — useful for pointing the openai backend at Azure AI Foundry or other compatible endpoints.
Microsoft Graph
| Variable | Default | Description |
|---|---|---|
CODEMOO_M365_TENANT_ID |
— | Microsoft Graph tenant ID |
CODEMOO_M365_CLIENT_ID |
— | Microsoft Graph client ID |
CODEMOO_SHAREPOINT_HOST |
contoso.sharepoint.com |
Base URL to Sharepoint |
CODEMOO_SHAREPOINT_SITE |
/sites/demo |
Site link inside Sharepoint |
Usage
Codemoo has two main modes: a coding assistant you can use directly, and a step-by-step demo that shows how coding agents work under the hood.
Coding assistant
Launch the chat with the most capable bot:
uv run codemoo
The business chat is named Collebra, and can be run in the same way as Codemoo (requires an Entra app registration and correctly set environment variables.):
uv run collebra
uv run codemoo --variant business
Use --bot to start with a specific bot by type:
uv run codemoo --bot ReadBot
To pick a bot interactively before starting:
uv run codemoo select
To see all available bots:
uv run codemoo list-bots
Demo mode
Run through the bot progression to see how coding agents evolve step by step — from a simple echo bot up to a full agent loop.
Note: The example prompts for later bots reference files in the
demo/folder. Run the demo from there so the paths resolve correctly:cd demo
Start the interactive demo by running Codemoo with the demo command:
uv run codemoo demo
Each bot is introduced with slides explaining what it can do and how it works. Press Ctrl-N to advance to the next bot, or Ctrl-Q to quit. Press Ctrl-S at any point to reopen the current bot's slide. Each bot also comes with a few example prompts. Press Ctrl-E to insert the next example prompt. You can then edit it or just press enter to submit it directly.
You can also start or end the demo with specific bots:
uv run codemoo demo --start telo --end loom
For different demo purposes, you can run with different preset scripts (lists of bots):
uv run codemoo list-scripts
uv run codemoo demo --script focused
Scripts can also be further customized by providing --start and --end.
Language support
You can set language with CODEMOO_LANGUAGE. For example, if you use CODEMOO_LANGUAGE=Norwegian then demo slides and prompts, as well as commentary and error messages will be translated to Norwegian (or your chosen language).
Bot progression
Coding path (--script default):
| # | Bot | Capability |
|---|---|---|
| 1 | 🦜 Coco | Echo — repeats your message back |
| 2 | ✨ Mono | LLM — single-turn language model call |
| 3 | 🧿 Iris | Chat — multi-turn conversation with history |
| 4 | 🎭 Sona | System prompt — chat with a persona |
| 5 | 🔧 Telo | Tools — can call a tool and act on the result |
| 6 | 📁 Rune | ReadBot — reads files and lists directories |
| 7 | 🔨 Axel | ChangeBot — runs shell commands and writes files |
| 8 | 🌀 Loom | Agent — full agentic loop with planning |
| 9 | 🔒 Cato | Guard — human-in-the-loop before risky actions |
Business path (--script business):
| # | Bot | Capability |
|---|---|---|
| 1 | 🦜 Coco | Echo — repeats your message back |
| 2 | ✨ Mono | LLM — single-turn language model call |
| 3 | 🧿 Iris | Chat — multi-turn conversation with history |
| 4 | 🎭 Sona | System prompt — chat with a persona |
| 5 | 🔧 Telo | Tools — can call a tool and act on the result |
| 6 | 🚶 Roam | ScanBot — reads SharePoint, email, and calendar |
| 7 | 📤 Aero | SendBot — sends email, creates events, posts to Teams |
| 8 | 🌀 Loom | Agent — full agentic loop over M365 data |
| 9 | 🔒 Cato | Guard — human approval before M365 actions |
See BOTS.md for more information about the bots.
Microsoft Graph
If you run in business mode, you need to set up access to your Microsoft Graph tenant.
Register an Entra app
- Go to portal.azure.com → Microsoft Entra ID → App registrations → New registration
- Name it (e.g.
Codemoo Demo), leave supported account types as single tenant, and click Register - On the app overview page, copy the Application (client) ID and Directory (tenant) ID
- Go to Authentication → Add a platform → Mobile and desktop applications → tick the
https://login.microsoftonline.com/common/oauth2/nativeclientredirect URI → Configure - Under Advanced settings on the same page, set Allow public client flows to Yes → Save
The redirect URI and public client flag enable the device code flow Codemoo uses — no client secret is needed.
Grant API permissions
Go to API permissions → Add a permission → Microsoft Graph → Delegated permissions and add:
| Permission | Consent required | Used by |
|---|---|---|
Mail.Read |
User | Read email |
Mail.Send |
User | Send email |
Calendars.ReadWrite |
User | Read and create calendar events |
Sites.Read.All |
Admin | Read SharePoint documents |
Files.ReadWrite.All |
Admin | Write SharePoint documents |
ChannelMessage.Send |
Admin | Post Teams messages |
For the m365_lite script only Mail.Read, Mail.Send, and Calendars.ReadWrite are needed — no admin consent required.
After adding permissions, click Grant admin consent for <tenant> if you have admin rights, or ask your tenant admin to do so for the admin-only permissions.
Configure Codemoo
Set the tenant and client IDs via environment variables:
export CODEMOO_M365_TENANT_ID=<your-tenant-id>
export CODEMOO_M365_CLIENT_ID=<your-client-id>
export CODEMOO_M365_SHAREPOINT_HOST=<your-tenant>.sharepoint.com
export CODEMOO_M365_SHAREPOINT_SITE=/sites/<your-site>
Authenticate
The first time you run in business mode, Codemoo will print a device code and a URL:
To sign in, use a web browser to open the page https://microsoft.com/devicelogin
and enter the code ABCD1234 to authenticate.
Open the URL, enter the code, and sign in with your Microsoft account. The token is cached at ~/.cache/codemoo/token_cache.bin so subsequent runs are silent for up to 90 days.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file codemoo-2026.5.0.tar.gz.
File metadata
- Download URL: codemoo-2026.5.0.tar.gz
- Upload date:
- Size: 41.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f15ae82cac54efc4202a63b2f02894568f9993a1b8a9017ba488d82378ef5959
|
|
| MD5 |
15ce63598b526bba140966d33714fc88
|
|
| BLAKE2b-256 |
8ad4da273e9189c2dcb43fa51e8d2cb1a529d9d7286039f4cfbb471e15d6c16e
|
Provenance
The following attestation bundles were made for codemoo-2026.5.0.tar.gz:
Publisher:
publish.yml on gahjelle/codemoo
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
codemoo-2026.5.0.tar.gz -
Subject digest:
f15ae82cac54efc4202a63b2f02894568f9993a1b8a9017ba488d82378ef5959 - Sigstore transparency entry: 1423725479
- Sigstore integration time:
-
Permalink:
gahjelle/codemoo@f18ec6ee378f80eb8b5067ac4870d1e2a76a7333 -
Branch / Tag:
refs/tags/v2026.5.0 - Owner: https://github.com/gahjelle
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@f18ec6ee378f80eb8b5067ac4870d1e2a76a7333 -
Trigger Event:
push
-
Statement type:
File details
Details for the file codemoo-2026.5.0-py3-none-any.whl.
File metadata
- Download URL: codemoo-2026.5.0-py3-none-any.whl
- Upload date:
- Size: 66.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
84dc9fa6aa03324f5c7e1f618bcac18fc5520a7fe0ef320221ef95f0c99edc60
|
|
| MD5 |
4288fea9923be97a5ec14f0a543351e9
|
|
| BLAKE2b-256 |
d6028ae770b54bfe3848169595bd024cd48609939f58912056ba815f527bcf96
|
Provenance
The following attestation bundles were made for codemoo-2026.5.0-py3-none-any.whl:
Publisher:
publish.yml on gahjelle/codemoo
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
codemoo-2026.5.0-py3-none-any.whl -
Subject digest:
84dc9fa6aa03324f5c7e1f618bcac18fc5520a7fe0ef320221ef95f0c99edc60 - Sigstore transparency entry: 1423725604
- Sigstore integration time:
-
Permalink:
gahjelle/codemoo@f18ec6ee378f80eb8b5067ac4870d1e2a76a7333 -
Branch / Tag:
refs/tags/v2026.5.0 - Owner: https://github.com/gahjelle
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@f18ec6ee378f80eb8b5067ac4870d1e2a76a7333 -
Trigger Event:
push
-
Statement type: