Skip to main content

Aggregate AI subscription/API usage and flag use-it-or-lose-it allotments

Project description

aiuse

Aggregate live subscription quota and prepaid balance information across your local AI tooling, then highlight allotments you should use before they reset (use-it-or-lose-it).

CLI command: aiuse (stub ai → same entrypoint)

AI agents: start at AGENTS.md for a map of this repo, active priorities, Claude/cswap reliability notes (docs/cswap-reliability.md), and review-derived fixes in docs/fix-implementation-plan.md.

Data sources

Tool Purpose Authority
cswap cswap list --json Live Claude Code quota for every configured email/account Canonical multi-account Claude source; may hydrate from cswap’s local usage cache when JSON is decision-stale
CodexBar codexbar usage --format json Live quotas and balances for enabled providers Preferred for non-Claude providers; Claude fallback if cswap has no live rows
caut caut usage --json Independent multi-provider usage (CodexBar-class probes) Cross-check peer; fill-in when CodexBar missing
OpenUsage CLI / 127.0.0.1:6736/v1/limits Menu-bar companion + loopback limits API Cross-check peer; optional CLI install from app Settings
tokscale tokscale usage --json Independent live subscription quota measurement Cross-checked against peers; preferred for Copilot; fill-in when others lack a live row

This project shells out to tools already on your PATH (and optionally hits OpenUsage’s loopback API); it does not scrape billing dashboards itself. For Claude multi-account reliability (stale JSON vs cache), see docs/cswap-reliability.md. caut + OpenUsage setup: docs/collectors-caut-openusage.md.

Install

End users (pipx):

pipx install aiuse
# or from git tip:
# pipx install 'git+https://github.com/djbclark/aiuse.git'
aiuse doctor

(ai is installed as a stub that runs the same CLI.)

Homebrew (personal tap):

brew tap djbclark/aiuse
brew trust djbclark/aiuse
brew install aiuse

Developers (editable):

cd /path/to/aiuse
python3 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"

More channels and release / OIDC publish docs: docs/packaging.md.

Scheduled runs (macOS LaunchAgent, hourly): docs/scheduling.md (./packaging/launchd/install.sh). Snapshot history: docs/history-learning.md.

Optional config (standard location: ~/.config/aiuse/, or $XDG_CONFIG_HOME/aiuse/):

# Create directories + default files (never overwrites existing files)
aiuse --generate-config

# Or copy examples by hand:
mkdir -p "${XDG_CONFIG_HOME:-$HOME/.config}/aiuse"
cp config/services.example.yaml "${XDG_CONFIG_HOME:-$HOME/.config}/aiuse/services.yaml"
cp config/config.example.toml "${XDG_CONFIG_HOME:-$HOME/.config}/aiuse/config.toml"
File Purpose
~/.config/aiuse/services.yaml Plans, analysis thresholds, which collectors are enabled
~/.config/aiuse/config.toml Tool settings: subprocess timeouts (default 45s), room for more later

Run aiuse --show-config-path to print both paths. aiuse --generate-config creates missing parent dirs (~/.config, ~/.config/aiuse) and writes defaults; if a file already exists it is left alone and reported on stderr. Provider credentials stay with cswap, CodexBar, caut, OpenUsage, and tokscale — these files do not hold tokens or emails.

Daily workflow

# Once: create defaults under ~/.config/aiuse/ (never overwrites)
aiuse --generate-config
aiuse doctor                 # PATH tools + config presence + timeouts
# Once per machine: install data-source tools (cswap, codexbar, caut, OpenUsage, tokscale)
./packaging/install-deps.sh
# or: just -f ~/ops/site-djbclark/justfile install-aiuse-deps

# Morning / before a long coding block
aiuse                        # priority ladder on stdout (use-soon at bottom); meta on stderr
aiuse --full                 # long report: per-provider, tips, detailed plan
aiuse --brief                # same as default (compat alias)
aiuse --no-tui               # classic plain-text report (also used when piping)
aiuse -q                     # ladder only (no stderr meta / Collecting…)

# Scripting / cron (JSON on stdout; use exit codes)
aiuse -q --json
# exit 0 = ok, no burn/conserve alerts
# exit 1 = hard failure (collectors failed, no accounts)
# exit 2 = success with at least one burn/conserve alert
# field contract: docs/json-contract.md

# Shell completion (bash or zsh)
eval "$(aiuse --print-completion bash)"
# or: source completions/ai.bash

# Tighter thresholds for “only what resets soon”
aiuse --min-remaining 50 --max-days 7

Usage

