Soenneker.SemanticKernel.Pool
                              
                            
                                3.0.114
                            
                        
                            
                                
                                
                                    Prefix Reserved
                                
                            
                    See the version list below for details.
dotnet add package Soenneker.SemanticKernel.Pool --version 3.0.114
NuGet\Install-Package Soenneker.SemanticKernel.Pool -Version 3.0.114
<PackageReference Include="Soenneker.SemanticKernel.Pool" Version="3.0.114" />
<PackageVersion Include="Soenneker.SemanticKernel.Pool" Version="3.0.114" />
<PackageReference Include="Soenneker.SemanticKernel.Pool" />
paket add Soenneker.SemanticKernel.Pool --version 3.0.114
#r "nuget: Soenneker.SemanticKernel.Pool, 3.0.114"
#:package Soenneker.SemanticKernel.Pool@3.0.114
#addin nuget:?package=Soenneker.SemanticKernel.Pool&version=3.0.114
#tool nuget:?package=Soenneker.SemanticKernel.Pool&version=3.0.114
 Soenneker.SemanticKernel.Pool
A high-performance, thread-safe pool implementation for Microsoft Semantic Kernel instances with built-in rate limiting capabilities.
Features
- Kernel Pooling: Efficiently manages and reuses Semantic Kernel instances
 - Rate Limiting: Built-in support for request rate limiting at multiple time windows:
- Per-second rate limiting
 - Per-minute rate limiting
 - Per-day rate limiting
 - Token-based rate limiting
 
 - Thread Safety: Fully thread-safe implementation using concurrent collections and async locking
 - Flexible Configuration: Configurable rate limits and pool settings
 - Resource Management: Automatic cleanup of expired rate limit windows
 
Installation
dotnet add package Soenneker.SemanticKernel.Pool
services.AddSemanticKernelPoolAsSingleton();
Extension Packages
This library has several extension packages for different AI providers:
- Soenneker.SemanticKernel.Pool.Gemini – Google Gemini integration
 - Soenneker.SemanticKernel.Pool.OpenAi – OpenAI/OpenRouter.ai/etc. integration
 - Soenneker.SemanticKernel.Pool.Ollama – Ollama integration
 - Soenneker.SemanticKernel.Pool.OpenAi.Azure – Azure OpenAI integration
 
