Skip to content

ci: bump pypa/gh-action-pypi-publish to v1.14.2 for metadata 2.5 - #135

Merged
hallerite merged 1 commit into
mainfrom
fix/publish-metadata-2.5
Aug 24, 2026
Merged

ci: bump pypa/gh-action-pypi-publish to v1.14.2 for metadata 2.5#135
hallerite merged 1 commit into
mainfrom
fix/publish-metadata-2.5

Conversation

@hallerite

@hallerite hallerite commented Aug 24, 2026

Copy link
Copy Markdown
Member

Why

The Publish Dev run on main @ 1a5bd3b failed at the Publish to PyPI step:

InvalidDistribution: Invalid distribution metadata: '2.5' is not a valid metadata version

Hatchling (unpinned in build-system.requires) now emits core packaging metadata v2.5, which the Twine bundled in gh-action-pypi-publish v1.14.0 rejects. The release publish.yml builds the same way, so the next renderers-v* tag would fail identically.

Fix

Bump the SHA pin in both publish.yml and publish-dev.yml to v1.14.2 (dc37677), which bundles Twine v7 with metadata 2.5 support (release notes).

This unblocks the v0.1.10 release.

🤖 Generated with Claude Code


Note

Low Risk
CI-only dependency pin on the publish step; no application or packaging logic changes beyond restoring successful PyPI uploads.

Overview
Bumps the SHA-pinned pypa/gh-action-pypi-publish action from v1.14.0 to v1.14.2 in both publish-dev.yml and publish.yml.

This fixes PyPI publish failures where builds produced by current Hatchling emit core metadata v2.5, which the Twine bundled in v1.14.0 rejects (InvalidDistribution: '2.5' is not a valid metadata version). v1.14.2 ships Twine v7 with metadata 2.5 support, so dev publishes on main and tagged renderers-v* releases can upload again.

Reviewed by Cursor Bugbot for commit d5b613c. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Bump pypa/gh-action-pypi-publish to v1.14.2 in publish workflows

Updates the pinned action SHA from v1.14.0 to v1.14.2 in both publish-dev.yml and publish.yml to support metadata 2.5. The publish step behavior is otherwise unchanged.

Macroscope summarized d5b613c.

Hatchling now emits core packaging metadata v2.5, which the Twine
bundled in v1.14.0 rejects (InvalidDistribution), breaking both the
dev and release publish jobs. v1.14.2 bundles Twine v7, which accepts
metadata 2.5.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@macroscopeapp

macroscopeapp Bot commented Aug 24, 2026

Copy link
Copy Markdown

Approvability

Verdict: Approved at d5b613c

Macroscope's review found this PR approvable — This is a small, self-contained CI dependency update in the existing development and release PyPI publishing jobs, enabling metadata 2.5 without changing triggers, permissions, artifacts, targets, or application behavior. Both changes are pinned to the same newer action revision.

Notes:

  • Macroscope's correctness review did not run, so approvability was decided on eligibility alone.

You can add or adjust custom eligibility rules. Learn more.

@hallerite
hallerite merged commit cb82439 into main Aug 24, 2026
7 checks passed
@hallerite
hallerite deleted the fix/publish-metadata-2.5 branch August 24, 2026 18:16
joanvelja added a commit to joanvelja/renderers that referenced this pull request Aug 25, 2026
* feat: add Nemotron 3.5 (Lightning) renderer

* chore: drop NVFP4 map entry, BF16 only

* feat(laguna): route poolside/Laguna-S-2.1 to the XS-2.1 renderer

S-2.1 is a larger sibling of XS-2.1 (48 layers, hidden 3072, top-10 of
256 experts) but ships a byte-identical chat_template.jinja and tokenizer
(same special tokens/ids, same vocab). It reuses LagunaXS21Renderer via an
exact-match MODEL_RENDERER_MAP entry; no new renderer/config/parser needed.

Added to the shared render-parity matrices (config-parity, is_content,
sampled_mask); token-exact parity against apply_chat_template verified for
both enable_thinking polarities across all conversation shapes.

* fix(laguna): give Laguna-S-2.1 its own renderer for its distinct template

The initial routing (cdc158e) assumed S-2.1 shipped a byte-identical chat
template to XS-2.1 and reused LagunaXS21Renderer. It doesn't: S-2.1 shares
XS-2.1's tokenizer (same vocab/merges/special tokens) but its template
defaults enable_thinking to True (XS-2.1 defaults False) and adds a
preserve_thinking kwarg, widening the reasoning-display gate to
`enable_thinking or preserve_thinking`. Reusing the XS-2.1 renderer mismatched
apply_chat_template on the default flag (bare `</think>` vs empty
`<think></think>` wrapper), failing test_render_ids / test_build_helpers.

The config-parity barrage missed this because it always sets enable_thinking
explicitly, never exercising the differing default.

Add LagunaS21RendererConfig (enable_thinking=True, preserve_thinking=False) and
LagunaS21Renderer, a thin LagunaXS21Renderer subclass that overrides only the
reasoning-display gate. Route poolside/Laguna-S-2.1 to it. The token format is
otherwise identical, so everything else is inherited.

Verified token-exact against apply_chat_template for all enable_thinking ×
preserve_thinking combinations; added tests/test_laguna_s21.py for the
S-2.1-specific behaviours the shared barrage can't reach.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* docs(laguna): list S-2.1 in the renderer config tables

