fix(tokenizer): accept the OpenAI developer role (map to system for templates without it) - #391
fix(tokenizer): accept the OpenAI developer role (map to system for templates without it)#391gdevenyi wants to merge 1 commit into
Conversation
…emplates without it) Clients such as pi send the system prompt with role "developer" by default (OpenAI's current spelling of "system"). Most chat templates do not know the role and raise "Unexpected message role", which the server returns as a 400. Map developer to system before rendering unless the template spells the role itself (gpt-oss does). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0173pf9k9fSVtwbm3f898HDt
|
Re-tested against current main ( Method. This PR's head merged onto main, then the full Result: 1206 passed, 350 skipped, no new failures. The +1 over main are this PR's own tests, and they ran (not skipped). 🤖 Generated with Claude Code |
What this fixes
A request whose system prompt uses the OpenAI
developerrole (the current spelling ofsystem; pi sends it by default foropenai-completionsproviders,compat.supportsDeveloperRole: true) fails with400 could not encode request: Unexpected message role.on every model whose chat template does not spell the role, which is most of them (Qwen3.8-Flash-Next, Qwen3.x, GLM, ...). The template raises, the server relays it.TokenizeManager._rendernow mapsdevelopertosystembeforeapply_chat_template, unless the template mentionsdeveloperitself (gpt-oss renders the two roles differently and keeps its input). The mapping copies the message; the request is not mutated.Testing
tests/tokenizer/test_tokenize.py::test_developer_role_maps_to_system_unless_the_template_knows_it.{"role": "developer", ...}went from the 400 above to the sameprompt_tokensas thesystemspelling.🤖 Generated with Claude Code
https://claude.ai/code/session_0173pf9k9fSVtwbm3f898HDt