Просмотр исходного кода

Deprecate free grok 4 fast (#8481)

Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com>
Matt Rubens 3 месяцев назад
Родитель
Сommit
7ba8e33d03

+ 2 - 0
packages/types/src/model.ts

@@ -76,6 +76,8 @@ export const modelInfoSchema = z.object({
 	minTokensPerCachePoint: z.number().optional(),
 	maxCachePoints: z.number().optional(),
 	cachableFields: z.array(z.string()).optional(),
+	// Flag to indicate if the model is deprecated and should not be used
+	deprecated: z.boolean().optional(),
 	/**
 	 * Service tiers with pricing information.
 	 * Each tier can have a name (for OpenAI service tiers) and pricing overrides.

+ 1 - 0
packages/types/src/providers/roo.ts

@@ -38,6 +38,7 @@ export const rooModels = {
 		outputPrice: 0,
 		description:
 			"Grok 4 Fast is xAI's latest multimodal model with SOTA cost-efficiency and a 2M token context window. (Note: prompts and completions are logged by xAI and used to improve the model.)",
+		deprecated: true,
 	},
 	"deepseek/deepseek-chat-v3.1": {
 		maxTokens: 16_384,

+ 31 - 14
webview-ui/src/components/settings/ApiOptions.tsx

@@ -263,15 +263,24 @@ const ApiOptions = ({
 
 		const filteredModels = filterModels(models, selectedProvider, organizationAllowList)
 
-		const modelOptions = filteredModels
-			? Object.keys(filteredModels).map((modelId) => ({
-					value: modelId,
-					label: modelId,
-				}))
+		// Include the currently selected model even if deprecated (so users can see what they have selected)
+		// But filter out other deprecated models from being newly selectable
+		const availableModels = filteredModels
+			? Object.entries(filteredModels)
+					.filter(([modelId, modelInfo]) => {
+						// Always include the currently selected model
+						if (modelId === selectedModelId) return true
+						// Filter out deprecated models that aren't currently selected
+						return !modelInfo.deprecated
+					})
+					.map(([modelId]) => ({
+						value: modelId,
+						label: modelId,
+					}))
 			: []
 
-		return modelOptions
-	}, [selectedProvider, organizationAllowList])
+		return availableModels
+	}, [selectedProvider, organizationAllowList, selectedModelId])
 
 	const onProviderChange = useCallback(
 		(value: ProviderName) => {
@@ -716,6 +725,11 @@ const ApiOptions = ({
 						</Select>
 					</div>
 
+					{/* Show error if a deprecated model is selected */}
+					{selectedModelInfo?.deprecated && (
+						<ApiErrorMessage errorMessage={t("settings:validation.modelDeprecated")} />
+					)}
+
 					{selectedProvider === "bedrock" && selectedModelId === "custom-arn" && (
 						<BedrockCustomArn
 							apiConfiguration={apiConfiguration}
@@ -723,13 +737,16 @@ const ApiOptions = ({
 						/>
 					)}
 
-					<ModelInfoView
-						apiProvider={selectedProvider}
-						selectedModelId={selectedModelId}
-						modelInfo={selectedModelInfo}
-						isDescriptionExpanded={isDescriptionExpanded}
-						setIsDescriptionExpanded={setIsDescriptionExpanded}
-					/>
+					{/* Only show model info if not deprecated */}
+					{!selectedModelInfo?.deprecated && (
+						<ModelInfoView
+							apiProvider={selectedProvider}
+							selectedModelId={selectedModelId}
+							modelInfo={selectedModelInfo}
+							isDescriptionExpanded={isDescriptionExpanded}
+							setIsDescriptionExpanded={setIsDescriptionExpanded}
+						/>
+					)}
 				</>
 			)}
 

+ 24 - 4
webview-ui/src/components/settings/ModelPicker.tsx

@@ -75,13 +75,30 @@ export const ModelPicker = ({
 	const selectTimeoutRef = useRef<NodeJS.Timeout | null>(null)
 	const closeTimeoutRef = useRef<NodeJS.Timeout | null>(null)
 
+	const { id: selectedModelId, info: selectedModelInfo } = useSelectedModel(apiConfiguration)
+
 	const modelIds = useMemo(() => {
 		const filteredModels = filterModels(models, apiConfiguration.apiProvider, organizationAllowList)
 
-		return Object.keys(filteredModels ?? {}).sort((a, b) => a.localeCompare(b))
-	}, [models, apiConfiguration.apiProvider, organizationAllowList])
+		// Include the currently selected model even if deprecated (so users can see what they have selected)
+		// But filter out other deprecated models from being newly selectable
+		const availableModels = Object.entries(filteredModels ?? {})
+			.filter(([modelId, modelInfo]) => {
+				// Always include the currently selected model
+				if (modelId === selectedModelId) return true
+				// Filter out deprecated models that aren't currently selected
+				return !modelInfo.deprecated
+			})
+			.reduce(
+				(acc, [modelId, modelInfo]) => {
+					acc[modelId] = modelInfo
+					return acc
+				},
+				{} as Record<string, ModelInfo>,
+			)
 
-	const { id: selectedModelId, info: selectedModelInfo } = useSelectedModel(apiConfiguration)
+		return Object.keys(availableModels).sort((a, b) => a.localeCompare(b))
+	}, [models, apiConfiguration.apiProvider, organizationAllowList, selectedModelId])
 
 	const [searchValue, setSearchValue] = useState("")
 
@@ -225,7 +242,10 @@ export const ModelPicker = ({
 				</Popover>
 			</div>
 			{errorMessage && <ApiErrorMessage errorMessage={errorMessage} />}
-			{selectedModelId && selectedModelInfo && (
+			{selectedModelInfo?.deprecated && (
+				<ApiErrorMessage errorMessage={t("settings:validation.modelDeprecated")} />
+			)}
+			{selectedModelId && selectedModelInfo && !selectedModelInfo.deprecated && (
 				<ModelInfoView
 					apiProvider={apiConfiguration.apiProvider}
 					selectedModelId={selectedModelId}

+ 195 - 0
webview-ui/src/components/settings/__tests__/ModelPicker.deprecated.spec.tsx

@@ -0,0 +1,195 @@
+// npx vitest src/components/settings/__tests__/ModelPicker.deprecated.spec.tsx
+
+import { render, screen } from "@testing-library/react"
+import userEvent from "@testing-library/user-event"
+import { QueryClient, QueryClientProvider } from "@tanstack/react-query"
+import { describe, it, expect, vi, beforeEach } from "vitest"
+
+import { ModelPicker } from "../ModelPicker"
+import type { ModelInfo } from "@roo-code/types"
+
+// Mock the i18n module
+vi.mock("@src/i18n/TranslationContext", () => ({
+	useAppTranslation: () => ({
+		t: (key: string, options?: any) => {
+			// Handle specific translation keys
+			if (key === "settings:validation.modelDeprecated") {
+				return "This model is no longer available. Please select a different model."
+			}
+			if (options) return `${key} ${JSON.stringify(options)}`
+			return key
+		},
+	}),
+}))
+
+// Mock the useSelectedModel hook
+vi.mock("@/components/ui/hooks/useSelectedModel", () => ({
+	useSelectedModel: (apiConfiguration: any) => {
+		const modelId = apiConfiguration?.openRouterModelId || "model-1"
+		const models: Record<string, ModelInfo> = {
+			"model-1": {
+				maxTokens: 1000,
+				contextWindow: 4000,
+				supportsPromptCache: true,
+			},
+			"model-2": {
+				maxTokens: 2000,
+				contextWindow: 8000,
+				supportsPromptCache: false,
+			},
+			"deprecated-model": {
+				maxTokens: 1500,
+				contextWindow: 6000,
+				supportsPromptCache: true,
+				deprecated: true,
+			},
+		}
+		return {
+			id: modelId,
+			info: models[modelId],
+			provider: "openrouter",
+			isLoading: false,
+			isError: false,
+		}
+	},
+}))
+
+describe("ModelPicker - Deprecated Models", () => {
+	const mockSetApiConfigurationField = vi.fn()
+	const queryClient = new QueryClient({
+		defaultOptions: {
+			queries: { retry: false },
+		},
+	})
+
+	const regularModels: Record<string, ModelInfo> = {
+		"model-1": {
+			maxTokens: 1000,
+			contextWindow: 4000,
+			supportsPromptCache: true,
+		},
+		"model-2": {
+			maxTokens: 2000,
+			contextWindow: 8000,
+			supportsPromptCache: false,
+		},
+		"deprecated-model": {
+			maxTokens: 1500,
+			contextWindow: 6000,
+			supportsPromptCache: true,
+			deprecated: true,
+		},
+	}
+
+	beforeEach(() => {
+		vi.clearAllMocks()
+	})
+
+	it("should filter out deprecated models from the dropdown", async () => {
+		const user = userEvent.setup()
+
+		render(
+			<QueryClientProvider client={queryClient}>
+				<ModelPicker
+					defaultModelId="model-1"
+					models={regularModels}
+					modelIdKey="openRouterModelId"
+					serviceName="Test Service"
+					serviceUrl="https://test.com"
+					apiConfiguration={{ apiProvider: "openrouter" }}
+					setApiConfigurationField={mockSetApiConfigurationField}
+					organizationAllowList={{ allowAll: true, providers: {} }}
+				/>
+			</QueryClientProvider>,
+		)
+
+		// Open the dropdown
+		const button = screen.getByTestId("model-picker-button")
+		await user.click(button)
+
+		// Check that non-deprecated models are shown
+		expect(screen.getByTestId("model-option-model-1")).toBeInTheDocument()
+		expect(screen.getByTestId("model-option-model-2")).toBeInTheDocument()
+
+		// Check that deprecated model is NOT shown
+		expect(screen.queryByTestId("model-option-deprecated-model")).not.toBeInTheDocument()
+	})
+
+	it("should show error when a deprecated model is currently selected", () => {
+		render(
+			<QueryClientProvider client={queryClient}>
+				<ModelPicker
+					defaultModelId="deprecated-model"
+					models={regularModels}
+					modelIdKey="openRouterModelId"
+					serviceName="Test Service"
+					serviceUrl="https://test.com"
+					apiConfiguration={{
+						apiProvider: "openrouter",
+						openRouterModelId: "deprecated-model",
+					}}
+					setApiConfigurationField={mockSetApiConfigurationField}
+					organizationAllowList={{ allowAll: true, providers: {} }}
+				/>
+			</QueryClientProvider>,
+		)
+
+		// Check that the error message is displayed
+		expect(
+			screen.getByText("This model is no longer available. Please select a different model."),
+		).toBeInTheDocument()
+	})
+
+	it("should allow selecting non-deprecated models", async () => {
+		const user = userEvent.setup()
+
+		render(
+			<QueryClientProvider client={queryClient}>
+				<ModelPicker
+					defaultModelId="model-1"
+					models={regularModels}
+					modelIdKey="openRouterModelId"
+					serviceName="Test Service"
+					serviceUrl="https://test.com"
+					apiConfiguration={{ apiProvider: "openrouter" }}
+					setApiConfigurationField={mockSetApiConfigurationField}
+					organizationAllowList={{ allowAll: true, providers: {} }}
+				/>
+			</QueryClientProvider>,
+		)
+
+		// Open the dropdown
+		const button = screen.getByTestId("model-picker-button")
+		await user.click(button)
+
+		// Select a non-deprecated model
+		const model2Option = screen.getByTestId("model-option-model-2")
+		await user.click(model2Option)
+
+		// Verify the selection was made
+		expect(mockSetApiConfigurationField).toHaveBeenCalledWith("openRouterModelId", "model-2")
+	})
+
+	it("should not display model info for deprecated models", () => {
+		render(
+			<QueryClientProvider client={queryClient}>
+				<ModelPicker
+					defaultModelId="deprecated-model"
+					models={regularModels}
+					modelIdKey="openRouterModelId"
+					serviceName="Test Service"
+					serviceUrl="https://test.com"
+					apiConfiguration={{
+						apiProvider: "openrouter",
+						openRouterModelId: "deprecated-model",
+					}}
+					setApiConfigurationField={mockSetApiConfigurationField}
+					organizationAllowList={{ allowAll: true, providers: {} }}
+				/>
+			</QueryClientProvider>,
+		)
+
+		// Model info should not be displayed for deprecated models
+		expect(screen.queryByText("This is a deprecated model")).not.toBeInTheDocument()
+	})
+})

+ 1 - 0
webview-ui/src/i18n/locales/ca/settings.json

@@ -824,6 +824,7 @@
 			"regionMismatch": "Avís: La regió del vostre ARN ({{arnRegion}}) no coincideix amb la regió seleccionada ({{region}}). Això pot causar problemes d'accés. El proveïdor utilitzarà la regió de l'ARN."
 		},
 		"modelAvailability": "L'ID de model ({{modelId}}) que heu proporcionat no està disponible. Si us plau, trieu un altre model.",
+		"modelDeprecated": "Aquest model ja no està disponible. Si us plau, seleccioneu un model diferent.",
 		"providerNotAllowed": "El proveïdor '{{provider}}' no està permès per la vostra organització",
 		"modelNotAllowed": "El model '{{model}}' no està permès per al proveïdor '{{provider}}' per la vostra organització",
 		"profileInvalid": "Aquest perfil conté un proveïdor o model que no està permès per la vostra organització",

+ 1 - 0
webview-ui/src/i18n/locales/de/settings.json

@@ -824,6 +824,7 @@
 			"regionMismatch": "Warnung: Die Region in deiner ARN ({{arnRegion}}) stimmt nicht mit deiner ausgewählten Region ({{region}}) überein. Dies kann zu Zugriffsproblemen führen. Der Anbieter wird die Region aus der ARN verwenden."
 		},
 		"modelAvailability": "Die von dir angegebene Modell-ID ({{modelId}}) ist nicht verfügbar. Bitte wähle ein anderes Modell.",
+		"modelDeprecated": "Dieses Modell ist nicht mehr verfügbar. Bitte wähle ein anderes Modell.",
 		"providerNotAllowed": "Anbieter '{{provider}}' ist von deiner Organisation nicht erlaubt",
 		"modelNotAllowed": "Modell '{{model}}' ist für Anbieter '{{provider}}' von deiner Organisation nicht erlaubt",
 		"profileInvalid": "Dieses Profil enthält einen Anbieter oder ein Modell, das von deiner Organisation nicht erlaubt ist",

+ 1 - 0
webview-ui/src/i18n/locales/en/settings.json

@@ -829,6 +829,7 @@
 			"regionMismatch": "Warning: The region in your ARN ({{arnRegion}}) does not match your selected region ({{region}}). This may cause access issues. The provider will use the region from the ARN."
 		},
 		"modelAvailability": "The model ID ({{modelId}}) you provided is not available. Please choose a different model.",
+		"modelDeprecated": "This model is no longer available. Please select a different model.",
 		"providerNotAllowed": "Provider '{{provider}}' is not allowed by your organization",
 		"modelNotAllowed": "Model '{{model}}' is not allowed for provider '{{provider}}' by your organization",
 		"profileInvalid": "This profile contains a provider or model that is not allowed by your organization",

+ 1 - 0
webview-ui/src/i18n/locales/es/settings.json

@@ -824,6 +824,7 @@
 			"regionMismatch": "Advertencia: La región en su ARN ({{arnRegion}}) no coincide con su región seleccionada ({{region}}). Esto puede causar problemas de acceso. El proveedor usará la región del ARN."
 		},
 		"modelAvailability": "El ID de modelo ({{modelId}}) que proporcionó no está disponible. Por favor, elija un modelo diferente.",
+		"modelDeprecated": "Este modelo ya no está disponible. Por favor, elija un modelo diferente.",
 		"providerNotAllowed": "El proveedor '{{provider}}' no está permitido por su organización",
 		"modelNotAllowed": "El modelo '{{model}}' no está permitido para el proveedor '{{provider}}' por su organización",
 		"profileInvalid": "Este perfil contiene un proveedor o modelo que no está permitido por su organización",

+ 1 - 0
webview-ui/src/i18n/locales/fr/settings.json

@@ -824,6 +824,7 @@
 			"regionMismatch": "Attention : La région dans votre ARN ({{arnRegion}}) ne correspond pas à votre région sélectionnée ({{region}}). Cela peut causer des problèmes d'accès. Le fournisseur utilisera la région de l'ARN."
 		},
 		"modelAvailability": "L'ID de modèle ({{modelId}}) que vous avez fourni n'est pas disponible. Veuillez choisir un modèle différent.",
+		"modelDeprecated": "Ce modèle n'est plus disponible. Veuillez sélectionner un modèle différent.",
 		"providerNotAllowed": "Le fournisseur '{{provider}}' n'est pas autorisé par votre organisation",
 		"modelNotAllowed": "Le modèle '{{model}}' n'est pas autorisé pour le fournisseur '{{provider}}' par votre organisation",
 		"profileInvalid": "Ce profil contient un fournisseur ou un modèle qui n'est pas autorisé par votre organisation",

+ 1 - 0
webview-ui/src/i18n/locales/hi/settings.json

@@ -825,6 +825,7 @@
 			"regionMismatch": "चेतावनी: आपके ARN में क्षेत्र ({{arnRegion}}) आपके चयनित क्षेत्र ({{region}}) से मेल नहीं खाता। इससे पहुंच संबंधी समस्याएं हो सकती हैं। प्रदाता ARN से क्षेत्र का उपयोग करेगा।"
 		},
 		"modelAvailability": "आपके द्वारा प्रदान की गई मॉडल ID ({{modelId}}) उपलब्ध नहीं है। कृपया कोई अन्य मॉडल चुनें।",
+		"modelDeprecated": "यह मॉडल अब उपलब्ध नहीं है। कृपया कोई अन्य मॉडल चुनें।",
 		"providerNotAllowed": "प्रदाता '{{provider}}' आपके संगठन द्वारा अनुमत नहीं है",
 		"modelNotAllowed": "मॉडल '{{model}}' प्रदाता '{{provider}}' के लिए आपके संगठन द्वारा अनुमत नहीं है",
 		"profileInvalid": "इस प्रोफ़ाइल में एक प्रदाता या मॉडल शामिल है जो आपके संगठन द्वारा अनुमत नहीं है",

+ 1 - 0
webview-ui/src/i18n/locales/id/settings.json

@@ -854,6 +854,7 @@
 			"regionMismatch": "Peringatan: Region di ARN kamu ({{arnRegion}}) tidak cocok dengan region yang kamu pilih ({{region}}). Ini dapat menyebabkan masalah akses. Provider akan menggunakan region dari ARN."
 		},
 		"modelAvailability": "Model ID ({{modelId}}) yang kamu berikan tidak tersedia. Silakan pilih model yang berbeda.",
+		"modelDeprecated": "Model ini tidak lagi tersedia. Silakan pilih model yang berbeda.",
 		"providerNotAllowed": "Provider '{{provider}}' tidak diizinkan oleh organisasi kamu",
 		"modelNotAllowed": "Model '{{model}}' tidak diizinkan untuk provider '{{provider}}' oleh organisasi kamu",
 		"profileInvalid": "Profil ini berisi provider atau model yang tidak diizinkan oleh organisasi kamu",

+ 1 - 0
webview-ui/src/i18n/locales/it/settings.json

@@ -825,6 +825,7 @@
 			"regionMismatch": "Attenzione: La regione nel tuo ARN ({{arnRegion}}) non corrisponde alla regione selezionata ({{region}}). Questo potrebbe causare problemi di accesso. Il provider utilizzerà la regione dall'ARN."
 		},
 		"modelAvailability": "L'ID modello ({{modelId}}) fornito non è disponibile. Seleziona un modello diverso.",
