AICentral 0.21.0

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

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

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

releasenotes.md