renderers 0.1.7__tar.gz → 0.1.8.dev0__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 (49) hide show
  1. {renderers-0.1.7 → renderers-0.1.8.dev0}/.github/workflows/publish.yml +4 -15
  2. {renderers-0.1.7 → renderers-0.1.8.dev0}/.gitignore +2 -0
  3. {renderers-0.1.7 → renderers-0.1.8.dev0}/PKG-INFO +1 -1
  4. {renderers-0.1.7 → renderers-0.1.8.dev0}/pyproject.toml +25 -2
  5. {renderers-0.1.7 → renderers-0.1.8.dev0}/renderers/__init__.py +9 -0
  6. renderers-0.1.8.dev0/renderers/_version.py +24 -0
  7. {renderers-0.1.7 → renderers-0.1.8.dev0}/renderers/client.py +9 -2
  8. {renderers-0.1.7 → renderers-0.1.8.dev0}/renderers/kimi_k25.py +1 -1
  9. {renderers-0.1.7 → renderers-0.1.8.dev0}/renderers/qwen35.py +1 -1
  10. {renderers-0.1.7 → renderers-0.1.8.dev0}/renderers/qwen3_vl.py +1 -1
  11. {renderers-0.1.7 → renderers-0.1.8.dev0}/.github/workflows/style.yml +0 -0
  12. {renderers-0.1.7 → renderers-0.1.8.dev0}/.github/workflows/test.yml +0 -0
  13. {renderers-0.1.7 → renderers-0.1.8.dev0}/.pre-commit-config.yaml +0 -0
  14. {renderers-0.1.7 → renderers-0.1.8.dev0}/README.md +0 -0
  15. {renderers-0.1.7 → renderers-0.1.8.dev0}/examples/README.md +0 -0
  16. {renderers-0.1.7 → renderers-0.1.8.dev0}/examples/sglang/multiturn_generate_sglang.py +0 -0
  17. {renderers-0.1.7 → renderers-0.1.8.dev0}/examples/tinker/multiturn_generate_tinker.py +0 -0
  18. {renderers-0.1.7 → renderers-0.1.8.dev0}/examples/transformers/multiturn_generate_transformers.py +0 -0
  19. {renderers-0.1.7 → renderers-0.1.8.dev0}/examples/vllm/multiturn_generate_vllm.py +0 -0
  20. {renderers-0.1.7 → renderers-0.1.8.dev0}/renderers/base.py +0 -0
  21. {renderers-0.1.7 → renderers-0.1.8.dev0}/renderers/deepseek_v3.py +0 -0
  22. {renderers-0.1.7 → renderers-0.1.8.dev0}/renderers/default.py +0 -0
  23. {renderers-0.1.7 → renderers-0.1.8.dev0}/renderers/glm45.py +0 -0
  24. {renderers-0.1.7 → renderers-0.1.8.dev0}/renderers/glm5.py +0 -0
  25. {renderers-0.1.7 → renderers-0.1.8.dev0}/renderers/gpt_oss.py +0 -0
  26. {renderers-0.1.7 → renderers-0.1.8.dev0}/renderers/kimi_k2.py +0 -0
  27. {renderers-0.1.7 → renderers-0.1.8.dev0}/renderers/minimax_m2.py +0 -0
  28. {renderers-0.1.7 → renderers-0.1.8.dev0}/renderers/nemotron3.py +0 -0
  29. {renderers-0.1.7 → renderers-0.1.8.dev0}/renderers/parsers.py +0 -0
  30. {renderers-0.1.7 → renderers-0.1.8.dev0}/renderers/parsing.py +0 -0
  31. {renderers-0.1.7 → renderers-0.1.8.dev0}/renderers/qwen3.py +0 -0
  32. {renderers-0.1.7 → renderers-0.1.8.dev0}/renderers/qwen36.py +0 -0
  33. {renderers-0.1.7 → renderers-0.1.8.dev0}/tests/conftest.py +0 -0
  34. {renderers-0.1.7 → renderers-0.1.8.dev0}/tests/test_bridge.py +0 -0
  35. {renderers-0.1.7 → renderers-0.1.8.dev0}/tests/test_build_helpers.py +0 -0
  36. {renderers-0.1.7 → renderers-0.1.8.dev0}/tests/test_client.py +0 -0
  37. {renderers-0.1.7 → renderers-0.1.8.dev0}/tests/test_gpt_oss_harmony_parity.py +0 -0
  38. {renderers-0.1.7 → renderers-0.1.8.dev0}/tests/test_incremental.py +0 -0
  39. {renderers-0.1.7 → renderers-0.1.8.dev0}/tests/test_load_tokenizer.py +0 -0
  40. {renderers-0.1.7 → renderers-0.1.8.dev0}/tests/test_message_indices.py +0 -0
  41. {renderers-0.1.7 → renderers-0.1.8.dev0}/tests/test_multimodal.py +0 -0
  42. {renderers-0.1.7 → renderers-0.1.8.dev0}/tests/test_parse_response.py +0 -0
  43. {renderers-0.1.7 → renderers-0.1.8.dev0}/tests/test_parse_response_robustness.py +0 -0
  44. {renderers-0.1.7 → renderers-0.1.8.dev0}/tests/test_parsers.py +0 -0
  45. {renderers-0.1.7 → renderers-0.1.8.dev0}/tests/test_preserve_thinking.py +0 -0
  46. {renderers-0.1.7 → renderers-0.1.8.dev0}/tests/test_qwen35_size_coverage.py +0 -0
  47. {renderers-0.1.7 → renderers-0.1.8.dev0}/tests/test_render_ids.py +0 -0
  48. {renderers-0.1.7 → renderers-0.1.8.dev0}/tests/test_roundtrip.py +0 -0
  49. {renderers-0.1.7 → renderers-0.1.8.dev0}/uv.lock +0 -0
