{"record":{"id":"64e728ccd10e9327","repo":"microsoft/aspire","slug":"model-must-be-a-foundrymodel-or-a-string-model-name-64e728","errorCode":null,"errorMessage":"Model must be a FoundryModel or a string model name.","messagePattern":"Model must be a FoundryModel or a string model name\\.","errorType":"validation","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/Aspire.Hosting.Foundry/Project/ProjectBuilderExtension.cs","lineNumber":311,"sourceCode":"    [AspireExport(\"addModelDeployment\")]\n    internal static IResourceBuilder<FoundryDeploymentResource> AddModelDeploymentForPolyglot(\n        this IResourceBuilder<AzureCognitiveServicesProjectResource> builder,\n        [ResourceName] string name,\n        [AspireUnion(typeof(FoundryModel), typeof(string))] object model,\n        string? modelVersion = null,\n        string? format = null)\n    {\n        ArgumentNullException.ThrowIfNull(builder);\n        ArgumentNullException.ThrowIfNull(model);\n        ArgumentException.ThrowIfNullOrEmpty(name);\n\n        return model switch\n        {\n            FoundryModel foundryModel when modelVersion is null && format is null => builder.AddModelDeployment(name, foundryModel),\n            FoundryModel => throw new ArgumentException(\"Model version and format must be omitted when using a FoundryModel.\", nameof(modelVersion)),\n            string modelName when modelVersion is not null && format is not null => builder.AddModelDeployment(name, modelName, modelVersion, format),\n            string => throw new ArgumentException(\"Model version and format are required when the model is provided as a string.\", nameof(modelVersion)),\n            _ => throw new ArgumentException(\"Model must be a FoundryModel or a string model name.\", nameof(model))\n        };\n    }\n\n    /// <summary>\n    /// Adds a model deployment to the parent Microsoft Foundry resource of the Microsoft Foundry project.\n    /// </summary>\n    [AspireExportIgnore(Reason = \"Polyglot AppHosts use the internal addModelDeployment dispatcher export.\")]\n    public static IResourceBuilder<FoundryDeploymentResource> AddModelDeployment(\n        this IResourceBuilder<AzureCognitiveServicesProjectResource> builder,\n        [ResourceName] string name,\n        string modelName,\n        string modelVersion,\n        string format)\n    {\n        ArgumentNullException.ThrowIfNull(builder);\n        ArgumentException.ThrowIfNullOrEmpty(name);\n        return builder.ApplicationBuilder.CreateResourceBuilder(builder.Resource.Parent).AddDeployment(name, modelName, modelVersion, format);\n    }","sourceCodeStart":293,"sourceCodeEnd":329,"githubUrl":"https://github.com/microsoft/aspire/blob/25830f84bd145686607ad00c057b3f84e2e51d43/src/Aspire.Hosting.Foundry/Project/ProjectBuilderExtension.cs#L293-L329","documentation":"Type filter in AddModelDeploymentForPolyglot: the 'model' argument of the AspireUnion parameter is neither a FoundryModel instance nor a string model name. The polyglot bridge supplied an unsupported type for the union parameter.","triggerScenarios":"Passing null, an enum, a custom model wrapper, or any object that is neither FoundryModel nor string as the model argument to AddModelDeploymentForPolyglot.","commonSituations":"Dynamic/deserialized model values of unexpected type in polyglot app hosts; a variable typed as object passed straight through; passing null where the parameter type allows it.","solutions":["Pass a FoundryModel instance or a string model name","Check the model value's type at the call site before invoking","If the value may be null or another type, throw or convert it before calling"],"exampleFix":"// before\nobject model = GetModel();\nproject.AddModelDeploymentForPolyglot(\"gpt-4o\", model);\n\n// after\nFoundryModel model = GetModel();\nproject.AddModelDeploymentForPolyglot(\"gpt-4o\", model);","handlingStrategy":"type-guard","validationCode":"if (model is not (FoundryModel or string))\n{\n    throw new InvalidOperationException($\"Unsupported model type {model?.GetType().Name}.\");\n}","typeGuard":"static bool IsValidModel(object? model) => model is FoundryModel or string;","tryCatchPattern":"try { project.AddModelDeploymentForPolyglot(name, model, version, format); }\ncatch (ArgumentException ex) when (ex.Message.Contains(\"FoundryModel or a string\"))\n{\n    // Convert or reject the unsupported model value.\n}","preventionTips":["Type model variables as FoundryModel or string, not object","Validate deserialized/config model values before calling","Never pass null as the model argument"],"tags":["csharp","aspire","azure","argument-type"],"backgroundTag":"invalid-argument-value","analyzedSha":"25830f84bd145686607ad00c057b3f84e2e51d43","analyzedAt":"2026-09-16T11:10:06.193Z","contentChangedAt":"2026-09-16T11:10:06.193Z","schemaVersion":2},"datasetVersion":"2026-09-21T04:17:39.646Z"}