+		"modelDeprecated": "Questo modello non è più disponibile. Seleziona un modello diverso.",
 		"providerNotAllowed": "Il fornitore '{{provider}}' non è consentito dalla tua organizzazione",
 		"modelNotAllowed": "Il modello '{{model}}' non è consentito per il fornitore '{{provider}}' dalla tua organizzazione.",
 		"profileInvalid": "Questo profilo contiene un fornitore o un modello non consentito dalla tua organizzazione.",

+ 1 - 0
webview-ui/src/i18n/locales/ja/settings.json

@@ -825,6 +825,7 @@
 			"regionMismatch": "警告:ARN内のリージョン({{arnRegion}})が選択したリージョン({{region}})と一致しません。これによりアクセスの問題が発生する可能性があります。プロバイダーはARNのリージョンを使用します。"
 		},
 		"modelAvailability": "指定されたモデルID({{modelId}})は利用できません。別のモデルを選択してください。",
+		"modelDeprecated": "このモデルは利用できなくなりました。別のモデルを選択してください。",
 		"providerNotAllowed": "プロバイダー「{{provider}}」は組織によって許可されていません",
 		"modelNotAllowed": "モデル「{{model}}」はプロバイダー「{{provider}}」に対して組織によって許可されていません",
 		"profileInvalid": "このプロファイルには、組織によって許可されていないプロバイダーまたはモデルが含まれています",

