mirror of
https://github.com/RooVetGit/Roo-Code.git
synced 2026-08-28 05:27:24 +00:00
* Latest main branch snapshot from API * feat: add dedicated Azure OpenAI provider using @ai-sdk/azure package * feat: add Azure provider UI component and translations * feat: add Azure provider translations for all locales * chore: add missing Azure placeholder translations * Delete .changeset/azure-ai-sdk-migration.md * fix: add Azure provider validation for onboarding workflow - Add azureApiKey to SECRET_STATE_KEYS for proper configuration detection - Add Azure validation case in validateModelsAndKeysProvided - Add validation translations for azureResourceName and azureDeploymentName across all 18 locales This fixes the issue where the Finish button does nothing when setting up Azure provider in the onboarding workflow. * feat(azure): add model metadata, model picker, rename to Azure AI Foundry - Add static model metadata for 29 Azure models (from models.dev) with Roo-specific flags (reasoning, tools, verbosity) matching openAiNativeModels - Add model picker dropdown to Azure provider settings for model capability detection (context window, max tokens, pricing) - Rename provider label from 'Azure OpenAI' to 'Azure AI Foundry' across all 18 locales - Make API key optional (supports Azure managed identity / Entra ID) - Update default API version from 2024-08-01-preview to 2025-04-01-preview - Fix maxOutputTokens validation (filter invalid values <= 0) - Handler separates deployment name (API calls) from model ID (capability lookup) with azureDefaultModelInfo (gpt-4o) fallback - Remove unhelpful 'Get Azure AI Foundry Access' button - Prevent stale model IDs from other providers carrying over - Suppress validation errors on fresh provider selection * fix(azure): add missing isAiSdkProvider() override for reasoning block preservation * Azure Fixes for Hannes * Quick Fix for Respones API Only (for Hannes) * fix: use explicit azureOpenAiDefaultApiVersion fallback when apiVersion is empty Addresses review feedback: the UI placeholder shows '2025-04-01-preview' via azureOpenAiDefaultApiVersion, so the handler should use the same constant as fallback instead of silently deferring to the SDK's internal default. * fix: remove stale Cerebras references (retired provider) * fix: add missing retiredProviderMessage translations for all locales * fix: do not map promptCacheMissTokens to cacheWriteTokens for Azure Azure uses OpenAI-compatible caching which does not report cache write tokens separately. promptCacheMissTokens represents tokens NOT found in cache (processed from scratch), not tokens written to cache. This aligns the Azure handler with the OpenAI native handler behavior. --------- Co-authored-by: Hannes Rudolph <hrudolph@gmail.com> Co-authored-by: Roo Code <roomote@roocode.com> Co-authored-by: daniel-lxs <ricciodaniel98@gmail.com> Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com>
162 lines
5.7 KiB
TypeScript
162 lines
5.7 KiB
TypeScript
import type { ProviderName, ModelInfo, ProviderSettings } from "@roo-code/types"
|
|
import {
|
|
anthropicDefaultModelId,
|
|
azureDefaultModelId,
|
|
bedrockDefaultModelId,
|
|
deepSeekDefaultModelId,
|
|
moonshotDefaultModelId,
|
|
geminiDefaultModelId,
|
|
mistralDefaultModelId,
|
|
openAiNativeDefaultModelId,
|
|
qwenCodeDefaultModelId,
|
|
vertexDefaultModelId,
|
|
xaiDefaultModelId,
|
|
sambaNovaDefaultModelId,
|
|
internationalZAiDefaultModelId,
|
|
mainlandZAiDefaultModelId,
|
|
fireworksDefaultModelId,
|
|
minimaxDefaultModelId,
|
|
basetenDefaultModelId,
|
|
} from "@roo-code/types"
|
|
|
|
import { MODELS_BY_PROVIDER } from "../constants"
|
|
|
|
export interface ProviderServiceConfig {
|
|
serviceName: string
|
|
serviceUrl: string
|
|
}
|
|
|
|
export const PROVIDER_SERVICE_CONFIG: Partial<Record<ProviderName, ProviderServiceConfig>> = {
|
|
anthropic: { serviceName: "Anthropic", serviceUrl: "https://console.anthropic.com" },
|
|
azure: {
|
|
serviceName: "Azure AI Foundry",
|
|
serviceUrl: "https://azure.microsoft.com/en-us/products/ai-foundry/models/openai",
|
|
},
|
|
bedrock: { serviceName: "Amazon Bedrock", serviceUrl: "https://aws.amazon.com/bedrock" },
|
|
deepseek: { serviceName: "DeepSeek", serviceUrl: "https://platform.deepseek.com" },
|
|
moonshot: { serviceName: "Moonshot", serviceUrl: "https://platform.moonshot.cn" },
|
|
gemini: { serviceName: "Google Gemini", serviceUrl: "https://ai.google.dev" },
|
|
mistral: { serviceName: "Mistral", serviceUrl: "https://console.mistral.ai" },
|
|
"openai-native": { serviceName: "OpenAI", serviceUrl: "https://platform.openai.com" },
|
|
"qwen-code": { serviceName: "Qwen Code", serviceUrl: "https://dashscope.console.aliyun.com" },
|
|
vertex: { serviceName: "GCP Vertex AI", serviceUrl: "https://console.cloud.google.com/vertex-ai" },
|
|
xai: { serviceName: "xAI", serviceUrl: "https://x.ai" },
|
|
sambanova: { serviceName: "SambaNova", serviceUrl: "https://sambanova.ai" },
|
|
zai: { serviceName: "Z.ai", serviceUrl: "https://z.ai" },
|
|
fireworks: { serviceName: "Fireworks AI", serviceUrl: "https://fireworks.ai" },
|
|
minimax: { serviceName: "MiniMax", serviceUrl: "https://minimax.chat" },
|
|
baseten: { serviceName: "Baseten", serviceUrl: "https://baseten.co" },
|
|
ollama: { serviceName: "Ollama", serviceUrl: "https://ollama.ai" },
|
|
lmstudio: { serviceName: "LM Studio", serviceUrl: "https://lmstudio.ai/docs" },
|
|
"vscode-lm": {
|
|
serviceName: "VS Code LM",
|
|
serviceUrl: "https://code.visualstudio.com/api/extension-guides/language-model",
|
|
},
|
|
}
|
|
|
|
export const PROVIDER_DEFAULT_MODEL_IDS: Partial<Record<ProviderName, string>> = {
|
|
anthropic: anthropicDefaultModelId,
|
|
azure: azureDefaultModelId,
|
|
bedrock: bedrockDefaultModelId,
|
|
deepseek: deepSeekDefaultModelId,
|
|
moonshot: moonshotDefaultModelId,
|
|
gemini: geminiDefaultModelId,
|
|
mistral: mistralDefaultModelId,
|
|
"openai-native": openAiNativeDefaultModelId,
|
|
"qwen-code": qwenCodeDefaultModelId,
|
|
vertex: vertexDefaultModelId,
|
|
xai: xaiDefaultModelId,
|
|
sambanova: sambaNovaDefaultModelId,
|
|
zai: internationalZAiDefaultModelId,
|
|
fireworks: fireworksDefaultModelId,
|
|
minimax: minimaxDefaultModelId,
|
|
baseten: basetenDefaultModelId,
|
|
}
|
|
|
|
export const getProviderServiceConfig = (provider: ProviderName): ProviderServiceConfig => {
|
|
return PROVIDER_SERVICE_CONFIG[provider] ?? { serviceName: provider, serviceUrl: "" }
|
|
}
|
|
|
|
export const getDefaultModelIdForProvider = (provider: ProviderName, apiConfiguration?: ProviderSettings): string => {
|
|
// Handle Z.ai's China/International entrypoint distinction
|
|
if (provider === "zai" && apiConfiguration) {
|
|
return apiConfiguration.zaiApiLine === "china_coding"
|
|
? mainlandZAiDefaultModelId
|
|
: internationalZAiDefaultModelId
|
|
}
|
|
|
|
return PROVIDER_DEFAULT_MODEL_IDS[provider] ?? ""
|
|
}
|
|
|
|
export const getStaticModelsForProvider = (
|
|
provider: ProviderName,
|
|
customArnLabel?: string,
|
|
): Record<string, ModelInfo> => {
|
|
const models = MODELS_BY_PROVIDER[provider] ?? {}
|
|
|
|
// Add custom-arn option for Bedrock
|
|
if (provider === "bedrock") {
|
|
return {
|
|
...models,
|
|
"custom-arn": {
|
|
maxTokens: 0,
|
|
contextWindow: 0,
|
|
supportsPromptCache: false,
|
|
description: customArnLabel ?? "Use Custom ARN",
|
|
},
|
|
}
|
|
}
|
|
|
|
return models
|
|
}
|
|
|
|
/**
|
|
* Checks if a provider uses static models from MODELS_BY_PROVIDER
|
|
*/
|
|
export const isStaticModelProvider = (provider: ProviderName): boolean => {
|
|
return provider in MODELS_BY_PROVIDER
|
|
}
|
|
|
|
/**
|
|
* List of providers that have their own custom model selection UI
|
|
* and should not use the generic ModelPicker in ApiOptions
|
|
*/
|
|
export const PROVIDERS_WITH_CUSTOM_MODEL_UI: ProviderName[] = [
|
|
"openrouter",
|
|
"requesty",
|
|
"openai", // OpenAI Compatible
|
|
"openai-codex", // OpenAI Codex has custom UI with auth and rate limits
|
|
"litellm",
|
|
"vercel-ai-gateway",
|
|
"roo",
|
|
"ollama",
|
|
"lmstudio",
|
|
"vscode-lm",
|
|
]
|
|
|
|
/**
|
|
* Checks if a provider should use the generic ModelPicker
|
|
*/
|
|
export const shouldUseGenericModelPicker = (provider: ProviderName): boolean => {
|
|
return isStaticModelProvider(provider) && !PROVIDERS_WITH_CUSTOM_MODEL_UI.includes(provider)
|
|
}
|
|
|
|
/**
|
|
* Handles provider-specific side effects when a model is changed.
|
|
* Centralizes provider-specific logic to keep it out of the ApiOptions template.
|
|
*/
|
|
export const handleModelChangeSideEffects = <K extends keyof ProviderSettings>(
|
|
provider: ProviderName,
|
|
modelId: string,
|
|
setApiConfigurationField: (field: K, value: ProviderSettings[K]) => void,
|
|
): void => {
|
|
// Bedrock: Clear custom ARN if not using custom ARN option
|
|
if (provider === "bedrock" && modelId !== "custom-arn") {
|
|
setApiConfigurationField("awsCustomArn" as K, "" as ProviderSettings[K])
|
|
}
|
|
|
|
// All providers: Clear reasoning effort when switching models to allow
|
|
// the new model's default to take effect. Different models within the
|
|
// same provider can have different reasoning effort defaults/options.
|
|
setApiConfigurationField("reasoningEffort" as K, undefined as ProviderSettings[K])
|
|
}
|