Updated 2026-08-01: added the "don't pin genblaze==0.7.0" paragraph to this already-published release's notes (originally published without it). No published package artifacts changed; canonical text lives in CHANGELOG.md, which this body is generated from.
[0.7.0] - 2026-07-28
Bug-fix wave with one new opt-in feature and one new provider. Closes a
regression in the ReDoS pattern-safety heuristic (both the shape #196/#200
fixed and two further false-positive/false-negative bugs those same fixes
introduced), adds an opt-in rate-limit backoff for chat()/vision helpers,
ships a native Gemini image provider, fixes Runway's image-to-video routing,
and closes a verify --fetch SSRF gap.
This heading is the release wave name and the git tag (v0.7.0);
individual PyPI package versions move independently and are listed below (the
umbrella genblaze package is 0.4.5). Wave tags and the umbrella's PyPI
versions are separate sequences that happen to look alike — don't pin
genblaze==0.7.0. A pin on a wave tag either fails outright or, worse,
resolves silently to an unrelated umbrella build from a different wave (e.g.
genblaze==0.4.0 on PyPI predates the v0.4.0 wave). Pin the exact umbrella
version above, or a lockfile for full reproducibility (the umbrella pins
ranges, not exact versions, for its own dependencies).
Released package versions
genblaze(umbrella) 0.4.4 → 0.4.5genblaze-core0.3.7 → 0.3.8genblaze-cli0.3.5 → 0.3.6genblaze-assemblyai0.3.1 → 0.3.2genblaze-decart0.3.2 → 0.3.3genblaze-elevenlabs0.3.2 → 0.3.3genblaze-gmicloud0.3.4 → 0.3.5genblaze-google0.3.3 → 0.3.4genblaze-hume0.3.2 → 0.3.3genblaze-lmnt0.3.2 → 0.3.3genblaze-nvidia0.3.2 → 0.3.3genblaze-openai0.3.3 → 0.3.4genblaze-runway0.3.2 → 0.3.3genblaze-stability-audio0.3.2 → 0.3.3
genblaze-core
- Security the ReDoS pattern-safety heuristic (
pattern_safety.py) missed
two more catastrophic-backtracking shapes on top of #157 (fixed in 0.6.0):
a quantified alternation with overlapping branches whose textual prefixes
differ, and adjacent unbounded-quantified groups whose reachable character
sets actually overlap despite looking disjoint by source text alone (#196,
#200). Both are now rejected byassert_safe(). That charset-overlap gate
itself had two bugs, also closed here: an unescaped.no longer resolves
to the literal character'.'(it now correctly means "matches anything"),
so a pattern like(.+)([a-z]+)$is rejected as it should be; and a
(?:...)/(?P<name>...)group's marker prefix is now stripped before
charset analysis, so a genuinely safe pattern like(?:[a-z]+)(?:[0-9]+)$
is no longer wrongly rejected. Upgrade impact: the shipped connector
catalog contains no pattern of either shape, so this only affects
third-party or future connectors — aModelFamilypattern with two or
more adjacent unbounded groups where one uses.will now be rejected at
import time (fix: separate the groups with a mandatory, non-nullable
delimiter, or narrow.to an explicit character class); a pattern using
(?:...)/(?P<name>...)that was previously (incorrectly) rejected will
now import successfully. Lookaround groups ((?=...),(?!...)) keep
their existing, unchanged handling. - Fixed
Mp4Handler.embed()raised on astrpath instead of accepting
one like every other media handler, andPipeline.step()accepted any
object as a provider instead of validating it's aBaseProvider— a
non-provider value previously surfaced a confusing failure deep inside
run()instead of immediately at the call site (#224, #225).
genblaze-openai
- Added opt-in rate-limit backoff for
chat()/achat()and the vision
helpers viaretry_on_rate_limit=/retry_policy=kwargs, wrapping calls in
genblaze_core.providers.retry.call_with_rate_limit_retry(#221). A
follow-up in this same release disables the SDK's own internal retry when
genblaze already manages backoff on an internally-created client, closing a
double-retry (multiplicative wait) bug the initial opt-in introduced; a
caller-suppliedclient=keeps its own retry configuration untouched
(#221, #235). The identical feature and fix landed ingenblaze-google
(see below); currently wired intoopenai/googleonly — see
docs/features/llm-calls.md. - Docs confirmed
estimate_cost()already computed per-model pricing
correctly; the reported gap was a documentation error in
docs/reference/pricing-recipes.md, now corrected, plus added test
coverage pinning the existing (correct) behavior (#222, #223). No
production code changed.
genblaze-google
- Added the same opt-in rate-limit backoff described under
genblaze-openaiabove (#221, #235). - Added
GeminiImageProvider, a native Gemini image-generation provider
(google-gemini-imageentry point) alongside the existing Imagen provider,
sharing client construction via a newGoogleClientMixin(#205). - Fixed a probe-confirmed-
LIVEbut known-gated Imagen slug reported a
misleading authoritativeOKinstead ofOK_PROVISIONAL, mirroring the
same gmicloud fix below (#206). - Fixed
chat()/vision calls sent anImageURLContentinput as an
unsupported field instead of translating it to Gemini's
inline_data/file_datawire format (#217).
genblaze-gmicloud
- Fixed preflight validation didn't distinguish a known-catalog slug from
one confirmed callable with the caller's API key, reporting a misleading
authoritativeOKfor a probe-confirmed slug that isn't confirmed-callable
instead ofOK_PROVISIONAL(#193). Added a guard against a misconfigured
base_url/GMI_BASE_URLpointed at the wrong endpoint shape (a
silent-404 footgun), and an edit-mode fallback path.
genblaze-runway
- Fixed
image_to_videoon models that require an input image (e.g.
gen4_turbo,gen3a_turbo) now raises a clear, actionable error instead of
silently failing when no image is supplied; corrected the model catalog's
ratio literals, which were wrong pixel-dimension strings for several models
(#226).
genblaze-lmnt
- Fixed an unsupported
seedparameter was silently forwarded to
generate_detailedinstead of being dropped; it's now dropped with a
one-time warning so callers know to stop passing it (#207).
genblaze-cli
- Fixed
verify --fetchaccepted afile://URL with a remote authority
(e.g.file://evil-host/path) instead of rejecting it, and could leak
presigned-URL userinfo/credentials into output; both are now blocked/
redacted. Also dedupes redundant stream-hash computation on the same asset
(#214).
genblaze (umbrella)
- Fixed the umbrella's lazy
__getattr__lost the original install hint
to a generic message when propagatingOptionalDependencyErrorinstead of
preserving it (#213). - Added a
parquetextra re-exposinggenblaze-core[parquet], so
pip install "genblaze[parquet]"— the exact incantation
OptionalDependencyErrorprints forParquetSink— resolves instead of
failing with an unknown-extra error.
Packaging
- Fixed nine connectors' (
genblaze-assemblyai,-decart,
-elevenlabs,-google,-hume,-lmnt,-nvidia,-openai,
-stability-audio)genblaze-coredependency floor was raised to
>=0.3.7forlocal_file_url()users, but each package's own published
version wasn't bumped alongside it (#209) — apypi-pin-paritytrap that
would have blocked (not silently shipped) this release. Closed here by
bumping all nine to a new patch version. - Fixed
genblaze-openaiandgenblaze-googleimport
call_with_rate_limit_retry, new ingenblaze-core0.3.8 this release,
but still declared agenblaze-core>=0.3.7floor — the same class of gap
as the item above, catchable only because it's caught here rather than by
any automated gate (tools/prepare_release.pydoesn't check connector→core
floors against the symbols a connector actually imports). Both floors are
nowgenblaze-core>=0.3.8,<0.4.
Internal
- Fixed
install-verify's "Wait for PyPI to index the umbrella" pre-check
only polled for thegenblazeumbrella itself, butgenblaze[all]also
resolves the ~14 connector packages that propagate across PyPI's CDN
independently — so the pre-check could pass while a connector's simple-index
page was still stale, and the very nextpip install "genblaze[all]==$version"
false-red the job on a genuinely-healthy release (hit twice during the
v0.6.0 release, #189). The fresh install step itself now retries up to 5
times (30s apart) so transient propagation of any package is tolerated; a
truly missing/unresolvable package still fails the job after retries are
exhausted. The umbrella pre-check and the import-smoke invocation are
unchanged. Release tooling only — no packaged code changed. - Fixed the lint job's
ruffversion could drift from what contributors
run locally, producing false-red CI on a clean local run; pinned to
0.14.0(#212). - Fixed Dependabot could propose a major-version bump on a runtime
dependency, which this repo's pinning policy caps below the next major by
hand; Dependabot config now excludes major-version updates for runtime
deps (#216). - Fixed
tools/batch_cluster.pycould drop an in-flight dependency
blocker between clustering passes (#210). - Chore bumped the GitHub Actions dependency group (#191).