+ 1 - 0
webview-ui/src/i18n/locales/ko/settings.json

@@ -825,6 +825,7 @@
 			"regionMismatch": "경고: ARN의 리전({{arnRegion}})이 선택한 리전({{region}})과 일치하지 않습니다. 접근 문제가 발생할 수 있습니다. 제공자는 ARN의 리전을 사용합니다."
 		},
 		"modelAvailability": "제공한 모델 ID({{modelId}})를 사용할 수 없습니다. 다른 모델을 선택하세요.",
+		"modelDeprecated": "이 모델은 더 이상 사용할 수 없습니다. 다른 모델을 선택하세요.",
 		"providerNotAllowed": "제공자 '{{provider}}'는 조직에서 허용되지 않습니다",
 		"modelNotAllowed": "모델 '{{model}}'은 제공자 '{{provider}}'에 대해 조직에서 허용되지 않습니다",
 		"profileInvalid": "이 프로필에는 조직에서 허용되지 않는 제공자 또는 모델이 포함되어 있습니다",

+ 1 - 0
webview-ui/src/i18n/locales/nl/settings.json

@@ -825,6 +825,7 @@
 			"regionMismatch": "Waarschuwing: De regio in je ARN ({{arnRegion}}) komt niet overeen met je geselecteerde regio ({{region}}). Dit kan toegangsfouten veroorzaken. De provider gebruikt de regio uit de ARN."
 		},
 		"modelAvailability": "Het opgegeven model-ID ({{modelId}}) is niet beschikbaar. Kies een ander model.",