Usage
Startup Configuration
// Program.cs or Startup.cs
public class Program
{
    public static async Task Main(string[] args)
    {
        var builder = WebApplication.CreateBuilder(args);
        // Add the kernel pool as a singleton
        builder.Services.AddSemanticKernelPoolAsSingleton();
        var app = builder.Build();
        // Get the pool service
        var kernelPool = app.Services.GetRequiredService<ISemanticKernelPool>();
        // Create SemanticKernelOptions (example uses OpenAI)
        var options = new SemanticKernelOptions
        {
            ApiKey = "your-api-key",
            Endpoint = "https://api.openai.com/v1",
            Model = "gpt-4",
            KernelFactory = async (opts, _) =>
            {
                return Kernel.CreateBuilder()
                             .AddOpenAIChatCompletion(
                                 modelId: opts.ModelId!,
                                 new OpenAIClient(
                                     new ApiKeyCredential(opts.ApiKey),
                                     new OpenAIClientOptions { Endpoint = new Uri(opts.Endpoint) }));
            },
            // Rate Limiting
            RequestsPerSecond = 10,
            RequestsPerMinute = 100,
            RequestsPerDay = 1000,
            TokensPerDay = 10000
        };
        // Register one or more entries under a "sub-pool-1" sub-pool
        // poolId: "sub-pool-1", entryKey: "entry1"
        await kernelPool.Register("sub-pool-1", "entry1", options);
        // You can register additional entries (with different entryKey or options)
        // await kernelPool.Register("sub-pool-1", "entry2", otherOptions);
        await app.RunAsync();
    }
}
Working with Sub-Pools
Each call to Register(...) creates a new “entry” under the specified poolId. Entries are checked out in the order they were added (round-robin), subject to rate limits. You can have multiple sub-pools by choosing different poolId strings:
// Register two separate sub-pools
await kernelPool.Register("reasoning", "o4-mini-high", reasoningOptions);
await kernelPool.Register("high-performance", "4o", highPerformanceOptions);
Retrieving an Available Kernel
public class MyService
{
    private readonly ISemanticKernelPool _kernelPool;
    public MyService(ISemanticKernelPool kernelPool)
    {
        _kernelPool = kernelPool;
    }
    public async Task ProcessAsync()
    {
        // Attempt to get an available kernel from the "my-kernel" sub-pool
        // If no type is provided, defaults to KernelType.Chat
        var (kernel, entry) = await _kernelPool.GetAvailableKernel("my-kernel");
        if (kernel is null || entry is null)
        {
            Console.WriteLine("No available kernel or operation was cancelled.");
            return;
        }
        // Use the kernel as usual
        var chatCompletion = kernel.GetService<IChatCompletionService>();
        var chatHistory = new ChatHistory();
        chatHistory.AddMessage(AuthorRole.User, "What's the capital of France?");
        var response = await chatCompletion.GetChatMessageContentAsync(chatHistory);
        Console.WriteLine($"Response: {response.Content}");
        // Check rate limit usage
        var remaining = await entry.RemainingQuota();
        Console.WriteLine($"Remaining quotas — Second: {remaining.Second}, Minute: {remaining.Minute}, Day: {remaining.Day}");
    }
}
Unregistering and Clearing
Remove a single entry from a sub-pool
bool removed = await kernelPool.Remove("sub-pool-1", "entry1");Clear a single sub-pool (removes all entries under that
poolIdand clears cache for those entries)await kernelPool.Clear("sub-pool-1");Clear all sub-pools (removes every
poolId, all entries, and clears the entire cache)await kernelPool.ClearAll();
| Product | Versions Compatible and additional computed target framework versions. | 
|---|---|
| .NET | net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. | 
- 
                                                    
net9.0
- Soenneker.SemanticKernel.Cache (>= 3.0.540)
 - Soenneker.Utils.Delay (>= 3.0.30)
 
 
NuGet packages (5)
Showing the top 5 NuGet packages that depend on Soenneker.SemanticKernel.Pool:
| Package | Downloads | 
|---|---|
| 
                                                        
                                                            Soenneker.SemanticKernel.Pool.OpenAi
                                                        
                                                            
                                                         Provides OpenAI-specific registration extensions for KernelPoolManager, enabling integration with local LLMs via Semantic Kernel.  | 
                                                    |
| 
                                                        
                                                            Soenneker.SemanticKernel.Pool.Ollama
                                                        
                                                            
                                                         Provides Ollama-specific registration extensions for KernelPoolManager, enabling integration with local LLMs via Semantic Kernel.  | 
                                                    |
| 
                                                        
                                                            Soenneker.SemanticKernel.Pool.Gemini
                                                        
                                                            
                                                         Provides Gemini-specific registration extensions for KernelPoolManager, enabling integration with local LLMs via Semantic Kernel.  | 
                                                    |
| 
                                                        
                                                            Soenneker.SemanticKernel.Pool.OpenAi.Azure
                                                        
                                                            
                                                         Provides Azure OpenAI-specific registration extensions for KernelPoolManager, enabling integration with local LLMs via Semantic Kernel.  | 
                                                    |
