{"record":{"id":"febcd770e6381f32","repo":"microsoft/autogen","slug":"missing-parameter-type-for-parametername","errorCode":null,"errorMessage":"Missing parameter type for {parameterName}","messagePattern":"Missing parameter type for (.+?)","errorType":"exception","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"dotnet/src/AutoGen.SemanticKernel/Middleware/KernelPluginMiddleware.cs","lineNumber":47,"sourceCode":"        _functionCallMiddleware = new FunctionCallMiddleware(functionContracts, functionMap, Name);\n    }\n\n    public Task<IMessage> InvokeAsync(MiddlewareContext context, IAgent agent, CancellationToken cancellationToken = default)\n    {\n        return _functionCallMiddleware.InvokeAsync(context, agent, cancellationToken);\n    }\n\n    private async Task<string> InvokeFunctionAsync(Kernel kernel, KernelFunction function, string arguments)\n    {\n        var kernelArguments = new KernelArguments();\n        var parameters = function.Metadata.Parameters;\n        var jsonObject = JsonSerializer.Deserialize<JsonObject>(arguments) ?? new JsonObject();\n        foreach (var parameter in parameters)\n        {\n            var parameterName = parameter.Name;\n            if (jsonObject.ContainsKey(parameterName))\n            {\n                var parameterType = parameter.ParameterType ?? throw new ArgumentException($\"Missing parameter type for {parameterName}\");\n                var parameterValue = jsonObject[parameterName];\n                var parameterObject = parameterValue.Deserialize(parameterType);\n                kernelArguments.Add(parameterName, parameterObject);\n            }\n            else\n            {\n                if (parameter.DefaultValue != null)\n                {\n                    kernelArguments.Add(parameterName, parameter.DefaultValue);\n                }\n                else if (parameter.IsRequired)\n                {\n                    throw new ArgumentException($\"Missing required parameter: {parameterName}\");\n                }\n            }\n        }\n        var result = await function.InvokeAsync(kernel, kernelArguments);\n","sourceCodeStart":29,"sourceCodeEnd":65,"githubUrl":"https://github.com/microsoft/autogen/blob/027ecf0a379bcc1d09956d46d12d44a3ad9cee14/dotnet/src/AutoGen.SemanticKernel/Middleware/KernelPluginMiddleware.cs#L29-L65","documentation":"KernelPluginMiddleware.InvokeFunctionAsync deserializes the LLM's JSON arguments and converts each value using KernelParameterMetadata.ParameterType. If the plugin function's parameter metadata carries no .NET type (ParameterType == null), conversion is impossible and this ArgumentException is thrown.","triggerScenarios":"Registering a KernelFunction whose parameter metadata lacks a resolved type — typically dynamically constructed functions (e.g. from PromptFunctions with untyped arguments) or KernelFunctionFactory overloads that do not carry reflection info — and the model then supplies that parameter in its arguments JSON.","commonSituations":"Building KernelPlugins from delegates defined via method-info-less factories; AOT/trimming scenarios stripping metadata; plugins authored with object/dynamic parameters.","solutions":["Define plugin methods as concrete public C# methods so KernelFunctionFactory.FromMethod captures ParameterType via reflection.","If constructing KernelFunctionMetadata manually, always populate ParameterType for each KernelParameterMetadata.","Check for null ParameterType at plugin registration time and fail fast with a clear message naming the function.","Avoid dynamic/AOT trimming for assemblies containing plugins, or use source-generated plugin metadata."],"exampleFix":"// before\nvar metadata = new KernelFunctionMetadata(\"get_weather\")\n{\n    Parameters = [new KernelParameterMetadata(\"city\")] // no ParameterType\n};\n\n// after\nvar metadata = new KernelFunctionMetadata(\"get_weather\")\n{\n    Parameters = [new KernelParameterMetadata(\"city\") { ParameterType = typeof(string) }]\n};","handlingStrategy":"validation","validationCode":"// Fail fast at plugin registration\nforeach (var p in function.Metadata.Parameters)\n{\n    if (p.ParameterType is null)\n        throw new InvalidOperationException($\"Plugin '{function.Metadata.Name}': parameter '{p.Name}' has no ParameterType.\");\n}","typeGuard":null,"tryCatchPattern":"catch (ArgumentException ex) when (ex.Message.StartsWith(\"Missing parameter type\"))\n{\n    logger.LogError(ex, \"Plugin metadata incomplete; register plugins from strongly-typed methods\");\n    throw;\n}","preventionTips":["Register plugins from concrete public methods (KernelFunctionFactory.FromMethodWithType) so reflection supplies types.","Smoke-test every plugin registration at startup, verifying ParameterType is non-null.","Avoid dynamic metadata construction without explicit ParameterType assignments."],"tags":["semantic-kernel","plugins","metadata","autogen","csharp"],"backgroundTag":null,"analyzedSha":"027ecf0a379bcc1d09956d46d12d44a3ad9cee14","analyzedAt":"2026-08-15T03:38:00.719Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}