+		"modelDeprecated": "Dit model is niet meer beschikbaar. Kies een ander model.",
 		"providerNotAllowed": "Provider '{{provider}}' is niet toegestaan door je organisatie",
 		"modelNotAllowed": "Model '{{model}}' is niet toegestaan voor provider '{{provider}}' door je organisatie",
 		"profileInvalid": "Dit profiel bevat een provider of model dat niet is toegestaan door je organisatie",

+ 1 - 0
webview-ui/src/i18n/locales/pl/settings.json

@@ -825,6 +825,7 @@
 			"regionMismatch": "Ostrzeżenie: Region w Twoim ARN ({{arnRegion}}) nie zgadza się z wybranym regionem ({{region}}). Może to powodować problemy z dostępem. Dostawca użyje regionu z ARN."
 		},
 		"modelAvailability": "Podane ID modelu ({{modelId}}) jest niedostępne. Wybierz inny model.",
+		"modelDeprecated": "Ten model nie jest już dostępny. Wybierz inny model.",
 		"providerNotAllowed": "Dostawca '{{provider}}' nie jest dozwolony przez Twoją organizację",
 		"modelNotAllowed": "Model '{{model}}' nie jest dozwolony dla dostawcy '{{provider}}' przez Twoją organizację",
 		"profileInvalid": "Ten profil zawiera dostawcę lub model, który nie jest dozwolony przez Twoją organizację",

