AWS-CLI-shaped command line for AIMA Labs — drive voice/WhatsApp campaigns from humans, CI, or AI agents.
Project description
aima — AIMA Labs CLI
An AWS-CLI-shaped command line for AIMA Labs. Drive voice and WhatsApp campaigns — set up a campaign, add leads, place outbound calls, and watch their status — from a terminal, a CI pipeline, or an AI agent.
The grammar is aima <noun> <verb>. It's a thin, dependency-light wire-protocol
client over the /api/cli REST surface: every command is a 1:1 wrapper over an
endpoint, except a few client-side composites (init, status, onboard).
Install
The PyPI package is aimalabs-cli; the command it installs is aima.
Homebrew (macOS/Linux):
brew install stepacool/tap/aima
uv / pipx — isolated install onto your PATH (provides the aima command):
uv tool install aimalabs-cli # or: pipx install aimalabs-cli
pip:
pip install aimalabs-cli
Run once without installing (ephemeral — does not add aima to your PATH).
Because the package and command names differ, uvx needs --from:
uvx --from aimalabs-cli aima --help # not: uvx aimalabs-cli
Upgrade or remove an isolated install later with uv tool upgrade aimalabs-cli
(or pipx upgrade / brew upgrade aima) and the matching uninstall.
Quick start
aima init # prompts for your API key, validates it, writes ~/.aima/config.json (0600)
aima voices list # browse available voices
aima onboard # guided: voice → campaign → test lead → real call → live status
Or do it by hand:
aima campaigns create \
--title "Q2 outbound" --company-name "Acme Corp" \
--voice-id 42 \
--field "budget:string:Ask the prospect their monthly budget." \
--field "plan:enum:Which plan are they on?:values=free,pro,enterprise"
aima leads add-test --campaign-id 17 --lead "Jane Doe:+15551234567"
aima calls dispatch 501 --yes
aima calls status 501 --poll
# Manage agents and tweak a campaign after the fact:
aima agents list
aima agents create --name "Stefan" --company-name "Acme Corp" --voice-id 42
aima agents update 9 --system-prompt @prompts/stefan.txt
aima campaigns update 17 --title "Q2 outbound (v2)" --agent-id 9 --extra-context "Mention the summer promo."
Configuration
Config lives at ~/.aima/config.json (mode 0600):
{ "base_url": "https://api.aimalabs.io", "api_key": "api_..." }
Environment variables override the file:
| Variable | Effect |
|---|---|
AIMA_API_KEY |
Override api_key. |
AIMA_BASE_URL |
Override base_url (self-hosted / staging). |
AIMA_CONFIG |
Use an alternate config-file path. |
AIMA_OUTPUT=json |
Force machine-readable output. |
Manage it directly:
aima config show # api_key is masked as api_…<last4>
aima config set base_url https://staging.aimalabs.io
aima config clear
Output modes
- Human (default): rich tables and key/value blocks. The API key is always masked.
--json: raw response body to stdout, nothing else. The exit code carries success/failure.- Auto: when stdout is not a TTY, JSON is emitted automatically. Override with
--no-json. AIMA_OUTPUT=jsonbehaves like--json.
Status lines, prompts, and errors go to stderr, so --json stdout stays clean
and pipeable:
aima campaigns list --json | jq '.[].campaign_id'
Commands
| Command | What it does |
|---|---|
aima init |
First-run wizard: prompt, validate against the API, write config. |
aima status |
Show config and probe that the key still works. |
aima config show | set | clear |
Manage local config. |
aima voices list [--language] [--provider] [--voice-type] [--no-active] |
List voices (active by default). |
aima agents list [--limit N] |
List agents, newest first. |
aima agents get <agent_id> |
Show one agent, including its system prompt. |
aima agents create --name N --company-name C [--language] [--system-prompt] [--voice-id] |
Create a reusable agent. |
aima agents update <agent_id> [--name] [--company-name] [--language] [--system-prompt] [--voice-id] |
Update an agent (only the flags you pass). |
aima campaigns list [--active|--inactive] [--limit N] |
List campaigns, newest first. |
aima campaigns create ... |
Create a campaign + agent + extraction fields atomically. |
aima campaigns update <campaign_id> [--title] [--agent-id] [--extra-context] [--active|--inactive] |
Retitle, reassign the agent, or edit the prompt. |
aima leads add-test --campaign-id ID --lead NAME:E164 |
Add test leads (no dispatch). |
aima leads upload-csv --campaign-id ID --file PATH ... |
Bulk-create leads from CSV (or stdin via --file -). |
aima calls dispatch <lead_id> |
Place a real outbound call (confirms unless --yes). |
aima calls status <lead_id> [--poll] |
Latest call status + extracted values; --poll until it ends. |
aima onboard |
Interactive end-to-end walkthrough. |
Defining extraction fields
--field is repeatable. Each token is title:type:description:
--field "budget:string:Ask their monthly budget."
--field "meeting:calendar_appointment:Book a demo."
--field "tier:enum:Which tier?:values=bronze,silver,gold"
Types: string, integer, float, boolean, date, datetime, enum,
json, array, calendar_appointment, file. Enum types require the
trailing :values=....
--system-prompt and --extra-context accept a literal string or @path/to/file
to read from disk. The whole request body can also be supplied with
--from-yaml body.yaml; explicit flags override values from the YAML.
Exit codes
| Code | Meaning |
|---|---|
0 |
Success. |
1 |
User error — bad flags, validation, or a 4xx from the API (detail printed to stderr). |
2 |
Server / network error — a 5xx or a transport failure. |
3 |
Missing or invalid config (no API key, unreadable file). |
For AI agents
aima is designed to be driven by coding agents. Tips:
- Set
AIMA_OUTPUT=json(or pass--json) for deterministic, parseable output. - Every error prints the backend's
detailto stderr and uses a stable exit code. aima <noun> --helpandaima <noun> <verb> --helpdescribe every flag.- Calls that cost money (
calls dispatch, largeupload-csv) require--yesin non-interactive contexts.
Development
uv pip install -e ".[dev]"
pytest
ruff check src
License
MIT
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 aimalabs_cli-0.2.0.tar.gz.
File metadata
- Download URL: aimalabs_cli-0.2.0.tar.gz
- Upload date:
- Size: 45.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.8.22
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
14dcad48500a99a2007127113b075bc16341bf26bc2ed35650649069ccdb7561
|
|
| MD5 |
d84a62a8606d627d4c493e60097639af
|
|
| BLAKE2b-256 |
421c708ead03dc21e97dbd4029ae880e075e702e58ebd5bb14688a5c6af75d9f
|
File details
Details for the file aimalabs_cli-0.2.0-py3-none-any.whl.
File metadata
- Download URL: aimalabs_cli-0.2.0-py3-none-any.whl
- Upload date:
- Size: 26.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.8.22
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
df9ca7277e4430f76f8a9e1829f48006b58b34c5a849191596fbd3116746e438
|
|
| MD5 |
96380bbd895629c49355c0561ce853dc
|
|
| BLAKE2b-256 |
72e23f4209adf811f3c9fc6f8eb78426607c89dd413d85679d3f4e8b277e1e7c
|