diff --git a/open-sse/config/constants.ts b/open-sse/config/constants.ts index 2058233f..26883ec8 100644 --- a/open-sse/config/constants.ts +++ b/open-sse/config/constants.ts @@ -66,6 +66,15 @@ export const DEFAULT_MAX_TOKENS = 64000; // Minimum max tokens for tool calling (to prevent truncated arguments) export const DEFAULT_MIN_TOKENS = 32000; +export const PROVIDER_MAX_TOKENS: Record = { + groq: 16384, // Groq strict per-model enforcement + openai: 16384, // GPT-4/4o standard + anthropic: 65536, // Claude models + gemini: 65536, // Gemini Studio +}; + +export const DEFAULT_PROVIDER_MAX_TOKENS = 32000; + // HTTP status codes export const HTTP_STATUS = { BAD_REQUEST: 400, diff --git a/open-sse/handlers/chatCore.ts b/open-sse/handlers/chatCore.ts index bc044363..061b1d97 100644 --- a/open-sse/handlers/chatCore.ts +++ b/open-sse/handlers/chatCore.ts @@ -15,7 +15,7 @@ import { getModelTargetFormat, PROVIDER_ID_TO_ALIAS } from "../config/providerMo import { resolveModelAlias } from "../services/modelDeprecation.ts"; import { getUnsupportedParams } from "../config/providerRegistry.ts"; import { createErrorResult, parseUpstreamError, formatProviderError } from "../utils/error.ts"; -import { HTTP_STATUS } from "../config/constants.ts"; +import { HTTP_STATUS, PROVIDER_MAX_TOKENS } from "../config/constants.ts"; import { classifyProviderError, PROVIDER_ERROR_TYPES } from "../services/errorClassifier.ts"; import { updateProviderConnection } from "@/lib/db/providers"; import { logAuditEvent } from "@/lib/compliance"; @@ -797,11 +797,7 @@ export async function handleChatCore({ // Provider-specific max_tokens caps (#711) // Some providers reject requests when max_tokens exceeds their API limit. // Cap before sending to avoid upstream HTTP 400 errors. - const PROVIDER_MAX_OUTPUT_TOKENS: Record = { - groq: 16384, - cerebras: 8192, - }; - const providerCap = PROVIDER_MAX_OUTPUT_TOKENS[provider]; + const providerCap = PROVIDER_MAX_TOKENS[provider]; if (providerCap) { for (const field of ["max_tokens", "max_completion_tokens"] as const) { if (typeof translatedBody[field] === "number" && translatedBody[field] > providerCap) {