agui-rs-server 0.1.1

Server SDK for the AG-UI protocol
Documentation
use agui_rs_core::{Event, Message, Result, RunAgentInput, UserMessageContent};
use agui_rs_server::{agui_router, channel, serve, RunHandler};
use futures::stream::BoxStream;

struct EchoHandler;

#[async_trait::async_trait]
impl RunHandler for EchoHandler {
    async fn handle(&self, input: RunAgentInput) -> Result<BoxStream<'static, Result<Event>>> {
        let (emitter, stream) = channel(32);
        let last_user_text = input
            .messages
            .iter()
            .rev()
            .find_map(|message| match message {
                Message::User(user) => match &user.content {
                    UserMessageContent::Text(text) => Some(text.clone()),
                    _ => None,
                },
                _ => None,
            })
            .unwrap_or_else(|| "(no input)".to_string());

        let thread_id = input.thread_id.clone();
        let run_id = input.run_id.clone();

        tokio::spawn(async move {
            let _ = emitter.run_started(&thread_id, &run_id).await;
            let _ = emitter
                .text_message("msg-1", &format!("echo: {last_user_text}"))
                .await;
            let _ = emitter.run_finished_success(&thread_id, &run_id).await;
        });

        Ok(stream)
    }
}

#[tokio::main]
async fn main() -> Result<()> {
    let app = agui_router(EchoHandler);
    println!("listening on http://127.0.0.1:8000/");
    serve("127.0.0.1:8000", app).await
}