The renderer/config landed in the previous commit but was missing from the
user-facing listings, which now cover its sibling M.1 (PrimeIntellect-ai#120): the README
renderer roster, the per-renderer config table, and the thinking_retention
default table.

`LagunaS21RendererConfig.template_field_names()` is
{enable_thinking, preserve_thinking}, and the renderer inherits XS.2's
``all`` retention default, so it joins that row.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* less yapping

* refactor(laguna): move LagunaS21Renderer to its own module

Review feedback: S-2.1 didn't belong in laguna_xs2.py. Pure code motion to
renderers/laguna_s21.py, following the qwen35.py -> qwen36.py precedent for a
cross-module renderer subclass. Updated the _LAZY_RENDERERS entry, the
_populate_registry import, the config docstring cross-ref, and the test import.

laguna_xs2.py still imports LagunaS21RendererConfig for two config-union
annotations — the base __init__s must accept an S-2.1 config forwarded up
through super().

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Add Gemma 4 renderer (PrimeIntellect-ai#123)

* Add Gemma 4 renderer

* Fix multimodal processor loading in CI

* Fix Gemma 4 post-tool thinking parsing

* fix(gemma4): classify media content parts before text

`_emit_content` dispatched on `"text" in item` before `_is_image_part`.
HF Arrow schema unification (`Dataset.from_list` over a heterogeneous
content list) adds `text: None` to every image part, so any image that
round-tripped through a dataset took the text branch, emitted nothing,
and never expanded its soft tokens. Reorder to media-first, matching
`qwen35.py` and `kimi_k25.py`.

Two adjacent instances of the same hazard:

- `_emit_tool_response_body` was safe from the zombie key (strict
  `== "text"`) but silently dropped *untyped* text parts; align it on
  the same dispatch order and text acceptance.
- the system-content text-only guard accepted a schema-unified image
  part via `"text" in item` and emitted a stray space instead of
  raising; reject media parts explicitly.

Normalizing each part to `dict` also lets `_is_image_part` (which
requires `isinstance(item, dict)`) see Mapping-but-not-dict parts,
which `_emit_content` otherwise accepts.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(gemma4): address renderer stability review

* test(gemma4): carve out intentional template deviation

* fix(gemma4): preserve post-tool token identity

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>

* feat(renderers): add Inkling and Inkling-Small (PrimeIntellect-ai#103)

* feat(renderers): add Inkling renderer (text + image + audio)

Implement InklingRenderer for thinkingmachines/Inkling — a token-delimited
vision+audio model whose chat template is a flat stream of role-tagged,
<|end_message|>-terminated blocks (no BOS) with a one-off "Thinking effort
level: {N}" system line and <|content_model_end_sampling|> as the assistant
close/eos.

- Text / tools / reasoning / reasoning_effort: byte-parity with
  apply_chat_template across all shapes (effort labels + raw floats, tool
  cycles, multi-tool-call, content=None, tool-name resolution via
  tool_call_id).
- Image + audio: byte-parity with the native InklingProcessor, including the
  Qwen-VL-style placeholder expansion (image -> num_patches image pads, audio
  -> one audio pad per mel frame); ships pixel_values / audio_input_ids in
  MultiModalData with exact placeholder anchoring.
- Full parse_response (native-JSON tool args, types preserved) and
  bridge_to_next_turn (mm carry-forward; refuses tool messages needing
  cross-turn name resolution).

The InklingProcessor is native in transformers >= 5.14 (merged upstream
2026-07-15), so it loads without trust_remote_code. Bump the transformers
floor to >=5.14.0 and fast-track it past the 7-day uv exclude-newer cooldown
(drop the fast-track once 5.14.x clears the window). The full existing suite
was re-validated on 5.14.1 with no regressions.

Wiring: InklingRendererConfig (reasoning_effort str|float, validated),
MODEL_RENDERER_MAP, MULTIMODAL_MODELS={"image","audio"}, registry, __init__
exports. Tests: tests/test_inkling.py plus Inkling rows in the shared
render/config-parity/multimodal matrices (extended with an "inkling" family
and an audio modality kit). Docs updated.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* style(renderers): trim narrative comments on Inkling wiring

Condense the verbose rationale comments added with the Inkling renderer
(MODEL_RENDERER_MAP / MULTIMODAL_MODELS entries, INKLING_EFFORT_MAP, the
transformers pin, and the shared-test rows) to terse one-liners matching
the surrounding style. Comments only — no behavior change.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(inkling): address Bugbot review — bridge mutation + audio hash

- bridge_to_next_turn copied only the outer mm_data dicts, so appending a
  carried-forward modality's items mutated the caller's
  previous_multi_modal_data lists in place. Copy the per-modality lists too.
  Adds a regression test (test_inkling_bridge_does_not_mutate_prior_mm_data).
- _audio_hash now folds in the sampling rate, so mm_hashes["audio"] uniquely
  identifies the clip (matching the processor cache key); identical samples
  at different rates no longer collide as media IDs.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat(inkling): support Inkling-Small

* fix(inkling): address compatibility review

* fix(inkling): load input_image content parts

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* Enforce explicit chat-template kwarg allowlists (PrimeIntellect-ai#126)

* feat: add Qwen3.8 27B renderer (PrimeIntellect-ai#130)

* ci: bump pypa/gh-action-pypi-publish to v1.14.2 for metadata 2.5 (PrimeIntellect-ai#135)

---------

Co-authored-by: eexwhyzee <13672394+eexwhyzee@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: hallerite <git@hallerite.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant