diff --git a/packages/ai/src/providers/alibaba.ts b/packages/ai/src/providers/alibaba.ts index 4ae703a8c8f..c7007acc59b 100644 --- a/packages/ai/src/providers/alibaba.ts +++ b/packages/ai/src/providers/alibaba.ts @@ -127,6 +127,9 @@ export const responsesModel: ProviderPackage.Model configure(config(input)).responses(id) +export const chat = model +export const messages = messagesModel +export const responses = responsesModel export const imageModel = (id: string, settings: Settings) => { const input = config(settings) return configure(input).image(id, input.providerOptions) diff --git a/packages/ai/src/providers/amazon-bedrock-mantle.ts b/packages/ai/src/providers/amazon-bedrock-mantle.ts index f14328cc0aa..1ffa2636156 100644 --- a/packages/ai/src/providers/amazon-bedrock-mantle.ts +++ b/packages/ai/src/providers/amazon-bedrock-mantle.ts @@ -152,6 +152,9 @@ export const configure = (input: Config = {}) => { } export const provider = configure() +export const chat = provider.chat +export const messages = provider.messages +export const responses = provider.responses const fromSettings = ({ apiKey, diff --git a/packages/ai/src/providers/azure.ts b/packages/ai/src/providers/azure.ts index 53cddaf3f85..7b8d2177776 100644 --- a/packages/ai/src/providers/azure.ts +++ b/packages/ai/src/providers/azure.ts @@ -228,3 +228,5 @@ export const imageModel = (modelID: string, settings: Settings) => { return configure(input).image(modelID, input.providerOptions) } export const model = responsesModel +export const responses = responsesModel +export const chat = chatModel diff --git a/packages/ai/src/providers/cloudflare-ai-gateway.ts b/packages/ai/src/providers/cloudflare-ai-gateway.ts index e4f69e50fc3..857fc9919a3 100644 --- a/packages/ai/src/providers/cloudflare-ai-gateway.ts +++ b/packages/ai/src/providers/cloudflare-ai-gateway.ts @@ -130,9 +130,19 @@ export const configure = (input: Config) => { headers: headers(input), } : rest - const responses = responsesRoute.with(passthrough("openai")) - const messages = messagesRoute.with(passthrough("anthropic/v1")) - const chat = route.with(rest) + const responsesConfigured = responsesRoute.with(passthrough("openai")) + const messagesConfigured = messagesRoute.with(passthrough("anthropic/v1")) + const chatConfigured = route.with(rest) + const responses = (value: string | ModelID) => + responsesConfigured.model({ + id: native ? value.replace(/^openai\//, "") : value, + }) + const messages = (value: string | ModelID) => + messagesConfigured.model({ + id: native ? value.replace(/^anthropic\//, "").replaceAll(".", "-") : value, + }) + const chat = (value: string | ModelID) => + chatConfigured.model({ id: value.replace(/^workers-ai\//, "") }) // The Run API base is derived per call so a chat-only configuration without an account still constructs. const decision = (value: string | ModelID, providerOptions?: ProviderOptions) => CloudflareRunDecisions.route @@ -147,16 +157,13 @@ export const configure = (input: Config) => { return { id, model: (value: string | ModelID) => { - if (value.startsWith("openai/")) - return responses.model({ id: native ? value.slice("openai/".length) : value }) - if (value.startsWith("anthropic/")) - return messages.model({ - id: native ? value.slice("anthropic/".length).replaceAll(".", "-") : value, - }) - if (value.startsWith("workers-ai/")) - return chat.model({ id: value.slice("workers-ai/".length) }) - return chat.model({ id: value }) + if (value.startsWith("openai/")) return responses(value) + if (value.startsWith("anthropic/")) return messages(value) + return chat(value) }, + chat, + responses, + messages, decision, configure, } @@ -166,6 +173,12 @@ export const provider = { id, configure } export const model: ProviderPackage.Model = (modelID, settings) => configure(config(settings)).model(modelID) +export const chat: ProviderPackage.Model = (modelID, settings) => + configure(config(settings)).chat(modelID) +export const responses: ProviderPackage.Model = (modelID, settings) => + configure(config(settings)).responses(modelID) +export const messages: ProviderPackage.Model = (modelID, settings) => + configure(config(settings)).messages(modelID) export const decisionModel = (modelID: string, settings: Settings) => { const input = config(settings) return configure(input).decision(modelID, input.providerOptions) diff --git a/packages/ai/src/providers/cohere.ts b/packages/ai/src/providers/cohere.ts index 4c3320ff882..dceddf9a562 100644 --- a/packages/ai/src/providers/cohere.ts +++ b/packages/ai/src/providers/cohere.ts @@ -50,6 +50,7 @@ export const configure = (input: Config = {}) => { } } export const provider = configure() +export const chat = provider.chat export const model: ProviderPackage.Model = ( modelID, { apiKey, baseURL, body, headers, ...providerOptions }: Settings = {}, diff --git a/packages/ai/src/providers/digitalocean.ts b/packages/ai/src/providers/digitalocean.ts index fc42a58b9b7..dca2065d637 100644 --- a/packages/ai/src/providers/digitalocean.ts +++ b/packages/ai/src/providers/digitalocean.ts @@ -75,15 +75,17 @@ export const configure = (input: Config = {}) => { const media = MediaRoute.deployment({ ...input, baseURL: endpoint ?? baseURL }, auth) const image = (modelID: string | ModelID, providerOptions?: ProviderOptions) => OpenAIImages.model({ ...media, id: modelID, provider: id, providerOptions }) + const chat = (modelID: string | ModelID) => + configured.model({ + id: modelID, + compatibility: { + supportsPromptCacheKey: true, + }, + }) return { id, - model: (modelID: string | ModelID) => - configured.model({ - id: modelID, - compatibility: { - supportsPromptCacheKey: true, - }, - }), + model: chat, + chat, responses: (modelID: string | ModelID) => configuredResponses.model({ id: modelID }), image, @@ -95,6 +97,7 @@ export const configure = (input: Config = {}) => { export const provider = configure() export const decision = provider.decision export const image = provider.image +export const chat = provider.chat export const responses = provider.responses export const model: ProviderPackage.Model = (modelID, settings) => diff --git a/packages/ai/src/providers/google.ts b/packages/ai/src/providers/google.ts index 3c4cdd76233..7cf6667400c 100644 --- a/packages/ai/src/providers/google.ts +++ b/packages/ai/src/providers/google.ts @@ -51,9 +51,11 @@ const interactionsRoute = (input: Config) => { export const configure = (input: Config = {}) => { const route = configuredRoute(input) const media = MediaRoute.deployment(input, auth(input)) + const gemini = (modelID: string | ModelID) => route.model({ id: modelID }) return { id, - model: (modelID: string | ModelID) => route.model({ id: modelID }), + model: gemini, + gemini, interactions: (modelID: string | ModelID) => interactionsRoute(input).model({ id: modelID }), image: (modelID: string | ModelID, providerOptions?: ProviderOptions) => @@ -84,6 +86,7 @@ function config({ apiKey, baseURL, body, headers, ...providerOptions }: Settings } export const image = provider.image +export const gemini = provider.gemini export const interactions = provider.interactions export const video = provider.video export const speech = provider.speech diff --git a/packages/ai/src/providers/openrouter.ts b/packages/ai/src/providers/openrouter.ts index 46bca45daf4..f7be5b4d128 100644 --- a/packages/ai/src/providers/openrouter.ts +++ b/packages/ai/src/providers/openrouter.ts @@ -272,10 +272,12 @@ export const configure = (input: Config = {}) => { compatibility: { mediaInput: "state" }, providerOptions, }) + const chat = (modelID: string | ModelID) => + chatRoute.model({ id: modelID, compatibility: { supportsPromptCacheKey: true } }) return { id, - model: (modelID: string | ModelID) => - chatRoute.model({ id: modelID, compatibility: { supportsPromptCacheKey: true } }), + model: chat, + chat, responses: (modelID: string | ModelID) => configuredResponses.model({ id: modelID }), image, @@ -287,6 +289,7 @@ export const configure = (input: Config = {}) => { export const provider = configure() export const decision = provider.decision export const image = provider.image +export const chat = provider.chat export const responses = provider.responses export const model: ProviderPackage.Model = (modelID, settings) => configure(config(settings)).model(modelID) diff --git a/packages/ai/test/provider-api-methods.types.ts b/packages/ai/test/provider-api-methods.types.ts new file mode 100644 index 00000000000..a452711f3d6 --- /dev/null +++ b/packages/ai/test/provider-api-methods.types.ts @@ -0,0 +1,8 @@ +import { ai } from "../src/index.js" +import { DigitalOcean, OpenAI, OpenRouter, Venice, XAI } from "../src/providers.js" + +for (const p of [OpenAI, XAI, Venice, OpenRouter, DigitalOcean]) { + p.chat("x") + p.configure().chat("x") + void ai.generate({ model: p.chat("x"), prompt: "Say hi" }) +}