Deprecate free grok 4 fast (#8481)

Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com>
This commit is contained in:
Matt Rubens 2025-10-03 00:14:38 -04:00 committed by GitHub
parent 8622d93f59
commit 7ba8e33d03
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
23 changed files with 271 additions and 18 deletions

View file

@ -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.

View file

@ -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,

View file

@ -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}
/>
)}
</>
)}

View file

@ -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}

View file

@ -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()
})
})

View file

@ -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ó",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

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

View file

@ -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",

View file

@ -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.",

View file

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

View file

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

View file

@ -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",

View file

@ -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ę",

View file

@ -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",

View file

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

View file

@ -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",

View file

@ -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",

View file

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

View file

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