< Summary

Information
Class: NexusLabs.Needlr.SemanticKernel.SemanticKernelSyringe
Assembly: NexusLabs.Needlr.SemanticKernel
File(s): /home/runner/work/needlr/needlr/src/NexusLabs.Needlr.SemanticKernel/SemanticKernelSyringe.cs
Line coverage
100%
Covered lines: 38
Uncovered lines: 0
Coverable lines: 38
Total lines: 87
Line coverage: 100%
Branch coverage
75%
Covered branches: 12
Total branches: 16
Branch coverage: 75%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
get_ServiceProvider()100%11100%
get_ConfigureKernelFactory()100%11100%
get_PluginTypes()100%11100%
BuildKernelFactory(...)60%1010100%
SetupPlugins(...)100%66100%
BuildPluginFromType()100%11100%

File(s)

/home/runner/work/needlr/needlr/src/NexusLabs.Needlr.SemanticKernel/SemanticKernelSyringe.cs

#LineLine coverage
 1using Microsoft.Extensions.DependencyInjection;
 2using Microsoft.Extensions.DependencyInjection.Extensions;
 3using Microsoft.SemanticKernel;
 4
 5using System.Diagnostics.CodeAnalysis;
 6using System.Reflection;
 7
 8namespace NexusLabs.Needlr.SemanticKernel;
 9
 10/// <summary>
 11/// Fluent builder for configuring Semantic Kernel with Needlr plugin discovery.
 12/// </summary>
 13/// <remarks>
 14/// This class uses reflection to discover methods with <see cref="KernelFunctionAttribute"/>.
 15/// For AOT/trimmed applications, consider registering kernel functions explicitly.
 16/// </remarks>
 17[DoNotAutoRegister]
 18[RequiresUnreferencedCode("SemanticKernel plugin setup uses reflection to discover [KernelFunction] methods.")]
 19[RequiresDynamicCode("SemanticKernel plugin setup uses reflection APIs that require dynamic code generation.")]
 20public sealed record SemanticKernelSyringe
 21{
 10922    public required IServiceProvider ServiceProvider { get; init; }
 23
 6924    internal List<Action<KernelFactoryOptions>>? ConfigureKernelFactory { get; init; } = [];
 25
 11526    internal List<Type>? PluginTypes { get; init; } = [];
 27
 28    public IKernelFactory BuildKernelFactory(
 29        Action<KernelFactoryOptions>? configure = null)
 30    {
 3231        var pluginFactory = ServiceProvider.GetRequiredService<IPluginFactory>();
 3232        KernelFactory kernelFactory = new(
 3233            _serviceProvider: ServiceProvider,
 3234            _pluginFactory: pluginFactory,
 3235            _configure: options =>
 3236            {
 3137                SetupPlugins(
 3138                    options.KernelBuilder,
 3139                    PluginTypes ?? []);
 3240
 6841                foreach (var callback in ConfigureKernelFactory ?? [])
 3242                {
 343                    callback?.Invoke(options);
 3244                }
 3245
 3146                configure?.Invoke(options);
 3247            });
 3248        return kernelFactory;
 49    }
 50
 51    private static void SetupPlugins(
 52        IKernelBuilder kernelBuilder,
 53        IReadOnlyList<Type> pluginTypes)
 54    {
 31055        foreach (var pluginType in pluginTypes)
 56        {
 12457            if (pluginType.IsStatic())
 58            {
 2459                var funcs = pluginType.GetMethods(BindingFlags.Public | BindingFlags.Static)
 2460                    .Where(m => m.IsDefined(typeof(KernelFunctionAttribute), inherit: true))
 2461                    .Select(m => KernelFunctionFactory.CreateFromMethod(m, target: null))
 2462                    .ToList();
 63
 2464                if (funcs.Count > 0)
 65                {
 2466                    var plugin = KernelPluginFactory.CreateFromFunctions(pluginType.Name, funcs);
 2467                    kernelBuilder.Plugins.Add(plugin);
 68                }
 69
 2470                continue;
 71            }
 72
 20073            kernelBuilder.Plugins.Services.AddSingleton(sp => BuildPluginFromType(pluginType, sp));
 74        }
 75
 76        static KernelPlugin BuildPluginFromType(
 77            Type pluginType,
 78            IServiceProvider serviceProvider)
 79        {
 10080            var plugin = KernelPluginFactory.CreateFromType(
 10081                instanceType: pluginType,
 10082                pluginName: pluginType.Name,
 10083                serviceProvider: serviceProvider);
 10084            return plugin;
 85        }
 3186    }
 87}