mirror of
https://github.com/DrizzleTime/Foxel.git
synced 2026-09-04 23:29:00 +08:00
refactor(AiService): switch to IHttpClientFactory for HttpClient management
This commit is contained in:
+28
-17
@@ -7,32 +7,43 @@ namespace Foxel.Services.AI;
|
|||||||
|
|
||||||
public class AiService : IAiService
|
public class AiService : IAiService
|
||||||
{
|
{
|
||||||
private readonly HttpClient _httpClient;
|
private readonly IHttpClientFactory _httpClientFactory;
|
||||||
private readonly IConfigService _configService;
|
private readonly IConfigService _configService;
|
||||||
|
private HttpClient? _httpClient;
|
||||||
|
private string? _currentApiKey;
|
||||||
|
private string? _currentBaseUrl;
|
||||||
|
|
||||||
public AiService(HttpClient httpClient, IConfigService configService)
|
public AiService(IHttpClientFactory httpClientFactory, IConfigService configService)
|
||||||
{
|
{
|
||||||
_httpClient = httpClient;
|
_httpClientFactory = httpClientFactory;
|
||||||
_configService = configService;
|
_configService = configService;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ConfigureHttpClient()
|
private HttpClient ConfigureHttpClient()
|
||||||
{
|
{
|
||||||
string apiKey = _configService["AI:ApiKey"];
|
string apiKey = _configService["AI:ApiKey"];
|
||||||
string baseUrl = _configService["AI:ApiEndpoint"];
|
string baseUrl = _configService["AI:ApiEndpoint"];
|
||||||
|
|
||||||
if (_httpClient.BaseAddress?.ToString() != baseUrl)
|
// 检查是否需要重新创建 HttpClient
|
||||||
|
if (_httpClient == null || _currentApiKey != apiKey || _currentBaseUrl != baseUrl)
|
||||||
{
|
{
|
||||||
|
_httpClient = _httpClientFactory.CreateClient();
|
||||||
_httpClient.BaseAddress = new Uri(baseUrl);
|
_httpClient.BaseAddress = new Uri(baseUrl);
|
||||||
|
_httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", apiKey);
|
||||||
|
|
||||||
|
// 更新当前配置记录
|
||||||
|
_currentApiKey = apiKey;
|
||||||
|
_currentBaseUrl = baseUrl;
|
||||||
}
|
}
|
||||||
_httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", apiKey);
|
|
||||||
|
return _httpClient;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<(string title, string description)> AnalyzeImageAsync(string base64Image)
|
public async Task<(string title, string description)> AnalyzeImageAsync(string base64Image)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
ConfigureHttpClient();
|
var client = ConfigureHttpClient();
|
||||||
string model = _configService["AI:Model"];
|
string model = _configService["AI:Model"];
|
||||||
var imageUrl = new ImageUrl
|
var imageUrl = new ImageUrl
|
||||||
{
|
{
|
||||||
@@ -69,7 +80,7 @@ public class AiService : IAiService
|
|||||||
TopK = 50
|
TopK = 50
|
||||||
};
|
};
|
||||||
|
|
||||||
var response = await _httpClient.PostAsJsonAsync("/v1/chat/completions", requestContent);
|
var response = await client.PostAsJsonAsync("/v1/chat/completions", requestContent);
|
||||||
response.EnsureSuccessStatusCode();
|
response.EnsureSuccessStatusCode();
|
||||||
|
|
||||||
var responseContent = await response.Content.ReadFromJsonAsync<AiResponse>();
|
var responseContent = await response.Content.ReadFromJsonAsync<AiResponse>();
|
||||||
@@ -92,8 +103,8 @@ public class AiService : IAiService
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// 确保使用最新配置
|
// 获取配置好的 HttpClient
|
||||||
ConfigureHttpClient();
|
var client = ConfigureHttpClient();
|
||||||
|
|
||||||
if (availableTags.Count == 0)
|
if (availableTags.Count == 0)
|
||||||
return new List<string>();
|
return new List<string>();
|
||||||
@@ -124,7 +135,7 @@ public class AiService : IAiService
|
|||||||
TopK = 50
|
TopK = 50
|
||||||
};
|
};
|
||||||
|
|
||||||
var response = await _httpClient.PostAsJsonAsync("/v1/chat/completions", requestContent);
|
var response = await client.PostAsJsonAsync("/v1/chat/completions", requestContent);
|
||||||
response.EnsureSuccessStatusCode();
|
response.EnsureSuccessStatusCode();
|
||||||
|
|
||||||
var responseContent = await response.Content.ReadFromJsonAsync<AiResponse>();
|
var responseContent = await response.Content.ReadFromJsonAsync<AiResponse>();
|
||||||
@@ -201,8 +212,8 @@ public class AiService : IAiService
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// 确保使用最新配置
|
// 获取配置好的 HttpClient
|
||||||
ConfigureHttpClient();
|
var client = ConfigureHttpClient();
|
||||||
|
|
||||||
string model = _configService["AI:Model"];
|
string model = _configService["AI:Model"];
|
||||||
|
|
||||||
@@ -260,7 +271,7 @@ public class AiService : IAiService
|
|||||||
TopK = 50
|
TopK = 50
|
||||||
};
|
};
|
||||||
|
|
||||||
var response = await _httpClient.PostAsJsonAsync("/v1/chat/completions", requestContent);
|
var response = await client.PostAsJsonAsync("/v1/chat/completions", requestContent);
|
||||||
response.EnsureSuccessStatusCode();
|
response.EnsureSuccessStatusCode();
|
||||||
|
|
||||||
var responseContent = await response.Content.ReadFromJsonAsync<AiResponse>();
|
var responseContent = await response.Content.ReadFromJsonAsync<AiResponse>();
|
||||||
@@ -343,8 +354,8 @@ public class AiService : IAiService
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// 确保使用最新配置
|
// 获取配置好的 HttpClient
|
||||||
ConfigureHttpClient();
|
var client = ConfigureHttpClient();
|
||||||
|
|
||||||
string model = _configService["AI:EmbeddingModel"];
|
string model = _configService["AI:EmbeddingModel"];
|
||||||
|
|
||||||
@@ -355,7 +366,7 @@ public class AiService : IAiService
|
|||||||
encoding_format = "float"
|
encoding_format = "float"
|
||||||
};
|
};
|
||||||
|
|
||||||
var response = await _httpClient.PostAsJsonAsync("/v1/embeddings", requestContent);
|
var response = await client.PostAsJsonAsync("/v1/embeddings", requestContent);
|
||||||
response.EnsureSuccessStatusCode();
|
response.EnsureSuccessStatusCode();
|
||||||
|
|
||||||
var embedResult = await response.Content.ReadFromJsonAsync<EmbeddingResponse>();
|
var embedResult = await response.Content.ReadFromJsonAsync<EmbeddingResponse>();
|
||||||
|
|||||||
Reference in New Issue
Block a user