Armance ๐ - a team of experts you recruit to help you decide. Coordinate a panel that debates, stress-tests and synthesises. You keep the call ๐ก. Not a copilot, a brain you consult when the choice matters.
Project description
Armance ๐
A brain you consult when the choice matters.
Not a copilot. Not an autonomous agent. A small firm of LLM experts that debates, stress-tests, and synthesises โ over your own documents โ so you can make a decision you can defend.
Install ยท Quickstart ยท How it works ยท Contributing ยท Vision ยท Architecture
For AI agents reading this file: start here, then read
roadmap/02_architecture.mdfor the module map andCLAUDE.mdfor project conventions.
Why Armance
Most "AI tools" are makers โ they race to a single answer, then ask you to ship it. That is the wrong shape for the hardest moments of strategic work:
- Framing an ambiguous problem.
- Deciding between two plausible directions.
- Stress-testing a plan before committing.
- Synthesising contradictory expert opinions.
In those moments you do not need a faster typist. You need a thinking partner that pulls multiple competent perspectives, makes them disagree productively, and forces you to see the angle you would have missed.
Armance is that partner. It runs locally, reads your documents, recruits a panel of specialists with conflicting personas, runs them through a workflow, and hands you a defensible brief. You keep the call.
The brain-vs-hands principle
| Armance does | Armance does not |
|---|---|
| Frame the problem with you | Write your codebase |
| Recruit a panel of disagreeing personas | Manage a queue of tasks |
| Run a workflow across that panel | Push to your CI |
| Stress-test the synthesis | Send the email |
| Produce a defensible decision brief | Be your IDE |
Meet the staff
Five permanent meta-agents live in every Armance project. They never recruit themselves; they coordinate the specialists Armance brings in for your specific brief.
| Role | Voice | |
|---|---|---|
| Armance | Host โ frames the project, routes the room | French refinement. Systematic vouvoiement. |
| Malik | Recruiter โ picks specialists whose personas disagree usefully | Quiet force, slow tempo, Gainsbourgian nonchalance. |
| Kim | Operator โ designs and runs the workflow | Direct, technical, square. Numbered lists, no padding. |
| Mona | VP โ synthesises, challenges, recommends | Cash and direct. Changes a room's centre of gravity in two sentences. |
| Serge | Adversarial criticalist โ stress-tests every synthesis | The cynical senior French engineer. ยซ *soupir* ยป before every critique. |
Plus the specialists Malik recruits per project (UX researchers, historians, ops engineers โ whatever the brief calls for), each with a generated 200-word persona prompt.
Install
Prerequisites
- Python โฅ 3.11
- At least one LLM provider key (OpenRouter recommended; free tier works end to end)
Recommended โ uv tool (isolated, fast)
uv tool install git+https://github.com/armance-io/armance.git
Alternative โ pipx
pipx install git+https://github.com/armance-io/armance.git
Contributor / dev setup
git clone https://github.com/armance-io/armance.git
cd armance
uv sync && uv pip install -e .
Verify: armance --version
Optional extras
# Claude subscription provider (+75 MB)
uv pip install 'armance[claude]'
# PDF deliverables (Linux native libs for WeasyPrint)
sudo apt-get install libgobject-2.0-0 libcairo2 libpango-1.0-0
Health check
armance doctor
Reports: config validity, provider reachability, sqlite-vec availability, deliverable libs, ledger writability.
Quickstart
mkdir my-project && cd my-project
armance init # interactive โ providers, default model, budget, language
armance run # opens the TUI
armance init walks through:
- Providers โ
openrouter,claude-code,gemini,custom-openai(multi-select). - API keys โ stored in
.armance/.env(gitignored). - Default provider + model.
- Budget effort โ
free-first/low/medium/high/adaptive. - Interface language โ EN / FR / ES / DE / ZH / JA. Every agent โ staff and specialists โ replies in this language. Auto-detected from
$LANG. - Embedding model โ discovered from your configured provider's API; can be skipped and configured later.
Drop documents into .armance/docs/ and run armance run. Armance greets you, frames the project, recruits a team, designs a workflow, runs it, and exports a deliverable.
How it works
The user journey
โโโโโโโโโโโโโโโโโโโ
1. โ armance init โ pick providers, models, budget, language
โโโโโโโโโโฌโโโโโโโโโ
โ
โโโโโโโโโโผโโโโโโโโโ
2. โ drop docs โ .armance/docs/ โ auto-indexed on `armance run`
โโโโโโโโโโฌโโโโโโโโโ
โ
โโโโโโโโโโผโโโโโโโโโ
3. โ armance run โ TUI opens; Armance greets in your language
โโโโโโโโโโฌโโโโโโโโโ
โ
โโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
4. โ Armance frames the project โ asks focused questions,
โ "What audience? What constraint?" โ proposes /library index
โ /library load <file> if needed โ and /library load,
โ โ /save when context is rich โ freezes L0 context
โโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
5. โ Malik recruits specialists โ axis of disagreement
โ "Sarah ยท data-driven / Julian ยท empathic" โ per role; rich
โ each with a 200-word persona โ persona generation
โโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
6. โ Kim designs a workflow โ 3 strategies โ
โ NL dialogue, narrow scope, tailored steps โ rapide / รฉquilibrรฉe /
โ interactive โ autonomous run mode โ approfondie
โโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
7. โ /workflow run <name> โ pre-run health-check,
โ parallel deliberation per DAG level โ HITL checkpoints
โ Mona synthesises, Serge red-teams โ (autonomous = Mona
โ โ proxies for the CEO),
โ โ versioned manifest
โ โ with per-step tokens
โ โ and duration
โโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
8. โ /deliverable pdf | docx | pptx | md โ .armance/exports/
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Storage layout โ everything is a file
.armance/
docs/ your documents (PDF, DOCX, MD, TXT)
vector/ sqlite-vec store + manifest.json + read.json
agents/ one .md per agent (YAML frontmatter + system prompt)
system-*.md built-in staff (Armance / Malik / Kim / Mona / Serge)
<Name>.md Malik-recruited specialists, with rich personas
workflows/ *.yaml DAG definitions
context/ L0_v<N>.md / L1_<role>_v<N>.md / L2_<theme>_v<N>.md
reports/ versioned <agent>_v<N>.md per step
sessions/<id>/ state.json + ledger.json + conversation.md
exports/<wf>/run-<ts>/ per-run manifest + per-step outputs + synthesis
config.yaml non-secret config (providers, default model, language)
.env provider API keys โ gitignored
Markdown is the source of truth. SQLite is used only for vector retrieval.
Four-layer architecture
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ client TUI (Textual) โ and future web client โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ transport DTOs + event bus โ wire-format only โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ service orchestration, agents, workflows, RAG โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ core pure models + protocols, no I/O โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Each layer imports only from layers below. Enforced by import-linter. See roadmap/02_architecture.md for the module map.
Providers
| Provider | Key env var | Notes |
|---|---|---|
openrouter |
OPENROUTER_API_KEY |
Default. Live model discovery. Many :free models. Supports reasoning effort. |
claude-code |
uses claude-agent-sdk auth |
Requires armance[claude]. Subscription = effectively free for the user. Native web search via WebSearch tool. |
gemini |
GEMINI_API_KEY |
Live discovery via /v1beta/models. Native Google Search grounding. |
custom-openai |
CUSTOM_OPENAI_API_KEY + CUSTOM_OPENAI_BASE_URL |
Any OpenAI-compatible endpoint. |
Models are discovered live; pricing tiers, web-search capability, and reasoning support are read from each provider's API. No hardcoded catalogue.
Configuration
All non-secret settings live in .armance/config.yaml. API keys live in .armance/.env. Both are created by armance init and can be edited by hand โ changes take effect on the next armance run.
.armance/config.yaml
| Field | Default | What it does |
|---|---|---|
default_provider |
openrouter |
LLM provider used for all agents unless overridden per-agent. |
default_model |
(chosen at init) | Model id for all agents. Per-agent override via the agent's .md frontmatter. |
budget_effort |
free-first |
Cost guard. free-first keeps effectively-free models (OpenRouter :free, Claude subscription) regardless of nominal tier. Changeable live via /effort. |
budget_cap_usd |
null |
Hard USD cap per session. null = no cap. |
language |
(chosen at init) | en / fr / es / de / zh / ja. All agents reply in this language. |
embedding_provider |
(chosen at init) | Provider used for RAG. Leave blank to disable. |
embedding_model |
(chosen at init) | Embedding model id. Must match embedding_provider. |
judge_provider |
openrouter |
Provider used for Mona's synthesis / Serge's stress-test. |
judge_model |
"" |
Empty = use default_model. |
judge_reasoning |
null |
low / medium / high / null. |
log_level |
INFO |
DEBUG, INFO, WARNING, ERROR. |
prices |
{} |
Override per-model USD prices. Example: prices: {my-model: {input_per_mtok: 1.0, output_per_mtok: 5.0}}. |
.armance/.env
| Variable | Provider | Notes |
|---|---|---|
OPENROUTER_API_KEY |
openrouter | Get one at openrouter.ai. |
OPENROUTER_BASE_URL |
openrouter | Override base URL (default: https://openrouter.ai/api/v1). |
GEMINI_API_KEY |
gemini | Google AI Studio. |
GEMINI_BASE_URL |
gemini | Override base URL. |
ANTHROPIC_API_KEY |
claude-code | Used for live model discovery via /v1/models. |
CUSTOM_OPENAI_API_KEY |
custom-openai | Custom endpoint API key. |
CUSTOM_OPENAI_BASE_URL |
custom-openai | e.g. http://localhost:11434/v1 for Ollama. |
ARMANCE_JUDGE_REASONING |
all | Override judge reasoning effort at runtime. |
Shell values override .env values.
TUI commands (short list)
| Command | Effect |
|---|---|
/help, /quit |
self-explanatory |
/switch <agent> |
route next turn to an agent (or @Name inline) |
/save |
freeze current project context into L0 |
/workflow design <name> |
start Kim's workflow design dialogue |
/workflow run <name> |
execute a workflow (interactive or autonomous) |
/deliverable pdf|docx|pptx|md |
export the latest synthesis |
/report |
persist the last reply as a versioned report |
/export claude|opencode|cline|roo|all |
emit agent docs for another tool |
/model, /effort |
switch provider/model or reasoning effort |
Everything is natural-language first. Slash commands are aliases. "Malik, recrute deux historiens" โ the recruiter intercepts it.
What runs your turn
dispatch_input(service/tui_bridge) โ routes by@mentionor current agent.- The right meta-agent chat handler builds its system prompt: persona + voice overlay (your language) + RAG injection + project brief + team roster.
call_with_ledgercalls the provider via the chosenLLMClientand accumulates token usage.- The reply is scanned for
[EXECUTE:/save],[EXECUTE:/recruit],[EXECUTE:/workflow-design],[EXECUTE:/workflow-run:<name>:<mode>],[EXECUTE:/dismiss-all]. Tags trigger the corresponding side effect. - The conversation is appended to
.armance/sessions/<id>/conversation.mdand the ledger is persisted.
Tests
uv run pytest tests/ # unit + integration (no network)
uv run python scripts/qa_live.py # live OpenRouter free-model QA
qa_live.py exercises the full user journey: greeting โ context โ recruit โ dismiss โ re-recruit โ design โ run โ deliverable โ RAG round-trip โ language switch.
Roadmap & vision
See roadmap/:
01_vision.mdโ the brain-vs-hands manifesto.02_architecture.mdโ module map & dependency rules.
Phased planning and per-issue specs are tracked privately by the maintainer.
License
AGPL-3.0-or-later. Copyright ยฉ 2026 Guillaume Richard.
The strong copyleft license is intentional. If you run a modified Armance as a network service, you must publish your modifications. Commercial dual-licensing is available โ contact guillaume@richard-pro.fr.
See LICENSE for the full text.
Project details
Release history Release notifications | RSS feed
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 armance-0.1.0.tar.gz.
File metadata
- Download URL: armance-0.1.0.tar.gz
- Upload date:
- Size: 819.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cf9f92426026da45ce72f1bd680f343d851a6b6313d034f3e4bb47519e1621cd
|
|
| MD5 |
8f7af60284d05b704a64a73259a5aba2
|
|
| BLAKE2b-256 |
8cb4e8b1ffae6949d6749b8c89d7704cf515d26e2bfec0dd1d4822bbcb728918
|
Provenance
The following attestation bundles were made for armance-0.1.0.tar.gz:
Publisher:
release.yml on armance-io/armance
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
armance-0.1.0.tar.gz -
Subject digest:
cf9f92426026da45ce72f1bd680f343d851a6b6313d034f3e4bb47519e1621cd - Sigstore transparency entry: 1665727026
- Sigstore integration time:
-
Permalink:
armance-io/armance@81d89f36d62a3c2fb73a13dabf4d305e508a40a5 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/armance-io
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@81d89f36d62a3c2fb73a13dabf4d305e508a40a5 -
Trigger Event:
push
-
Statement type:
File details
Details for the file armance-0.1.0-py3-none-any.whl.
File metadata
- Download URL: armance-0.1.0-py3-none-any.whl
- Upload date:
- Size: 352.6 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 |
1a807d72d31981b6925cdcfee0a3f094985c1269b4d61ce26f67162583fd41df
|
|
| MD5 |
8bc6726e5a1bb5816f1d87a812265b02
|
|
| BLAKE2b-256 |
e47d3d10fe4ece81f18985002718ec2770afa0f2e301ff8e98839543bc0d971a
|
Provenance
The following attestation bundles were made for armance-0.1.0-py3-none-any.whl:
Publisher:
release.yml on armance-io/armance
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
armance-0.1.0-py3-none-any.whl -
Subject digest:
1a807d72d31981b6925cdcfee0a3f094985c1269b4d61ce26f67162583fd41df - Sigstore transparency entry: 1665727159
- Sigstore integration time:
-
Permalink:
armance-io/armance@81d89f36d62a3c2fb73a13dabf4d305e508a40a5 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/armance-io
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@81d89f36d62a3c2fb73a13dabf4d305e508a40a5 -
Trigger Event:
push
-
Statement type: