{"record":{"id":"d4ec8b6287e8cda3","repo":"microsoft/semantic-kernel","slug":"invalid-argument-type-for-function-functionmetada","errorCode":null,"errorMessage":"Invalid argument type for function {functionMetadata.Name}. Parameter {param.Name} expects type {param.ParameterType ?? (object?)param.Schema} but received {value?.GetType().ToString() ?? \"<null>\"}.","messagePattern":"Invalid argument type for function (.+?)\\. Parameter (.+?) expects type (.+?) but received (.+?)\\.","errorType":"exception","errorClass":"KernelException","httpStatus":null,"severity":"error","filePath":"dotnet/src/Extensions/PromptTemplates.Handlebars/Helpers/KernelHelpers/KernelFunctionHelpers.cs","lineNumber":154,"sourceCode":"        KernelFunctionMetadata functionMetadata,\n        KernelArguments executionContext,\n        IDictionary<string, object>? handlebarsArguments,\n        string nameDelimiter)\n    {\n        // Prepare the input parameters for the function\n        foreach (var param in functionMetadata.Parameters)\n        {\n            var fullyQualifiedParamName = functionMetadata.Name + nameDelimiter + param.Name;\n            if (handlebarsArguments is not null && (handlebarsArguments.TryGetValue(fullyQualifiedParamName, out var value) || handlebarsArguments.TryGetValue(param.Name, out value)))\n            {\n                value = KernelHelpersUtils.GetArgumentValue(value, executionContext);\n                if (IsExpectedParameterType(param, value))\n                {\n                    executionContext[param.Name] = value;\n                }\n                else\n                {\n                    throw new KernelException($\"Invalid argument type for function {functionMetadata.Name}. Parameter {param.Name} expects type {param.ParameterType ?? (object?)param.Schema} but received {value?.GetType().ToString() ?? \"<null>\"}.\");\n                }\n            }\n            else if (param.IsRequired)\n            {\n                throw new KernelException($\"Parameter {param.Name} is required for function {functionMetadata.Name}.\");\n            }\n        }\n    }\n\n    /// <summary>\n    /// Processes the positional arguments passed to a Handlebars helper function.\n    /// </summary>\n    /// <param name=\"functionMetadata\">KernelFunctionMetadata for the function being invoked.</param>\n    /// <param name=\"executionContext\">Arguments maintained in the executing context.</param>\n    /// <param name=\"handlebarsArguments\">Arguments passed to the Handlebars helper.</param>\n    /// <exception cref=\"KernelException\">Thrown when a required parameter is missing.</exception>\n    private static void ProcessPositionalArguments(KernelFunctionMetadata functionMetadata, KernelArguments executionContext, Arguments handlebarsArguments)\n    {","sourceCodeStart":136,"sourceCodeEnd":172,"githubUrl":"https://github.com/microsoft/semantic-kernel/blob/c028a0c7dc4f0814cdcbaba9d998f187a41197bf/dotnet/src/Extensions/PromptTemplates.Handlebars/Helpers/KernelHelpers/KernelFunctionHelpers.cs#L136-L172","documentation":"Thrown during hash-argument processing when a provided argument value's type does not match the expected parameter type. The helper validates each supplied argument against the function metadata before invoking the kernel function.","triggerScenarios":"ProcessHashArguments checks IsExpectedParameterType(param, value) for each hash-supplied argument; a type mismatch (e.g., passing a string where an int is expected, or null for a non-nullable) throws this.","commonSituations":"Template supplies a literal of the wrong type (e.g., {{Function count=\"three\"}} for an int parameter), a variable resolves to an unexpected runtime type, or schema/parameter type changes between versions.","solutions":["Align the argument value type in the template with the parameter's declared type (e.g., pass numeric literals for int parameters).","Pre-validate kernel argument values before rendering the template.","Update the function metadata schema if the parameter type changed and templates must adapt."],"exampleFix":"// before (param expects int)\n{{Plugin-Function count=\"3\"}}\n// after\n{{Plugin-Function count=3}}","handlingStrategy":"validation","validationCode":"foreach (var param in functionMetadata.Parameters)\n{\n    if (handlebarsArguments.TryGetValue(param.Name, out var value) && !IsExpectedParameterType(param, value))\n        throw new InvalidOperationException($\"Argument '{param.Name}' type mismatch for {functionMetadata.Name}.\");\n}","typeGuard":"// Reuse the library's own check if exposed; otherwise mirror parameter type expectations\npublic static bool MatchesParamType(KernelParameterMetadata param, object? value)\n{\n    if (param.ParameterType is null) return true;\n    return value is null ? !param.IsRequired : param.ParameterType.IsAssignableFrom(value.GetType());\n}","tryCatchPattern":"try\n{\n    var result = await template.RenderAsync(kernel, arguments).ConfigureAwait(false);\n}\ncatch (KernelException ex) when (ex.Message.Contains(\"Invalid argument type\"))\n{\n    _logger.LogError(ex, \"Hash argument type mismatch; convert the value to the declared type.\");\n    throw;\n}","preventionTips":["Match literal types in templates to parameter declared types.","Pre-convert argument values before rendering.","Update templates when parameter types change."],"tags":["handlebars","prompt-templates","function-invocation","type-mismatch","arguments"],"backgroundTag":null,"analyzedSha":"c028a0c7dc4f0814cdcbaba9d998f187a41197bf","analyzedAt":"2026-08-13T13:48:05.040Z","schemaVersion":2},"datasetVersion":"2026-08-13T14:17:21.547Z"}