OtterMind/Chat2DB · error · IllegalArgumentException
Unsupported provider:
Error message
Unsupported provider:
What it means
Thrown as IllegalArgumentException('Unsupported provider: ' + runtimeModel.getProvider()) by validateRuntimeModel when AiProviderEnum.from(provider) returns null. from() uppercases and trims, returning null for empty/unknown values; the only accepted providers are OPENAI, CLAUDE, GEMINI, MINIMAX. The provider passed validation as non-null but is not a recognized enum constant.
Source
Thrown at chat2db-community-server/chat2db-community-domain/chat2db-community-domain-core/src/main/java/ai/chat2db/community/domain/core/impl/ai/AiModelConfigServiceImpl.java:365
return;
}
if (provider == AiProviderEnum.GEMINI) {
runtimeModel.setProjectId(defaultValue(trimToNull(runtimeModel.getProjectId()), trimToNull(System.getenv("GOOGLE_CLOUD_PROJECT"))));
runtimeModel.setLocation(defaultValue(trimToNull(runtimeModel.getLocation()), trimToNull(System.getenv("GOOGLE_CLOUD_LOCATION"))));
runtimeModel.setLocation(defaultValue(runtimeModel.getLocation(), DEFAULT_GEMINI_LOCATION));
}
}
private void validateRuntimeModel(AiRuntimeModel runtimeModel) {
if (Objects.isNull(runtimeModel.getProvider())) {
throw new IllegalArgumentException("provider is required");
}
if (StringUtils.isBlank(runtimeModel.getModel())) {
throw new IllegalArgumentException("model is required");
}
AiProviderEnum provider = AiProviderEnum.from(runtimeModel.getProvider());
if (provider == null) {
throw new IllegalArgumentException("Unsupported provider: " + runtimeModel.getProvider());
}
if (provider == AiProviderEnum.OPENAI || provider == AiProviderEnum.CLAUDE) {
return;
}
if (provider == AiProviderEnum.GEMINI) {
}
}
private synchronized void loadFromDisk() {
if (!Files.exists(storagePath)) {
return;
}
try {
StorageData data = objectMapper.readValue(storagePath.toFile(), StorageData.class);
Map<Long, List<AiModelConfig>> loadedConfigMap = new HashMap<>();
if (CollectionUtils.isNotEmpty(data.getConfigs())) {
data.getConfigs().forEach(config -> {View on GitHub (pinned to 5ee1e990e7)
Solutions
- Use one of the supported provider constants exactly: OPENAI, CLAUDE, GEMINI, or MINIMAX (case/whitespace insensitive).
- For OpenAI-compatible self-hosted endpoints, use provider OPENAI with a custom baseUrl rather than a custom provider string.
- If you genuinely need a new provider, add it to AiProviderEnum and implement its applyProviderDefaults branch.
Example fix
// before
resolve.setProvider("ollama"); // not in enum
// after - use OPENAI provider with a local base url for ollama-style endpoints
resolve.setProvider("OPENAI");
resolve.setBaseUrl("http://127.0.0.1:11434/v1");
resolve.setModel("llama3");
resolve.setApiKey("ollama"); // placeholder required by client Defensive patterns
Strategy: type-guard
Validate before calling
String provider = runtimeModel.getProvider();
AiProviderEnum p = AiProviderEnum.from(provider);
if (p == null) {
return ResponseEntity.badRequest()
.body("unsupported provider '" + provider + "'; use OPENAI/CLAUDE/GEMINI/MINIMAX");
} Type guard
static boolean isSupportedProvider(String provider) {
return AiProviderEnum.from(provider) != null;
} Try / catch
try {
service.validateRuntimeModel(m);
} catch (IllegalArgumentException e) {
if (e.getMessage() != null && e.getMessage().startsWith("Unsupported provider:")) {
return ResponseEntity.badRequest().body(e.getMessage());
}
throw e;
} Prevention
- Constrain the provider UI field to OPENAI/CLAUDE/GEMINI/MINIMAX.
- For OpenAI-compatible self-hosted endpoints, use OPENAI with a custom baseUrl.
- When adding a provider, update AiProviderEnum and its applyProviderDefaults branch together.
When it happens
Trigger: runtimeModel.getProvider() is a non-null, non-blank string that does not match any AiProviderEnum constant after trim+uppercase: e.g. 'AZURE', 'OPENROUTER', 'ollama', 'mistral', or a typo like 'OPENAI ' is fine (trimmed) but 'OPEN_AI' fails.
Common situations: User typed a custom provider string not in the enum; a config imported from another tool carries an unsupported provider; a new provider was added to the UI list without adding it to AiProviderEnum; casing/whitespace variants are tolerated but synonyms are not.
Related errors
- ai.model.config.required
- provider is required
- model is required
- The baseURL is not valid!
- The baseURL is not valid!
AI-assisted analysis of OtterMind/Chat2DB@5ee1e990e7 (2026-08-14).
Data as JSON: /api/errors/4c8f0e6be583c056.
Report an issue: GitHub.