From 0df2b75794084f781dbbc105a1f40c19499712a9 Mon Sep 17 00:00:00 2001 From: Matt Miller Date: Mon, 31 Aug 2026 18:28:32 -0700 Subject: [PATCH 1/3] docs(changelog): cut 0.1.9 Co-Authored-By: Claude Fable 5 --- CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5f4968d..046d09b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,8 @@ notes for each version. ## [Unreleased] +## [0.1.9] - 2026-09-01 + ### Added - Every exception `client.models.run()` raises **for a failed call** now @@ -329,7 +331,8 @@ First public release of the Comfy API v2 Python SDK (`comfy-sdk`). and download outputs. - Sync and async clients. Python 3.10+. -[unreleased]: https://github.com/Comfy-Org/comfy-python-sdk/compare/v0.1.8...HEAD +[unreleased]: https://github.com/Comfy-Org/comfy-python-sdk/compare/v0.1.9...HEAD +[0.1.9]: https://github.com/Comfy-Org/comfy-python-sdk/compare/v0.1.8...v0.1.9 [0.1.8]: https://github.com/Comfy-Org/comfy-python-sdk/compare/v0.1.7...v0.1.8 [0.1.7]: https://github.com/Comfy-Org/comfy-python-sdk/compare/v0.1.5...v0.1.7 [0.1.5]: https://github.com/Comfy-Org/comfy-python-sdk/compare/v0.1.4...v0.1.5 From 6cdcfcd6ec82e3ba9efc6c49c921c8eddb1f945c Mon Sep 17 00:00:00 2001 From: Matt Miller Date: Mon, 31 Aug 2026 18:29:31 -0700 Subject: [PATCH 2/3] docs(changelog): spell the run route as /v2 in the Changed entry The Fixed entry above documents the /v1 -> /v2 move; the Changed entry kept the pre-move literal, which is not the route this release ships. Co-Authored-By: Claude Fable 5 --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 046d09b..b44f32f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -150,7 +150,7 @@ notes for each version. ### Changed - **Breaking (wire): `client.models.run` now posts to Comfy Router.** It sends - `POST {COMFY_ROUTER_BASE_URL}/v1/models/{provider}/{model}` — the route + `POST {COMFY_ROUTER_BASE_URL}/v2/models/{provider}/{model}` — the route `spec/router-openapi.yaml` declares as `runRouterModel` — with the partner model's **own native JSON input** as the body, forwarded to the provider unchanged. It previously posted `{COMFY_BASE_URL}/api/v2/models/run` with a From 5afd467aeed481ee54d5f8896b5cdd4e3dd1d241 Mon Sep 17 00:00:00 2001 From: Matt Miller Date: Mon, 31 Aug 2026 18:53:51 -0700 Subject: [PATCH 3/3] docs(changelog): stop 0.1.9 documenting its own pre-release churn as a fix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cutting the `## [0.1.9]` heading turned two intra-cycle bullets into release history that contradicted itself: the Fixed entry said the run path still pointed at `/v1` so every `models.run` returned a bare 404, while the Changed entry said the route was `/v2`. An operator allowlisting the route got two answers. Neither state was ever published — `client.models.run` is new in 0.1.9 (#73), moved to Router in #103, and reached `/v2` in #117, all after the v0.1.8 tag — so the `/v1` 404 fixed nothing a user could have hit. Drop that Fixed bullet and fold its surviving fact (the vendored spec pin and the `check_drift.py` gate) into the Changed entry, which now states the one live route, names the pre-release shapes as pre-release, and no longer bills itself as a wire break against a version that never spoke the old shape. Migration guidance is kept for anyone who tracked `main`. Documentation only; no code or behaviour changes. Co-Authored-By: Claude Opus 5 --- CHANGELOG.md | 30 +++++++++++------------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b44f32f..e7a592c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -79,14 +79,6 @@ notes for each version. characters) before any bytes move. The empty string is the load-bearing case: it used to fall into the mint-a-fresh-key branch, silently dispatching a second billed generation on what the caller meant as a collect. -- `models.run` now posts to `POST {router_base_url}/v2/models/{provider}/{model}`. - The Comfy Router service moved its model routes from `/v1/models` to - `/v2/models` and the SDK's hand-written path template was never - updated, so every `models.run` call answered a bare 404 against the live - service. The vendored `spec/router-openapi.yaml` is synced to the same - contract in this change, and `scripts/check_drift.py` re-pins the two - together. - - A success status whose body will not decode (a proxy interstitial served under a `200`, a response truncated mid-stream) now raises a translated SDK error instead of letting `json.JSONDecodeError` escape from outside the @@ -149,20 +141,20 @@ notes for each version. ### Changed -- **Breaking (wire): `client.models.run` now posts to Comfy Router.** It sends +- **`client.models.run` posts to Comfy Router.** It sends `POST {COMFY_ROUTER_BASE_URL}/v2/models/{provider}/{model}` — the route `spec/router-openapi.yaml` declares as `runRouterModel` — with the partner model's **own native JSON input** as the body, forwarded to the provider - unchanged. It previously posted `{COMFY_BASE_URL}/api/v2/models/run` with a - `{"model": ..., "arguments": {...}}` envelope, which nothing serves: the - `/api/v2` surface is jobs and assets, and the model-ID-addressed invocation - routes are Router's. The Python method signature is unchanged - (`run(model, arguments, *, idempotency_key=None, timeout=...)`), the result is - still the provider's payload returned as-is, and the `Idempotency-Key` and - retry behaviour are unchanged — what moved is the URL and the body shape. - **Anyone who pointed `COMFY_BASE_URL` at a Router host to make model runs work - must now point `COMFY_ROUTER_BASE_URL` there instead**, and set - `COMFY_BASE_URL` back at their v2 deployment (or unset it for Comfy Cloud). + unchanged. The vendored `spec/router-openapi.yaml` is pinned to that contract + and `scripts/check_drift.py` keeps the two together. The whole `models` + surface is new in this release, so nothing published ever spoke a different + shape: during development the call went to `{COMFY_BASE_URL}/api/v2/models/run` + with a `{"model": ..., "arguments": {...}}` envelope, and briefly to Router's + `/v1/models`, neither of which anything serves — the `/api/v2` surface is jobs + and assets, and the model-ID-addressed invocation routes are Router's, now at + `/v2`. **If you tracked `main` and pointed `COMFY_BASE_URL` at a Router host to + make model runs work, point `COMFY_ROUTER_BASE_URL` there instead**, and set + `COMFY_BASE_URL` back at your v2 deployment (or unset it for Comfy Cloud). - The `model` argument to `client.models.run` is now the canonical `{provider}/{model}` id, because it *is* the two path segments the route is addressed by. Exactly two non-empty segments are accepted; a one-segment id, a