diff --git a/dev-proxy-abstractions/LanguageModel/OllamaLanguageModelClient.cs b/dev-proxy-abstractions/LanguageModel/OllamaLanguageModelClient.cs index c40c2cb0..a8b91585 100644 --- a/dev-proxy-abstractions/LanguageModel/OllamaLanguageModelClient.cs +++ b/dev-proxy-abstractions/LanguageModel/OllamaLanguageModelClient.cs @@ -12,6 +12,7 @@ public class OllamaLanguageModelClient(LanguageModelConfiguration? configuration { private readonly LanguageModelConfiguration? _configuration = configuration; private readonly ILogger _logger = logger; + private readonly HttpClient _httpClient = new(); private bool? _lmAvailable; private readonly Dictionary _cacheCompletion = []; private readonly Dictionary _cacheChatCompletion = []; @@ -119,11 +120,10 @@ private async Task IsEnabledInternalAsync() try { - using var client = new HttpClient(); var url = $"{_configuration.Url}/api/generate"; _logger.LogDebug("Requesting completion. Prompt: {prompt}", prompt); - var response = await client.PostAsJsonAsync(url, + var response = await _httpClient.PostAsJsonAsync(url, new { prompt, @@ -213,11 +213,10 @@ private async Task IsEnabledInternalAsync() try { - using var client = new HttpClient(); var url = $"{_configuration.Url}/api/chat"; _logger.LogDebug("Requesting chat completion. Message: {lastMessage}", messages.Last().Content); - var response = await client.PostAsJsonAsync(url, + var response = await _httpClient.PostAsJsonAsync(url, new { messages, diff --git a/dev-proxy-abstractions/LanguageModel/OpenAILanguageModelClient.cs b/dev-proxy-abstractions/LanguageModel/OpenAILanguageModelClient.cs index d4264a92..4cc12e6c 100644 --- a/dev-proxy-abstractions/LanguageModel/OpenAILanguageModelClient.cs +++ b/dev-proxy-abstractions/LanguageModel/OpenAILanguageModelClient.cs @@ -12,6 +12,7 @@ public class OpenAILanguageModelClient(LanguageModelConfiguration? configuration { private readonly LanguageModelConfiguration? _configuration = configuration; private readonly ILogger _logger = logger; + private readonly HttpClient _httpClient = new(); private bool? _lmAvailable; private readonly Dictionary _cacheChatCompletion = []; @@ -158,7 +159,6 @@ private async Task IsEnabledInternalAsync() try { - using var client = new HttpClient(); var url = $"{_configuration.Url}/chat/completions"; _logger.LogDebug("Requesting chat completion. Message: {lastMessage}", messages.Last().Content); @@ -170,7 +170,7 @@ private async Task IsEnabledInternalAsync() Temperature = options?.Temperature }; - var response = await client.PostAsJsonAsync(url, payload); + var response = await _httpClient.PostAsJsonAsync(url, payload); _logger.LogDebug("Response: {response}", response.StatusCode); if (!response.IsSuccessStatusCode) diff --git a/dev-proxy-plugins/GraphUtils.cs b/dev-proxy-plugins/GraphUtils.cs index 0dcc8fcb..4095a987 100644 --- a/dev-proxy-plugins/GraphUtils.cs +++ b/dev-proxy-plugins/GraphUtils.cs @@ -11,6 +11,8 @@ namespace DevProxy.Plugins; public class GraphUtils { + private static readonly HttpClient _httpClient = new(); + // throttle requests per workload public static string BuildThrottleKey(Request r) => BuildThrottleKey(r.RequestUri); @@ -53,14 +55,13 @@ internal static async Task> UpdateUserScopesAsync(IEnumerabl var newMinimalScopes = new HashSet(minimalScopes); var url = $"https://devxapi-func-prod-eastus.azurewebsites.net/permissions?scopeType={GetScopeTypeString(permissionsType)}"; - using var httpClient = new HttpClient(); var urls = userEndpoints.Select(e => { logger.LogDebug("Getting permissions for {method} {url}", e.method, e.url); return $"{url}&requesturl={e.url}&method={e.method}"; }); var tasks = urls.Select(u => { logger.LogTrace("Calling {url}...", u); - return httpClient.GetFromJsonAsync(u); + return _httpClient.GetFromJsonAsync(u); }); await Task.WhenAll(tasks); diff --git a/dev-proxy-plugins/Mocks/MockRequestPlugin.cs b/dev-proxy-plugins/Mocks/MockRequestPlugin.cs index a2e7e129..59f70b62 100644 --- a/dev-proxy-plugins/Mocks/MockRequestPlugin.cs +++ b/dev-proxy-plugins/Mocks/MockRequestPlugin.cs @@ -23,6 +23,7 @@ public class MockRequestPlugin(IPluginEvents pluginEvents, IProxyContext context { protected MockRequestConfiguration _configuration = new(); private MockRequestLoader? _loader = null; + private readonly HttpClient _httpClient = new(); public override string Name => nameof(MockRequestPlugin); @@ -95,14 +96,13 @@ protected virtual async Task OnMockRequestAsync(object sender, EventArgs e) return; } - using var httpClient = new HttpClient(); var requestMessage = GetRequestMessage(); try { Logger.LogRequest("Sending mock request", MessageType.Mocked, _configuration.Request.Method, _configuration.Request.Url); - await httpClient.SendAsync(requestMessage); + await _httpClient.SendAsync(requestMessage); } catch (Exception ex) {