use std::collections::HashMap;
use std::error::Error;
use std::time::Duration;
use serde::{Deserialize, Serialize};
use serde_json::Value;
use tokio::time::sleep;
use crate::resource::APIResource;
use crate::core::{self, FinalRequestOptions, Headers, RequestOptions};
use crate::library::assistant_stream::{AssistantStream, RunCreateParamsBaseStream, RunSubmitToolOutputsParamsStream};
use crate::resources::beta::threads::runs::runs as runs_api;
use crate::resources::beta::assistants as assistants_api;
use crate::resources::beta::threads::messages as messages_api;
use crate::resources::beta::threads as threads_api;
use crate::resources::beta::threads::runs::steps as steps_api;
use crate::pagination::{CursorPage, CursorPageParams, CursorPageResponse, Page};
#[derive(Debug, Clone)]
pub struct Runs {
pub client: Option<APIResource>,
}
impl Runs {
pub fn new() -> Self {
Runs {
client: None,
}
}
pub async fn create(
&self,
thread_id: &str,
body: RunCreateParams,
options: Option<RequestOptions<RunCreateParams>>,
) -> Result<Run, Box<dyn Error>> {
let stream = body.stream.unwrap_or(false);
let mut headers: Headers = HashMap::new();
headers.insert("OpenAI-Beta".to_string(), Some("assistants=v2".to_string()));
if let Some(opts) = &options {
if let Some(hdrs) = &opts.headers {
for (key, value) in hdrs {
headers.insert(key.to_owned(), value.to_owned());
}
}
}
self.client.as_ref().unwrap().borrow().post(
&format!("/threads/{thread_id}/runs"),
Some(RequestOptions {
body: Some(body),
headers: Some(headers),
stream: Some(stream),
..options.unwrap_or_default()
}),
).await
}
pub async fn retrieve(
&self,
thread_id: &str,
run_id: &str,
options: Option<RequestOptions>,
) -> Result<Run, Box<dyn Error>> {
let mut headers: Headers = HashMap::new();
headers.insert("OpenAI-Beta".to_string(), Some("assistants=v2".to_string()));
if let Some(opts) = &options {
if let Some(hdrs) = &opts.headers {
for (key, value) in hdrs {
headers.insert(key.to_owned(), value.to_owned());
}
}
}
self.client.as_ref().unwrap().borrow().get(
&format!("/threads/{thread_id}/runs/{run_id}"),
Some(core::RequestOptions {
headers: Some(headers),
..options.unwrap_or_default()
}),
).await
}
pub async fn update(
&self,
thread_id: &str,
run_id: &str,
body: RunUpdateParams,
options: Option<RequestOptions<RunUpdateParams>>,
) -> Result<Run, Box<dyn Error>> {
let mut headers: Headers = HashMap::new();
headers.insert("OpenAI-Beta".to_string(), Some("assistants=v2".to_string()));
if let Some(opts) = &options {
if let Some(hdrs) = &opts.headers {
for (key, value) in hdrs {
headers.insert(key.to_owned(), value.to_owned());
}
}
}
self.client.as_ref().unwrap().borrow().post(
&format!("/threads/{thread_id}/runs/{run_id}"),
Some(RequestOptions {
body: Some(body),
headers: Some(headers),
..options.unwrap_or_default()
}),
).await
}
pub async fn list(
&self,
thread_id: &str,
query: Option<RunListParams>,
options: Option<RequestOptions<RunListParams>>,
) -> Result<CursorPage<RunListParams, Run>, Box<dyn Error>> {
let mut headers: Headers = HashMap::new();
headers.insert("OpenAI-Beta".to_string(), Some("assistants=v2".to_string()));
if let Some(opts) = &options {
if let Some(hdrs) = &opts.headers {
for (key, value) in hdrs {
headers.insert(key.to_owned(), value.to_owned());
}
}
}
let page_constructor = |
client: APIResource,
body: CursorPageResponse<Run>,
options: FinalRequestOptions<RunListParams>,
| {
CursorPage::new(client, body, options)
};
self.client.as_ref().unwrap().borrow().get_api_list(
&format!("/threads/{thread_id}/runs"),
page_constructor,
Some(RequestOptions {
query: query,
headers: Some(headers),
..options.unwrap_or_default()
}),
).await
}
pub async fn cancel(
&self,
thread_id: &str,
run_id: &str,
options: Option<RequestOptions>,
) -> Result<Run, Box<dyn Error>> {
let mut headers: Headers = HashMap::new();
headers.insert("OpenAI-Beta".to_string(), Some("assistants=v2".to_string()));
if let Some(opts) = &options {
if let Some(hdrs) = &opts.headers {
for (key, value) in hdrs {
headers.insert(key.to_owned(), value.to_owned());
}
}
}
self.client.as_ref().unwrap().borrow().post(
&format!("/threads/{thread_id}/runs/{run_id}/cancel"),
Some(RequestOptions {
headers: Some(headers),
..options.unwrap_or_default()
}),
).await
}
pub async fn create_and_poll(
&self,
thread_id: &str,
body: RunCreateParams, options: Option<RequestOptions<RunCreateParams>>, ) -> Result<Run, Box<dyn Error>> {
let run = self.create(thread_id, body, options.clone()).await?;
self.poll(thread_id, &run.id, options).await
}
pub async fn poll(
&self,
thread_id: &str,
run_id: &str,
options: Option<RequestOptions<RunCreateParams>>,
) -> Result<Run, Box<dyn Error>> {
let mut headers: Headers = HashMap::new();
headers.insert("OpenAI-Beta".to_string(), Some("assistants=v2".to_string()));
headers.insert("X-Stainless-Poll-Helper".to_string(), Some("true".to_string()));
if let Some(opts) = &options {
if let Some(hdrs) = &opts.headers {
for (key, value) in hdrs {
headers.insert(key.to_owned(), value.to_owned());
}
}
}
let mut options = options.unwrap_or_default();
let poll_interval_ms = options.poll_interval_ms.clone();
if let Some(ms) = &poll_interval_ms {
headers.insert("X-Stainless-Custom-Poll-Interval".to_string(), Some(ms.clone().to_string()));
}
options.headers = Some(headers);
let retrieve_options: RequestOptions<()> = options.convert(None);
loop {
let run = self.retrieve(thread_id, run_id, Some(retrieve_options.clone())).await?;
match run.status {
RunStatus::Queued | RunStatus::InProgress | RunStatus::Cancelling => {
let sleep_interval = poll_interval_ms.unwrap_or(5000);
sleep(Duration::from_millis(sleep_interval as u64));
}
RunStatus::RequiresAction | RunStatus::Incomplete |
RunStatus::Cancelled | RunStatus::Completed |
RunStatus::Failed | RunStatus::Expired => {
return Ok(run);
}
}
}
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct RequiredActionFunctionToolCall {
pub id: String,
pub function: required_action_function_tool_call::Function,
#[serde(rename = "type")]
pub kind: required_action_function_tool_call::Type,
}
pub mod required_action_function_tool_call {
use super::*;
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct Function {
pub arguments: String,
pub name: String,
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum Type {
#[default]
Function,
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct Run {
pub id: String,
pub assistant_id: String,
pub cancelled_at: Option<u64>,
pub completed_at: Option<u64>,
pub created_at: u64,
pub expires_at: Option<u64>,
pub failed_at: Option<u64>,
pub incomplete_details: Option<run::IncompleteDetails>,
pub instructions: String,
pub last_error: Option<run::LastError>,
pub max_completion_tokens: Option<u32>,
pub max_prompt_tokens: Option<u32>,
pub metadata: Option<Value>,
pub model: String,
pub object: run::Object,
pub parallel_tool_calls: bool,
pub required_action: Option<run::RequiredAction>,
pub response_format: Option<threads_api::AssistantResponseFormatOption>,
pub started_at: Option<u64>,
pub status: RunStatus,
pub thread_id: String,
pub tool_choice: Option<threads_api::AssistantToolChoiceOption>,
pub tools: Vec<assistants_api::AssistantTool>,
pub truncation_strategy: Option<run::TruncationStrategy>,
pub usage: Option<run::Usage>,
#[serde(skip_serializing_if = "Option::is_none")]
pub temperature: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub top_p: Option<f32>,
}
pub mod run {
use super::*;
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct IncompleteDetails {
#[serde(skip_serializing_if = "Option::is_none")]
pub reason: Option<incomplete_details::Reason>,
}
pub mod incomplete_details {
use super::*;
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
#[serde(untagged, rename_all = "snake_case")]
pub enum Reason {
#[default]
MaxCompletionTokens,
MaxPromptTokens,
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub enum Object {
#[default]
#[serde(rename = "thread.run")]
ThreadRun,
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct LastError {
pub code: last_error::Code,
pub message: String,
}
pub mod last_error {
use super::*;
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
#[serde(untagged, rename_all = "snake_case")]
pub enum Code {
#[default]
ServerError,
RateLimitExceeded,
InvalidPrompt,
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct RequiredAction {
pub submit_tool_outputs: required_action::SubmitToolOutputs,
#[serde(rename = "type")]
pub kind: required_action::Type,
}
pub mod required_action {
use super::*;
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct SubmitToolOutputs {
pub tool_calls: Vec<runs_api::RequiredActionFunctionToolCall>,
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum Type {
#[default]
SubmitToolOutputs,
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct TruncationStrategy {
#[serde(rename = "type")]
pub kind: truncation_strategy::Type,
#[serde(skip_serializing_if = "Option::is_none")]
pub last_messages: Option<u32>,
}
pub mod truncation_strategy {
use super::*;
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum Type {
#[default]
Auto,
LastMessages,
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct Usage {
pub completion_tokens: u32,
pub prompt_tokens: u32,
pub total_tokens: u32,
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum RunStatus {
#[default]
Queued,
InProgress,
RequiresAction,
Cancelling,
Cancelled,
Failed,
Completed,
Incomplete,
Expired,
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct RunCreateParams {
pub assistant_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub additional_instructions: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub additional_messages: Option<Vec<run_create_params::AdditionalMessage>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub instructions: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_completion_tokens: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_prompt_tokens: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub model: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parallel_tool_calls: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub response_format: Option<threads_api::AssistantResponseFormatOption>,
#[serde(skip_serializing_if = "Option::is_none")]
pub stream: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub temperature: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_choice: Option<threads_api::AssistantToolChoiceOption>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tools: Option<Vec<assistants_api::AssistantTool>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub top_p: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub truncation_strategy: Option<run_create_params::TruncationStrategy>,
}
pub mod run_create_params {
use super::*;
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct AdditionalMessage {
pub content: additional_message::Content,
pub role: additional_message::Role,
#[serde(skip_serializing_if = "Option::is_none")]
pub attachments: Option<Vec<additional_message::Attachment>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<Value>,
}
pub mod additional_message {
use super::*;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum Content {
Text(String),
Multiple(Vec<messages_api::MessageContent>), }
impl Default for Content {
fn default() -> Self {
Content::Text(String::default())
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct Attachment {
#[serde(skip_serializing_if = "Option::is_none")]
pub file_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tools: Option<Vec<attachment::Tool>>,
}
pub mod attachment {
use super::*;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum Tool {
CodeInterpreterTool(assistants_api::CodeInterpreterTool),
FileSearch(FileSearch),
}
impl Default for Tool {
fn default() -> Self {
Tool::CodeInterpreterTool(assistants_api::CodeInterpreterTool::default())
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct FileSearch {
#[serde(rename = "type")]
pub kind: file_search::Type,
}
pub mod file_search {
use super::*;
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum Type {
#[default]
FileSearch,
}
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub enum Role {
#[default]
User,
Assistant,
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct TruncationStrategy {
#[serde(rename = "type")]
pub kind: truncation_strategy::Type,
#[serde(skip_serializing_if = "Option::is_none")]
last_messages: Option<u32>,
}
pub mod truncation_strategy {
use super::*;
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum Type {
#[default]
Auto,
LastMessages,
}
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct RunUpdateParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<Value>,
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct RunListParams { #[serde(skip_serializing_if = "Option::is_none")]
pub before: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub order: Option<run_list_params::Order>,
}
pub mod run_list_params {
use super::*;
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
#[serde(untagged, rename_all = "snake_case")]
pub enum Order {
#[default]
Asc,
Desc,
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct RunCreateAndPollParams {
pub assistant_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub additional_instructions: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub additional_messages: Option<Vec<run_create_and_poll_params::AdditionalMessage>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub instructions: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_completion_tokens: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_prompt_tokens: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<Value>,
pub model: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub response_format: Option<threads_api::AssistantResponseFormatOption>,
#[serde(skip_serializing_if = "Option::is_none")]
pub temperature: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_choice: Option<threads_api::AssistantToolChoiceOption>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tools: Option<Vec<assistants_api::AssistantTool>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub top_p: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub truncation_strategy: Option<run_create_and_poll_params::TruncationStrategy>,
}
pub mod run_create_and_poll_params {
use super::*;
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct AdditionalMessage {
pub content: additional_message::Content,
pub role: additional_message::Role,
#[serde(skip_serializing_if = "Option::is_none")]
pub attachments: Option<Vec<additional_message::Attachment>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<Value>,
}
pub mod additional_message {
use super::*;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum Content {
Text(String),
Multiple(Vec<messages_api::MessageContent>), }
impl Default for Content {
fn default() -> Self {
Content::Text(String::default())
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct Attachment {
#[serde(skip_serializing_if = "Option::is_none")]
pub file_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tools: Option<Vec<attachment::Tool>>,
}
pub mod attachment {
use super::*;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum Tool {
CodeInterpreterTool(assistants_api::CodeInterpreterTool),
FileSearch(assistants_api::FileSearchTool),
}
impl Default for Tool {
fn default() -> Self {
Tool::CodeInterpreterTool(assistants_api::CodeInterpreterTool::default())
}
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
#[serde(untagged, rename_all = "snake_case")]
pub enum Role {
#[default]
User,
Assistant,
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct TruncationStrategy {
#[serde(rename = "type")]
pub kind: truncation_strategy::Type,
#[serde(skip_serializing_if = "Option::is_none")]
last_messages: Option<u32>,
}
pub mod truncation_strategy {
use super::*;
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum Type {
#[default]
Auto,
LastMessages,
}
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct RunCreateAndStreamParams {
pub assistant_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub additional_instructions: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub additional_messages: Option<Vec<run_create_and_stream_params::AdditionalMessage>>,
#[serde(skip_serializing_if = "Option::is_none")]
instructions: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
max_completion_tokens: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
max_prompt_tokens: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
metadata: Option<Value>,
pub model: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub response_format: Option<threads_api::AssistantResponseFormatOption>,
#[serde(skip_serializing_if = "Option::is_none")]
pub temperature: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_choice: Option<threads_api::AssistantToolChoiceOption>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tools: Option<Vec<assistants_api::AssistantTool>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub top_p: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub truncation_strategy: Option<run_create_and_stream_params::TruncationStrategy>,
}
pub mod run_create_and_stream_params {
use super::*;
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct AdditionalMessage {
pub content: additional_message::Content,
pub role: additional_message::Role,
#[serde(skip_serializing_if = "Option::is_none")]
pub attachments: Option<Vec<additional_message::Attachment>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<Value>,
}
pub mod additional_message {
use super::*;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum Content {
Text(String),
Multiple(Vec<messages_api::MessageContent>), }
impl Default for Content {
fn default() -> Self {
Content::Text(String::default())
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub enum Role {
#[default]
User,
Assistant,
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct Attachment {
#[serde(skip_serializing_if = "Option::is_none")]
pub file_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tools: Option<Vec<attachment::Tool>>,
}
pub mod attachment {
use super::*;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum Tool {
CodeInterpreterTool(assistants_api::CodeInterpreterTool),
FileSearch(assistants_api::FileSearchTool),
}
impl Default for Tool {
fn default() -> Self {
Tool::CodeInterpreterTool(assistants_api::CodeInterpreterTool::default())
}
}
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct TruncationStrategy {
#[serde(rename = "type")]
pub kind: truncation_strategy::Type,
#[serde(skip_serializing_if = "Option::is_none")]
pub last_messages: Option<u32>,
}
pub mod truncation_strategy {
use super::*;
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum Type {
#[default]
Auto,
LastMessages,
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub enum Role {
#[default]
User,
Assistant,
}
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct RunStreamParams {
pub assistant_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub additional_instructions: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub additional_messages: Option<Vec<run_stream_params::AdditionalMessage>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub instructions: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_completion_tokens: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_prompt_tokens: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<Value>,
pub model: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub response_format: Option<threads_api::AssistantResponseFormatOption>,
#[serde(skip_serializing_if = "Option::is_none")]
pub temperature: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_choice: Option<threads_api::AssistantToolChoiceOption>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tools: Option<Vec<assistants_api::AssistantTool>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub top_p: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub truncation_strategy: Option<run_stream_params::TruncationStrategy>,
}
pub mod run_stream_params {
use super::*;
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct AdditionalMessage {
pub content: additional_message::Content,
pub role: additional_message::Role,
#[serde(skip_serializing_if = "Option::is_none")]
pub attachments: Option<Vec<additional_message::Attachment>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<Value>,
}
pub mod additional_message {
use super::*;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum Content {
Text(String),
Multiple(Vec<messages_api::MessageContent>), }
impl Default for Content {
fn default() -> Self {
Content::Text(String::default())
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct Attachment {
#[serde(skip_serializing_if = "Option::is_none")]
file_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
tools: Option<Vec<attachment::Tool>>,
}
pub mod attachment {
use super::*;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum Tool {
CodeInterpreterTool(assistants_api::CodeInterpreterTool),
FileSearch(assistants_api::FileSearchTool),
}
impl Default for Tool {
fn default() -> Self {
Tool::CodeInterpreterTool(assistants_api::CodeInterpreterTool::default())
}
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub enum Role {
#[default]
User,
Assistant,
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct TruncationStrategy {
#[serde(rename = "type")]
pub kind: truncation_strategy::Type,
#[serde(skip_serializing_if = "Option::is_none")]
last_messages: Option<u32>,
}
pub mod truncation_strategy {
use super::*;
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum Type {
#[default]
Auto,
LastMessages,
}
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct RunSubmitToolOutputsParams {
pub tool_outputs: Vec<run_submit_tool_outputs_params::ToolOutput>,
#[serde(skip_serializing_if = "Option::is_none")]
pub stream: Option<bool>,
}
pub mod run_submit_tool_outputs_params {
use super::*;
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct ToolOutput {
pub output: Option<String>,
pub tool_call_id: Option<String>,
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct RunSubmitToolOutputsAndPollParams {
pub tool_outputs: Vec<run_submit_tool_outputs_and_poll_params::ToolOutput>,
}
pub mod run_submit_tool_outputs_and_poll_params {
use super::*;
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct ToolOutput {
#[serde(skip_serializing_if = "Option::is_none")]
pub output: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_call_id: Option<String>,
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct RunSubmitToolOutputsStreamParams {
pub tool_outputs: Vec<run_submit_tool_outputs_stream_params::ToolOutput>,
}
pub mod run_submit_tool_outputs_stream_params {
use super::*;
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct ToolOutput {
#[serde(skip_serializing_if = "Option::is_none")]
pub output: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_call_id: Option<String>,
}
}