Repository navigation
Getting started
- Sign up free at studio.poly.ai
- Install:
uv tool install polyai-adk - Set up:
poly setup(signs you in, saves an API key, installs shell completion and AI coding-agent skills)
Already installed? Run poly update to get this release and the latest skills.
v0.71.1 (2026-10-16)
This release is published under the Apache-2.0 License.
Bug Fixes
Summary
poly apikey now gets someone who belongs to more than one workspace to a key in one sign-in. It also tells an agent which poly ran (in --json), and ends with the next step: a first API call.
Motivation
With more than one account and no --account-id, poly apikey exited 1 and asked for a re-run. The sign-in lived only in that process, so the re-run meant a second GitHub sign-in. Anyone invited to a teammate's workspace hit this on first use. An AI assistant following the setup prompt stopped there. The --json output also didn't say which poly binary ran, so an agent couldn't tell when an older install earlier on PATH answered. And it ended without a next step.
Changes
- Several accounts: at a terminal without
--json, a picker (the same onepoly project createuses). Without a terminal, or with--json, it stops and lists the accounts so you can re-run with one; with--json, they also come back in a newaccountsarray on the error object (id,name,role,created_by). No guessing. - Sign-in kept: the device-flow token is saved to~/.poly/apikey_session(mode 600, per region, until the token'sexp), so a re-run with--account-idskips the browser. If a kept token gets a 401 from authorise or accounts, it is dropped and the run signs in once more. New--no-session-cacheflag: sign in fresh and keep nothing. The token is never printed and never in--json. - Whichpoly:--json(success and error) gainscli_versionandcli_path. The human output is unchanged;poly updatealready reports stale installs. - Next step: the summary ends withNext: make your first API call (POLY_API_KEY is already set).and
the Dialog RSN 1 linkhttps://docs.poly.ai/dialog-rsn-1.--jsongainsnext_step_url. - Wording: "never prompts" is now "never prompts when run by an agent (no terminal, or--json)" in the help, the module docstring,docs/docs/reference/cli/apikey.mdanddocs/docs/get-started/get-started.md. The reference page documents the behaviours, the new flag, and the success and error JSON shapes.
No breaking changes: --account-id behaves as before, --json only gains keys, and the exit codes are the same.
Test strategy
- Added/updated unit tests - [ ] Manual CLI testing (
poly <command>) - [ ] Tested against a live Agent Studio project - [ ] N/A (docs, config, or trivial change)
New apikey_session_test.py covers save/load, exp parsing, expiry margin, bad or partial JSON, clear, and mode 600. apikey_test.py covers:
- the picker: choices, choice used, cancel - several accounts without a terminal: error with
accounts, in plain and--json---jsonat a TTY never prompts ---account-idstill wins - cached sign-in reused; 401 on authorise or accounts clears it and signs in once; no retry loop on a fresh token ---no-session-cachereads and writes nothing -cli_version/cli_pathon success and on error, and absent from the plain output -next_step_url- a sweep over every failure path (plain and--json, fresh and cached) asserting the token never reaches stdout or stderr
The old multiple-accounts tests are rewritten to the new contract.
Checklist
-
ruff check .andruff format --check .pass - [x]pytestpasses (2300 passed locally; CI green on Ubuntu and Windows) - [x] No breaking changes to thepolyCLI interface (or migration path documented) - [x] PR title follows conventional commits, and its type matches the change (fix:, per review) - [x] User-facing changes are reflected indocs/docs/,src/poly/docs/(resource shapes) andskills/(no resource shapes or skills referencepoly apikey)
Screenshots / Logs
Several accounts, no terminal (--json):
🤖 Generated with [Claude Code](https://claude.com/claude-code)
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
### Chores
- Update pluggy URL in licenses.json ([#369](https://github.com/polyai/adk/pull/369), [`7c686ae`](https://github.com/polyai/adk/commit/7c686ae37f63918a0ca7753cc59ca10d2da88822))
## Summary
Updates the pluggy entry in `licenses.json` so it matches what CI now generates.
## Motivation
CI installs dependencies fresh and regenerates `licenses.json` with `pip-licenses`, then fails if the committed file differs. pluggy 1.7.0 now publishes its project URL, so CI generates `https://github.com/pytest-dev/pluggy` where the committed file has `UNKNOWN`. Every open PR fails the check until this lands.
## Changes
- `licenses.json`: pluggy's URL changes from `UNKNOWN` to `https://github.com/pytest-dev/pluggy`.
## Test strategy
- [ ] Added/updated unit tests - [ ] Manual CLI testing (`poly <command>`) - [ ] Tested against a live Agent Studio project - [x] N/A (docs, config, or trivial change)
The change matches the diff CI's own regeneration produced on Ubuntu with Python 3.14 and pluggy 1.7.0. Regenerating on macOS also changes the Pygments and ruff licence strings, so those were left as CI generates them.
## Checklist
- [x] `ruff check .` and `ruff format --check .` pass - [x] `pytest` passes - [x] No breaking changes to the `poly` CLI interface (or migration path documented) - [x] PR title follows [conventional commits](https://www.conventionalcommits.org/), and its type matches the change (`feat:` for anything user-visible; see CONTRIBUTING.md) - [x] User-facing changes are reflected in `docs/docs/`, `src/poly/docs/` (resource shapes) and `skills/`
## Screenshots / Logs
``` - "URL": "UNKNOWN" + "URL": "https://github.com/pytest-dev/pluggy" ```
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
---
**Detailed Changes**: [v0.71.0...v0.71.1](https://github.com/polyai/adk/compare/v0.71.0...v0.71.1)