Skip to main content

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.

CI License: AGPL v3 Python 3.11+ DCO

Install ยท Quickstart ยท How it works ยท Contributing ยท Vision ยท Architecture


For AI agents reading this file: start here, then read roadmap/02_architecture.md for the module map and CLAUDE.md for 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:

  1. Providers โ€” openrouter, claude-code, gemini, custom-openai (multi-select).
  2. API keys โ€” stored in .armance/.env (gitignored).
  3. Default provider + model.
  4. Budget effort โ€” free-first / low / medium / high / adaptive.
  5. Interface language โ€” EN / FR / ES / DE / ZH / JA. Every agent โ€” staff and specialists โ€” replies in this language. Auto-detected from $LANG.
  6. 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

  1. dispatch_input (service/tui_bridge) โ€” routes by @mention or current agent.
  2. The right meta-agent chat handler builds its system prompt: persona + voice overlay (your language) + RAG injection + project brief + team roster.
  3. call_with_ledger calls the provider via the chosen LLMClient and accumulates token usage.
  4. 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.
  5. The conversation is appended to .armance/sessions/<id>/conversation.md and 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/:

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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

armance-0.1.0.tar.gz (819.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

armance-0.1.0-py3-none-any.whl (352.6 kB view details)

Uploaded Python 3

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

Hashes for armance-0.1.0.tar.gz
Algorithm Hash digest
SHA256 cf9f92426026da45ce72f1bd680f343d851a6b6313d034f3e4bb47519e1621cd
MD5 8f7af60284d05b704a64a73259a5aba2
BLAKE2b-256 8cb4e8b1ffae6949d6749b8c89d7704cf515d26e2bfec0dd1d4822bbcb728918

See more details on using hashes here.

Provenance

The following attestation bundles were made for armance-0.1.0.tar.gz:

Publisher: release.yml on armance-io/armance

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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

Hashes for armance-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 1a807d72d31981b6925cdcfee0a3f094985c1269b4d61ce26f67162583fd41df
MD5 8bc6726e5a1bb5816f1d87a812265b02
BLAKE2b-256 e47d3d10fe4ece81f18985002718ec2770afa0f2e301ff8e98839543bc0d971a

See more details on using hashes here.

Provenance

The following attestation bundles were made for armance-0.1.0-py3-none-any.whl:

Publisher: release.yml on armance-io/armance

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page