responses_stream/
responses_stream.rs1use futures_util::StreamExt;
2use openai_api_rs::v1::api::OpenAIClient;
3use openai_api_rs::v1::common::GPT4_1_MINI;
4use openai_api_rs::v1::responses::responses_stream::{
5 CreateResponseStreamRequest, ResponseStreamResponse,
6};
7use serde_json::{json, Value};
8use std::env;
9use std::io::{self, Write};
10
11#[tokio::main]
12async fn main() -> Result<(), Box<dyn std::error::Error>> {
13 let api_key = env::var("OPENAI_API_KEY").unwrap();
14 let mut client = OpenAIClient::builder().with_api_key(api_key).build()?;
15
16 let mut req = CreateResponseStreamRequest::new();
17 req.model = Some(GPT4_1_MINI.to_string());
18 req.input = Some(json!("What is bitcoin? Please answer in detail."));
19
20 let mut stream = client.create_response_stream(req).await?;
21 let mut full_text = String::new();
22
23 while let Some(event) = stream.next().await {
24 match event {
25 ResponseStreamResponse::Event(evt) => {
26 if let Some("response.output_text.delta") = evt.event.as_deref() {
27 if let Some(delta) = evt.data.get("delta").and_then(Value::as_str) {
28 print!("{delta}");
29 io::stdout().flush()?;
30 full_text.push_str(delta);
31 continue;
32 }
33 }
34
35 if let Some(name) = evt.event.as_deref() {
36 println!("\nEvent: {name} => {}", evt.data);
37 } else {
38 println!("Event data: {}", evt.data);
39 }
40 }
41 ResponseStreamResponse::Done => {
42 println!("\n\nDone streaming response.");
43 }
44 }
45 }
46
47 println!("\nCollected text: {full_text}");
48 Ok(())
49}
50
51