use std::cell::RefCell;
use std::collections::HashMap;
use std::error::Error;
use std::rc::Rc;
use serde::{Deserialize, Serialize};
use serde_json::Value;
use crate::resource::{APIResource};
use crate::core::{self, APIClient, FinalRequestOptions, Headers, RequestOptions};
use crate::core::streaming::APIFuture;
use crate::resources::beta::assistants as assistants_api;
use crate::resources::beta::shared;
use crate::resources::beta::threads::messages as messages_api;
use crate::resources::beta::threads as threads_api;
use crate::resources::beta::threads::runs::runs as runs_api;
use crate::resources::beta::threads::runs::steps as steps_api;
use crate::pagination::{Page, CursorPage, CursorPageParams, CursorPageResponse};
#[derive(Debug, Clone)]
pub struct Assistants {
pub client: Option<APIResource>,
}
impl Assistants {
pub fn new() -> Self {
Assistants {
client: None,
}
}
pub fn create(
&self,
body: AssistantCreateParams,
options: Option<RequestOptions<AssistantCreateParams>>,
) -> APIFuture<AssistantCreateParams, Assistant, ()> {
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.clone().unwrap().lock().unwrap().post(
"/assistants",
Some(RequestOptions {
body: Some(body),
headers: Some(headers),
..options.unwrap_or_default()
}),
)
}
pub fn retrieve(
&self,
assistant_id: &str,
options: Option<RequestOptions<()>>,
) -> APIFuture<(), Assistant, ()> {
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, value);
}
}
}
self.client.clone().unwrap().lock().unwrap().get(
&format!("/assistants/{assistant_id}"),
Some(RequestOptions::<()> {
headers: Some(headers),
..Default::default()
}),
)
}
pub fn update(
&self,
assistant_id: &str,
body: AssistantUpdateParams,
options: Option<RequestOptions<AssistantUpdateParams>>,
) -> APIFuture<AssistantUpdateParams, Assistant, ()> {
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, value);
}
}
}
self.client.clone().unwrap().lock().unwrap().post(
&format!("/assistants/{assistant_id}"),
Some(RequestOptions {
body: Some(body),
headers: Some(headers),
..Default::default()
}),
)
}
pub async fn list(
&self,
query: AssistantListParams,
_options: Option<RequestOptions<AssistantListParams>>,
) -> Result<CursorPage<AssistantListParams, Assistant>, Box<dyn Error>> {
let mut headers: Headers = HashMap::new();
headers.insert("OpenAI-Beta".to_string(), Some("assistants=v2".to_string()));
let page_constructor = |
client: APIResource,
body: CursorPageResponse<Assistant>,
options: FinalRequestOptions<AssistantListParams>,
| {
CursorPage::new(client, body, options)
};
self.client.clone().unwrap().lock().unwrap().get_api_list(
"/assistants",
page_constructor,
Some(RequestOptions {
headers: Some(headers),
..Default::default()
}),
).await
}
pub fn del(
&self,
assistant_id: &str,
options: Option<RequestOptions<()>>,
) -> APIFuture<(), AssistantDeleted, ()> {
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, value);
}
}
}
self.client.clone().unwrap().lock().unwrap().delete(
&format!("/assistants/{assistant_id}"),
Some(RequestOptions::<()> {
headers: Some(headers),
..Default::default()
}),
)
}
}
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
pub struct Assistant {
pub id: String,
pub created_at: u64,
pub description: Option<String>,
pub instructions: Option<String>,
pub metadata: Option<Value>,
pub model: String,
pub name: Option<String>,
pub object: assistant::Object,
pub tools: Vec<AssistantTool>,
#[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_resources: Option<assistant::ToolResources>,
#[serde(skip_serializing_if = "Option::is_none")]
pub top_p: Option<f32>,
}
pub mod assistant {
use serde::{Deserialize, Serialize};
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
pub struct ToolResources {
#[serde(skip_serializing_if = "Option::is_none")]
pub code_interpreter: Option<tool_resources::CodeInterpreter>,
#[serde(skip_serializing_if = "Option::is_none")]
pub file_search: Option<tool_resources::FileSearch>,
}
pub mod tool_resources {
use serde::{Deserialize, Serialize};
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
pub struct CodeInterpreter {
#[serde(skip_serializing_if = "Option::is_none")]
pub file_ids: Option<Vec<String>>,
}
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
pub struct FileSearch {
#[serde(skip_serializing_if = "Option::is_none")]
pub vector_store_ids: Option<Vec<String>>,
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum Object {
#[default]
Assistant,
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct AssistantDeleted {
pub id: String,
pub deleted: bool,
pub object: assistant_deleted::Object,
}
pub mod assistant_deleted {
use super::*;
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum Object {
#[default]
#[serde(rename = "assistant.deleted")]
AssistantDeleted,
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum AssistantTool {
CodeInterpreter,
FileSearch(FileSearchTool),
Function(FunctionTool),
}
impl Default for AssistantTool {
fn default() -> Self {
AssistantTool::CodeInterpreter
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct CodeInterpreterTool {
#[serde(rename = "type")]
pub kind: code_interpreter_tool::Type,
}
pub mod code_interpreter_tool {
use super::*;
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
#[serde(untagged, rename_all = "snake_case")]
pub enum Type {
#[default]
CodeInterpreter,
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct FileSearchTool {
#[serde(skip_serializing_if = "Option::is_none")]
file_search: Option<file_search_tool::FileSearch>,
}
pub mod file_search_tool {
use super::*;
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct FileSearch {
#[serde(skip_serializing_if = "Option::is_none")]
pub max_num_results: Option<u32>,
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum Type {
#[default]
FileSearch,
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct FunctionTool {
pub function: shared::FunctionDefinition,
}
pub mod function_tool {
use super::*;
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum Type {
#[default]
Function,
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged, rename_all = "snake_case")]
pub enum MessageStreamEvent {
ThreadMessageCreated(message_stream_event::ThreadMessageCreated),
ThreadMessageInProgress(message_stream_event::ThreadMessageInProgress),
ThreadMessageDelta(message_stream_event::ThreadMessageDelta),
ThreadMessageCompleted(message_stream_event::ThreadMessageCompleted),
ThreadMessageIncomplete(message_stream_event::ThreadMessageIncomplete),
}
impl Default for MessageStreamEvent {
fn default() -> Self {
MessageStreamEvent::ThreadMessageCreated(Default::default())
}
}
pub mod message_stream_event {
use super::*;
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct ThreadMessageCreated {
pub data: messages_api::Message,
pub event: thread_message_created::Event,
}
pub mod thread_message_created {
use super::*;
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
#[serde(untagged, rename_all = "snake_case")]
pub enum Event {
#[default]
#[serde(rename = "thread.message.created")]
ThreadMessageCreated,
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct ThreadMessageInProgress {
pub data: messages_api::Message,
pub event: thread_message_in_progress::Event,
}
pub mod thread_message_in_progress {
use super::*;
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
#[serde(untagged, rename_all = "snake_case")]
pub enum Event {
#[default]
#[serde(rename = "thread.message.in_progress")]
ThreadMessageInProgress,
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct ThreadMessageDelta {
pub data: messages_api::MessageDeltaEvent,
pub event: thread_message_delta::Event,
}
pub mod thread_message_delta {
use super::*;
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
#[serde(untagged, rename_all = "snake_case")]
pub enum Event {
#[default]
#[serde(rename = "thread.message.delta")]
ThreadMessageDelta,
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct ThreadMessageCompleted {
pub data: messages_api::Message,
pub event: thread_message_completed::Event,
}
pub mod thread_message_completed {
use super::*;
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
#[serde(untagged, rename_all = "snake_case")]
pub enum Event {
#[default]
#[serde(rename = "thread.message.completed")]
ThreadMessageCompleted,
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct ThreadMessageIncomplete {
pub data: messages_api::Message,
pub event: thread_message_incomplete::Event,
}
pub mod thread_message_incomplete {
use super::*;
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
#[serde(untagged, rename_all = "snake_case")]
pub enum Event {
#[default]
#[serde(rename = "thread.message.incomplete")]
ThreadMessageIncomplete,
}
}
}
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
pub struct AssistantCreateParams {
pub model: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub instructions: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: 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_resources: Option<assistant_create_params::ToolResources>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tools: Option<Vec<AssistantTool>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub top_p: Option<f32>,
}
pub mod assistant_create_params {
use super::*;
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
pub struct ToolResources {
#[serde(skip_serializing_if = "Option::is_none")]
pub code_interpreter: Option<tool_resources::CodeInterpreter>,
#[serde(skip_serializing_if = "Option::is_none")]
pub file_search: Option<tool_resources::FileSearch>,
}
pub mod tool_resources {
use super::*;
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
pub struct CodeInterpreter {
#[serde(skip_serializing_if = "Option::is_none")]
file_ids: Option<Vec<String>>,
}
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
pub struct FileSearch {
#[serde(skip_serializing_if = "Option::is_none")]
pub vector_store_ids: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
vector_stores: Option<Vec<file_search::VectorStore>>,
}
pub mod file_search {
use super::*;
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
pub struct VectorStore {
#[serde(skip_serializing_if = "Option::is_none")]
pub chunking_strategy: Option<vector_store::ChunkingStrategy>,
#[serde(skip_serializing_if = "Option::is_none")]
pub file_ids: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<Value>,
}
pub mod vector_store {
use super::*;
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum ChunkingStrategy {
#[default]
Auto,
Static {
#[serde(rename = "static")]
detail: vector_store_static::Static,
},
}
pub mod vector_store_static {
use super::*;
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
pub struct Static {
pub chunk_overlap_tokens: u32,
pub max_chunk_size_tokens: u32,
}
}
}
}
}
}
#[derive(Default, Clone, Debug, Deserialize, Serialize)]
pub struct AssistantUpdateParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub instructions: Option<String>,
#[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 name: 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_resources: Option<assistant_update_params::ToolResources>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tools: Option<Vec<AssistantTool>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub top_p: Option<f32>,
}
pub mod assistant_update_params {
use super::*;
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct ToolResources {
#[serde(skip_serializing_if = "Option::is_none")]
pub code_interpreter: Option<tool_resources::CodeInterpreter>,
#[serde(skip_serializing_if = "Option::is_none")]
pub file_search: Option<tool_resources::FileSearch>,
}
pub mod tool_resources {
use serde::{Deserialize, Serialize};
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct CodeInterpreter {
#[serde(skip_serializing_if = "Option::is_none")]
pub file_ids: Option<Vec<String>>,
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct FileSearch {
#[serde(skip_serializing_if = "Option::is_none")]
pub vector_store_ids: Option<Vec<String>>,
}
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct AssistantListParams { pub before: Option<String>,
pub order: Option<assistant_list_params::Order>,
pub limit: Option<u32>,
}
pub mod assistant_list_params {
use super::*;
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
#[serde(untagged, rename_all = "snake_case")]
pub enum Order {
#[default]
Asc,
Desc,
}
}