use futures_util::StreamExt;
use super::contract::{ApiMessage, ChatChunk, ChatRequest, ChatStream};
pub(crate) fn serve(events: &'static [&'static str]) -> String {
let listener = std::net::TcpListener::bind("127.0.0.1:0").unwrap();
let port = listener.local_addr().unwrap().port();
std::thread::spawn(move || {
use std::io::{Read, Write};
let Ok((mut sock, _)) = listener.accept() else {
return;
};
let mut buf = [0u8; 4096];
let _ = sock.read(&mut buf);
let mut body = String::new();
for e in events {
body.push_str(&format!("data: {e}\n\n"));
}
let _ = sock.write_all(
format!(
"HTTP/1.1 200 OK\r\nContent-Type: text/event-stream\r\nContent-Length: {}\r\nConnection: close\r\n\r\n{body}",
body.len()
)
.as_bytes(),
);
let _ = sock.flush();
});
format!("http://127.0.0.1:{port}")
}
pub(crate) async fn collect(stream: ChatStream) -> Vec<ChatChunk> {
let mut out = Vec::new();
let mut stream = stream;
while let Some(c) = stream.next().await {
let last = matches!(c, ChatChunk::Finished(_));
out.push(c);
if last {
break;
}
}
out
}
pub(crate) fn hello() -> ChatRequest {
ChatRequest {
continue_final: false,
system: None,
messages: vec![ApiMessage::user("hi")],
sampling: Default::default(),
tools: vec![],
}
}