+ 1 - 0
webview-ui/src/i18n/locales/pt-BR/settings.json

@@ -825,6 +825,7 @@
 			"regionMismatch": "Aviso: A região em seu ARN ({{arnRegion}}) não corresponde à região selecionada ({{region}}). Isso pode causar problemas de acesso. O provedor usará a região do ARN."
 		},
 		"modelAvailability": "O ID do modelo ({{modelId}}) que você forneceu não está disponível. Por favor, escolha outro modelo.",
+		"modelDeprecated": "Este modelo não está mais disponível. Por favor, selecione um modelo diferente.",
 		"providerNotAllowed": "O provedor '{{provider}}' não é permitido pela sua organização",
 		"modelNotAllowed": "O modelo '{{model}}' não é permitido para o provedor '{{provider}}' pela sua organização",
 		"profileInvalid": "Este perfil contém um provedor ou modelo que não é permitido pela sua organização",

+ 1 - 0
webview-ui/src/i18n/locales/ru/settings.json

@@ -825,6 +825,7 @@
 			"regionMismatch": "Внимание: регион в вашем ARN ({{arnRegion}}) не совпадает с выбранным регионом ({{region}}). Это может вызвать проблемы с доступом. Провайдер будет использовать регион из ARN."
 		},
 		"modelAvailability": "ID модели ({{modelId}}), который вы указали, недоступен. Пожалуйста, выберите другую модель.",