# Pretty human-readable report (default)
aiuse
aiuse --format pretty
aiuse --no-color          # plain text, no ANSI
aiuse -q / --quiet        # suppress progress on stderr

# or without install:
PYTHONPATH=src python -m ai

# Machine-readable JSON on stdout (progress on stderr unless -q)
aiuse --json
aiuse --format json
aiuse --json --alerts-only
aiuse --save ~/tmp/ai-snapshot.json   # also write JSON file

# Faster / partial
aiuse --providers copilot,grok,codex   # query these separately
aiuse --no-tokscale
aiuse --min-remaining 50 --max-days 10

# Subprocess timeout for external tools (default 45s; also in config.toml)
aiuse --timeout 45
aiuse -t45

# Environment check (tools on PATH, config files, timeouts) — no usage collection
aiuse doctor
aiuse --doctor
Flag Effect
(none) / --format pretty Priority ladder on stdout (empty→n/a→slow→mid→use); meta on stderr; plain when piped
--full Long pretty report: per-provider, cross-checks, tips, detailed plan
--json / --format json Full snapshot + alerts as JSON
--brief Alias of default priority-ladder pretty report
--no-tui Force classic plain-text pretty report
--no-color Disable ANSI colors in plain-text pretty mode
-q / --quiet Suppress progress messages on stderr
--alerts-only Recommendations only (respects pretty vs json)
--traditional-summary Legacy flat summary format instead of unified action plan
--print-completion bash|zsh Print shell completion script to stdout
--no-tokscale / --no-cswap / --no-codexbar / --no-caut / --no-openusage Skip specific collectors
--providers copilot,grok Query specific CodexBar providers (CSV, one per subprocess)
-t / --timeout SECONDS Force subprocess timeout for all external tools (default 45)
--generate-config Write default ~/.config/aiuse/* files; never overwrites existing
--show-config-path Print services.yaml and config.toml paths
doctor / --doctor Check tools on PATH, config presence, effective timeouts; no collect
--min-remaining 50 --max-days 10 Override alert thresholds
--save PATH Also write full JSON snapshot to PATH

Exit codes

Code When
0 Collect succeeded (or nothing to report) and there are no burn/conserve alerts. INFO-only notes still count as 0.
1 Hard failure: collectors reported errors and no accounts were collected. Also used by aiuse doctor when an enabled tool is missing from PATH, and by --generate-config when nothing was written / overwrite refused.
2 Collect succeeded and at least one burn or conserve alert is present. Cross-check disagreements alone do not set 2. Bad --timeout values also use 2.

aiuse doctor checks config file presence, config validation (unknown keys, bad timeouts, dead plan aliases), all five data-source tools on PATH (and OpenUsage loopback HTTP when the CLI is missing), and a light version probe (cswap --version, codexbar -V, caut --version, tokscale --version). It does not call usage APIs or verify login sessions.

What “use it or lose it” means

Most subscription coding plans (Claude Pro/Max, ChatGPT Plus/Codex, Cursor, Copilot, SuperGrok, Google AI Pro, …) grant windows of usage (5-hour, weekly, monthly). When the window resets, unused capacity disappears — you still paid for the month.

This tool:

  1. Pulls remaining % and reset times from cswap (Claude multi-account), CodexBar (broad live quotas), caut and OpenUsage (cross-check peers / fill-in), and tokscale (independent measurement; preferred for Copilot).
  2. Scores windows with pace-based logic (default): compare how far through the cycle you are vs how much you've used, then project waste or early lockout.
  3. Classifies each window as Burn (will leave capacity unused), Conserve (on track to exhaust before reset — slow down), or On pace (no alert).
  4. For shared-allotment providers (Claude, Gemini by default), scores the longest governing window only so a fresh 5-hour bar does not outrank the weekly budget it draws from.
  5. Default pretty output is a priority ladder on stdout (depleted → prepaid n/a → conserve → mid → use-soon at bottom; read bottom→top). Meta goes to stderr. Use aiuse --full for per-provider detail.
  6. On --full, keeps the trailing plan within ~23 lines × console width when possible; if the detailed plan is taller, both detailed and at a glance are printed (glance last).
  7. Cross-checks all live sources pairwise; Claude multi-account stays canonical in cswap (with cache hydrate + fallbacks).

This command intentionally does not report historical local-token usage or API-equivalent cost estimates.

Example output

================================================================================
AI USAGE — USE IT OR LOSE IT
Collected at … · 3 accounts · 2 alerts
================================================================================

## Per-provider usage
--------------------------------------------------------------------------------
Codex · account=you@example.com · plan=plus · selected live source: CodexBar
  quota: Codex weekly quota
    [============] 100% left   0% used   resets in 6.4d (Jul 28 21:59 UTC)
    $6.90 · flex:▒ semi

## Cross-checks (informational)
--------------------------------------------------------------------------------
  Tools poll at different times; multi-account Claude is cswap-only. …

## Tips
--------------------------------------------------------------------------------
  • …

## Action plan — use these before they reset
--------------------------------------------------------------------------------
  Available capacity this cycle: $35.65 across 6 windows (5 providers).

  THIS WEEK (start now — capacity will reset or needs lead time)
  ─────────────────────────────────────────────────────────────
  .   Codex · you@example.com · Codex weekly quota: 88% left · use within 6.4 days · $6.07 at risk
      Semi-throttled — steady usage will exhaust it.
  .   OpenCode Go · default · OpenCode Go weekly quota: 98% left · use within 4.5 days · $3.37 at risk
      Burstable — one heavy session will cover it.

Project layout

src/aiuse/
  cli.py                 # entrypoint
  collectors/            # cswap, codexbar, caut, openusage, tokscale
  analysis/use_or_lose.py
  report.py
config/services.example.yaml
tests/

Tests

just test
just check # tests plus deterministic lint, type, spelling, and format checks
just lint  # full check plus Bandit, Semgrep, and Gitleaks
just format

The quality suite mirrors the applicable tools from stayturgid: pytest, Ruff, mypy, yamllint, markdownlint, Prettier (including TOML support), typos, Bandit, Semgrep, Gitleaks, pre-commit, and just. Ansible, shell, JavaScript/CSS, dotenv, Caddy, and browser-page checks are omitted because this repository contains none of those corresponding inputs.

Scoring modes (analysis.scoring_mode)

Mode Meaning
pace (default) Burn / conserve / on-pace from projected waste and lockout
multi_dim Previous value + flexibility + deadline blend (escape hatch)
legacy Original deadline-heavy scorer (use_multi_dim_scoring: false still maps here)

Pace knobs (also in services.yaml under analysis.pace):

  • waste_alert_fraction (default 0.30) — project this much unused → Burn
  • min_elapsed_fraction (default 0.15) — too early in the window → On pace unless history says otherwise
  • conserve_min_lead_hours (default 4) — exhaust this far before reset → Conserve

Shared allotment: analysis.provider_overrides.<provider>.shared_allotment: true (Claude/Gemini default) scores only the longest window per account.

Notes / limitations

  • Live quota accuracy depends on each tool's auth (browser cookies, OAuth, keychain). Errors are reported per account rather than aborting the whole run.
  • All enabled collectors (cswap, CodexBar, caut, OpenUsage, tokscale) run concurrently; each CodexBar provider is its own subprocess. Default tool timeout is 45s (-t / config.toml [timeouts]).
  • Per-window detail still shows $ value, flexibility class, and a pace ratio when computable.
  • Duplicate live measurements are retained for cross-checking but only one copy drives recommendations.
  • Dollar values use plan monthly_price with waking-hours correction (default 16h/day).

Related reading

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

aiuse-2.1.7.tar.gz (113.0 kB view details)

Uploaded Source

Built Distribution

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

aiuse-2.1.7-py3-none-any.whl (86.6 kB view details)

Uploaded Python 3

File details

Details for the file aiuse-2.1.7.tar.gz.

File metadata

  • Download URL: aiuse-2.1.7.tar.gz
  • Upload date:
  • Size: 113.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.32 {"installer":{"name":"uv","version":"0.11.32","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for aiuse-2.1.7.tar.gz
Algorithm Hash digest
SHA256 2f7681b993582b067f7314eeee6d4889ca1f17249df438f45c4c5f30dd30282f
MD5 99159cd840b4d4b826848af187fca407
BLAKE2b-256 f24143e7a733a51816a990686e836fc921cf82014c755634450c7236d3c98a3b

See more details on using hashes here.

File details

Details for the file aiuse-2.1.7-py3-none-any.whl.

File metadata

  • Download URL: aiuse-2.1.7-py3-none-any.whl
  • Upload date:
  • Size: 86.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.32 {"installer":{"name":"uv","version":"0.11.32","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for aiuse-2.1.7-py3-none-any.whl
Algorithm Hash digest
SHA256 8151740bfc072b1638f398a268a8d0e1ff547249613820c0c4d07b284c0475d0
MD5 5c3dd9848aaaa004c65be88365c87637
BLAKE2b-256 a347daafb7028fc4da5638da33e0a645f67e4a96694ad25a6e11f830c5a85f43

See more details on using hashes here.

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