Skip to content

v0.3.0

Latest

Choose a tag to compare

@mattmillerai mattmillerai released this 14 Sep 22:55
· 1 commit to main since this release
Immutable release. Only release title and notes can be modified.
358032c

Added

  • Queued model surface: models.submit(), models.subscribe(), models.handle(), and the RequestHandle they return (status(), get(), cancel(), iter_events()). Sync and async. Gated server side — a caller it is not enabled for gets 403 NotEnabled.
  • ComfyError.resend_refusedTrue only on the failure re-raised after a refused same-key resend. Check it before letting an outer retry wrapper re-enter run(), which would mint a fresh key and bill a second generation.
  • retry.may_have_claimed_key(exc) — whether a failure could have left the key claimed.
  • router_exceptions.error_from_completion() — the typed exception a completed-but-failed queued request reports, or None.

Changed

  • models.run now raises the failure that claimed the key when a same-key retry is refused 422 idempotency_key_reuse, with the refusal chained on __cause__ and .resend_refused set. except IdempotencyKeyReuse no longer catches this — catch the real failure (or ComfyError) and inspect __cause__.
  • The substitution only applies when a claim-capable failure preceded the refusal. After a never-delivered transport error or a released 429, a 422 is a genuine refusal and is raised as itself. Among eligible failures the most recent wins, not the first.

Fixed

  • A 409 naming no error code raises plain ComfyError instead of guessing HashMismatch. Enveloped hash_mismatch and Router-bucketed 409s are unaffected.

Full changelog: v0.2.0...v0.3.0