Repository navigation
Rebuild the CLI on the Places API (0.4.0) - #10
Merged
Merged
Conversation
…-call retries Replace the retired /v1/business-status call with validate() and enrich(), add pricing(), and let signup() tag its source. The default base URL is now https://api.voygr.tech. Each call picks its own retry set: validate, enrich, signup and recover retry on 429 only, reads retry on 429 and transient 5xx. A numeric Retry-After is honoured up to 60 s, otherwise backoff is exponential with jitter. Timeouts and connection errors are never retried. Enrich waits up to 3,700 s when any attribute is a research field, 90 s otherwise. Error bodies map error_code, validation detail lists and plain detail strings to APIError. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: multica-agent <github@multica.ai>
…ult download Submit, poll, cancel and download bulk jobs. Submits carry one Idempotency-Key across retries; result files are fetched without the API key, checked against their sha256 and decoded from gzipped JSON Lines. An expired presigned link triggers one status refresh per file. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: multica-agent <github@multica.ai>
Add `validate` and `enrich` for one place, `pricing` (no key needed), and human output for every command in a new `voygr.human` module. `signup` sends `src: voygr-cli` and its human output points to `voygr recover`. The default base URL is now https://api.voygr.tech, and JSON output keeps non-ASCII text. `check` and its CSV batch mode are removed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: multica-agent <github@multica.ai>
validate and enrich take --file PATH (instead of NAME) and --no-wait. The CSV is checked row by row before anything is sent; the job is submitted, polled and its rows printed as JSON Lines. Ctrl-C stops waiting and leaves the job running. A failed or cancelled job prints its rows, then exits 1. voygr jobs status, results and cancel work on a batch ID. The integration tests now run the CLI and the real client over a fake transport. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: multica-agent <github@multica.ai>
…n README Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: multica-agent <github@multica.ai>
[High impact] The follow-up appears safe to merge, with no new blocking findings. SummaryRebuilds the CLI and Python client around the Places API, with bulk jobs and a PyPI release workflow.
Diagram%%{init: {'theme': 'neutral'}}%%
flowchart TD
A[Read CSV] --> B[Check rows and headers]
B --> C[Choose idempotency key]
C --> D[Submit job]
D --> E{Submit outcome}
E -->|Unclear failure| F[Print key for replay]
E -->|Job returned| G[Poll job]
G --> H[Download and check result files]
H --> I[Print JSON Lines]
Reviews (2) · Last reviewed commit: "fix: keep the submit key after an unclea..." · Reviewed by Greptile |
…ts, refuse repeated CSV columns A bulk submit that fails without a clear answer (timeout, dropped connection or 5xx) now prints the Idempotency-Key it used. --idempotency-key KEY replays that job instead of creating a second paid one. wait_for_job cuts its sleeps and poll requests to the time left and never starts a poll after the deadline. A CSV whose header repeats a supported column after case and space folding (address, Address) stops with a line 1 error instead of silently keeping one. The README now says --max-credits applies to each place, and to each row with --file. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: multica-agent <github@multica.ai>
Contributor
Author
|
@greptileai please re-review. ad2856a fixes the three findings from the first review: the submit key after an unclear failure, wait_for_job timeouts, and repeated CSV columns. This is a public repository, so please keep comments to the code in this PR. |
moranlemusj
self-requested a review
October 21, 2026 16:06
moranlemusj
approved these changes
Oct 21, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What changed
The CLI was built on
/v1/business-status, which is no longer part of the published API. This rebuildsvoygrand its Python client on the endpoints described at https://api.voygr.tech/docs/.voygr validatechecks whether a place exists and is open. 1 credit.voygr enrichreturns phone, website, opening hours, social profiles and email for 1 credit per place. Research fields cost 1 credit per place per field.--estimateprices a request without running it.--file places.csvon either command submits a bulk job of up to 10,000 rows, waits, and prints one JSON line per row.voygr jobs status,resultsandcancelpick a job up later.voygr usageandvoygr pricingare new. Pricing needs no key.https://api.voygr.tech.voygr checkis gone. That breaks existing scripts, so the version goes to 0.4.0.Charges
Idempotency-Keyand reuses it on every retry, so a retry replays the same job.Release
.github/workflows/release.ymlpublishes to PyPI when av*tag is pushed. It uses trusted publishing, so the repo holds no PyPI token. Thevoygrproject on PyPI needs a trusted publisher for this workflow before the first tag.Tests
python -m buildproducesvoygr-0.4.0.tar.gzandvoygr-0.4.0-py3-none-any.whl.The release workflow hasn't run yet. The first tag will be its first run.
🤖 Generated with Claude Code