Skip to main content

Command-line client for the Obitrain API

Project description

obi

Command-line client for the Obitrain API — one generic, scriptable interface to every endpoint, for interactive use and automation.

Instead of wrapping each endpoint in its own subcommand, obi gives you three primitives:

  • obi auth — authenticate once, stay authenticated
  • obi api — call any endpoint (method, query, body, headers)
  • obi schema — discover endpoints, parameters and payload shapes offline

Install

uv tool install obitrain      # exposes the `obi` binary
uvx --from obitrain obi --help

User quickstart

obi auth login

obi auth login prints a short code (like QX2F-LX4T). Enter it in the Obitrain mobile app under Account → Link a device, and the CLI receives its own API token — no password typed in the terminal, and it works for Google/Apple accounts too. The token is long-lived and revocable from the app at any time.

Then call anything:

obi api /v1/user                                  # your profile
obi api /v1/training/sessions -q limit=5          # last sessions
obi api /v1/user -X PATCH -d '{"lang": "fr"}'     # update a field
obi api /v1/training/session -d @session.json     # body from a file (implies POST)

Continue with the user quickstart or see the full documentation.

Authentication

Command Purpose
obi auth login Device-code login: approve in the app, token stored in the active profile
obi auth set <token> Store a token generated from your Account page
obi auth status / whoami Inspect the active profile / authenticated user
obi auth token Print the token, for scripting
obi auth clear Remove stored credentials
  • Profiles--profile work (or OBI_PROFILE) keeps separate accounts; credentials are stored per profile with 0600 permissions. obi auth profiles lists them.
  • Ephemeral tokensOBI_TOKEN / --token authenticate a single invocation without writing anything to disk; ideal for CI.
  • Base URL — defaults to https://api.obitrain.com; override with --base-url or OBI_BASE_URL.

Calling the API

obi api <path> [-X METHOD] [-q k=v ...] [-d BODY|@file|@-] [-H k:v ...] [-o json|pretty|raw|yaml] [-n]
  • -d implies POST unless -X says otherwise; @file and @- (stdin) are supported.
  • -n / --dry-run prints the fully resolved request (token redacted) without sending it.
  • Response bodies always go to stdout; diagnostics go to stderr as one-line JSON.
  • Output is human-friendly by default (syntax-highlighted on a TTY) and plain JSON whenever output is piped or an agent environment is detected; --json (or -o json|raw|yaml) forces a format explicitly.

Exit codes

Code Meaning
0 Success — parse stdout
1 Usage error
4 Authentication required or failed
5 Network error (connection, DNS, timeout)
6 Server error (5xx)
7 Client error (4xx)
130 Cancelled (Ctrl-C)

Discovering the API

The OpenAPI spec is bundled with the package — discovery works offline:

obi schema tags                              # tags with operation counts
obi schema list --grep session               # find operations
obi schema show /v1/training/sessions -X GET # params, body & response schemas, inlined models
obi schema show /v1/stats/activity/weekly    # concrete paths resolve to their {template}

Agent quickstart

obi was also designed for reliable use by AI agents. The machine-facing contract includes:

  • Self-documenting binaryobi quickstart prints the full agent guide (discovery → auth → calls → error repair) to stdout; obi --help-json gives the machine-readable command tree. No repo or web access needed.

  • Deterministic output — bodies on stdout, one-line JSON diagnostics on stderr, exit codes above. Pass --json to force plain JSON; in practice you already get it, since output falls back to JSON when an agent environment is detected (CLAUDECODE, CURSOR_AGENT, GITHUB_COPILOT, AMAZON_Q, OBI_AGENT_MODE, …), when NO_COLOR is set, or when stdout is not a TTY.

  • Errors carry their own fix404/405/422 diagnostics include a hint field built from the bundled spec:

    $ obi api /v1/stats/activity/weekly
    {"error": "http_error", "status": 422, "method": "GET", "path": "/v1/stats/activity/weekly",
     "hint": "required params: range_type (path, enum: daily|weekly|monthly), from_date (query, date),
     to_date (query, date); see `obi schema show '/v1/stats/activity/{range_type}'`"}
    
    $ obi api /v1/stats/activity/weekly -q from_date=2026-01-01 -q to_date=2026-06-01   # repaired
    

The recommended loop: obi schema list --grep …obi schema show <path>obi api … -n (optional dry-run) → obi api … → on exit 7, read hint and retry.

Works with coding agents. Any agent that can run a shell can drive obi — give it a token via OBI_TOKEN and tell it to run obi quickstart. Claude Code is auto-detected (CLAUDECODE); for OpenAI Codex (AGENTS.md) and Mistral Vibe, set OBI_AGENT_MODE=1 to force JSON:

OBI_TOKEN="<api token>" claude                                   # auto-detected
OBI_AGENT_MODE=1 OBI_TOKEN="<api token>" codex exec "use obi to fetch /v1/user"
OBI_AGENT_MODE=1 OBI_TOKEN="<api token>" vibe -p "use obi to fetch /v1/user" --enabled-tools "bash*"

See the agent quickstart for the complete workflow, including per-tool setup.

Development

uv sync --all-groups
uv run ruff check src tests && uv run ruff format --check src tests
uv run pyright
uv run pytest

Generated models

src/obitrain/api/models.py holds TypedDicts generated from static/openapi.json (the vendored OpenAPI 3.1 spec). Regenerate after updating the spec:

sh bin/codegen.sh
git diff --exit-code src/obitrain/api/models.py   # CI fails if these drift

To refresh the spec from upstream, replace static/openapi.json and rerun codegen.

Docs

uv run --group docs zensical serve   # live preview
uv run --group docs zensical build   # static site -> ./site

Full docs: https://obitrain.github.io/obi/.

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

obitrain-0.2.0.tar.gz (47.3 kB view details)

Uploaded Source

Built Distribution

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

obitrain-0.2.0-py3-none-any.whl (51.9 kB view details)

Uploaded Python 3

File details

Details for the file obitrain-0.2.0.tar.gz.

File metadata

  • Download URL: obitrain-0.2.0.tar.gz
  • Upload date:
  • Size: 47.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.21 {"installer":{"name":"uv","version":"0.11.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for obitrain-0.2.0.tar.gz
Algorithm Hash digest
SHA256 a4e7b21ff9a3d3d6ca8d7c3300b48de2e35d6e0e675d5d7ba340d35d9ea5cecd
MD5 fe268308f70fff37dd0992c86f98fc71
BLAKE2b-256 52f8249b1762868fe01fda135b88157279ec1139151410712d9f9fcf78afa027

See more details on using hashes here.

File details

Details for the file obitrain-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: obitrain-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 51.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.21 {"installer":{"name":"uv","version":"0.11.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for obitrain-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 91484aa9f08d486bc41cc6f26f4c08e09e9cfbdeb5ecc908b0e09b3d37718748
MD5 17dc534b010b19a0a28508c8bfa3eded
BLAKE2b-256 3091630b83a38ddfe1aa52971c9c37b996df6c46d6c66915809fad0ea930c5d0

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