li agent MODEL PROMPT [flags] # single-turn agent
li team SUBCMD [flags] # persistent team messaging
li o fanout MODEL PROMPT [flags] # parallel workers
li o flow MODEL PROMPT [flags] # auto-DAG pipeline
li play NAME [ARGS] # sugar for `li o flow -p NAME`
li skill NAME # print a CC-compatible skill body to stdoutThree reusable primitives live under ~/.lionagi/:
| Primitive | Location | Invocation |
|---|---|---|
| Agent profile | ~/.lionagi/agents/<name>/<name>.md |
li agent -a <name> / li o flow -a <name> |
| Skill (static ref) | ~/.lionagi/skills/<name>/SKILL.md |
li skill <name> |
| Playbook (parametric flow) | ~/.lionagi/playbooks/<name>.playbook.yaml |
li play <name> |
See examples/ for minimal templates of each.
Available on li agent, li o fanout, li o flow. Source: cli/_providers.py:263
| Flag | Default | Notes |
|---|---|---|
--yolo |
false | Auto-approve all tool calls |
-v, --verbose |
false | Stream real-time output; suppresses final print |
--theme {light,dark} |
none | Terminal theme |
--effort LEVEL |
none | Override effort; claude: low medium high xhigh max; codex: none minimal low medium high xhigh; gemini: unsupported (cli/_providers.py:24,44) |
--cwd DIR |
none | Working directory for CLI endpoint |
--timeout SECONDS |
none | Hard timeout; partial branches saved |
Model spec: provider/model[-effort] — e.g. claude/opus-4-7-high, codex/gpt-5.4-xhigh. Bare aliases: claude → claude_code/sonnet, codex → codex/gpt-5.3-codex-spark, gemini-code → gemini_code/gemini-3.1-flash-lite-preview. Source: cli/_providers.py:72,145
One-shot agent turn or resumed conversation.
li agent [model] prompt [flags]| Arg/Flag | Default | Notes |
|---|---|---|
model |
— | Spec or alias. Omit with -r or -c. cli/agent.py:156 |
prompt |
— | Message to send. cli/agent.py:165 |
-a, --agent NAME |
none | Profile by name. Resolves .lionagi/agents/<NAME>/<NAME>.md first, then legacy .lionagi/agents/<NAME>.md. Sets model/effort/system/yolo. cli/agent.py:167 |
-r, --resume BRANCH_ID |
none | Resume prior branch. cli/agent.py:178 |
-c, --continue-last |
false | Resume most recent branch. cli/agent.py:184 |
-r and -c are mutually exclusive (cli/agent.py:49). Common flags apply.
li agent claude/sonnet "What does Branch.operate() do?"# output:
Branch.operate() is the universal structured operation entry point...
[to resume] li agent -r 20260420T110143-a1b2c3 "..."
Python equivalent: branch.operate(instruction="...") → api/branch.md#operate
Persistent inbox messaging. Teams stored at ~/.lionagi/teams/{team_id}.json under fcntl.flock (cli/team.py:50).
li team create NAME -m MEMBERS
li team list [alias: ls]
li team show TEAM
li team send CONTENT -t TEAM --to RECIPIENTS [--from NAME] [--from-op OP]
li team receive -t TEAM [--as MEMBER] [alias: recv]| Arg/Flag | Required | Notes |
|---|---|---|
name |
yes | Team name |
-m, --members |
yes | Comma-separated member names |
Source: cli/team.py:284
li team create "docs-team" -m "researcher,writer,reviewer"# output:
Created team 'docs-team' (7fa0d9abbf5b)
Members: researcher, writer, reviewer
File: ~/.lionagi/teams/7fa0d9abbf5b.json
list — sorted by mtime; shows ID, name, members, msg count (cli/team.py:294). show TEAM — all messages with timestamps and read_by (cli/team.py:297). TEAM = ID, prefix, or name.
| Arg/Flag | Required | Default | Notes |
|---|---|---|---|
content |
yes | — | Message text (positional) |
--team, -t |
yes | — | Team ID or name |
--to |
yes | — | all or comma-separated names |
--from |
no | _cli |
Sender name |
--from-op |
no | none | Op id; ties signal to a specific flow invocation |
Source: cli/team.py:301
li team send "Research done — see research.md" \
--team 7fa0d9abbf5b --to writer --from researcher --from-op o1| Flag | Required | Default | Notes |
|---|---|---|---|
--team, -t |
yes | — | Team ID or name |
--as |
no | none | Mark as read for this member; omit = see all |
Source: cli/team.py:322
li team receive --team 7fa0d9abbf5b --as writerPython equivalent: session.send() / session.receive() → api/team.md
Three-phase: orchestrator decomposes → N workers in parallel → optional synthesis.
li o fanout [model] prompt [flags]| Flag | Default | Notes |
|---|---|---|
-a, --agent NAME |
none | Orchestrator profile. cli/orchestrate/__init__.py:49 |
-n, --num-workers N |
3 | Worker count; ignored when --workers set |
--workers M1,M2,... |
none | Per-worker model specs (each can include effort suffix) |
--max-concurrent N |
0 | Max concurrent (0 = all) |
--with-synthesis [MODEL] |
false | Enable synthesis; bare = orchestrator model |
--synthesis-prompt TEXT |
none | Override synthesis instruction |
--output {text,json} |
text | Output format |
--save DIR |
none | Write artifacts here |
--team-mode [NAME] |
none | Create persistent team; bare = "fanout" |
Source: cli/orchestrate/__init__.py:29–119. Common flags apply.
li o fanout claude/opus-high "Audit lionagi/session/ for stale API surface" \
-n 3 --with-synthesis --save ./audit-out# output:
Phase 1: Orchestrator decomposing task into 3 agent requests...
Phase 1 done (3.2s): 3 requests generated.
Phase 2: Fanning out to 3 workers: [claude/opus, claude/opus, claude/opus]
Phase 2 done (14.1s).
Saved 3 worker results to /Users/ocean/audit-out
Phase 3: Synthesis [claude/opus]...
Saved to /Users/ocean/audit-out
Worker outputs: worker_1.md … worker_N.md in artifact root (fanout.py:269). Synthesis: synthesis.md (fanout.py:317). Resume cancelled workers with li agent -r BRANCH_ID.
Auto-DAG pipeline. Orchestrator plans a FlowPlan (agents + ops with depends_on edges); engine executes with dependency-aware parallelism. Control ops trigger re-planning up to 3 rounds (flow.py:705).
li o flow [model] prompt [flags]| Flag | Default | Notes |
|---|---|---|
-a, --agent NAME |
none | Orchestrator profile. Resolves .lionagi/agents/<NAME>/<NAME>.md first, then legacy .lionagi/agents/<NAME>.md. |
-f, --file PATH |
none | Load flow spec from YAML/JSON file. File values are defaults; CLI flags override. |
-p, --playbook NAME |
none | Load playbook from ~/.lionagi/playbooks/<NAME>.playbook.yaml. Playbook's declared args are injected as additional flags. |
--with-synthesis [MODEL] |
false | Final synthesis after all ops |
--max-concurrent N |
0 | Max concurrent agents per phase (0 = all) |
--max-agents N |
0 | Cap total ops (0 = unlimited) |
--dry-run |
false | Plan DAG and print; no execution |
--show-graph |
false | Render DAG as matplotlib PNG into --save dir |
--bare |
false | Ignore agent profiles; all workers use CLI model |
--background |
false | Subprocess run; requires --save; monitor tail -f <save>/flow.log; child inherits LIONAGI_RUN_ID (cli/_runs.py:57) |
--output {text,json} |
text | Output format |
--save DIR |
none | Artifact dir; required for --background |
--team-mode [NAME] |
none | Create a FRESH team every invocation (new UUID). Bare = "flow". |
--team-attach NAME |
none | Upsert: attach to existing team by NAME (preserving message history) or create if missing. Mutex with --team-mode. |
-f and -p are mutually exclusive. --team-mode and --team-attach are mutually exclusive. Source: cli/orchestrate/__init__.py:122–209. --background re-invokes python -m lionagi.cli without itself (cli/orchestrate/__init__.py:265). Common flags apply.
| Goal | Flag | Behavior |
|---|---|---|
| One-off parallel workers, no shared history | --team-mode [NAME] |
New UUID every invocation. Messages posted; team discarded conceptually. |
| Persistent thread across invocations | --team-attach NAME |
First call creates; subsequent calls attach to the same team (same UUID, same history). No pre-step required — you never have to li team create first. |
| Strict attach (error if missing) | li team create NAME -m ... first, then --team-attach NAME |
Explicit human-in-the-loop for shared, long-lived teams. |
li o flow claude/opus "Write and test a CLI arg parser for a new subcommand" \
--save ./parser-work --with-synthesis# output:
Planning DAG...
Plan done (4.1s): 3 agents, 4 ops — o1:r1 | o2:i1←o1 | o3:t1←o2 | o4:r1←o3
Executing DAG: 3 agents / 4 ops...
▶ researcher started
✓ researcher done (8.2s)
▶ implementer started
✓ implementer done (22.1s)
▶ tester started
✓ tester done (18.4s)
Synthesis [claude/opus]...
Saved to ./parser-work/
Total: 55.8s
Use --dry-run to inspect the plan before running. Artifact dirs per agent: <save>/{agent_id}/. Python equivalent: Builder + Session.flow() → api/flow.md
A playbook is a YAML file that declares a reusable, parametric flow
invocation: model, agent, effort, prompt template, and typed CLI args.
Source of truth: ~/.lionagi/playbooks/<NAME>.playbook.yaml.
name: audit
description: Parametric audit pattern
argument-hint: '[--mode MODE] [--workers N]' # CC-compatible display string
model: claude-code/opus-4-7
agent: orchestrator
effort: high
args: # explicit, typed schema (preferred)
mode:
type: str # str | int | float | bool
default: dry
help: "audit mode: dry | security | dead-code"
workers:
type: int
default: 8
strict:
type: bool
default: false
prompt: |
Run a {mode} audit with {workers} parallel workers. Strict: {strict}.
Target: {input}All playbook fields map to li o flow flags. If both args: and
argument-hint: are present, args: wins. If only argument-hint: is
present, it's parsed as CC does — [--flag VALUE] → string arg, [--flag]
→ bool arg, no type coercion.
Inside prompt:, three rules:
{input}→ the positional prompt text passed on the CLI.{arg_name}→ a declared arg (CLI override > playbook default).- If the template has no
{...}placeholders, the positional text is appended with a blank line — same convention as Claude Code slash commands.
# Long form
li o flow -p audit --mode security "the auth service"
# Sugar
li play audit --mode security "the auth service"
li play list # list playbooks in ~/.lionagi/playbooks/
li play audit --help # show playbook description, args, and usageLists all installed playbooks in ~/.lionagi/playbooks/.
li play list# output:
audit Parametric audit pattern [--mode MODE] [--workers N]
refactor Multi-step refactor with review [--scope SCOPE]
Shows the playbook's description, its declared arguments with types and defaults, and a
generated usage line. Does not execute the flow.
li play audit --help# output:
audit — Parametric audit pattern
Usage: li play audit [--mode MODE] [--workers N] [--strict] PROMPT
Arguments:
--mode MODE str default: dry audit mode: dry | security | dead-code
--workers N int default: 8
--strict bool default: false
Prompt template:
Run a {mode} audit with {workers} parallel workers. Strict: {strict}.
Target: {input}
--help is checked before any flags are forwarded to li o flow, so it never starts execution.
For one-off specs not worth installing globally:
li o flow -f ./my-spec.yaml "target"-f takes an absolute/relative path; -p takes a bare name resolved under
~/.lionagi/playbooks/. They are mutually exclusive.
See examples/playbooks/ for ready-to-install
playbooks with different shapes.
A skill is static reference content the agent pulls on demand. Format
is identical to Claude Code skills — you can symlink one source file into
both ~/.claude/skills/<name>/SKILL.md and
~/.lionagi/skills/<name>/SKILL.md.
~/.lionagi/skills/commit/SKILL.md
---
name: commit
description: Conventional Commits style guide + safety rules.
---
# Commit conventions
... body ...li skill NAME # print body (post-frontmatter) to stdout
li skill list # list installed skills
li skill show NAME # print full file (frontmatter + body)An orchestrator agent can shell out to li skill <name>, capture stdout,
and inject the result into its own context — no extra protocol required.
See examples/skills/ for templates.
A profile is resolved by name. Two layouts are supported:
~/.lionagi/agents/
orchestrator/ # preferred — directory layout
orchestrator.md # main profile
patterns/ # optional supplementary references
empaco.md
refs/
commit-conventions.md
legacy.md # flat layout — backward compat
li agent -a NAME and li o flow -a NAME check for
<NAME>/<NAME>.md first and fall back to <NAME>.md. Supplementary files
beside the main profile are not injected into the initial system prompt
— the agent reads them on demand (via direct file reads or li skill).
Project-local .lionagi/agents/ takes precedence over ~/.lionagi/agents/.
See examples/agents/ for minimal/ and with-refs/
templates.
Every CLI invocation allocates a run directory. Source: cli/_runs.py:14. Run ID format: YYYYMMDDTHHMMSS-{6hex} (cli/_runs.py:61).
~/.lionagi/runs/{run_id}/
run.json manifest (command, branches, artifact_root)
branches/{branch_id}.json branch snapshot — resumable via -r / -c
stream/{branch_id}.buffer.jsonl live chunk buffer during streaming
Resume any prior branch:
li agent -r 20260420T110143-a1b2c3 "follow up"
li agent -c "continue most recent"| Variable | Purpose | Source |
|---|---|---|
LIONAGI_RUN_ID |
Child inherits parent run ID (background flows) | cli/_runs.py:57 |
LIONAGI_HOME |
Override ~/.lionagi/ base dir |
lionagi/utils.py |
OPENAI_API_KEY |
OpenAI REST API key (for iModel, not for codex CLI alias) |
lionagi/config.py |
ANTHROPIC_API_KEY |
Anthropic REST API key (for iModel; claude alias uses claude login instead) |
lionagi/config.py |
GOOGLE_API_KEY |
Gemini key | lionagi/config.py |
GROQ_API_KEY |
Groq key | lionagi/config.py |
Sources: cli/agent.py · cli/team.py · cli/orchestrate/__init__.py · cli/orchestrate/fanout.py · cli/orchestrate/flow.py · cli/_providers.py · cli/_runs.py
Next: Python API reference