From 80a2bfcfd79a7ef7fccf6732f7da4f9cb74bcc93 Mon Sep 17 00:00:00 2001 From: Tran Hoang Nguyen Date: Mon, 11 May 2026 15:57:28 +0700 Subject: [PATCH] fix: normalize developer role to system for OpenAI-format providers (#1011) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Deepseek API (and likely other providers) reject messages with role: 'developer' — only accept system, user, assistant, tool. filterToOpenAIFormat() normalizes content blocks but never touched message roles, so developer passed through unmodified and caused 400 errors (issue #773). Fix: add one-line developer → system mapping in filterToOpenAIFormat() before role-specific logic. This is the common normalization point called for all targetFormat=openai providers (Deepseek, Groq, Mistral, Perplexity, Together, Fireworks, Cerebras, xAI, NVIDIA, etc.) Closes #773 --- open-sse/translator/helpers/openaiHelper.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/open-sse/translator/helpers/openaiHelper.js b/open-sse/translator/helpers/openaiHelper.js index 0577cfc..a4c3f8a 100644 --- a/open-sse/translator/helpers/openaiHelper.js +++ b/open-sse/translator/helpers/openaiHelper.js @@ -10,6 +10,9 @@ export function filterToOpenAIFormat(body) { if (!body.messages || !Array.isArray(body.messages)) return body; body.messages = body.messages.map(msg => { + // Normalize developer role to system (many providers don't support developer) + if (msg.role === "developer") msg = { ...msg, role: "system" }; + // Keep tool messages as-is (OpenAI format) if (msg.role === "tool") return msg;