Блазор потоковая передача и обновление пользовательского интерфейса и обновление пользовательского интерфейсаC#

Место общения программистов C#
Ответить
Anonymous
 Блазор потоковая передача и обновление пользовательского интерфейса и обновление пользовательского интерфейса

Сообщение Anonymous »

У меня есть приложение Blazor Hosted Webassembly в соответствии с .net8. Это означает, что у меня есть клиент, сервер и общие проекты. /p>

Код: Выделить всё

[HttpPost, Route("/api/chat/communicate_async")]
public async IAsyncEnumerable DoCommunicateAsync(ChatRequest chat)
{
IAsyncEnumerable results = _IChat.DoCommunicateAsync(chat);
await foreach (var result in results)
{
yield return result;
}
}
< /code>
в клиенту, на странице бритвы у меня есть следующий код, чтобы каждый цикл итерации на контроллере был представлен в пользовательском интерфейсе: < /p>
CancellationToken cancellationToken = GetCancellationToken();
var requestContent = new StringContent(System.Text.Json.JsonSerializer.Serialize(chatRequest), Encoding.UTF8, "application/json");
using var requestMessage = new HttpRequestMessage(HttpMethod.Post, "api/chat/communicate_async")
{
Content = requestContent
};
requestMessage.SetBrowserResponseStreamingEnabled(true); // Enable response streaming

using var response = await Http.SendAsync(requestMessage, HttpCompletionOption.ResponseHeadersRead);

using Stream stream = await response.Content.ReadAsStreamAsync(cancellationToken);
var lines = System.Text.Json.JsonSerializer.DeserializeAsyncEnumerable(
stream,
new JsonSerializerOptions
{
PropertyNameCaseInsensitive = true,
DefaultBufferSize = 128
},
cancellationToken);
await foreach (string? line in lines)
{
chatResponse.response += line;
StateHasChanged();
}
< /code>
Я также пробовал различный подход к клиенту, чтобы сделать каждую итерацию цикла на контроллере в UI: < /p>
CancellationToken cancellationToken = GetCancellationToken();
chatResponse.response = string.Empty;
var requestContent = new StringContent(System.Text.Json.JsonSerializer.Serialize(chatRequest), Encoding.UTF8, "application/json");
var requestMessage = new HttpRequestMessage(HttpMethod.Post, "api/chat/communicate_async")
{
Content = requestContent
};
//requestMessage.Headers.Accept.Append(new MediaTypeWithQualityHeaderValue("application/stream+json"));
requestMessage.SetBrowserResponseStreamingEnabled(true); // Enable response streaming

var response = await Http.SendAsync(requestMessage, HttpCompletionOption.ResponseHeadersRead);
IAsyncEnumerable results = response.Content.ReadFromJsonAsAsyncEnumerable();
await foreach (string? result in results)
{
chatResponse.response += result;
StateHasChanged();
}
< /code>
Клиент (с двумя подходами) кажется, что ожидает, пока все итерации не будут завершены в контроллере, чтобы сделать цикл JSON и обновить пользовательский интерфейс. До сих пор я прочитал много статей и пробовал разные вещи здесь: https://www.tpeczek.com/2021/07/aspnet-core-6-and-aasyncenumerable.html
и отсюда: Streaming Lines текста по HTTP с Blazor с использованием iAsyncenumerable
уже перепробовано. Обновление 2024/05/28  
кажется, что приведенный ниже код, который генерирует части предложения, хотя он итерат, хотя исинометабельный, кажется, не транслируется на клиенте (это из Местный LLM из библиотеки Llamasharp: < /p>
await foreach (string? result in session.ChatAsync(new ChatHistory.Message(AuthorRole.User, chat.prompt), inferenceParams, cancellationToken))
{
if (result != null)
{ yield return result; }
}
< /code>
Пока кажется ниже код, который транслируется, хотя клиент из библиотеки Azure.ai: < /p>
await foreach (StreamingChatCompletionsUpdate chatUpdate in client.GetChatCompletionsStreaming(completionsOptions))
{
string? result = chatUpdate.ContentUpdate;
if (result != null)
{ yield return result; }
}
Есть идеи?

Подробнее здесь: https://stackoverflow.com/questions/785 ... -ui-update
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»