use crate::{
config::Config,
error::OpenAIError,
types::responses::{
CompactResource, CompactResponseRequest, CreateResponse, DeleteResponse, Response,
ResponseItemList, TokenCountsBody, TokenCountsResource,
},
Client, RequestOptions,
};
#[cfg(not(target_family = "wasm"))]
use crate::types::responses::ResponseStream;
pub struct Responses<'c, C: Config> {
client: &'c Client<C>,
pub(crate) request_options: RequestOptions,
}
impl<'c, C: Config> Responses<'c, C> {
pub fn new(client: &'c Client<C>) -> Self {
Self {
client,
request_options: RequestOptions::new(),
}
}
#[crate::byot(
T0 = serde::Serialize,
R = serde::de::DeserializeOwned
)]
pub async fn create(&self, request: CreateResponse) -> Result<Response, OpenAIError> {
self.client
.post("/responses", request, &self.request_options)
.await
}
#[cfg(not(target_family = "wasm"))]
#[crate::byot(
T0 = serde::Serialize,
R = serde::de::DeserializeOwned,
stream = "true",
where_clause = "R: std::marker::Send + 'static"
)]
#[allow(unused_mut)]
pub async fn create_stream(
&self,
mut request: CreateResponse,
) -> Result<ResponseStream, OpenAIError> {
#[cfg(not(feature = "byot"))]
{
if matches!(request.stream, Some(false)) {
return Err(OpenAIError::InvalidArgument(
"When stream is false, use Responses::create".into(),
));
}
request.stream = Some(true);
}
Ok(self
.client
.post_stream("/responses", request, &self.request_options)
.await)
}
#[crate::byot(T0 = std::fmt::Display, R = serde::de::DeserializeOwned)]
pub async fn retrieve(&self, response_id: &str) -> Result<Response, OpenAIError> {
self.client
.get(
&format!("/responses/{}", response_id),
&self.request_options,
)
.await
}
#[cfg(not(target_family = "wasm"))]
#[crate::byot(
T0 = std::fmt::Display,
R = serde::de::DeserializeOwned,
stream = "true",
where_clause = "R: std::marker::Send + 'static"
)]
pub async fn retrieve_stream(&self, response_id: &str) -> Result<ResponseStream, OpenAIError> {
let mut request_options = self.request_options.clone();
request_options.with_query(&[("stream", "true")])?;
Ok(self
.client
.get_stream(&format!("/responses/{}", response_id), &request_options)
.await)
}
#[crate::byot(T0 = std::fmt::Display, R = serde::de::DeserializeOwned)]
pub async fn delete(&self, response_id: &str) -> Result<DeleteResponse, OpenAIError> {
self.client
.delete(
&format!("/responses/{}", response_id),
&self.request_options,
)
.await
}
#[crate::byot(T0 = std::fmt::Display, R = serde::de::DeserializeOwned)]
pub async fn cancel(&self, response_id: &str) -> Result<Response, OpenAIError> {
self.client
.post(
&format!("/responses/{}/cancel", response_id),
serde_json::json!({}),
&self.request_options,
)
.await
}
#[crate::byot(T0 = std::fmt::Display, R = serde::de::DeserializeOwned)]
pub async fn list_input_items(
&self,
response_id: &str,
) -> Result<ResponseItemList, OpenAIError> {
self.client
.get(
&format!("/responses/{}/input_items", response_id),
&self.request_options,
)
.await
}
#[crate::byot(T0 = serde::Serialize, R = serde::de::DeserializeOwned)]
pub async fn get_input_token_counts(
&self,
request: TokenCountsBody,
) -> Result<TokenCountsResource, OpenAIError> {
self.client
.post("/responses/input_tokens", request, &self.request_options)
.await
}
#[crate::byot(T0 = serde::Serialize, R = serde::de::DeserializeOwned)]
pub async fn compact(
&self,
request: CompactResponseRequest,
) -> Result<CompactResource, OpenAIError> {
self.client
.post("/responses/compact", request, &self.request_options)
.await
}
}