From fea17b4a0ec5dfcc8f1463ffcca935103615635d Mon Sep 17 00:00:00 2001 From: Shoubhit Dash Date: Wed, 29 Jul 2026 18:22:16 +0530 Subject: [PATCH] feat(ai): type Cloudflare request options (#39507) --- packages/ai/src/providers/cloudflare.ts | 14 ++++++++++---- .../ai/test/provider-options/cloudflare.types.ts | 13 +++++++++++++ 2 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 packages/ai/test/provider-options/cloudflare.types.ts diff --git a/packages/ai/src/providers/cloudflare.ts b/packages/ai/src/providers/cloudflare.ts index a006152e98..a8e911feef 100644 --- a/packages/ai/src/providers/cloudflare.ts +++ b/packages/ai/src/providers/cloudflare.ts @@ -4,6 +4,7 @@ import { Auth } from "../route/auth" import { AuthOptions, type AtLeastOne, type ProviderAuthOption } from "../route/auth-options" import type { RouteDefaultsInput } from "../route/client" import { ProviderID, type ModelID } from "../schema" +import type { OpenAIProviderOptionsInput } from "./openai-options" export const aiGatewayID = ProviderID.make("cloudflare-ai-gateway") export const workersAIID = ProviderID.make("cloudflare-workers-ai") @@ -20,10 +21,11 @@ type GatewayURL = AtLeastOne<{ } export type AIGatewayOptions = GatewayURL & - RouteDefaultsInput & + Omit & ProviderAuthOption<"optional"> & { /** Cloudflare AI Gateway authentication token. Sent as `cf-aig-authorization`. */ readonly gatewayApiKey?: CloudflareSecret + readonly providerOptions?: OpenAIProviderOptionsInput } type WorkersAIURL = AtLeastOne<{ @@ -31,7 +33,11 @@ type WorkersAIURL = AtLeastOne<{ readonly baseURL: string }> -export type WorkersAIOptions = WorkersAIURL & RouteDefaultsInput & ProviderAuthOption<"optional"> +export type WorkersAIOptions = WorkersAIURL & + Omit & + ProviderAuthOption<"optional"> & { + readonly providerOptions?: OpenAIProviderOptionsInput + } export const aiGatewayBaseURL = (input: GatewayURL) => { if (input.baseURL) return input.baseURL @@ -98,7 +104,7 @@ const configureAIGateway = (options: AIGatewayOptions) => { }) return { id: aiGatewayID, - model: (modelID: string | ModelID) => route.model({ id: modelID }), + model: (modelID: string | ModelID) => route.model({ id: modelID }), configure: configureAIGateway, } } @@ -111,7 +117,7 @@ const configureWorkersAI = (options: WorkersAIOptions) => { }) return { id: workersAIID, - model: (modelID: string | ModelID) => route.model({ id: modelID }), + model: (modelID: string | ModelID) => route.model({ id: modelID }), configure: configureWorkersAI, } } diff --git a/packages/ai/test/provider-options/cloudflare.types.ts b/packages/ai/test/provider-options/cloudflare.types.ts new file mode 100644 index 0000000000..6e2af83bae --- /dev/null +++ b/packages/ai/test/provider-options/cloudflare.types.ts @@ -0,0 +1,13 @@ +import { LLM } from "../../src" +import { CloudflareWorkersAI } from "../../src/providers" + +const model = CloudflareWorkersAI.configure({ accountId: "account", apiKey: "test" }).model("model") + +LLM.request({ model, prompt: "Hello", providerOptions: { openai: { promptCacheKey: "cache" } } }) + +LLM.request({ + model, + prompt: "Hello", + // @ts-expect-error Cloudflare's OpenAI-compatible prompt cache key must be a string. + providerOptions: { openai: { promptCacheKey: 1 } }, +})