diff --git a/app/MindWork AI Studio/Provider/Anthropic/ProviderAnthropic.cs b/app/MindWork AI Studio/Provider/Anthropic/ProviderAnthropic.cs index c6ac4bc..5897b98 100644 --- a/app/MindWork AI Studio/Provider/Anthropic/ProviderAnthropic.cs +++ b/app/MindWork AI Studio/Provider/Anthropic/ProviderAnthropic.cs @@ -76,13 +76,13 @@ public sealed class ProviderAnthropic(ILogger logger) : BaseProvider("https://ap return request; } - // Send the request using exponential backoff: - using var responseData = await this.SendRequest(RequestBuilder, token); - if(responseData.IsFailedAfterAllRetries) - { - this.logger.LogError($"Anthropic chat completion failed: {responseData.ErrorMessage}"); - yield break; - } + // Send the request using exponential backoff: + var responseData = await this.SendRequest(RequestBuilder, token); + if(responseData.IsFailedAfterAllRetries) + { + this.logger.LogError($"Anthropic chat completion failed: {responseData.ErrorMessage}"); + yield break; + } // Open the response stream: var stream = await responseData.Response!.Content.ReadAsStreamAsync(token); diff --git a/app/MindWork AI Studio/Provider/Fireworks/ProviderFireworks.cs b/app/MindWork AI Studio/Provider/Fireworks/ProviderFireworks.cs index ff04cc9..b8b0357 100644 --- a/app/MindWork AI Studio/Provider/Fireworks/ProviderFireworks.cs +++ b/app/MindWork AI Studio/Provider/Fireworks/ProviderFireworks.cs @@ -82,13 +82,13 @@ public class ProviderFireworks(ILogger logger) : BaseProvider("https://api.firew return request; } - // Send the request using exponential backoff: - using var responseData = await this.SendRequest(RequestBuilder, token); - if(responseData.IsFailedAfterAllRetries) - { - this.logger.LogError($"Fireworks chat completion failed: {responseData.ErrorMessage}"); - yield break; - } + // Send the request using exponential backoff: + var responseData = await this.SendRequest(RequestBuilder, token); + if(responseData.IsFailedAfterAllRetries) + { + this.logger.LogError($"Fireworks chat completion failed: {responseData.ErrorMessage}"); + yield break; + } // Open the response stream: var fireworksStream = await responseData.Response!.Content.ReadAsStreamAsync(token); diff --git a/app/MindWork AI Studio/Provider/Google/ProviderGoogle.cs b/app/MindWork AI Studio/Provider/Google/ProviderGoogle.cs index 7714405..5110061 100644 --- a/app/MindWork AI Studio/Provider/Google/ProviderGoogle.cs +++ b/app/MindWork AI Studio/Provider/Google/ProviderGoogle.cs @@ -83,13 +83,13 @@ public class ProviderGoogle(ILogger logger) : BaseProvider("https://generativela return request; } - // Send the request using exponential backoff: - using var responseData = await this.SendRequest(RequestBuilder, token); - if(responseData.IsFailedAfterAllRetries) - { - this.logger.LogError($"Google chat completion failed: {responseData.ErrorMessage}"); - yield break; - } + // Send the request using exponential backoff: + var responseData = await this.SendRequest(RequestBuilder, token); + if(responseData.IsFailedAfterAllRetries) + { + this.logger.LogError($"Google chat completion failed: {responseData.ErrorMessage}"); + yield break; + } // Open the response stream: var geminiStream = await responseData.Response!.Content.ReadAsStreamAsync(token); diff --git a/app/MindWork AI Studio/Provider/Groq/ProviderGroq.cs b/app/MindWork AI Studio/Provider/Groq/ProviderGroq.cs index 1d13fdc..ae4e5ff 100644 --- a/app/MindWork AI Studio/Provider/Groq/ProviderGroq.cs +++ b/app/MindWork AI Studio/Provider/Groq/ProviderGroq.cs @@ -85,13 +85,13 @@ public class ProviderGroq(ILogger logger) : BaseProvider("https://api.groq.com/o return request; } - // Send the request using exponential backoff: - using var responseData = await this.SendRequest(RequestBuilder, token); - if(responseData.IsFailedAfterAllRetries) - { - this.logger.LogError($"Groq chat completion failed: {responseData.ErrorMessage}"); - yield break; - } + // Send the request using exponential backoff: + var responseData = await this.SendRequest(RequestBuilder, token); + if(responseData.IsFailedAfterAllRetries) + { + this.logger.LogError($"Groq chat completion failed: {responseData.ErrorMessage}"); + yield break; + } // Open the response stream: var groqStream = await responseData.Response!.Content.ReadAsStreamAsync(token); diff --git a/app/MindWork AI Studio/Provider/Mistral/ProviderMistral.cs b/app/MindWork AI Studio/Provider/Mistral/ProviderMistral.cs index a66840b..561d316 100644 --- a/app/MindWork AI Studio/Provider/Mistral/ProviderMistral.cs +++ b/app/MindWork AI Studio/Provider/Mistral/ProviderMistral.cs @@ -84,13 +84,13 @@ public sealed class ProviderMistral(ILogger logger) : BaseProvider("https://api. return request; } - // Send the request using exponential backoff: - using var responseData = await this.SendRequest(RequestBuilder, token); - if(responseData.IsFailedAfterAllRetries) - { - this.logger.LogError($"Mistral chat completion failed: {responseData.ErrorMessage}"); - yield break; - } + // Send the request using exponential backoff: + var responseData = await this.SendRequest(RequestBuilder, token); + if(responseData.IsFailedAfterAllRetries) + { + this.logger.LogError($"Mistral chat completion failed: {responseData.ErrorMessage}"); + yield break; + } // Open the response stream: var mistralStream = await responseData.Response!.Content.ReadAsStreamAsync(token); diff --git a/app/MindWork AI Studio/Provider/OpenAI/ProviderOpenAI.cs b/app/MindWork AI Studio/Provider/OpenAI/ProviderOpenAI.cs index 9555aaf..62007f7 100644 --- a/app/MindWork AI Studio/Provider/OpenAI/ProviderOpenAI.cs +++ b/app/MindWork AI Studio/Provider/OpenAI/ProviderOpenAI.cs @@ -112,13 +112,13 @@ public sealed class ProviderOpenAI(ILogger logger) : BaseProvider("https://api.o return request; } - // Send the request using exponential backoff: - using var responseData = await this.SendRequest(RequestBuilder, token); - if(responseData.IsFailedAfterAllRetries) - { - this.logger.LogError($"OpenAI chat completion failed: {responseData.ErrorMessage}"); - yield break; - } + // Send the request using exponential backoff: + var responseData = await this.SendRequest(RequestBuilder, token); + if(responseData.IsFailedAfterAllRetries) + { + this.logger.LogError($"OpenAI chat completion failed: {responseData.ErrorMessage}"); + yield break; + } // Open the response stream: var openAIStream = await responseData.Response!.Content.ReadAsStreamAsync(token); diff --git a/app/MindWork AI Studio/Provider/SelfHosted/ProviderSelfHosted.cs b/app/MindWork AI Studio/Provider/SelfHosted/ProviderSelfHosted.cs index 0bf876d..ea9de2b 100644 --- a/app/MindWork AI Studio/Provider/SelfHosted/ProviderSelfHosted.cs +++ b/app/MindWork AI Studio/Provider/SelfHosted/ProviderSelfHosted.cs @@ -85,7 +85,7 @@ public sealed class ProviderSelfHosted(ILogger logger, Host host, string hostnam } // Send the request using exponential backoff: - using var responseData = await this.SendRequest(RequestBuilder, token); + var responseData = await this.SendRequest(RequestBuilder, token); if(responseData.IsFailedAfterAllRetries) { this.logger.LogError($"Self-hosted provider's chat completion failed: {responseData.ErrorMessage}"); diff --git a/app/MindWork AI Studio/Tools/HttpRateLimitedStreamResult.cs b/app/MindWork AI Studio/Tools/HttpRateLimitedStreamResult.cs index 1e02c86..01f7c6b 100644 --- a/app/MindWork AI Studio/Tools/HttpRateLimitedStreamResult.cs +++ b/app/MindWork AI Studio/Tools/HttpRateLimitedStreamResult.cs @@ -10,14 +10,4 @@ public readonly record struct HttpRateLimitedStreamResult( bool IsSuccessful, bool IsFailedAfterAllRetries, string ErrorMessage, - HttpResponseMessage? Response) : IDisposable -{ - #region IDisposable - - public void Dispose() - { - this.Response?.Dispose(); - } - - #endregion -} \ No newline at end of file + HttpResponseMessage? Response); \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/changelog/v0.9.24.md b/app/MindWork AI Studio/wwwroot/changelog/v0.9.24.md index 0c4f18d..58342a7 100644 --- a/app/MindWork AI Studio/wwwroot/changelog/v0.9.24.md +++ b/app/MindWork AI Studio/wwwroot/changelog/v0.9.24.md @@ -2,4 +2,5 @@ - Added a button to remove a message from the chat thread. - Added a button to regenerate the last AI response. - Added a button to edit the last user message. -- Added a button to stop the AI from generating a response. \ No newline at end of file +- Added a button to stop the AI from generating a response. +- Fixed a streaming bug that was particularly visible with self-hosted providers. \ No newline at end of file