@@ -41,6 +41,10 @@ jobs:
41
41
  TAG="$PUSHED_REF"
42
42
  fi
43
43
 
44
+ # The package version is derived from this tag by hatch-vcs
45
+ # at build time (see [tool.hatch.version] in pyproject.toml).
46
+ # We only need to validate the tag shape — there's no
47
+ # ``project.version`` field to cross-check anymore.
44
48
  case "$TAG" in
45
49
  renderers-v*) ;;
46
50
  *)
@@ -49,21 +53,6 @@ jobs:
49
53
  ;;
50
54
  esac
51
55
 
52
- VERSION="${TAG#renderers-v}"
53
- FILE_VERSION=$(python - <<'PY'
54
- import tomllib
55
- from pathlib import Path
56
- with Path('pyproject.toml').open('rb') as f:
57
- data = tomllib.load(f)
58
- print(data['project']['version'])
59
- PY
60
- )
61
-
62
- if [ "$FILE_VERSION" != "$VERSION" ]; then
63
- echo "Version mismatch: tag requests '$VERSION' but pyproject.toml defines '$FILE_VERSION'" >&2
64
- exit 1
65
- fi
66
-
67
56
  echo "tag=$TAG" >> "$GITHUB_OUTPUT"
68
57
 
69
58
  - uses: astral-sh/setup-uv@v7
@@ -14,6 +14,8 @@ __pycache__/
14
14
  *.pyc
15
15
  *.pyo
16
16
  *.pyd
17
+ # generated by hatch-vcs at build time (see [tool.hatch.build.hooks.vcs])
18
+ renderers/_version.py
17
19
 
18
20
  # tooling caches
19
21
  .pytest_cache/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: renderers
3
- Version: 0.1.7
3
+ Version: 0.1.8.dev0
4
4
  Summary: Chat template renderers — deterministic message-to-token conversion for LLM training
5
5
  Requires-Python: <3.14,>=3.10
6
6
  Requires-Dist: jinja2
@@ -1,10 +1,14 @@
1
1
  [build-system]
2
- requires = ["hatchling"]
2
+ requires = ["hatchling", "hatch-vcs"]
3
3
  build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "renderers"
7
- version = "0.1.7"
7
+ # Derived from git tags by hatch-vcs (see [tool.hatch.version] below).
8
+ # Untagged commits get PEP 440 dev versions like ``0.1.8.dev3+g4c877be4``
9
+ # so any commit is uniquely installable; tagged commits get clean
10
+ # release versions like ``0.1.8``.
11
+ dynamic = ["version"]
8
12
  description = "Chat template renderers — deterministic message-to-token conversion for LLM training"
9
13
  readme = "README.md"
10
14
  requires-python = ">=3.10,<3.14"
@@ -20,6 +24,25 @@ dependencies = [
20
24
  "openai-harmony>=0.0.8",
21
25
  ]
22
26
 
27
+ [tool.hatch.version]
28
+ source = "vcs"
29
+ # Tags look like ``renderers-v0.1.8`` (prefix matches the publish.yml
30
+ # release contract); strip the prefix to get a PEP 440 version. The
31
+ # regex accepts any PEP 440-valid suffix after the prefix so we can
32
+ # tag pre-releases like ``renderers-v0.2.0rc1`` later if needed.
33
+ tag-pattern = '^renderers-v(?P<version>.+)$'
34
+ # Used when building from a context without VCS metadata (e.g. an
35
+ # sdist consumed by a downstream that doesn't ship .git). Real
36
+ # builds from a checkout get the resolved version; this fallback
37
+ # only fires when the resolver has nothing to go on.
38
+ fallback-version = "0.0.0"
39
+
40
+ [tool.hatch.build.hooks.vcs]
41
+ # Write the resolved version to a Python file so it can be inspected
42
+ # at runtime via ``renderers.__version__`` without re-parsing the
43
+ # wheel metadata.
44
+ version-file = "renderers/_version.py"
45
+
23
46
  [tool.hatch.build.targets.wheel]
