Skip to content
This repository was archived by the owner on May 15, 2026. It is now read-only.

Commit 821bec2

Browse files
committed
feat: add dedicated Azure OpenAI provider using @ai-sdk/azure package
1 parent ede1d29 commit 821bec2

9 files changed

Lines changed: 619 additions & 1 deletion

File tree

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
---
2+
"roo-cline": minor
3+
"@roo-code/types": minor
4+
---
5+
6+
Add dedicated Azure OpenAI provider using @ai-sdk/azure package
7+
8+
- Add new "azure" provider type to support Azure OpenAI deployments via the AI SDK
9+
- Implement AzureHandler following the established pattern from DeepSeek, Groq, and Fireworks migrations
10+
- Add azureSchema with Azure-specific options: azureApiKey, azureResourceName, azureDeploymentName, azureApiVersion
11+
- Use streamText/generateText from the AI SDK for cleaner streaming implementation
12+
- Support tool calling via tool-input-start/delta/end events
13+
- Include cache metrics extraction from providerMetadata

packages/types/src/provider-settings.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ export const providerNames = [
119119
...customProviders,
120120
...fauxProviders,
121121
"anthropic",
122+
"azure",
122123
"bedrock",
123124
"baseten",
124125
"cerebras",
@@ -417,12 +418,20 @@ const basetenSchema = apiModelIdProviderModelSchema.extend({
417418
basetenApiKey: z.string().optional(),
418419
})
419420

421+
const azureSchema = apiModelIdProviderModelSchema.extend({
422+
azureApiKey: z.string().optional(),
423+
azureResourceName: z.string().optional(),
424+
azureDeploymentName: z.string().optional(),
425+
azureApiVersion: z.string().optional(),
426+
})
427+
420428
const defaultSchema = z.object({
421429
apiProvider: z.undefined(),
422430
})
423431

424432
export const providerSettingsSchemaDiscriminated = z.discriminatedUnion("apiProvider", [
425433
anthropicSchema.merge(z.object({ apiProvider: z.literal("anthropic") })),
434+
azureSchema.merge(z.object({ apiProvider: z.literal("azure") })),
426435
openRouterSchema.merge(z.object({ apiProvider: z.literal("openrouter") })),
427436
bedrockSchema.merge(z.object({ apiProvider: z.literal("bedrock") })),
428437
vertexSchema.merge(z.object({ apiProvider: z.literal("vertex") })),
@@ -464,6 +473,7 @@ export const providerSettingsSchemaDiscriminated = z.discriminatedUnion("apiProv
464473
export const providerSettingsSchema = z.object({
465474
apiProvider: providerNamesSchema.optional(),
466475
...anthropicSchema.shape,
476+
...azureSchema.shape,
467477
...openRouterSchema.shape,
468478
...bedrockSchema.shape,
469479
...vertexSchema.shape,
@@ -552,6 +562,7 @@ export const isTypicalProvider = (key: unknown): key is TypicalProvider =>
552562

553563
export const modelIdKeysByProvider: Record<TypicalProvider, ModelIdKey> = {
554564
anthropic: "apiModelId",
565+
azure: "apiModelId",
555566
openrouter: "openRouterModelId",
556567
bedrock: "apiModelId",
557568
vertex: "apiModelId",
@@ -628,6 +639,11 @@ export const MODELS_BY_PROVIDER: Record<
628639
label: "Anthropic",
629640
models: Object.keys(anthropicModels),
630641
},
642+
azure: {
643+
id: "azure",
644+
label: "Azure OpenAI",
645+
models: [], // Azure uses deployment names configured by the user
646+
},
631647
bedrock: {
632648
id: "bedrock",
633649
label: "Amazon Bedrock",

pnpm-lock.yaml

Lines changed: 29 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/api/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { ApiStream } from "./transform/stream"
88
import {
99
AnthropicHandler,
1010
AwsBedrockHandler,
11+
AzureHandler,
1112
CerebrasHandler,
1213
OpenRouterHandler,
1314
VertexHandler,
@@ -125,6 +126,8 @@ export function buildApiHandler(configuration: ProviderSettings): ApiHandler {
125126
switch (apiProvider) {
126127
case "anthropic":
127128
return new AnthropicHandler(options)
129+
case "azure":
130+
return new AzureHandler(options)
128131
case "openrouter":
129132
return new OpenRouterHandler(options)
130133
case "bedrock":

0 commit comments

Comments
 (0)