use std::collections::BTreeMap;
use std::time::Duration;
use http::Method;
use serde::{Deserialize, Serialize};
use serde_json::Value;
use tokio::time::sleep;
use crate::Client;
use crate::error::{Error, Result};
use crate::generated::endpoints;
#[cfg(feature = "realtime")]
use super::RealtimeSocketRequestBuilder;
use super::{
AssistantStreamRequestBuilder, BetaAssistantsResource, BetaChatkitResource,
BetaChatkitSessionsResource, BetaChatkitThreadsResource, BetaRealtimeResource,
BetaRealtimeSessionsResource, BetaRealtimeTranscriptionSessionsResource, BetaResource,
BetaThreadMessagesResource, BetaThreadRunStepsResource, BetaThreadRunsResource,
BetaThreadsResource, DeleteResponse, JsonRequestBuilder, ListRequestBuilder,
RealtimeSessionClientSecret, encode_path_segment,
};
macro_rules! json_payload_wrapper {
($(#[$meta:meta])* $name:ident) => {
$(#[$meta])*
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(transparent)]
pub struct $name(Value);
impl Default for $name {
fn default() -> Self {
Self(Value::Null)
}
}
impl From<Value> for $name {
fn from(value: Value) -> Self {
Self(value)
}
}
impl From<$name> for Value {
fn from(value: $name) -> Self {
value.0
}
}
impl $name {
pub fn as_raw(&self) -> &Value {
&self.0
}
pub fn into_raw(self) -> Value {
self.0
}
pub fn kind(&self) -> Option<&str> {
self.0.get("type").and_then(Value::as_str)
}
}
};
}
json_payload_wrapper!(
BetaAssistantTool
);
json_payload_wrapper!(
BetaThreadToolResources
);
json_payload_wrapper!(
BetaThreadMessageContent
);
json_payload_wrapper!(
BetaThreadRunTool
);
json_payload_wrapper!(
BetaThreadRunStepDetails
);
json_payload_wrapper!(
ChatKitWorkflow
);
json_payload_wrapper!(
ChatKitConfiguration
);
json_payload_wrapper!(
ChatKitRateLimits
);
json_payload_wrapper!(
ChatKitThreadContent
);
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct BetaThreadRunRequiredActionFunction {
#[serde(default)]
pub arguments: String,
pub name: Option<String>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct BetaThreadRunRequiredActionFunctionToolCall {
pub id: String,
#[serde(rename = "function")]
pub function_call: Option<BetaThreadRunRequiredActionFunction>,
#[serde(rename = "type")]
pub tool_type: Option<String>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct BetaThreadRunRequiredActionSubmitToolOutputs {
#[serde(default)]
pub tool_calls: Vec<BetaThreadRunRequiredActionFunctionToolCall>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct BetaThreadRunRequiredAction {
pub submit_tool_outputs: Option<BetaThreadRunRequiredActionSubmitToolOutputs>,
#[serde(rename = "type")]
pub action_type: Option<String>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct BetaThreadRunLastError {
pub code: Option<String>,
pub message: Option<String>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct BetaThreadRunIncompleteDetails {
pub reason: Option<String>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct BetaThreadRunUsage {
pub completion_tokens: Option<u64>,
pub prompt_tokens: Option<u64>,
pub total_tokens: Option<u64>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct BetaAssistant {
pub id: String,
#[serde(default)]
pub object: String,
pub model: Option<String>,
pub name: Option<String>,
pub description: Option<String>,
pub instructions: Option<String>,
#[serde(default)]
pub tools: Vec<BetaAssistantTool>,
pub metadata: Option<BTreeMap<String, String>>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct BetaThread {
pub id: String,
#[serde(default)]
pub object: String,
pub metadata: Option<BTreeMap<String, String>>,
pub tool_resources: Option<BetaThreadToolResources>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct BetaThreadMessage {
pub id: String,
#[serde(default)]
pub object: String,
pub thread_id: Option<String>,
pub role: Option<String>,
pub status: Option<String>,
#[serde(default)]
pub content: Vec<BetaThreadMessageContent>,
pub assistant_id: Option<String>,
pub run_id: Option<String>,
pub metadata: Option<BTreeMap<String, String>>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct BetaThreadRun {
pub id: String,
#[serde(default)]
pub object: String,
pub thread_id: Option<String>,
pub assistant_id: Option<String>,
pub status: Option<String>,
pub model: Option<String>,
pub instructions: Option<String>,
pub required_action: Option<BetaThreadRunRequiredAction>,
pub last_error: Option<BetaThreadRunLastError>,
pub incomplete_details: Option<BetaThreadRunIncompleteDetails>,
#[serde(default)]
pub tools: Vec<BetaThreadRunTool>,
pub metadata: Option<BTreeMap<String, String>>,
pub usage: Option<BetaThreadRunUsage>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct BetaThreadRunStep {
pub id: String,
#[serde(default)]
pub object: String,
pub run_id: Option<String>,
pub assistant_id: Option<String>,
pub status: Option<String>,
pub step_details: Option<BetaThreadRunStepDetails>,
pub usage: Option<BetaThreadRunUsage>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ChatKitSession {
pub id: String,
#[serde(default)]
pub object: String,
pub client_secret: Option<String>,
pub expires_at: Option<u64>,
pub max_requests_per_1_minute: Option<u64>,
pub status: Option<String>,
pub user: Option<String>,
pub workflow: Option<ChatKitWorkflow>,
pub chatkit_configuration: Option<ChatKitConfiguration>,
pub rate_limits: Option<ChatKitRateLimits>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ChatKitThreadStatus {
#[serde(rename = "type")]
pub status_type: Option<String>,
pub reason: Option<String>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ChatKitThread {
pub id: String,
pub created_at: Option<u64>,
#[serde(default)]
pub object: String,
pub status: Option<ChatKitThreadStatus>,
pub title: Option<String>,
pub user: Option<String>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ChatKitThreadItem {
pub id: String,
#[serde(default)]
pub object: String,
pub thread_id: Option<String>,
pub created_at: Option<u64>,
#[serde(rename = "type")]
pub item_type: Option<String>,
#[serde(default)]
pub content: Vec<ChatKitThreadContent>,
pub arguments: Option<String>,
pub call_id: Option<String>,
pub name: Option<String>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct BetaRealtimeSession {
pub id: Option<String>,
#[serde(rename = "type")]
pub session_type: Option<String>,
pub client_secret: Option<RealtimeSessionClientSecret>,
pub model: Option<String>,
#[serde(default)]
pub modalities: Vec<String>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct BetaRealtimeTranscriptionSession {
pub client_secret: Option<RealtimeSessionClientSecret>,
pub input_audio_format: Option<String>,
#[serde(default)]
pub modalities: Vec<String>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
impl BetaResource {
pub fn assistants(&self) -> BetaAssistantsResource {
BetaAssistantsResource::new(self.client.clone())
}
pub fn threads(&self) -> BetaThreadsResource {
BetaThreadsResource::new(self.client.clone())
}
pub fn chatkit(&self) -> BetaChatkitResource {
BetaChatkitResource::new(self.client.clone())
}
pub fn realtime(&self) -> BetaRealtimeResource {
BetaRealtimeResource::new(self.client.clone())
}
}
impl BetaAssistantsResource {
pub fn create(&self) -> JsonRequestBuilder<BetaAssistant> {
beta_json(
self.client.clone(),
"beta.assistants.create",
Method::POST,
"/assistants",
)
}
pub fn retrieve(&self, assistant_id: impl Into<String>) -> JsonRequestBuilder<BetaAssistant> {
beta_json(
self.client.clone(),
"beta.assistants.retrieve",
Method::GET,
format!("/assistants/{}", encode_path_segment(assistant_id.into())),
)
}
pub fn update(&self, assistant_id: impl Into<String>) -> JsonRequestBuilder<BetaAssistant> {
beta_json(
self.client.clone(),
"beta.assistants.update",
Method::POST,
format!("/assistants/{}", encode_path_segment(assistant_id.into())),
)
}
pub fn list(&self) -> ListRequestBuilder<BetaAssistant> {
beta_list(self.client.clone(), "beta.assistants.list", "/assistants")
}
pub fn delete(&self, assistant_id: impl Into<String>) -> JsonRequestBuilder<DeleteResponse> {
beta_json(
self.client.clone(),
"beta.assistants.delete",
Method::DELETE,
format!("/assistants/{}", encode_path_segment(assistant_id.into())),
)
}
}
impl BetaThreadsResource {
pub fn create(&self) -> JsonRequestBuilder<BetaThread> {
beta_json(
self.client.clone(),
"beta.threads.create",
Method::POST,
"/threads",
)
}
pub fn retrieve(&self, thread_id: impl Into<String>) -> JsonRequestBuilder<BetaThread> {
beta_json(
self.client.clone(),
"beta.threads.retrieve",
Method::GET,
format!("/threads/{}", encode_path_segment(thread_id.into())),
)
}
pub fn update(&self, thread_id: impl Into<String>) -> JsonRequestBuilder<BetaThread> {
beta_json(
self.client.clone(),
"beta.threads.update",
Method::POST,
format!("/threads/{}", encode_path_segment(thread_id.into())),
)
}
pub fn delete(&self, thread_id: impl Into<String>) -> JsonRequestBuilder<DeleteResponse> {
beta_json(
self.client.clone(),
"beta.threads.delete",
Method::DELETE,
format!("/threads/{}", encode_path_segment(thread_id.into())),
)
}
pub fn create_and_run(&self) -> JsonRequestBuilder<BetaThreadRun> {
beta_json(
self.client.clone(),
"beta.threads.create_and_run",
Method::POST,
"/threads/runs",
)
}
pub fn create_and_run_stream(&self) -> AssistantStreamRequestBuilder {
beta_assistant_stream(
self.client.clone(),
"beta.threads.create_and_run_stream",
Method::POST,
"/threads/runs",
)
.extra_body("stream", Value::Bool(true))
}
pub async fn create_and_run_poll<T>(
&self,
body: &T,
poll_interval: Option<Duration>,
) -> Result<BetaThreadRun>
where
T: Serialize,
{
let run = self.create_and_run().json_body(body)?.send().await?;
let thread_id = run
.thread_id
.clone()
.ok_or_else(|| Error::InvalidConfig("run 响应缺少 thread_id,无法继续轮询".into()))?;
self.runs()
.poll(thread_id, run.id.clone(), poll_interval)
.await
}
pub fn messages(&self) -> BetaThreadMessagesResource {
BetaThreadMessagesResource::new(self.client.clone())
}
pub fn runs(&self) -> BetaThreadRunsResource {
BetaThreadRunsResource::new(self.client.clone())
}
}
impl BetaThreadMessagesResource {
pub fn create(&self, thread_id: impl Into<String>) -> JsonRequestBuilder<BetaThreadMessage> {
beta_json(
self.client.clone(),
"beta.threads.messages.create",
Method::POST,
format!(
"/threads/{}/messages",
encode_path_segment(thread_id.into())
),
)
}
pub fn retrieve(
&self,
thread_id: impl Into<String>,
message_id: impl Into<String>,
) -> JsonRequestBuilder<BetaThreadMessage> {
beta_json(
self.client.clone(),
"beta.threads.messages.retrieve",
Method::GET,
format!(
"/threads/{}/messages/{}",
encode_path_segment(thread_id.into()),
encode_path_segment(message_id.into())
),
)
}
pub fn update(
&self,
thread_id: impl Into<String>,
message_id: impl Into<String>,
) -> JsonRequestBuilder<BetaThreadMessage> {
beta_json(
self.client.clone(),
"beta.threads.messages.update",
Method::POST,
format!(
"/threads/{}/messages/{}",
encode_path_segment(thread_id.into()),
encode_path_segment(message_id.into())
),
)
}
pub fn list(&self, thread_id: impl Into<String>) -> ListRequestBuilder<BetaThreadMessage> {
beta_list(
self.client.clone(),
"beta.threads.messages.list",
format!(
"/threads/{}/messages",
encode_path_segment(thread_id.into())
),
)
}
pub fn delete(
&self,
thread_id: impl Into<String>,
message_id: impl Into<String>,
) -> JsonRequestBuilder<DeleteResponse> {
beta_json(
self.client.clone(),
"beta.threads.messages.delete",
Method::DELETE,
format!(
"/threads/{}/messages/{}",
encode_path_segment(thread_id.into()),
encode_path_segment(message_id.into())
),
)
}
}
impl BetaThreadRunsResource {
pub fn create(&self, thread_id: impl Into<String>) -> JsonRequestBuilder<BetaThreadRun> {
beta_json(
self.client.clone(),
"beta.threads.runs.create",
Method::POST,
format!("/threads/{}/runs", encode_path_segment(thread_id.into())),
)
}
pub fn retrieve(
&self,
thread_id: impl Into<String>,
run_id: impl Into<String>,
) -> JsonRequestBuilder<BetaThreadRun> {
beta_json(
self.client.clone(),
"beta.threads.runs.retrieve",
Method::GET,
format!(
"/threads/{}/runs/{}",
encode_path_segment(thread_id.into()),
encode_path_segment(run_id.into())
),
)
}
pub fn update(
&self,
thread_id: impl Into<String>,
run_id: impl Into<String>,
) -> JsonRequestBuilder<BetaThreadRun> {
beta_json(
self.client.clone(),
"beta.threads.runs.update",
Method::POST,
format!(
"/threads/{}/runs/{}",
encode_path_segment(thread_id.into()),
encode_path_segment(run_id.into())
),
)
}
pub fn list(&self, thread_id: impl Into<String>) -> ListRequestBuilder<BetaThreadRun> {
beta_list(
self.client.clone(),
"beta.threads.runs.list",
format!("/threads/{}/runs", encode_path_segment(thread_id.into())),
)
}
pub fn cancel(
&self,
thread_id: impl Into<String>,
run_id: impl Into<String>,
) -> JsonRequestBuilder<BetaThreadRun> {
beta_json(
self.client.clone(),
"beta.threads.runs.cancel",
Method::POST,
format!(
"/threads/{}/runs/{}/cancel",
encode_path_segment(thread_id.into()),
encode_path_segment(run_id.into())
),
)
}
pub fn create_and_stream(&self, thread_id: impl Into<String>) -> AssistantStreamRequestBuilder {
beta_assistant_stream(
self.client.clone(),
"beta.threads.runs.create_and_stream",
Method::POST,
format!("/threads/{}/runs", encode_path_segment(thread_id.into())),
)
.extra_body("stream", Value::Bool(true))
}
pub fn submit_tool_outputs(
&self,
thread_id: impl Into<String>,
run_id: impl Into<String>,
) -> JsonRequestBuilder<BetaThreadRun> {
beta_json(
self.client.clone(),
"beta.threads.runs.submit_tool_outputs",
Method::POST,
format!(
"/threads/{}/runs/{}/submit_tool_outputs",
encode_path_segment(thread_id.into()),
encode_path_segment(run_id.into())
),
)
}
pub fn submit_tool_outputs_stream(
&self,
thread_id: impl Into<String>,
run_id: impl Into<String>,
) -> AssistantStreamRequestBuilder {
beta_assistant_stream(
self.client.clone(),
"beta.threads.runs.submit_tool_outputs_stream",
Method::POST,
format!(
"/threads/{}/runs/{}/submit_tool_outputs",
encode_path_segment(thread_id.into()),
encode_path_segment(run_id.into())
),
)
.extra_body("stream", Value::Bool(true))
}
pub fn stream(
&self,
thread_id: impl Into<String>,
run_id: impl Into<String>,
) -> AssistantStreamRequestBuilder {
beta_assistant_stream(
self.client.clone(),
"beta.threads.runs.stream",
Method::GET,
format!(
"/threads/{}/runs/{}",
encode_path_segment(thread_id.into()),
encode_path_segment(run_id.into())
),
)
.extra_query("stream", "true")
}
pub async fn create_and_poll<T>(
&self,
thread_id: impl Into<String>,
body: &T,
poll_interval: Option<Duration>,
) -> Result<BetaThreadRun>
where
T: Serialize,
{
let thread_id = thread_id.into();
let run = self
.create(thread_id.clone())
.json_body(body)?
.send()
.await?;
self.poll(thread_id, run.id.clone(), poll_interval).await
}
pub async fn poll(
&self,
thread_id: impl Into<String>,
run_id: impl Into<String>,
poll_interval: Option<Duration>,
) -> Result<BetaThreadRun> {
let thread_id = thread_id.into();
let run_id = run_id.into();
loop {
let mut request = self
.retrieve(thread_id.clone(), run_id.clone())
.extra_header("x-stainless-poll-helper", "true");
if let Some(interval) = poll_interval {
request = request.extra_header(
"x-stainless-custom-poll-interval",
interval.as_millis().to_string(),
);
}
let response = request.send_with_meta().await?;
let run = response.data;
match run.status.as_deref().unwrap_or_default() {
"queued" | "in_progress" | "cancelling" => {
let header_delay = response
.meta
.headers
.get("openai-poll-after-ms")
.and_then(|value| value.to_str().ok())
.and_then(|value| value.parse::<u64>().ok())
.map(Duration::from_millis);
sleep(
poll_interval
.or(header_delay)
.unwrap_or(Duration::from_secs(5)),
)
.await;
}
_ => return Ok(run),
}
}
}
pub async fn submit_tool_outputs_and_poll<T>(
&self,
thread_id: impl Into<String>,
run_id: impl Into<String>,
body: &T,
poll_interval: Option<Duration>,
) -> Result<BetaThreadRun>
where
T: Serialize,
{
let thread_id = thread_id.into();
let run_id = run_id.into();
let run = self
.submit_tool_outputs(thread_id.clone(), run_id)
.json_body(body)?
.send()
.await?;
self.poll(thread_id, run.id.clone(), poll_interval).await
}
pub fn steps(&self) -> BetaThreadRunStepsResource {
BetaThreadRunStepsResource::new(self.client.clone())
}
}
impl BetaThreadRunStepsResource {
pub fn retrieve(
&self,
thread_id: impl Into<String>,
run_id: impl Into<String>,
step_id: impl Into<String>,
) -> JsonRequestBuilder<BetaThreadRunStep> {
beta_json(
self.client.clone(),
"beta.threads.runs.steps.retrieve",
Method::GET,
format!(
"/threads/{}/runs/{}/steps/{}",
encode_path_segment(thread_id.into()),
encode_path_segment(run_id.into()),
encode_path_segment(step_id.into())
),
)
}
pub fn list(
&self,
thread_id: impl Into<String>,
run_id: impl Into<String>,
) -> ListRequestBuilder<BetaThreadRunStep> {
beta_list(
self.client.clone(),
"beta.threads.runs.steps.list",
format!(
"/threads/{}/runs/{}/steps",
encode_path_segment(thread_id.into()),
encode_path_segment(run_id.into())
),
)
}
}
impl BetaChatkitResource {
pub fn sessions(&self) -> BetaChatkitSessionsResource {
BetaChatkitSessionsResource::new(self.client.clone())
}
pub fn threads(&self) -> BetaChatkitThreadsResource {
BetaChatkitThreadsResource::new(self.client.clone())
}
}
impl BetaChatkitSessionsResource {
pub fn create(&self) -> JsonRequestBuilder<ChatKitSession> {
let endpoint = endpoints::beta_chatkit::BETA_CHATKIT_SESSIONS_CREATE;
beta_chatkit_json(
self.client.clone(),
endpoint.id,
Method::POST,
endpoint.template,
)
}
pub fn cancel(&self, session_id: impl Into<String>) -> JsonRequestBuilder<ChatKitSession> {
let endpoint = endpoints::beta_chatkit::BETA_CHATKIT_SESSIONS_CANCEL;
beta_chatkit_json(
self.client.clone(),
endpoint.id,
Method::POST,
endpoint.render(&[("session_id", &encode_path_segment(session_id.into()))]),
)
}
}
impl BetaChatkitThreadsResource {
pub fn retrieve(&self, thread_id: impl Into<String>) -> JsonRequestBuilder<ChatKitThread> {
let endpoint = endpoints::beta_chatkit::BETA_CHATKIT_THREADS_RETRIEVE;
beta_chatkit_json(
self.client.clone(),
endpoint.id,
Method::GET,
endpoint.render(&[("thread_id", &encode_path_segment(thread_id.into()))]),
)
}
pub fn list(&self) -> ListRequestBuilder<ChatKitThread> {
let endpoint = endpoints::beta_chatkit::BETA_CHATKIT_THREADS_LIST;
beta_chatkit_list(self.client.clone(), endpoint.id, endpoint.template)
}
pub fn list_items(
&self,
thread_id: impl Into<String>,
) -> ListRequestBuilder<ChatKitThreadItem> {
let endpoint = endpoints::beta_chatkit::BETA_CHATKIT_THREADS_LIST_ITEMS;
beta_chatkit_list(
self.client.clone(),
endpoint.id,
endpoint.render(&[("thread_id", &encode_path_segment(thread_id.into()))]),
)
}
pub fn delete(&self, thread_id: impl Into<String>) -> JsonRequestBuilder<DeleteResponse> {
let endpoint = endpoints::beta_chatkit::BETA_CHATKIT_THREADS_DELETE;
beta_chatkit_json(
self.client.clone(),
endpoint.id,
Method::DELETE,
endpoint.render(&[("thread_id", &encode_path_segment(thread_id.into()))]),
)
}
}
impl BetaRealtimeResource {
#[cfg(feature = "realtime")]
#[cfg_attr(docsrs, doc(cfg(feature = "realtime")))]
pub fn ws(&self) -> RealtimeSocketRequestBuilder {
RealtimeSocketRequestBuilder::new(self.client.clone())
}
pub fn sessions(&self) -> BetaRealtimeSessionsResource {
BetaRealtimeSessionsResource::new(self.client.clone())
}
pub fn transcription_sessions(&self) -> BetaRealtimeTranscriptionSessionsResource {
BetaRealtimeTranscriptionSessionsResource::new(self.client.clone())
}
}
impl BetaRealtimeSessionsResource {
pub fn create(&self) -> JsonRequestBuilder<BetaRealtimeSession> {
let endpoint = endpoints::beta_realtime::BETA_REALTIME_SESSIONS_CREATE;
beta_json(
self.client.clone(),
endpoint.id,
Method::POST,
endpoint.template,
)
}
}
impl BetaRealtimeTranscriptionSessionsResource {
pub fn create(&self) -> JsonRequestBuilder<BetaRealtimeTranscriptionSession> {
let endpoint = endpoints::beta_realtime::BETA_REALTIME_TRANSCRIPTION_SESSIONS_CREATE;
beta_json(
self.client.clone(),
endpoint.id,
Method::POST,
endpoint.template,
)
}
}
fn beta_json<T>(
client: Client,
endpoint_id: &'static str,
method: Method,
path: impl Into<String>,
) -> JsonRequestBuilder<T> {
JsonRequestBuilder::new(client, endpoint_id, method, path)
.extra_header("openai-beta", "assistants=v2")
}
fn beta_list<T>(
client: Client,
endpoint_id: &'static str,
path: impl Into<String>,
) -> ListRequestBuilder<T> {
ListRequestBuilder::new(client, endpoint_id, path).extra_header("openai-beta", "assistants=v2")
}
fn beta_chatkit_json<T>(
client: Client,
endpoint_id: &'static str,
method: Method,
path: impl Into<String>,
) -> JsonRequestBuilder<T> {
JsonRequestBuilder::new(client, endpoint_id, method, path)
.extra_header("openai-beta", "chatkit_beta=v1")
}
fn beta_chatkit_list<T>(
client: Client,
endpoint_id: &'static str,
path: impl Into<String>,
) -> ListRequestBuilder<T> {
ListRequestBuilder::new(client, endpoint_id, path)
.extra_header("openai-beta", "chatkit_beta=v1")
}
fn beta_assistant_stream(
client: Client,
endpoint_id: &'static str,
method: Method,
path: impl Into<String>,
) -> AssistantStreamRequestBuilder {
AssistantStreamRequestBuilder::new(client, endpoint_id, method, path)
.extra_header("openai-beta", "assistants=v2")
}