alibaba/spring-ai-alibaba · error · IllegalArgumentException
模型ID不能为空
Error message
模型ID不能为空
What it means
An IllegalArgumentException thrown by ModelConfigParser.validateModelConfig when ModelConfigInfo is non-null but its modelId field is null. A model configuration must identify which model to use; without modelId it cannot be resolved or executed.
Source
Thrown at spring-ai-alibaba-admin/spring-ai-alibaba-admin-server-start/src/main/java/com/alibaba/cloud/ai/studio/admin/utils/ModelConfigParser.java:194
} catch (Exception e) {
log.warn("变量替换失败,使用原始模板: template={}, variables={}", template, variablesJson, e);
return template;
}
}
/**
* 验证模型配置的有效性 只验证必需字段,动态参数由模型服务自行验证
*
* @param modelConfigInfo 模型配置信息
* @throws IllegalArgumentException 如果配置无效
*/
public void validateModelConfig(ModelConfigInfo modelConfigInfo) {
if (modelConfigInfo == null) {
throw new IllegalArgumentException("模型配置不能为空");
}
if (modelConfigInfo.getModelId() == null) {
throw new IllegalArgumentException("模型ID不能为空");
}
// 只进行基本的数据类型验证,具体的参数范围由模型服务验证
validateParameterTypes(modelConfigInfo);
}
/**
* 验证参数类型是否合理 确保数值参数确实是数值类型
*
* @param modelConfigInfo 模型配置信息
*/
private void validateParameterTypes(ModelConfigInfo modelConfigInfo) {
Map<String, Object> parameters = modelConfigInfo.getAllParameters();
for (Map.Entry<String, Object> entry : parameters.entrySet()) {
String name = entry.getKey();
Object value = entry.getValue();
View on GitHub (pinned to f82da0b50f)
Solutions
- Add the modelId field to the config JSON (e.g. {"modelId":"qwen-max",...}).
- Set modelConfigInfo.setModelId(...) before validation when building the object in code.
- Check field naming against ModelConfigInfo so Jackson actually populates modelId (watch @JsonProperty aliases).
- Run parser.parseModelConfig on the JSON and log the resulting modelId to confirm deserialization.
Example fix
// before
String cfg = "{\"modelName\":\"qwen-max\"}"; // no modelId
ModelConfigInfo info = parser.parseModelConfig(cfg);
parser.validateModelConfig(info); // IAE: 模型ID不能为空
// after
String cfg = "{\"modelId\":\"qwen-max\"}";
ModelConfigInfo info = parser.parseModelConfig(cfg);
parser.validateModelConfig(info); // ok Defensive patterns
Strategy: validation
Validate before calling
if (info.getModelId() == null || info.getModelId().isBlank()) throw new BadRequestException("modelId is required in model config"); Type guard
boolean hasModelId = modelConfigInfo != null && modelConfigInfo.getModelId() != null;
Try / catch
try { parser.validateModelConfig(info); } catch (IllegalArgumentException e) { if (e.getMessage().contains("模型ID不能为空")) { /* fix config JSON to include modelId */ } throw e; } Prevention
- Always include modelId in stored config JSON
- Verify Jackson field mapping matches ModelConfigInfo property names
- Assert modelId after parsing in tests for config fixtures
When it happens
Trigger: Calling validateModelConfig with a ModelConfigInfo deserialized from JSON lacking a 'modelId' key, or one built programmatically without setModelId(...). Note checkAndGetModelConfigInfo may later overwrite modelId with the ModelEntity id — but validation before that will still fail.
Common situations: Hand-written config JSON missing the modelId field; renamed field (e.g. 'model' vs 'modelId') so Jackson leaves modelId null; constructing ModelConfigInfo in tests/other code without setting the id.
Understand the failure class
Background: "is required", "must be set", "missing required field": configuration validation errors across open-source libraries — this error's family across 36 libraries.
Related errors
AI-assisted analysis of alibaba/spring-ai-alibaba@f82da0b50f (2026-09-09).
Data as JSON: /api/errors/9eb08cb23c09c844.
Report an issue: GitHub.