AICentral 0.21.1

There is a newer prerelease version of this package available.
See the version list below for details.
dotnet add package AICentral --version 0.21.1                
NuGet\Install-Package AICentral -Version 0.21.1                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="AICentral" Version="0.21.1" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add AICentral --version 0.21.1                
#r "nuget: AICentral, 0.21.1"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install AICentral as a Cake Addin
#addin nuget:?package=AICentral&version=0.21.1

// Install AICentral as a Cake Tool
#tool nuget:?package=AICentral&version=0.21.1                

AI Central

AI Central gives you control over your AI services.

  • Minimal overhead - written on Asp.Net Core, on dotnet 8. One of the fastest web-servers in the business.
  • Enable advanced Azure APIm scenarios such as passing a Subscription Key, and a JWT from libraries like PromptFlow that don't support that out-of-the-box.
  • PII Stripping logging to Cosmos DB
    • Powered by graemefoster/aicentral.logging.piistripping
  • Lightweight out-the-box token metrics surfaced through Open Telemetry
    • Does not buffer and block streaming
    • Use for PTU Chargeback scenarios
    • Gain quick insights into who's using what, how much, and how often
    • Standard Open Telemetry format to surface Dashboards in you monitoring solution of choice
  • Prompt and usage logging to Azure Monitor
    • Works for streaming endpoints as-well as non-streaming
  • Intelligent Routing
    • Endpoint Selector that favours endpoints reporting higher available capacity
    • Random endpoint selector
    • Prioritised endpoint selector with fallback
    • Lowest Latency endpoint selector
  • Can proxy asynchronous requests such as Azure OpenAI DALLE2 Image Generation across fleets of servers
  • Custom consumer OAuth2 authorisation
  • Can mint JWT time-bound and consumer-bound JWT tokens to make it easy to run events like Hackathons without blowing your budget
  • Circuit breakers and backoff-retry over downstream AI services
  • Local token rate limiting
    • By consumer / by endpoint
    • By number of tokens (including streaming by estimated token count)
  • Local request rate limiting
    • By consumer / by endpoint
  • Bulkhead support for buffering requests to backend
  • Distributed token rate limiting (using Redis)
    • Powered by an extension graemefoster/aicentral.ratelimiting.distributedredis
  • AI Search Vectorization endpoint
    • Powered by an extension graemefoster/aicentral.azureaisearchvectorizer
  • Support for Azure Inference endpoint

Configuration

See docs on Github for more details.

Minimal

This sample produces a AI-Central proxy that

  • Listens on a hostname of your choosing
  • Proxies directly through to a back-end Open AI server
  • Can be accessed using standard SDKs
  • Outputs open-telemetry metrics to capture usage information
{
  "AICentral": {
    "Endpoints": [
      {
        "Type": "AzureOpenAIEndpoint",
        "Name": "openai-1",
        "Properties": {
          "LanguageEndpoint": "https://<my-ai>.openai.azure.com",
          "AuthenticationType": "ApiKey",
          "ApiKey": "<key>"
        }
      }
    ],
    "EndpointSelectors": [
      {
        "Type": "SingleEndpoint",
        "Name": "default",
        "Properties": {
          "Endpoint": "openai-1"
        }
      }
    ],
    "AuthProviders": [
      {
        "Type": "ApiKey",
        "Name": "apikey",
        "Properties": {
          "Clients": [
            {
              "ClientName": "Consumer-1",
              "Key1": "<random-key>",
              "Key2": "<random-key>"
            }
          ]
        }
      }
    ],
    "Pipelines": [
      {
        "Name": "OpenAIPipeline",
        "Host": "mypipeline.mydomain.com",
        "EndpointSelector": "default",
        "AuthProvider": "apikey",
        "OpenTelemetryConfig": {
          "AddClientNameTag": true,
          "Transmit": true
        }
      }
    ]
  }
}

Full example

