From 514b37e1857e55bb17a709b26d6be5cdbef0c30c Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Sat, 4 Apr 2026 02:15:31 +0900 Subject: [PATCH] fix(providers): keep native modelstudio streaming usage compat --- src/agents/openai-completions-compat.ts | 16 +++++++++++++--- src/agents/openai-transport-stream.test.ts | 10 +++++++--- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/agents/openai-completions-compat.ts b/src/agents/openai-completions-compat.ts index 4500ad3eba1..99879c08210 100644 --- a/src/agents/openai-completions-compat.ts +++ b/src/agents/openai-completions-compat.ts @@ -4,6 +4,7 @@ type OpenAICompletionsCompatDefaultsInput = { provider?: string; endpointClass: ProviderEndpointClass; knownProviderFamily: string; + supportsNativeStreamingUsageCompat?: boolean; usesExplicitProxyLikeEndpoint?: boolean; }; @@ -22,7 +23,12 @@ function isDefaultRouteProvider(provider: string | undefined, ...ids: string[]) export function resolveOpenAICompletionsCompatDefaults( input: OpenAICompletionsCompatDefaultsInput, ): OpenAICompletionsCompatDefaults { - const { endpointClass, knownProviderFamily, usesExplicitProxyLikeEndpoint = false } = input; + const { + endpointClass, + knownProviderFamily, + supportsNativeStreamingUsageCompat = false, + usesExplicitProxyLikeEndpoint = false, + } = input; const isDefaultRoute = endpointClass === "default"; const usesConfiguredNonOpenAIEndpoint = endpointClass !== "default" && endpointClass !== "openai-public"; @@ -54,7 +60,8 @@ export function resolveOpenAICompletionsCompatDefaults( knownProviderFamily !== "mistral" && endpointClass !== "xai-native" && !usesExplicitProxyLikeEndpoint, - supportsUsageInStreaming: !isNonStandard && !usesConfiguredNonOpenAIEndpoint, + supportsUsageInStreaming: + !isNonStandard && (!usesConfiguredNonOpenAIEndpoint || supportsNativeStreamingUsageCompat), supportsStrictMode: !isZai && !usesConfiguredNonOpenAIEndpoint, }; } @@ -62,7 +69,10 @@ export function resolveOpenAICompletionsCompatDefaults( export function resolveOpenAICompletionsCompatDefaultsFromCapabilities( input: Pick< ProviderRequestCapabilities, - "endpointClass" | "knownProviderFamily" | "usesExplicitProxyLikeEndpoint" + | "endpointClass" + | "knownProviderFamily" + | "supportsNativeStreamingUsageCompat" + | "usesExplicitProxyLikeEndpoint" > & { provider?: string; }, diff --git a/src/agents/openai-transport-stream.test.ts b/src/agents/openai-transport-stream.test.ts index a556752e772..3952d197ad3 100644 --- a/src/agents/openai-transport-stream.test.ts +++ b/src/agents/openai-transport-stream.test.ts @@ -356,13 +356,13 @@ describe("openai transport stream", () => { expect(params.messages?.[0]).toMatchObject({ role: "system" }); }); - it("uses system role for ModelStudio-hosted completions providers", () => { + it("uses system role and streaming usage compat for native ModelStudio completions providers", () => { const params = buildOpenAICompletionsParams( { id: "qwen3.6-plus", name: "Qwen 3.6 Plus", api: "openai-completions", - provider: "custom-qwen", + provider: "modelstudio", baseUrl: "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", reasoning: true, input: ["text"], @@ -376,9 +376,13 @@ describe("openai transport stream", () => { tools: [], } as never, undefined, - ) as { messages?: Array<{ role?: string }> }; + ) as { + messages?: Array<{ role?: string }>; + stream_options?: { include_usage?: boolean }; + }; expect(params.messages?.[0]).toMatchObject({ role: "system" }); + expect(params.stream_options).toMatchObject({ include_usage: true }); }); it("disables developer-role-only compat defaults for configured custom proxy completions providers", () => {