24
47
  packages = ["renderers"]
25
48
 
@@ -1,3 +1,11 @@
1
+ try:
2
+ from renderers._version import __version__
3
+ except ImportError:
4
+ # Source checkout without a built artifact (e.g. editable install
5
+ # before the first ``uv build`` populates ``_version.py``). Real
6
+ # installs always have it.
7
+ __version__ = "0+unknown"
8
+
1
9
  from renderers.base import (
2
10
  Content,
3
11
  ContentPart,
@@ -73,6 +81,7 @@ __all__ = [
73
81
  "ToolCallFunction",
74
82
  "ToolSpec",
75
83
  "VideoPart",
84
+ "__version__",
76
85
  "build_training_sample",
77
86
  "build_trajectory_step",
78
87
  "create_renderer",
@@ -0,0 +1,24 @@
1
+ # file generated by vcs-versioning
2
+ # don't change, don't track in version control
3
+ from __future__ import annotations
4
+
5
+ __all__ = [
6
+ "__version__",
7
+ "__version_tuple__",
8
+ "version",
9
+ "version_tuple",
10
+ "__commit_id__",
11
+ "commit_id",
12
+ ]
13
+
14
+ version: str
15
+ __version__: str
16
+ __version_tuple__: tuple[int | str, ...]
17
+ version_tuple: tuple[int | str, ...]
18
+ commit_id: str | None
19
+ __commit_id__: str | None
20
+
21
+ __version__ = version = '0.1.8.dev0'
22
+ __version_tuple__ = version_tuple = (0, 1, 8, 'dev0')
23
+
24
+ __commit_id__ = commit_id = None
@@ -263,8 +263,15 @@ def _build_qwen_vl_features(
263
263
 
264
264
  image_items = mm_data.mm_items.get("image") or []
265
265
  if image_items:
266
- pixel_values = torch.cat([it["pixel_values"] for it in image_items], dim=0)
267
- image_grid_thw = torch.cat([it["image_grid_thw"] for it in image_items], dim=0)
266
+ # mm_items now ship numpy arrays (the renderer is torch-free);
267
+ # convert at this vLLM-glue boundary where torch is already a
268
+ # hard dependency.
269
+ pixel_values = torch.cat(
270
+ [torch.as_tensor(it["pixel_values"]) for it in image_items], dim=0
271
+ )
272
+ image_grid_thw = torch.cat(
273
+ [torch.as_tensor(it["image_grid_thw"]) for it in image_items], dim=0
274
+ )
268
275
  hf_inputs = BatchFeature(
269
276
  data={"pixel_values": pixel_values, "image_grid_thw": image_grid_thw}
270
277
  )
@@ -621,7 +621,7 @@ class KimiK25Renderer:
621
621
  img_proc = proc.image_processor
622
622
  # Kimi's vision processor takes a media-dict shape, not raw PIL.
623
623
  media_item = {"type": "image", "image": pil}
624
- out = img_proc.preprocess([media_item], return_tensors="pt")
624
+ out = img_proc.preprocess([media_item], return_tensors="np")
625
625
  # Patch count via the processor's own calculator (matches the
626
626
  # model's per-patch attention count); kept for debugging.
627
627
  num_patches = int(img_proc.media_tokens_calculator(media_item))
@@ -182,7 +182,7 @@ class Qwen35Renderer:
182
182
  out, num_image_tokens = cached
183
183
  return pil, out, num_image_tokens, h
184
184
  proc = self._get_processor()
185
- out = proc.image_processor(images=[pil], return_tensors="pt")
185
+ out = proc.image_processor(images=[pil], return_tensors="np")
186
186
  grid_thw = out["image_grid_thw"][0]
187
187
  merge_size = proc.image_processor.merge_size
188
188
  num_image_tokens = int(grid_thw.prod()) // (merge_size * merge_size)
@@ -357,7 +357,7 @@ class Qwen3VLRenderer:
357
357
  out, num_image_tokens = cached
358
358
  return pil, out, num_image_tokens, h
359
359
  proc = self._get_processor()
360
- out = proc.image_processor(images=[pil], return_tensors="pt")
360
+ out = proc.image_processor(images=[pil], return_tensors="np")
361
361
  grid_thw = out["image_grid_thw"][0]
362
362
  merge_size = proc.image_processor.merge_size
363
363
  num_image_tokens = int(grid_thw.prod()) // (merge_size * merge_size)
File without changes
File without changes