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.
Files changed (59) hide show
  1. renderers-0.1.8.dev26/.github/workflows/publish-dev.yml +104 -0
  2. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/PKG-INFO +2 -2
  3. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/pyproject.toml +10 -4
  4. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/renderers/__init__.py +4 -0
  5. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/renderers/_version.py +2 -2
  6. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/renderers/base.py +529 -22
  7. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/renderers/client.py +166 -68
  8. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/renderers/deepseek_v3.py +131 -45
  9. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/renderers/default.py +6 -1
  10. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/renderers/glm45.py +190 -60
  11. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/renderers/glm5.py +163 -54
  12. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/renderers/gpt_oss.py +201 -14
  13. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/renderers/kimi_k2.py +189 -76
  14. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/renderers/kimi_k25.py +215 -75
  15. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/renderers/laguna_xs2.py +161 -55
  16. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/renderers/minimax_m2.py +251 -66
  17. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/renderers/nemotron3.py +194 -70
  18. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/renderers/qwen3.py +199 -72
  19. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/renderers/qwen35.py +273 -117
  20. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/renderers/qwen3_vl.py +201 -102
  21. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/tests/test_client.py +227 -16
  22. renderers-0.1.8.dev26/tests/test_is_content.py +389 -0
  23. renderers-0.1.8.dev26/tests/test_kimi_k25_tool_schema.py +53 -0
  24. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/tests/test_load_tokenizer_fastokens.py +44 -5
  25. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/tests/test_multimodal.py +37 -0
  26. renderers-0.1.8.dev26/tests/test_tokens_per_message.py +325 -0
  27. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/uv.lock +37 -3
  28. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/.github/workflows/publish.yml +0 -0
  29. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/.github/workflows/style.yml +0 -0
  30. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/.github/workflows/test.yml +0 -0
  31. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/.gitignore +0 -0
  32. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/.pre-commit-config.yaml +0 -0
  33. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/LICENSE +0 -0
  34. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/README.md +0 -0
  35. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/examples/README.md +0 -0
  36. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/examples/sglang/multiturn_generate_sglang.py +0 -0
  37. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/examples/sglang/online_multiturn_sglang.py +0 -0
  38. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/examples/tinker/multiturn_generate_tinker.py +0 -0
  39. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/examples/transformers/multiturn_generate_transformers.py +0 -0
  40. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/examples/vllm/multiturn_generate_vllm.py +0 -0
  41. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/renderers/parsers.py +0 -0
  42. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/renderers/parsing.py +0 -0
  43. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/renderers/qwen36.py +0 -0
  44. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/tests/conftest.py +0 -0
  45. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/tests/test_bridge.py +0 -0
  46. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/tests/test_build_helpers.py +0 -0
  47. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/tests/test_gpt_oss_harmony_parity.py +0 -0
  48. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/tests/test_incremental.py +0 -0
  49. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/tests/test_load_tokenizer.py +0 -0
  50. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/tests/test_message_indices.py +0 -0
  51. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/tests/test_parse_response.py +0 -0
  52. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/tests/test_parse_response_robustness.py +0 -0
  53. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/tests/test_parsers.py +0 -0
  54. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/tests/test_preserve_thinking.py +0 -0
  55. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/tests/test_qwen35_size_coverage.py +0 -0
  56. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/tests/test_render_ids.py +0 -0
  57. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/tests/test_roundtrip.py +0 -0
  58. {renderers-0.1.8.dev2 → renderers-0.1.8.dev26}/tests/test_sampled_mask.py +0 -0
  59. {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.dev2
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.1.1
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, MiniMax-M2 family). The
30
- # patch is bracketed around ``from_pretrained``, so subsequent
31
- # ``AutoTokenizer`` calls outside the renderers package stay vanilla.
32
- "fastokens>=0.1.1",
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.dev2'
22
- __version_tuple__ = version_tuple = (0, 1, 8, 'dev2')
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