responses_stream/
responses_stream.rs

1use 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// OPENAI_API_KEY=xxxx cargo run --package openai-api-rs --example responses_stream