如何在Semantic Kernel中使用第三方代理OpenAI API介面

汤问發表於2024-04-16

最近手裡沒有官方的OpenAI API Key了,只能在第三方代理平臺去購買API Key。
但是使用Semantic Kernel的時候發現AddOpenAIChatCompletion不像AddAzureOpenAIChatCompletion那樣可以選擇終結點
去看了下Semantic Kernel專案下的issues,這個問題被提及了好幾次,但是官方仍然沒有提供Endpoint。不過廣大的開發者們想出了應對方法,就是對引數裡的HttpClient進行更改。
有很多途徑可以把HttpClient請求裡的官方API域名改為第三方代理OpenAI域名,但是這裡只提及一個我試了可以用的:

  1. 確保已安裝包Microsoft.Extensions.Http
  2. 先自定義一個 HTTP 訊息處理程式(DelegatingHandler),它用於處理 HTTP 請求並在傳送請求前對請求進行修改。
  3. 重寫其SendAsync方法,該方法在傳送 HTTP 請求時被呼叫,將請求的目標 URI 修改為了一個新的 URI。
class CustomRedirectingHandler() : DelegatingHandler(new HttpClientHandler())
{
    protected override Task<HttpResponseMessage> SendAsync(
        HttpRequestMessage request, CancellationToken cancellationToken)
    {
        request.RequestUri = new UriBuilder(request.RequestUri!) { Host = "api.xxxxxx.com" }.Uri; //替換為第三方代理API的地址
        return base.SendAsync(request, cancellationToken);
    }
}

然後就可以在註冊服務時使用了

var builder = Kernel.CreateBuilder().
    "gpt-3.5-turbo",
    "your-api-Key");

builder.Services.ConfigureHttpClientDefaults(
    b => b.ConfigurePrimaryHttpMessageHandler(
        () => new CustomRedirectingHandler()));

這個時候你拿到的IChatCompletionService就會將請求直接傳送到第三方代理OpenAI API

相關文章