| 
                                                        
                                                            Soenneker.SemanticKernel.Pool.Mistral
                                                        
                                                            
                                                         Provides Mistral-specific registration extensions for KernelPoolManager, enabling integration via Semantic Kernel.  | 
                                                    
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated | 
|---|---|---|
| 4.0.130 | 0 | 11/4/2025 | 
| 4.0.129 | 0 | 11/3/2025 | 
| 4.0.128 | 180 | 10/30/2025 | 
| 4.0.127 | 188 | 10/30/2025 | 
| 4.0.126 | 173 | 10/30/2025 | 
| 4.0.125 | 167 | 10/30/2025 | 
| 4.0.124 | 200 | 10/30/2025 | 
| 4.0.123 | 177 | 10/29/2025 | 
| 3.0.122 | 208 | 10/29/2025 | 
| 3.0.121 | 265 | 10/24/2025 | 
| 3.0.120 | 305 | 10/16/2025 | 
| 3.0.119 | 279 | 10/16/2025 | 
| 3.0.118 | 242 | 10/15/2025 | 
| 3.0.117 | 203 | 10/15/2025 | 
| 3.0.116 | 324 | 10/9/2025 | 
| 3.0.115 | 373 | 10/8/2025 | 
| 3.0.114 | 239 | 10/8/2025 | 
| 3.0.113 | 272 | 9/30/2025 | 
| 3.0.112 | 471 | 9/16/2025 | 
| 3.0.111 | 347 | 9/16/2025 | 
| 3.0.110 | 305 | 9/11/2025 | 
| 3.0.109 | 225 | 9/10/2025 | 
| 3.0.108 | 291 | 9/9/2025 | 
| 3.0.107 | 194 | 9/9/2025 | 
| 3.0.106 | 206 | 9/9/2025 | 
| 3.0.105 | 176 | 9/9/2025 | 
| 3.0.104 | 208 | 9/9/2025 | 
| 3.0.103 | 363 | 9/5/2025 | 
| 3.0.102 | 257 | 9/4/2025 | 
| 3.0.101 | 301 | 9/4/2025 | 
| 3.0.100 | 209 | 9/3/2025 | 
| 3.0.99 | 236 | 9/3/2025 | 
| 3.0.98 | 247 | 9/3/2025 | 
| 3.0.97 | 182 | 9/3/2025 | 
| 3.0.96 | 248 | 9/3/2025 | 
| 3.0.95 | 175 | 9/3/2025 | 
| 3.0.94 | 357 | 8/28/2025 | 
| 3.0.93 | 245 | 8/27/2025 | 
| 3.0.92 | 267 | 8/20/2025 | 
| 3.0.91 | 235 | 8/17/2025 | 
| 3.0.90 | 320 | 8/15/2025 | 
| 3.0.89 | 263 | 8/14/2025 | 
| 3.0.88 | 241 | 8/13/2025 | 
| 3.0.87 | 296 | 8/12/2025 | 
| 3.0.86 | 246 | 8/12/2025 | 
| 3.0.85 | 164 | 8/12/2025 | 
| 3.0.84 | 253 | 8/11/2025 | 
| 3.0.83 | 172 | 8/11/2025 | 
| 3.0.82 | 276 | 8/11/2025 | 
| 3.0.81 | 159 | 8/11/2025 | 
| 3.0.80 | 402 | 8/11/2025 | 
| 3.0.79 | 177 | 8/11/2025 | 
| 3.0.78 | 419 | 8/6/2025 | 
| 3.0.77 | 344 | 8/5/2025 | 
| 3.0.76 | 248 | 8/5/2025 | 
| 3.0.75 | 330 | 8/5/2025 | 
| 3.0.74 | 391 | 8/5/2025 | 
| 3.0.73 | 231 | 7/30/2025 | 
| 3.0.72 | 147 | 7/30/2025 | 
| 3.0.71 | 545 | 7/25/2025 | 
| 3.0.70 | 524 | 7/24/2025 | 
| 3.0.69 | 412 | 7/9/2025 | 
| 3.0.68 | 232 | 7/9/2025 | 
| 3.0.67 | 204 | 7/9/2025 | 
| 3.0.66 | 163 | 7/9/2025 | 
| 3.0.65 | 221 | 7/9/2025 | 
| 3.0.64 | 225 | 7/8/2025 | 
| 3.0.63 | 471 | 7/4/2025 | 
| 3.0.62 | 352 | 7/2/2025 | 
| 3.0.61 | 353 | 6/28/2025 | 
| 3.0.60 | 134 | 6/28/2025 | 
| 3.0.59 | 200 | 6/28/2025 | 
| 3.0.58 | 218 | 6/28/2025 | 
| 3.0.57 | 113 | 6/27/2025 | 
| 3.0.56 | 159 | 6/27/2025 | 
| 3.0.55 | 280 | 6/26/2025 | 
| 3.0.54 | 241 | 6/25/2025 | 
| 3.0.53 | 249 | 6/25/2025 | 
| 3.0.52 | 227 | 6/25/2025 | 
| 3.0.51 | 394 | 6/17/2025 | 
| 3.0.50 | 421 | 6/11/2025 | 
| 3.0.49 | 389 | 6/11/2025 | 
| 3.0.48 | 397 | 6/11/2025 | 
| 3.0.47 | 443 | 6/11/2025 | 
| 3.0.46 | 376 | 6/11/2025 | 
| 3.0.45 | 421 | 6/10/2025 | 
| 3.0.44 | 409 | 6/3/2025 | 
| 3.0.43 | 248 | 6/3/2025 | 
| 3.0.42 | 243 | 6/3/2025 | 
| 3.0.41 | 208 | 6/3/2025 | 
| 3.0.40 | 216 | 6/3/2025 | 
| 3.0.39 | 216 | 6/3/2025 | 
| 3.0.38 | 246 | 6/3/2025 | 
| 3.0.37 | 226 | 6/2/2025 | 
| 3.0.36 | 322 | 5/28/2025 | 
| 3.0.35 | 256 | 5/28/2025 | 
| 3.0.34 | 262 | 5/28/2025 | 
| 3.0.33 | 196 | 5/28/2025 | 
| 3.0.32 | 266 | 5/27/2025 | 
| 3.0.31 | 234 | 5/27/2025 | 
| 3.0.30 | 181 | 5/27/2025 | 
| 3.0.29 | 306 | 5/27/2025 | 
| 3.0.28 | 286 | 5/26/2025 | 
| 3.0.27 | 183 | 5/25/2025 | 
| 3.0.26 | 172 | 5/25/2025 | 
| 3.0.25 | 156 | 5/23/2025 | 
| 3.0.24 | 185 | 5/23/2025 | 
| 3.0.23 | 169 | 5/23/2025 | 
| 3.0.22 | 162 | 5/23/2025 | 
| 3.0.21 | 173 | 5/23/2025 | 
| 3.0.20 | 199 | 5/23/2025 | 
| 3.0.19 | 190 | 5/22/2025 | 
| 3.0.18 | 178 | 5/22/2025 | 
| 3.0.17 | 469 | 5/22/2025 | 
| 3.0.16 | 202 | 5/21/2025 | 
| 3.0.15 | 262 | 5/20/2025 | 
| 3.0.14 | 239 | 5/19/2025 | 
| 3.0.13 | 215 | 5/19/2025 | 
| 3.0.12 | 171 | 5/19/2025 | 
| 3.0.11 | 176 | 5/19/2025 | 
| 3.0.10 | 212 | 5/19/2025 | 
| 3.0.9 | 180 | 5/19/2025 | 
| 3.0.8 | 278 | 5/19/2025 | 
| 3.0.7 | 174 | 5/18/2025 | 
| 3.0.6 | 189 | 5/18/2025 | 
| 3.0.5 | 184 | 5/18/2025 | 
| 3.0.4 | 173 | 5/18/2025 | 
| 3.0.3 | 165 | 5/18/2025 | 
| 3.0.2 | 167 | 5/18/2025 | 
| 3.0.1 | 172 | 5/18/2025 |