From 002b26ddb39257e265390b0945f48d0c5102a8fb Mon Sep 17 00:00:00 2001 From: Dragon-GCS <878173121@qq.com> Date: Fri, 7 Nov 2025 15:25:32 +0800 Subject: [PATCH] feat:convenient to access output text for response api --- async-openai/src/types/responses/response.rs | 30 ++++++++++++++++++++ examples/responses/src/main.rs | 2 ++ 2 files changed, 32 insertions(+) diff --git a/async-openai/src/types/responses/response.rs b/async-openai/src/types/responses/response.rs index c571440c..3e011e48 100644 --- a/async-openai/src/types/responses/response.rs +++ b/async-openai/src/types/responses/response.rs @@ -2346,6 +2346,36 @@ pub struct Response { pub usage: Option, } +impl Response { + /// SDK-only convenience property that contains the aggregated text output from all + /// `output_text` items in the `output` array, if any are present. + pub fn output_text(&self) -> Option { + let output = self + .output + .iter() + .filter_map(|item| match item { + OutputItem::Message(msg) => Some( + msg.content + .iter() + .filter_map(|content| match content { + OutputMessageContent::OutputText(ot) => Some(ot.text.clone()), + _ => None, + }) + .collect::>(), + ), + _ => None, + }) + .flatten() + .collect::>() + .join(""); + if output.is_empty() { + None + } else { + Some(output) + } + } +} + #[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] #[serde(rename_all = "snake_case")] pub enum Status { diff --git a/examples/responses/src/main.rs b/examples/responses/src/main.rs index 792382d0..0ee2b16c 100644 --- a/examples/responses/src/main.rs +++ b/examples/responses/src/main.rs @@ -44,7 +44,9 @@ async fn main() -> Result<(), Box> { println!("{}", serde_json::to_string(&request).unwrap()); let response = client.responses().create(request).await?; + let output_text = response.output_text().unwrap_or("Empty text output".into()); + println!("\nOutput Text: {output_text:?}\n",); for output in response.output { println!("\nOutput: {:?}\n", output); }