From e3a19f67b57d005ee44457fd2d1ca42c2eb5b0ee Mon Sep 17 00:00:00 2001 From: Firat Sertgoz Date: Tue, 27 Jan 2026 13:25:34 +0400 Subject: [PATCH] fix(nearai): disable developer role for Near AI provider Near AI's OpenAI-compatible API doesn't support the `developer` role that OpenAI uses for reasoning models. This causes 400 errors when using GPT-OSS-120B and GLM-4.7 models. Add nearai provider and cloud-api.near.ai baseUrl to the model compatibility check that sets supportsDeveloperRole: false, which converts developer messages to system messages before API calls. Co-Authored-By: Claude Opus 4.5 --- src/agents/model-compat.test.ts | 22 ++++++++++++++++++++++ src/agents/model-compat.ts | 3 ++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/agents/model-compat.test.ts b/src/agents/model-compat.test.ts index ce6d12d4b..9b6538cd2 100644 --- a/src/agents/model-compat.test.ts +++ b/src/agents/model-compat.test.ts @@ -41,4 +41,26 @@ describe("normalizeModelCompat", () => { const normalized = normalizeModelCompat(model); expect(normalized.compat?.supportsDeveloperRole).toBe(false); }); + + it("forces supportsDeveloperRole off for nearai provider", () => { + const model = { + ...baseModel(), + provider: "nearai", + baseUrl: "https://cloud-api.near.ai/v1", + }; + delete (model as { compat?: unknown }).compat; + const normalized = normalizeModelCompat(model); + expect(normalized.compat?.supportsDeveloperRole).toBe(false); + }); + + it("forces supportsDeveloperRole off for near.ai baseUrl", () => { + const model = { + ...baseModel(), + provider: "custom", + baseUrl: "https://cloud-api.near.ai/v1", + }; + delete (model as { compat?: unknown }).compat; + const normalized = normalizeModelCompat(model); + expect(normalized.compat?.supportsDeveloperRole).toBe(false); + }); }); diff --git a/src/agents/model-compat.ts b/src/agents/model-compat.ts index 741819073..b9aa38c3e 100644 --- a/src/agents/model-compat.ts +++ b/src/agents/model-compat.ts @@ -7,7 +7,8 @@ function isOpenAiCompletionsModel(model: Model): model is Model<"openai-com export function normalizeModelCompat(model: Model): Model { const baseUrl = model.baseUrl ?? ""; const isZai = model.provider === "zai" || baseUrl.includes("api.z.ai"); - if (!isZai || !isOpenAiCompletionsModel(model)) return model; + const isNearAi = model.provider === "nearai" || baseUrl.includes("cloud-api.near.ai"); + if ((!isZai && !isNearAi) || !isOpenAiCompletionsModel(model)) return model; const openaiModel = model as Model<"openai-completions">; const compat = openaiModel.compat ?? undefined;