This pipeline will:

  • Present an Azure Open AI, and an Open AI downstream as a single upstream endpoint
    • maps the incoming deployment Name "GPT35Turbo0613" to the downstream Azure Open AI deployment "MyGptModel"
    • maps incoming Azure Open AI deployments to Open AI models
  • Present it as an Azure Open AI style endpoint
  • Protect the front-end by requiring an AAD token issued for your own AAD application
  • Put a local Asp.Net core rate-limiting policy over the endpoint
  • Emit Open Telemetry to be picked up by your OTel collector
  • Add rich logging to Azure monitor
    • Logs quota, client caller information (IP and identity name), and in this case the Prompt but not the response.
  • Publish the client-name as a tag in Open Telemetry
{
  "AICentral": {
    "Endpoints": [
      {
        "Type": "AzureOpenAIEndpoint",
        "Name": "openai-priority",
        "Properties": {
          "LanguageEndpoint": "https://<my-ai>.openai.azure.com",
          "AuthenticationType": "Entra|EntraPassThrough|ApiKey",
          "MaxConcurrency": 10,
          "ModelMappings": {
            "Gpt35Turbo0613": "MyGptModel"
          }
        }
      },
      {
        "Type": "OpenAIEndpoint",
        "Name": "openai-fallback",
        "Properties": {
          "LanguageEndpoint": "https://api.openai.com",
          "ModelMappings": {
            "Gpt35Turbo0613": "gpt-3.5-turbo",
            "Ada002Embedding": "text-embedding-ada-002"
          },
          "ApiKey": "<my-api-key>",
          "Organization": "<optional-organisation>"
        }
      }
    ],
    "AuthProviders": [
      {
        "Type": "Entra",
        "Name": "simple-aad",
        "Properties": {
          "Entra": {
            "ClientId": "<my-client-id>",
            "TenantId": "<my-tenant-id>",
            "Instance": "https://login.microsoftonline.com/",
            "Audience": "<custom-audience>"
          }
        }
      }
    ],
    "EndpointSelectors": [
      {
        "Type": "Prioritised",
        "Name": "my-endpoint-selector",
        "Properties": {
          "PriorityEndpoints": ["openai-1"],
          "FallbackEndpoints": ["openai-fallback"]
        }
      }
    ],
    "GenericSteps": [
      {
        "Type": "AspNetCoreFixedWindowRateLimiting",
        "Name": "token-rate-limiter",
        "Properties": {
          "LimitType": "PerConsumer|PerAICentralEndpoint",
          "MetricType": "Tokens",
          "Options": {
            "Window": "00:01:00",
            "PermitLimit": 1000
          }
        }
      },
      {
        "Type": "AspNetCoreFixedWindowRateLimiting",
        "Name": "window-rate-limiter",
        "Properties": {
          "LimitType": "PerConsumer|PerAICentralEndpoint",
          "MetricType": "Requests",
          "Options": {
            "Window": "00:00:10",
            "PermitLimit": 100
          }
        }
      },
      {
        "Type": "AzureMonitorLogger",
        "Name": "azure-monitor-logger",
        "Properties": {
          "WorkspaceId": "<workspace-id>",
          "Key": "<key>",
          "LogPrompt": true,
          "LogResponse": false,
          "LogClient": true
        }
      },
      {
        "Type": "BulkHead",
        "Name": "bulk-head",
        "Properties": {
          "MaxConcurrency": 20
        }
      }
    ],
    "Pipelines": [
      {
        "Name": "MyPipeline",
        "Host": "prioritypipeline.mydomain.com",
        "EndpointSelector": "my-endpoint-selector",
        "AuthProvider": "simple-aad",
        "Steps": [
          "window-rate-limiter",
          "bulk-head",
          "azure-monitor-logger"
        ],
        "OpenTelemetryConfig": {
          "AddClientNameTag": true,
          "Transmit": true
        }
      }
    ]
  }
}

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
0.21.3-pullrequest0155-0002 42 1/30/2025
0.21.1 250 1/14/2025
0.21.1-pullrequest0153-0003 28 1/14/2025
0.21.0 309 12/9/2024
0.21.0-pullrequest0152-0005 53 12/9/2024
0.21.0-pullrequest0152-0004 56 12/9/2024
0.21.0-pullrequest0152-0003 54 12/9/2024
0.21.0-pullrequest0152-0002 53 12/9/2024
0.20.7 218 11/26/2024
0.20.7-pullrequest0151-0002 60 11/26/2024
0.20.6 356 11/1/2024
0.20.6-pullrequest0150-0003 54 11/1/2024
0.20.5 183 9/30/2024
0.20.5-pullrequest0148-0004 67 9/30/2024
0.20.5-pullrequest0148-0003 62 9/30/2024
0.20.5-pullrequest0148-0002 76 9/30/2024
0.20.3 106 9/5/2024
0.20.3-pullrequest0146-0005 56 9/5/2024
0.20.3-pullrequest0146-0004 58 9/5/2024
0.20.2 72 9/4/2024
0.20.2-pullrequest0145-0004 50 9/4/2024
0.20.0 94 8/17/2024
0.20.0-pullrequest0143-0013 73 8/17/2024
0.20.0-pullrequest0143-0012 73 8/17/2024
0.20.0-pullrequest0143-0011 75 8/17/2024
0.20.0-pullrequest0143-0010 71 8/17/2024
0.20.0-pullrequest0143-0009 71 8/17/2024
0.19.6-pullrequest0143-0008 80 8/17/2024
0.19.5 67 8/7/2024
0.19.5-pullrequest0141-0002 54 8/7/2024
0.19.4 67 8/1/2024
0.19.4-pullrequest0140-0003 54 8/1/2024
0.19.4-pullrequest0139-0001 55 7/29/2024
0.19.3 64 7/29/2024
0.19.2 67 7/29/2024
0.19.2-pullrequest0138-0004 54 7/29/2024
0.19.1 63 7/29/2024
0.19.1-pullrequest0137-0003 55 7/29/2024
0.19.0 57 7/29/2024
0.19.0-pullrequest0136-0014 52 7/29/2024
0.19.0-pullrequest0136-0013 51 7/29/2024
0.19.0-pullrequest0136-0012 142 7/29/2024
0.19.0-pullrequest0136-0011 54 7/29/2024
0.19.0-pullrequest0136-0010 57 7/29/2024
0.19.0-pullrequest0136-0009 68 7/27/2024
0.19.0-pullrequest0136-0008 59 7/27/2024
0.19.0-pullrequest0136-0007 60 7/27/2024
0.18.6 78 7/15/2024
0.18.6-pullrequest0135-0002 56 7/15/2024
0.18.5 64 7/15/2024
0.18.5-pullrequest0134-0003 52 7/15/2024
0.18.4 67 7/15/2024
0.18.4-pullrequest0133-0009 59 7/15/2024
0.18.4-pullrequest0133-0008 55 7/15/2024
0.18.4-pullrequest0133-0007 56 7/15/2024
0.18.3 73 7/12/2024
0.18.3-pullrequest0132-0005 57 7/12/2024
0.18.2 64 7/12/2024
0.18.2-pullrequest0131-0003 63 7/11/2024
0.18.2-pullrequest0130-0003 58 7/11/2024
0.18.1 67 7/10/2024
0.18.1-pullrequest0129-0007 54 7/10/2024
0.18.0 107 7/10/2024
0.18.0-pullrequest0125-0014 56 7/10/2024
0.18.0-pullrequest0125-0013 64 7/10/2024
0.18.0-pullrequest0125-0012 52 7/10/2024
0.18.0-pullrequest0125-0011 54 7/10/2024
0.18.0-pullrequest0125-0010 56 7/10/2024
0.18.0-pullrequest0125-0009 67 7/10/2024
0.17.2-pullrequest0125-0008 59 7/10/2024
0.17.2-pullrequest0125-0007 63 7/10/2024
0.17.2-pullrequest0125-0006 57 7/10/2024
0.17.2-pullrequest0125-0005 59 7/10/2024
0.17.2-pullrequest0125-0004 63 7/10/2024
0.17.2-pullrequest0125-0003 59 7/9/2024
0.17.1 66 7/9/2024
0.17.1-pullrequest0124-0005 61 7/9/2024
0.17.0 70 7/8/2024
0.17.0-pullrequest0123-0024 49 7/8/2024
0.17.0-pullrequest0123-0023 50 7/8/2024
0.17.0-pullrequest0123-0021 65 7/8/2024
0.17.0-pullrequest0123-0019 56 7/8/2024
0.17.0-pullrequest0123-0018 46 7/8/2024
0.17.0-pullrequest0123-0017 59 7/8/2024
0.17.0-pullrequest0123-0015 55 7/8/2024
0.17.0-pullrequest0123-0014 51 7/8/2024
0.17.0-pullrequest0123-0013 56 7/8/2024
0.17.0-pullrequest0123-0012 51 7/8/2024
0.17.0-pullrequest0123-0011 58 7/8/2024
0.17.0-pullrequest0123-0009 60 7/6/2024
0.17.0-pullrequest0123-0008 55 7/6/2024
0.17.0-pullrequest0123-0007 93 7/6/2024
0.16.23 73 6/12/2024
0.16.23-pullrequest0118-0005 65 6/12/2024
0.16.23-pullrequest0118-0004 58 6/12/2024
0.16.23-pullrequest0118-0003 59 6/12/2024
0.16.23-pullrequest0118-0002 58 6/12/2024
0.16.21 126 5/29/2024
0.16.21-pullrequest0114-0002 63 5/29/2024
0.16.20 72 5/28/2024
0.16.20-pullrequest0112-0002 57 5/28/2024
0.16.19 78 5/13/2024
0.16.19-pullrequest0110-0004 72 5/13/2024
0.16.19-pullrequest0110-0003 60 5/13/2024
0.16.17 95 4/22/2024
0.16.17-pullrequest0108-0005 73 4/19/2024
0.16.17-pullrequest0108-0004 66 4/19/2024
0.16.17-pullrequest0108-0003 64 4/19/2024
0.16.16 87 4/16/2024
0.16.16-pullrequest0107-0003 79 4/16/2024
0.16.15 82 4/16/2024
0.16.15-pullrequest0106-0004 65 4/16/2024
0.16.15-pullrequest0106-0003 63 4/16/2024
0.16.15-pullrequest0106-0002 74 4/16/2024
0.16.14 145 4/16/2024
0.16.13 96 3/23/2024
0.16.13-pullrequest0103-0003 82 3/23/2024
0.16.12 81 3/23/2024
0.16.12-pullrequest0102-0006 71 3/22/2024
0.16.11 80 3/21/2024
0.16.11-pullrequest0101-0004 63 3/21/2024
0.16.11-pullrequest0101-0003 69 3/21/2024
0.16.11-pullrequest0101-0002 63 3/21/2024
0.16.9 85 3/16/2024
0.16.9-pullrequest0098-0008 67 3/16/2024
0.16.9-pullrequest0098-0007 69 3/16/2024
0.16.8 106 3/15/2024
0.16.8-pullrequest0097-0002 67 3/15/2024
0.16.7 82 3/10/2024
0.16.7-pullrequest0095-0002 77 3/10/2024
0.16.6 165 3/9/2024
0.16.6-pullrequest0094-0003 68 3/9/2024
0.16.6-pullrequest0094-0002 65 3/9/2024
0.16.2 93 3/5/2024
0.16.2-pullrequest0089-0009 74 3/5/2024
0.16.1 90 3/3/2024
0.16.1-pullrequest0088-0003 63 3/2/2024
0.16.1-pullrequest0088-0002 59 3/2/2024
0.16.0 133 2/28/2024
0.16.0-pullrequest0087-0010 62 2/28/2024
0.16.0-pullrequest0087-0009 66 2/28/2024
0.16.0-pullrequest0087-0007 75 2/28/2024
0.16.0-pullrequest0087-0006 66 2/28/2024
0.16.0-pullrequest0087-0005 61 2/28/2024
0.16.0-pullrequest0087-0004 71 2/28/2024
0.16.0-pullrequest0087-0003 64 2/28/2024
0.15.2 78 2/26/2024
0.15.2-pullrequest0086-0007 62 2/26/2024
0.15.2-pullrequest0086-0006 54 2/26/2024
0.15.1 83 2/23/2024
0.15.1-pullrequest0085-0006 63 2/23/2024
0.15.0 81 2/22/2024
0.15.0-pullrequest0084-0004 65 2/22/2024
0.15.0-pullrequest0084-0003 93 2/22/2024
0.14.1-pullrequest0084-0002 76 2/22/2024
0.14.0 95 2/21/2024
0.14.0-pullrequest0083-0011 91 2/8/2024
0.14.0-pullrequest0083-0010 72 2/8/2024
0.14.0-pullrequest0083-0009 70 2/8/2024
0.13.7 105 2/8/2024
0.13.7-pullrequest0082-0002 80 2/8/2024
0.13.6-pullrequest0081-0006 70 2/8/2024
0.13.5 103 2/7/2024
0.13.5-pullrequest0080-0002 73 2/7/2024
0.13.4 78 2/7/2024
0.13.4-pullrequest0079-0003 66 2/7/2024
0.13.1 90 2/1/2024
0.13.1-pullrequest0076-0003 73 2/1/2024
0.13.1-pullrequest0076-0002 73 2/1/2024
0.13.0 104 2/1/2024
0.13.0-pullrequest0075-0005 71 2/1/2024
0.13.0-pullrequest0075-0004 65 2/1/2024
0.12.2-pullrequest0075-0003 66 2/1/2024
0.12.1 82 2/1/2024
0.12.1-pullrequest0074-0002 68 2/1/2024
0.12.0 78 2/1/2024
0.12.0-pullrequest0073-0002 66 2/1/2024
0.11.0 80 1/31/2024
0.11.0-pullrequest0072-0011 70 1/31/2024
0.11.0-pullrequest0072-0010 67 1/31/2024
0.11.0-pullrequest0072-0008 64 1/31/2024
0.10.0 81 1/31/2024
0.10.0-pullrequest0070-0005 73 1/29/2024
0.10.0-pullrequest0070-0004 69 1/29/2024
0.9.1-pullrequest0069-0001 68 1/29/2024
0.9.0 79 1/29/2024
0.9.0-pullrequest0069-0002 65 1/29/2024
0.8.7-pullrequest0068-0001 69 1/29/2024
0.8.6 82 1/29/2024
0.8.4 99 1/19/2024
0.8.4-pullrequest0066-0009 68 1/19/2024
0.8.4-pullrequest0066-0008 61 1/19/2024
0.8.4-pullrequest0066-0007 68 1/19/2024
0.8.4-pullrequest0066-0005 64 1/19/2024
0.8.4-pullrequest0066-0004 70 1/19/2024
0.8.4-pullrequest0066-0003 64 1/19/2024
0.8.3 78 1/19/2024
0.8.3-pullrequest0065-0003 66 1/19/2024
0.8.3-pullrequest0065-0002 66 1/19/2024
0.8.1 78 1/19/2024
0.8.1-pullrequest0063-0013 66 1/19/2024
0.8.1-pullrequest0063-0011 69 1/19/2024
0.7.16-pullrequest0063-0010 68 1/19/2024
0.7.15 87 1/18/2024
0.7.15-pullrequest0062-0002 71 1/18/2024
0.7.12 94 1/16/2024
0.7.12-pullrequest0059-0006 74 1/16/2024
0.7.10 88 1/15/2024
0.7.10-pullrequest0059-0007 69 1/16/2024
0.7.10-pullrequest0058-0004 63 1/15/2024
0.7.10-pullrequest0057-0002 70 1/15/2024
0.7.9 87 1/15/2024
0.7.9-pullrequest0057-0003 65 1/15/2024
0.7.7 84 1/15/2024
0.7.7-pullrequest0056-0003 80 1/15/2024
0.7.4 87 1/15/2024
0.7.4-pullrequest0055-0012 73 1/15/2024
0.7.4-pullrequest0055-0011 72 1/15/2024
0.7.4-pullrequest0055-0010 78 1/15/2024
0.7.4-pullrequest0055-0009 72 1/15/2024
0.7.4-pullrequest0055-0008 71 1/15/2024
0.7.4-pullrequest0055-0007 73 1/15/2024
0.7.4-pullrequest0054-0005 73 1/15/2024
0.7.4-pullrequest0053-0004 84 1/15/2024
0.7.4-pullrequest0052-0002 63 1/15/2024
0.7.2 82 1/15/2024
0.7.2-pullrequest0051-0013 74 1/15/2024
0.7.2-pullrequest0050-0010 65 1/15/2024
0.7.1 93 1/13/2024
0.7.0 91 1/13/2024
0.7.0-pullrequest0046-0079 84 1/13/2024
0.6.12 107 1/3/2024
0.6.12-pullrequest0045-0018 70 1/13/2024
0.6.12-pullrequest0042-0010 74 1/12/2024
0.6.12-pullrequest0041-0007 72 1/12/2024
0.6.12-pullrequest0039-0002 77 1/3/2024
0.6.10 105 12/22/2023
0.6.10-pullrequest0038-0007 89 1/2/2024
0.6.10-pullrequest0038-0006 77 1/2/2024
0.6.10-pullrequest0038-0005 78 1/2/2024
0.6.8 99 12/21/2023
0.6.6 94 12/18/2023
0.6.6-pullrequest0035-0007 83 12/21/2023
0.6.6-pullrequest0035-0006 84 12/21/2023
0.6.6-pullrequest0035-0005 79 12/21/2023
0.6.3 93 12/18/2023
0.6.3-pullrequest0034-0018 83 12/18/2023
0.6.1 85 12/15/2023
0.6.1-pullrequest0029-0008 81 12/15/2023
0.6.1-pullrequest0028-0006 89 12/15/2023
0.6.1-pullrequest0027-0004 66 12/15/2023
0.5.3 95 12/11/2023
0.5.3-pullrequest0025-0049 87 12/14/2023
0.5.3-pullrequest0025-0047 84 12/14/2023
0.5.3-pullrequest0025-0043 78 12/13/2023
0.5.3-pullrequest0022-0038 79 12/13/2023
0.5.1 91 12/7/2023
0.5.0 99 12/6/2023
0.4.3 104 12/4/2023
0.4.2 94 12/4/2023
0.4.1 103 12/4/2023
0.3.10 112 11/22/2023
0.3.10-pullrequest0022-0008 81 11/27/2023
0.3.10-pullrequest0021-0005 84 11/22/2023
0.3.9 90 11/20/2023
0.3.8 101 11/9/2023
0.3.8-pullrequest0020-0005 78 11/9/2023
0.3.6 91 11/9/2023
0.3.5 99 11/9/2023
0.3.4 92 11/8/2023
0.3.3 93 11/8/2023
0.3.1 96 11/8/2023
0.3.1-pullrequest0018-0004 85 11/8/2023
0.2.1 131 11/2/2023
0.2.1-pullrequest0017-0050 93 11/8/2023
0.2.1-pullrequest0016-0048 89 11/8/2023
0.2.1-pullrequest0015-0045 85 11/8/2023
0.2.1-pullrequest0014-0035 94 11/7/2023
0.2.1-pullrequest0013-0033 86 11/7/2023
0.2.1-pullrequest0012-0031 90 11/7/2023
0.2.1-pullrequest0011-0024 89 11/6/2023
0.2.1-pullrequest0010-0015 100 11/2/2023
0.2.1-pullrequest0009-0011 91 11/2/2023
0.2.1-pullrequest0008-0009 92 11/2/2023
0.2.1-pullrequest0007-0007 99 11/2/2023
0.2.1-pullrequest0006-0005 93 11/2/2023
0.2.1-pullrequest0005-0001 86 11/2/2023
0.1.0 119 10/27/2023
0.1.0-pullrequest0004-0024 93 11/1/2023
0.1.0-pullrequest0003-0022 94 11/1/2023
0.1.0-pullrequest0002-0019 92 11/1/2023
0.1.0-pullrequest0001-0017 95 11/1/2023
0.1.0-pullrequest0001-0010 97 10/30/2023

releasenotes.md