AICentral 0.16.19

dotnet add package AICentral --version 0.16.19
NuGet\Install-Package AICentral -Version 0.16.19
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.16.19" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add AICentral --version 0.16.19
#r "nuget: AICentral, 0.16.19"
#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.16.19

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

AI Central

AI Central gives you control over your AI services.

  • Lightweight out-the-box token logging using Open Telemetry
  • Intelligent Routing
  • Custom consumer OAuth2 authorisation
  • Fallback AI service
  • Round Robin AI services
  • Lowest Latency AI service
  • Circuit breakers, and backoff-retry over downstream AI services
  • Request based and Token based rate limiting
  • Prompt and usage logging
    • Works for streaming endpoints as-well as non streaming
  • Additional Open Telemetry Metrics and Traces

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. 
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.16.19 39 5/13/2024
0.16.19-pullrequest0110-0004 37 5/13/2024
0.16.19-pullrequest0110-0003 33 5/13/2024
0.16.17 60 4/22/2024
0.16.17-pullrequest0108-0005 44 4/19/2024
0.16.17-pullrequest0108-0004 35 4/19/2024
0.16.17-pullrequest0108-0003 37 4/19/2024
0.16.16 58 4/16/2024
0.16.16-pullrequest0107-0003 48 4/16/2024
0.16.15 48 4/16/2024
0.16.15-pullrequest0106-0004 34 4/16/2024
0.16.15-pullrequest0106-0003 35 4/16/2024
0.16.15-pullrequest0106-0002 46 4/16/2024
0.16.14 82 4/16/2024
0.16.13 62 3/23/2024
0.16.13-pullrequest0103-0003 60 3/23/2024
0.16.12 53 3/23/2024
0.16.12-pullrequest0102-0006 49 3/22/2024
0.16.11 52 3/21/2024
0.16.11-pullrequest0101-0004 41 3/21/2024
0.16.11-pullrequest0101-0003 39 3/21/2024
0.16.11-pullrequest0101-0002 41 3/21/2024
0.16.9 59 3/16/2024
0.16.9-pullrequest0098-0008 46 3/16/2024
0.16.9-pullrequest0098-0007 47 3/16/2024
0.16.8 76 3/15/2024
0.16.8-pullrequest0097-0002 45 3/15/2024
0.16.7 51 3/10/2024
0.16.7-pullrequest0095-0002 55 3/10/2024
0.16.6 134 3/9/2024
0.16.6-pullrequest0094-0003 45 3/9/2024
0.16.6-pullrequest0094-0002 43 3/9/2024
0.16.2 59 3/5/2024
0.16.2-pullrequest0089-0009 43 3/5/2024
0.16.1 58 3/3/2024
0.16.1-pullrequest0088-0003 41 3/2/2024
0.16.1-pullrequest0088-0002 38 3/2/2024
0.16.0 105 2/28/2024
0.16.0-pullrequest0087-0010 40 2/28/2024
0.16.0-pullrequest0087-0009 42 2/28/2024
0.16.0-pullrequest0087-0007 49 2/28/2024
0.16.0-pullrequest0087-0006 44 2/28/2024
0.16.0-pullrequest0087-0005 37 2/28/2024
0.16.0-pullrequest0087-0004 45 2/28/2024
0.16.0-pullrequest0087-0003 42 2/28/2024
0.15.2 47 2/26/2024
0.15.2-pullrequest0086-0007 41 2/26/2024
0.15.2-pullrequest0086-0006 33 2/26/2024
0.15.1 53 2/23/2024
0.15.1-pullrequest0085-0006 41 2/23/2024
0.15.0 52 2/22/2024
0.15.0-pullrequest0084-0004 41 2/22/2024
0.15.0-pullrequest0084-0003 63 2/22/2024
0.14.1-pullrequest0084-0002 50 2/22/2024
0.14.0 64 2/21/2024
0.14.0-pullrequest0083-0011 59 2/8/2024
0.14.0-pullrequest0083-0010 41 2/8/2024
0.14.0-pullrequest0083-0009 42 2/8/2024
0.13.7 71 2/8/2024
0.13.7-pullrequest0082-0002 51 2/8/2024
0.13.6-pullrequest0081-0006 41 2/8/2024
0.13.5 50 2/7/2024
0.13.5-pullrequest0080-0002 43 2/7/2024
0.13.4 49 2/7/2024
0.13.4-pullrequest0079-0003 40 2/7/2024
0.13.1 58 2/1/2024
0.13.1-pullrequest0076-0003 46 2/1/2024
0.13.1-pullrequest0076-0002 48 2/1/2024
0.13.0 76 2/1/2024
0.13.0-pullrequest0075-0005 43 2/1/2024
0.13.0-pullrequest0075-0004 41 2/1/2024
0.12.2-pullrequest0075-0003 44 2/1/2024
0.12.1 51 2/1/2024
0.12.1-pullrequest0074-0002 45 2/1/2024
0.12.0 52 2/1/2024
0.12.0-pullrequest0073-0002 43 2/1/2024
0.11.0 52 1/31/2024
0.11.0-pullrequest0072-0011 48 1/31/2024
0.11.0-pullrequest0072-0010 44 1/31/2024
0.11.0-pullrequest0072-0008 42 1/31/2024
0.10.0 53 1/31/2024
0.10.0-pullrequest0070-0005 41 1/29/2024
0.10.0-pullrequest0070-0004 39 1/29/2024
0.9.1-pullrequest0069-0001 45 1/29/2024
0.9.0 51 1/29/2024
0.9.0-pullrequest0069-0002 42 1/29/2024
0.8.7-pullrequest0068-0001 46 1/29/2024
0.8.6 53 1/29/2024
0.8.4 70 1/19/2024
0.8.4-pullrequest0066-0009 45 1/19/2024
0.8.4-pullrequest0066-0008 39 1/19/2024
0.8.4-pullrequest0066-0007 40 1/19/2024
0.8.4-pullrequest0066-0005 39 1/19/2024
0.8.4-pullrequest0066-0004 43 1/19/2024
0.8.4-pullrequest0066-0003 37 1/19/2024
0.8.3 45 1/19/2024
0.8.3-pullrequest0065-0003 44 1/19/2024
0.8.3-pullrequest0065-0002 43 1/19/2024
0.8.1 50 1/19/2024
0.8.1-pullrequest0063-0013 43 1/19/2024
0.8.1-pullrequest0063-0011 44 1/19/2024
0.7.16-pullrequest0063-0010 45 1/19/2024
0.7.15 56 1/18/2024
0.7.15-pullrequest0062-0002 42 1/18/2024
0.7.12 65 1/16/2024
0.7.12-pullrequest0059-0006 51 1/16/2024
0.7.10 59 1/15/2024
0.7.10-pullrequest0059-0007 46 1/16/2024
0.7.10-pullrequest0058-0004 39 1/15/2024
0.7.10-pullrequest0057-0002 46 1/15/2024
0.7.9 57 1/15/2024
0.7.9-pullrequest0057-0003 41 1/15/2024
0.7.7 54 1/15/2024
0.7.7-pullrequest0056-0003 49 1/15/2024
0.7.4 58 1/15/2024
0.7.4-pullrequest0055-0012 49 1/15/2024
0.7.4-pullrequest0055-0011 47 1/15/2024
0.7.4-pullrequest0055-0010 54 1/15/2024
0.7.4-pullrequest0055-0009 45 1/15/2024
0.7.4-pullrequest0055-0008 47 1/15/2024
0.7.4-pullrequest0055-0007 52 1/15/2024
0.7.4-pullrequest0054-0005 49 1/15/2024
0.7.4-pullrequest0053-0004 47 1/15/2024
0.7.4-pullrequest0052-0002 42 1/15/2024
0.7.2 52 1/15/2024
0.7.2-pullrequest0051-0013 52 1/15/2024
0.7.2-pullrequest0050-0010 43 1/15/2024
0.7.1 65 1/13/2024
0.7.0 63 1/13/2024
0.7.0-pullrequest0046-0079 54 1/13/2024
0.6.12 79 1/3/2024
0.6.12-pullrequest0045-0018 48 1/13/2024
0.6.12-pullrequest0042-0010 52 1/12/2024
0.6.12-pullrequest0041-0007 50 1/12/2024
0.6.12-pullrequest0039-0002 55 1/3/2024
0.6.10 80 12/22/2023
0.6.10-pullrequest0038-0007 61 1/2/2024
0.6.10-pullrequest0038-0006 56 1/2/2024
0.6.10-pullrequest0038-0005 56 1/2/2024
0.6.8 71 12/21/2023
0.6.6 70 12/18/2023
0.6.6-pullrequest0035-0007 61 12/21/2023
0.6.6-pullrequest0035-0006 62 12/21/2023
0.6.6-pullrequest0035-0005 57 12/21/2023
0.6.3 68 12/18/2023
0.6.3-pullrequest0034-0018 61 12/18/2023
0.6.1 57 12/15/2023
0.6.1-pullrequest0029-0008 57 12/15/2023
0.6.1-pullrequest0028-0006 63 12/15/2023
0.6.1-pullrequest0027-0004 41 12/15/2023
0.5.3 70 12/11/2023
0.5.3-pullrequest0025-0049 65 12/14/2023
0.5.3-pullrequest0025-0047 62 12/14/2023
0.5.3-pullrequest0025-0043 54 12/13/2023
0.5.3-pullrequest0022-0038 52 12/13/2023
0.5.1 66 12/7/2023
0.5.0 74 12/6/2023
0.4.3 79 12/4/2023
0.4.2 70 12/4/2023
0.4.1 78 12/4/2023
0.3.10 88 11/22/2023
0.3.10-pullrequest0022-0008 59 11/27/2023
0.3.10-pullrequest0021-0005 64 11/22/2023
0.3.9 66 11/20/2023
0.3.8 72 11/9/2023
0.3.8-pullrequest0020-0005 54 11/9/2023
0.3.6 64 11/9/2023
0.3.5 70 11/9/2023
0.3.4 65 11/8/2023
0.3.3 60 11/8/2023
0.3.1 67 11/8/2023
0.3.1-pullrequest0018-0004 56 11/8/2023
0.2.1 102 11/2/2023
0.2.1-pullrequest0017-0050 65 11/8/2023
0.2.1-pullrequest0016-0048 63 11/8/2023
0.2.1-pullrequest0015-0045 58 11/8/2023
0.2.1-pullrequest0014-0035 61 11/7/2023
0.2.1-pullrequest0013-0033 60 11/7/2023
0.2.1-pullrequest0012-0031 63 11/7/2023
0.2.1-pullrequest0011-0024 62 11/6/2023
0.2.1-pullrequest0010-0015 72 11/2/2023
0.2.1-pullrequest0009-0011 66 11/2/2023
0.2.1-pullrequest0008-0009 66 11/2/2023
0.2.1-pullrequest0007-0007 71 11/2/2023
0.2.1-pullrequest0006-0005 66 11/2/2023
0.2.1-pullrequest0005-0001 61 11/2/2023
0.1.0 88 10/27/2023
0.1.0-pullrequest0004-0024 61 11/1/2023
0.1.0-pullrequest0003-0022 64 11/1/2023
0.1.0-pullrequest0002-0019 63 11/1/2023
0.1.0-pullrequest0001-0017 65 11/1/2023
0.1.0-pullrequest0001-0010 67 10/30/2023

releasenotes.md