diff --git a/.github/workflows/ecr-deploy.yaml b/.github/workflows/ecr-deploy.yaml
index 13d1783f..b7fe8323 100644
--- a/.github/workflows/ecr-deploy.yaml
+++ b/.github/workflows/ecr-deploy.yaml
@@ -6,6 +6,7 @@ on:
tags: ['v*', '*.*.*']
paths-ignore:
- 'k8s/**'
+ - 'README.md'
workflow_dispatch: # Allows manual triggering
inputs:
create_deployment_pr:
diff --git a/app/components/chat/ModelSelector.tsx b/app/components/chat/ModelSelector.tsx
index 8d38b256..4d686379 100644
--- a/app/components/chat/ModelSelector.tsx
+++ b/app/components/chat/ModelSelector.tsx
@@ -204,6 +204,20 @@ export const ModelSelector = ({
}
}, [providerList, provider, setProvider, modelList, setModel]);
+ // Handle case where selected model is no longer available after model list update
+ useEffect(() => {
+ if (model && provider && modelList.length > 0) {
+ const currentProviderModels = modelList.filter((m) => m.provider === provider.name);
+ const isModelStillAvailable = currentProviderModels.some((m) => m.name === model);
+
+ if (!isModelStillAvailable && currentProviderModels.length > 0 && setModel) {
+ // Selected model is no longer available, switch to first available model for this provider
+ const fallbackModel = currentProviderModels[0];
+ setModel(fallbackModel.name);
+ }
+ }
+ }, [modelList, model, provider, setModel]);
+
if (providerList.length === 0) {
return (
diff --git a/app/lib/modules/llm/providers/bayer-mga.ts b/app/lib/modules/llm/providers/bayer-mga.ts
index f6d6e0d2..1b499bf4 100644
--- a/app/lib/modules/llm/providers/bayer-mga.ts
+++ b/app/lib/modules/llm/providers/bayer-mga.ts
@@ -85,15 +85,29 @@ export default class BayerMGAProvider extends BaseProvider {
// Filter for available models and map to ModelInfo format
const models = res.data
- .filter((model: any) => model.model_status === 'available')
+ .filter((model: any) => {
+ // Only include models with 'available' status and valid model names
+ return model.model_status === 'available' &&
+ model.model &&
+ typeof model.model === 'string' &&
+ model.model.trim().length > 0;
+ })
.map((model: any) => ({
- name: model.model,
+ name: model.model.trim(),
label: model.name || model.model,
provider: this.name,
maxTokenAllowed: model.context_window || 8000,
}));
logger.info(`Found ${models.length} available models from Bayer MGA`);
+
+ // Log model names for debugging
+ if (models.length > 0) {
+ logger.debug(`Available Bayer MGA models: ${models.map(m => m.name).join(', ')}`);
+ } else {
+ logger.warn('No available models returned from Bayer MGA API');
+ }
+
return models;
} catch (error) {
logger.error(`Error fetching Bayer MGA models: ${error instanceof Error ? error.message : String(error)}`);
@@ -128,13 +142,37 @@ export default class BayerMGAProvider extends BaseProvider {
// Normalize base URL (remove trailing slash)
const normalizedBaseUrl = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;
- logger.info(`Creating model instance for ${model} using Bayer MGA API at ${normalizedBaseUrl}`);
+ // Get cached models to validate model availability
+ const cachedModels = this.getModelsFromCache({
+ apiKeys,
+ providerSettings: providerSettings?.[this.name],
+ serverEnv: serverEnv as any,
+ });
+
+ // Check if the requested model is available (either in cache or static models)
+ const availableModels = [...this.staticModels, ...(cachedModels || [])];
+ const modelExists = availableModels.some(m => m.name === model);
+
+ let effectiveModel = model;
+ if (!modelExists) {
+ logger.warn(`Model ${model} not found in available models for Bayer MGA. Available models: ${availableModels.map(m => m.name).join(', ')}`);
+ // Fall back to first available model if the requested model is not found
+ const fallbackModel = availableModels[0];
+ if (fallbackModel) {
+ logger.info(`Using fallback model: ${fallbackModel.name}`);
+ effectiveModel = fallbackModel.name;
+ } else {
+ throw new Error(`No models available for ${this.name} provider. Please check your API key and try again.`);
+ }
+ }
+
+ logger.info(`Creating model instance for ${effectiveModel} using Bayer MGA API at ${normalizedBaseUrl}`);
const openai = createOpenAI({
baseURL: normalizedBaseUrl,
apiKey,
});
- return openai(model);
+ return openai(effectiveModel);
}
}