renderers 0.1.8.dev2__tar.gz → 0.1.8.dev26__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- renderers-0.1.8.dev26/.github/workflows/publish-dev.yml +104 -0
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/PKG-INFO +2 -2
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/pyproject.toml +10 -4
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/renderers/__init__.py +4 -0
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/renderers/_version.py +2 -2
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/renderers/base.py +529 -22
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/renderers/client.py +166 -68
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/renderers/deepseek_v3.py +131 -45
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/renderers/default.py +6 -1
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/renderers/glm45.py +190 -60
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/renderers/glm5.py +163 -54
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/renderers/gpt_oss.py +201 -14
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/renderers/kimi_k2.py +189 -76
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/renderers/kimi_k25.py +215 -75
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/renderers/laguna_xs2.py +161 -55
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/renderers/minimax_m2.py +251 -66
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/renderers/nemotron3.py +194 -70
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/renderers/qwen3.py +199 -72
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/renderers/qwen35.py +273 -117
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/renderers/qwen3_vl.py +201 -102
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/tests/test_client.py +227 -16
- renderers-0.1.8.dev26/tests/test_is_content.py +389 -0
- renderers-0.1.8.dev26/tests/test_kimi_k25_tool_schema.py +53 -0
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/tests/test_load_tokenizer_fastokens.py +44 -5
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/tests/test_multimodal.py +37 -0
- renderers-0.1.8.dev26/tests/test_tokens_per_message.py +325 -0
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/uv.lock +37 -3
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/.github/workflows/publish.yml +0 -0
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/.github/workflows/style.yml +0 -0
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/.github/workflows/test.yml +0 -0
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/.gitignore +0 -0
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/.pre-commit-config.yaml +0 -0
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/LICENSE +0 -0
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/README.md +0 -0
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/examples/README.md +0 -0
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/examples/sglang/multiturn_generate_sglang.py +0 -0
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/examples/sglang/online_multiturn_sglang.py +0 -0
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/examples/tinker/multiturn_generate_tinker.py +0 -0
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/examples/transformers/multiturn_generate_transformers.py +0 -0
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/examples/vllm/multiturn_generate_vllm.py +0 -0
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/renderers/parsers.py +0 -0
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/renderers/parsing.py +0 -0
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/renderers/qwen36.py +0 -0
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/tests/conftest.py +0 -0
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/tests/test_bridge.py +0 -0
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/tests/test_build_helpers.py +0 -0
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/tests/test_gpt_oss_harmony_parity.py +0 -0
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/tests/test_incremental.py +0 -0
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/tests/test_load_tokenizer.py +0 -0
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/tests/test_message_indices.py +0 -0
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/tests/test_parse_response.py +0 -0
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/tests/test_parse_response_robustness.py +0 -0
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/tests/test_parsers.py +0 -0
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/tests/test_preserve_thinking.py +0 -0
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/tests/test_qwen35_size_coverage.py +0 -0
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/tests/test_render_ids.py +0 -0
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/tests/test_roundtrip.py +0 -0
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/tests/test_sampled_mask.py +0 -0
- {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/tests/test_tool_arg_type_preservation.py +0 -0
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
name: Publish Dev
|
|
2
|
+
|
|
3
|
+
# Tag every commit on main as ``renderers-v<next>.dev<N>`` and publish the
|
|
4
|
+
# wheel to PyPI as a pre-release. ``<next>`` is the latest release tag with
|
|
5
|
+
# its patch bumped; ``<N>`` is the number of commits since that release so
|
|
6
|
+
# each main commit maps to a unique PEP 440 dev version.
|
|
7
|
+
#
|
|
8
|
+
# Building from the freshly-created tag means hatch-vcs resolves the version
|
|
9
|
+
# cleanly (no ``+gHASH`` local segment), which PyPI requires.
|
|
10
|
+
|
|
11
|
+
on:
|
|
12
|
+
push:
|
|
13
|
+
branches: [main]
|
|
14
|
+
|
|
15
|
+
concurrency:
|
|
16
|
+
group: publish-dev-${{ github.ref }}
|
|
17
|
+
cancel-in-progress: false
|
|
18
|
+
|
|
19
|
+
jobs:
|
|
20
|
+
tag:
|
|
21
|
+
runs-on: ubuntu-latest
|
|
22
|
+
permissions:
|
|
23
|
+
contents: write
|
|
24
|
+
outputs:
|
|
25
|
+
tag: ${{ steps.compute.outputs.tag }}
|
|
26
|
+
steps:
|
|
27
|
+
- uses: actions/checkout@v4
|
|
28
|
+
with:
|
|
29
|
+
fetch-depth: 0
|
|
30
|
+
|
|
31
|
+
- name: Compute next dev tag
|
|
32
|
+
id: compute
|
|
33
|
+
run: |
|
|
34
|
+
set -euo pipefail
|
|
35
|
+
LATEST_RELEASE=$(git tag --list 'renderers-v*' --sort=-v:refname \
|
|
36
|
+
| grep -Ev '(dev|rc|a[0-9]|b[0-9])' \
|
|
37
|
+
| head -1)
|
|
38
|
+
if [ -z "$LATEST_RELEASE" ]; then
|
|
39
|
+
echo "No release tag matching 'renderers-v<MAJOR.MINOR.PATCH>' found" >&2
|
|
40
|
+
exit 1
|
|
41
|
+
fi
|
|
42
|
+
BASE=${LATEST_RELEASE#renderers-v}
|
|
43
|
+
MAJOR=$(echo "$BASE" | cut -d. -f1)
|
|
44
|
+
MINOR=$(echo "$BASE" | cut -d. -f2)
|
|
45
|
+
PATCH=$(echo "$BASE" | cut -d. -f3)
|
|
46
|
+
NEXT="${MAJOR}.${MINOR}.$((PATCH + 1))"
|
|
47
|
+
N=$(git rev-list --count "${LATEST_RELEASE}..HEAD")
|
|
48
|
+
TAG="renderers-v${NEXT}.dev${N}"
|
|
49
|
+
echo "tag=${TAG}" >> "$GITHUB_OUTPUT"
|
|
50
|
+
echo "Computed tag: ${TAG} (base=${LATEST_RELEASE}, commits=${N})"
|
|
51
|
+
|
|
52
|
+
- name: Create and push tag
|
|
53
|
+
env:
|
|
54
|
+
TAG: ${{ steps.compute.outputs.tag }}
|
|
55
|
+
run: |
|
|
56
|
+
set -euo pipefail
|
|
57
|
+
if git ls-remote --exit-code --tags origin "refs/tags/${TAG}" >/dev/null 2>&1; then
|
|
58
|
+
echo "Tag ${TAG} already exists on origin — nothing to do" >&2
|
|
59
|
+
exit 0
|
|
60
|
+
fi
|
|
61
|
+
git config user.name 'github-actions[bot]'
|
|
62
|
+
git config user.email '41898282+github-actions[bot]@users.noreply.github.com'
|
|
63
|
+
git tag -a "$TAG" -m "Automated dev release ${TAG}"
|
|
64
|
+
git push origin "$TAG"
|
|
65
|
+
|
|
66
|
+
build:
|
|
67
|
+
needs: tag
|
|
68
|
+
runs-on: ubuntu-latest
|
|
69
|
+
permissions:
|
|
70
|
+
contents: read
|
|
71
|
+
steps:
|
|
72
|
+
- uses: actions/checkout@v4
|
|
73
|
+
with:
|
|
74
|
+
fetch-depth: 0
|
|
75
|
+
ref: refs/tags/${{ needs.tag.outputs.tag }}
|
|
76
|
+
|
|
77
|
+
- uses: astral-sh/setup-uv@v7
|
|
78
|
+
|
|
79
|
+
- name: Build renderers
|
|
80
|
+
run: uv build
|
|
81
|
+
|
|
82
|
+
- name: Upload dist artifacts
|
|
83
|
+
uses: actions/upload-artifact@v4
|
|
84
|
+
with:
|
|
85
|
+
name: dist-dev
|
|
86
|
+
path: dist/
|
|
87
|
+
if-no-files-found: error
|
|
88
|
+
retention-days: 7
|
|
89
|
+
|
|
90
|
+
publish:
|
|
91
|
+
needs: build
|
|
92
|
+
runs-on: ubuntu-latest
|
|
93
|
+
environment: pypi-prod
|
|
94
|
+
permissions:
|
|
95
|
+
id-token: write
|
|
96
|
+
steps:
|
|
97
|
+
- name: Download dist artifacts
|
|
98
|
+
uses: actions/download-artifact@v4
|
|
99
|
+
with:
|
|
100
|
+
name: dist-dev
|
|
101
|
+
path: dist/
|
|
102
|
+
|
|
103
|
+
- name: Publish to PyPI
|
|
104
|
+
uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b # v1.14.0
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: renderers
|
|
3
|
-
Version: 0.1.8.
|
|
3
|
+
Version: 0.1.8.dev26
|
|
4
4
|
Summary: Chat template renderers — deterministic message-to-token conversion for LLM training
|
|
5
5
|
License-Expression: Apache-2.0
|
|
6
6
|
License-File: LICENSE
|
|
7
7
|
Requires-Python: <3.14,>=3.10
|
|
8
|
-
Requires-Dist: fastokens>=0.
|
|
8
|
+
Requires-Dist: fastokens>=0.2.0
|
|
9
9
|
Requires-Dist: jinja2
|
|
10
10
|
Requires-Dist: numpy
|
|
11
11
|
Requires-Dist: openai-harmony>=0.0.8
|
|
@@ -26,10 +26,10 @@ dependencies = [
|
|
|
26
26
|
"openai-harmony>=0.0.8",
|
|
27
27
|
# Crusoe's Rust BPE tokenizer; ~10x faster encode vs HF's tokenizers.
|
|
28
28
|
# ``load_tokenizer`` patches it in by default for every supported model
|
|
29
|
-
# except a small denylist (DeepSeek-V3 family
|
|
30
|
-
#
|
|
31
|
-
#
|
|
32
|
-
"fastokens>=0.
|
|
29
|
+
# except a small denylist (DeepSeek-V3 family). The patch is bracketed
|
|
30
|
+
# around ``from_pretrained``, so subsequent ``AutoTokenizer`` calls
|
|
31
|
+
# outside the renderers package stay vanilla.
|
|
32
|
+
"fastokens>=0.2.0",
|
|
33
33
|
]
|
|
34
34
|
|
|
35
35
|
[tool.hatch.version]
|
|
@@ -68,6 +68,12 @@ dev = [
|
|
|
68
68
|
|
|
69
69
|
[tool.uv]
|
|
70
70
|
exclude-newer = "7 days"
|
|
71
|
+
# fastokens 0.2.0 was published on 2026-05-17 and contains the
|
|
72
|
+
# ``unpatch_transformers`` fix (crusoecloud/fastokens#32) needed for
|
|
73
|
+
# MiniMax-M2's slow→fast tokenizer conversion path. Exempting it from
|
|
74
|
+
# the project-wide 7-day cutoff lets the lockfile pick it up immediately
|
|
75
|
+
# while the rest of the dependency graph stays gated.
|
|
76
|
+
exclude-newer-package = { fastokens = false }
|
|
71
77
|
|
|
72
78
|
[tool.ty.environment]
|
|
73
79
|
python-version = "3.13"
|
|
@@ -28,6 +28,7 @@ from renderers.base import (
|
|
|
28
28
|
ToolCallParseStatus,
|
|
29
29
|
ToolSpec,
|
|
30
30
|
VideoPart,
|
|
31
|
+
attribute_text_segments,
|
|
31
32
|
build_training_sample,
|
|
32
33
|
build_trajectory_step,
|
|
33
34
|
create_renderer,
|
|
@@ -36,6 +37,7 @@ from renderers.base import (
|
|
|
36
37
|
reject_assistant_in_extension,
|
|
37
38
|
trim_to_turn_close,
|
|
38
39
|
)
|
|
40
|
+
from renderers.client import OverlongPromptError
|
|
39
41
|
from renderers.deepseek_v3 import DeepSeekV3Renderer
|
|
40
42
|
from renderers.default import DefaultRenderer
|
|
41
43
|
from renderers.glm5 import GLM5Renderer
|
|
@@ -69,6 +71,7 @@ __all__ = [
|
|
|
69
71
|
"MultiModalData",
|
|
70
72
|
"MultimodalRenderer",
|
|
71
73
|
"Nemotron3Renderer",
|
|
74
|
+
"OverlongPromptError",
|
|
72
75
|
"ParsedResponse",
|
|
73
76
|
"ParsedToolCall",
|
|
74
77
|
"PlaceholderRange",
|
|
@@ -88,6 +91,7 @@ __all__ = [
|
|
|
88
91
|
"ToolSpec",
|
|
89
92
|
"VideoPart",
|
|
90
93
|
"__version__",
|
|
94
|
+
"attribute_text_segments",
|
|
91
95
|
"build_training_sample",
|
|
92
96
|
"build_trajectory_step",
|
|
93
97
|
"create_renderer",
|
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '0.1.8.
|
|
22
|
-
__version_tuple__ = version_tuple = (0, 1, 8, '
|
|
21
|
+
__version__ = version = '0.1.8.dev26'
|
|
22
|
+
__version_tuple__ = version_tuple = (0, 1, 8, 'dev26')
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|