+		"modelDeprecated": "Эта модель больше недоступна. Пожалуйста, выберите другую модель.",
 		"providerNotAllowed": "Провайдер '{{provider}}' не разрешен вашей организацией",
 		"modelNotAllowed": "Модель '{{model}}' не разрешена для провайдера '{{provider}}' вашей организацией",
 		"profileInvalid": "Этот профиль содержит провайдера или модель, которые не разрешены вашей организацией",

+ 1 - 0
webview-ui/src/i18n/locales/tr/settings.json

@@ -825,6 +825,7 @@
 			"regionMismatch": "Uyarı: ARN'nizdeki bölge ({{arnRegion}}) seçtiğiniz bölge ({{region}}) ile eşleşmiyor. Bu erişim sorunlarına neden olabilir. Sağlayıcı, ARN'deki bölgeyi kullanacak."
 		},
 		"modelAvailability": "Sağladığınız model kimliği ({{modelId}}) kullanılamıyor. Lütfen başka bir model seçin.",
+		"modelDeprecated": "Bu model artık kullanılamıyor. Lütfen farklı bir model seçin.",
 		"providerNotAllowed": "Sağlayıcı '{{provider}}' kuruluşunuz tarafından izin verilmiyor",
 		"modelNotAllowed": "Model '{{model}}' sağlayıcı '{{provider}}' için kuruluşunuz tarafından izin verilmiyor",
 		"profileInvalid": "Bu profil, kuruluşunuz tarafından izin verilmeyen bir sağlayıcı veya model içeriyor",

