diff --git a/packages/ai/src/protocols/google-interactions.ts b/packages/ai/src/protocols/google-interactions.ts index 51abf1bcea1c..36a8f877b64e 100644 --- a/packages/ai/src/protocols/google-interactions.ts +++ b/packages/ai/src/protocols/google-interactions.ts @@ -33,7 +33,7 @@ const Options = Schema.Struct({ store: lenient(Schema.Boolean), thinkingLevel: lenient(ThinkingLevel), thinkingSummaries: lenient(knownString<"auto" | "none">()), - serviceTier: lenient(knownString<"standard" | "flex" | "priority">()), + serviceTier: lenient(knownString<"standard" | "flex" | "priority" | "deferred">()), }) export type OptionsInput = typeof Options.Encoded export type ProviderOptionsInput = OptionsInput diff --git a/packages/ai/src/protocols/utils/openai-options.ts b/packages/ai/src/protocols/utils/openai-options.ts index f3e56be4a061..00f6592006ed 100644 --- a/packages/ai/src/protocols/utils/openai-options.ts +++ b/packages/ai/src/protocols/utils/openai-options.ts @@ -9,7 +9,8 @@ export type OpenAITextVerbosity = OpenResponsesOptions.TextVerbosity // in lockstep with `openai-node/src/resources/responses/responses.ts`. export const OpenAIResponseIncludables = OpenResponsesOptions.ResponseIncludables export type OpenAIResponseIncludable = OpenResponsesOptions.ResponseIncludable -export const OpenAIServiceTiers = [...OpenResponsesOptions.ServiceTiers, "scale"] as const +// Mirrors OpenAI's `ServiceTier` union from the official SDK. +export const OpenAIServiceTiers = [...OpenResponsesOptions.ServiceTiers, "scale", "fast", "ultrafast"] as const export type OpenAIServiceTier = (typeof OpenAIServiceTiers)[number] | (string & {}) export const OpenAIReasoningEffort = OpenResponsesOptions.ReasoningEffort diff --git a/packages/ai/test/provider-options/openai.types.ts b/packages/ai/test/provider-options/openai.types.ts index e2746750f48c..ddda75470734 100644 --- a/packages/ai/test/provider-options/openai.types.ts +++ b/packages/ai/test/provider-options/openai.types.ts @@ -9,6 +9,7 @@ LLM.request({ model: selected, prompt: "Hello", providerOptions: { reasoningEffo LLM.request({ model: selected, prompt: "Hello", providerOptions: { textVerbosity: "low" } }) LLM.request({ model: selected, prompt: "Hello", providerOptions: { textVerbosity: "verbose" } }) LLM.request({ model: selected, prompt: "Hello", providerOptions: { serviceTier: "scale" } }) +LLM.request({ model: selected, prompt: "Hello", providerOptions: { serviceTier: "ultrafast" } }) LLM.request({ model: selected, prompt: "Hello", providerOptions: { serviceTier: "future-tier" } }) LLM.request({ model: chat, prompt: "Hello", providerOptions: { reasoningEffort: "max" } }) LLM.request({ model: chat, prompt: "Hello", providerOptions: { reasoningEffort: "experimental" } }) diff --git a/packages/ai/test/provider/openai-responses.test.ts b/packages/ai/test/provider/openai-responses.test.ts index ca613295a321..e2ef36e446a6 100644 --- a/packages/ai/test/provider/openai-responses.test.ts +++ b/packages/ai/test/provider/openai-responses.test.ts @@ -325,11 +325,13 @@ describe("OpenAI Responses route", () => { }), ) - it.effect("passes through provider-defined service tiers", () => + it.effect("passes through provider-defined and future service tiers", () => Effect.gen(function* () { - const prepared = yield* compileRequest(LLMRequest.update(request, { providerOptions: { serviceTier: "scale" } })) + for (const serviceTier of ["scale", "ultrafast", "future-tier"]) { + const prepared = yield* compileRequest(LLMRequest.update(request, { providerOptions: { serviceTier } })) - expect(prepared.body.service_tier).toBe("scale") + expect(prepared.body.service_tier).toBe(serviceTier) + } }), )