Skip to content

Fix to_sharegpt optional block rendering "None" for missing extra columns#6827

Open
vineethsaivs wants to merge 2 commits into
unslothai:mainfrom
vineethsaivs:fix/to-sharegpt-optional-none-column
Open

Fix to_sharegpt optional block rendering "None" for missing extra columns#6827
vineethsaivs wants to merge 2 commits into
unslothai:mainfrom
vineethsaivs:fix/to-sharegpt-optional-none-column

Conversation

@vineethsaivs

Copy link
Copy Markdown
Contributor

What

to_sharegpt(..., merged_prompt=...) lets an optional [[...]] block reference more than one column, e.g. merged_prompt="Location: [[{city}, {country}]]". Only the first column in a block gates whether the block is rendered. When the block is kept, str.format is called with every referenced column, so a later column whose value is None renders as the literal string "None" in the emitted training text:

# merged_prompt = "Location: [[{city}, {country}]] end"
# row: city="Paris", country=None
# ->  "Location: Paris, None end"      # the literal "None" leaks in

Single-column blocks are unaffected, because the sole column is also the gate and is emptied before format is ever reached.

Fix

Coerce None to "" when building the format arguments for a kept block, so an absent extra column renders as empty ("Location: Paris, end"). The first-column gating semantics are left unchanged.

Test

tests/python/test_to_sharegpt_optional_none.py extracts the pure-Python formatter builders (_parse_combined_prompt, _create_formatter) via ast, so it runs on CPU with no import unsloth (same pattern as tests/python/test_change_system_message.py). It fails before the fix ("Location: Paris, None end") and passes after, and asserts the all-present, empty-gate, and single-column cases are unchanged.

An optional [[...]] block in merged_prompt may reference more than one
column, but only the first column gates the block. When the block is
kept, str.format is called with every referenced column, so a later
column whose value is None renders as the literal string "None" in the
emitted training text (for example [[{city}, {country}]] with a missing
country produces "Paris, None"). Single-column blocks are unaffected
because their sole column is also the gate and is emptied first.

Coerce None values to "" when building the format arguments so absent
extra columns render as empty. Add a regression test that extracts the
pure-Python formatter builders via ast (no GPU / no unsloth import).

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request updates the chat template processing in unsloth/chat_templates.py to coerce missing (None) columns to empty strings ("") within optional blocks, preventing them from rendering as the literal string "None". Additionally, a new test suite tests/python/test_to_sharegpt_optional_none.py has been added to verify this behavior under various scenarios. I have no feedback to provide.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

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