+ 1 - 0
webview-ui/src/i18n/locales/vi/settings.json

@@ -825,6 +825,7 @@
 			"regionMismatch": "Cảnh báo: Vùng trong ARN của bạn ({{arnRegion}}) không khớp với vùng bạn đã chọn ({{region}}). Điều này có thể gây ra vấn đề truy cập. Nhà cung cấp sẽ sử dụng vùng từ ARN."
 		},
 		"modelAvailability": "ID mô hình ({{modelId}}) bạn đã cung cấp không khả dụng. Vui lòng chọn một mô hình khác.",
+		"modelDeprecated": "Mô hình này không còn khả dụng. Vui lòng chọn một mô hình khác.",
 		"providerNotAllowed": "Nhà cung cấp '{{provider}}' không được phép bởi tổ chức của bạn",
 		"modelNotAllowed": "Mô hình '{{model}}' không được phép cho nhà cung cấp '{{provider}}' bởi tổ chức của bạn",
 		"profileInvalid": "Hồ sơ này chứa một nhà cung cấp hoặc mô hình không được phép bởi tổ chức của bạn",

+ 1 - 0
webview-ui/src/i18n/locales/zh-CN/settings.json

@@ -825,6 +825,7 @@
 			"regionMismatch": "警告:您的 ARN 中的区域 ({{arnRegion}}) 与您选择的区域 ({{region}}) 不匹配。这可能会导致访问问题。提供程序将使用 ARN 中的区域。"
 		},
 		"modelAvailability": "模型ID {{modelId}} 不可用,请重新选择",
+		"modelDeprecated": "此模型不再可用,请选择其他模型。",
 		"providerNotAllowed": "提供商 '{{provider}}' 不允许用于您的组织",
 		"modelNotAllowed": "模型 '{{model}}' 不允许用于提供商 '{{provider}}',您的组织不允许",
 		"profileInvalid": "此配置文件包含您的组织不允许的提供商或模型",

+ 1 - 0
webview-ui/src/i18n/locales/zh-TW/settings.json

@@ -825,6 +825,7 @@
 			"regionMismatch": "警告:您 ARN 中的區域 ({{arnRegion}}) 與您選擇的區域 ({{region}}) 不符,可能導致存取問題。系統將使用 ARN 中指定的區域。"
 		},
 		"modelAvailability": "您指定的模型 ID ({{modelId}}) 目前無法使用,請選擇其他模型。",
+		"modelDeprecated": "此模型已停用,請選擇其他模型。",
 		"providerNotAllowed": "供應商 '{{provider}}' 不允許用於您的組織。",
 		"modelNotAllowed": "模型 '{{model}}' 不允許用於供應商 '{{provider}}',您的組織不允許",
 		"profileInvalid": "此設定檔包含您的組織不允許的供應商或模型",