llm 1.3.8

A Rust library unifying multiple LLM backends.
Documentation
use futures::StreamExt;
use tokio::sync::mpsc;
use tokio_util::sync::CancellationToken;

use llm::error::LLMError;

use crate::runtime::AppEvent;

use super::helpers::{flush_text, flush_text_if_needed};
use super::manager::StreamRequest;

pub async fn stream_text(
    request: &StreamRequest,
    sender: &mpsc::Sender<AppEvent>,
    cancel: &CancellationToken,
) -> Result<(), LLMError> {
    let mut stream = request.provider.chat_stream(&request.messages).await?;
    let mut buffer = String::new();
    while let Some(chunk) = stream.next().await {
        if cancel.is_cancelled() {
            return Ok(());
        }
        let delta = chunk?;
        buffer.push_str(&delta);
        flush_text_if_needed(buffer.len(), &mut buffer, request, sender).await;
    }
    flush_text(&mut buffer, request, sender).await;
    Ok(())
}