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};
use crate::resources::beta::threads::runs::steps as steps_api;
use crate::pagination::{CursorPage, CursorPageParams, CursorPageResponse, Page};
#[derive(Debug, Clone)]
pub struct Steps {
pub client: Option<APIResource>,
}
impl Steps {
pub async fn retrieve(
&self,
thread_id: &str,
run_id: &str,
step_id: &str,
options: Option<core::RequestOptions<()>>,
) -> Result<RunStep, 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}/steps/{step_id}"),
Some(core::RequestOptions {
headers: Some(headers),
..options.unwrap_or_default()
}),
).await
}
pub async fn list(
&self,
thread_id: &str,
run_id: &str,
query: StepListParams,
_options: Option<core::RequestOptions<StepListParams>>,
) -> Result<CursorPage<StepListParams, RunStep>, Box<dyn Error>> {
let mut headers: Headers = HashMap::new();
headers.insert("OpenAI-Beta".to_string(), Some("assistants=v2".to_string()));
let page_constructor = |
client: Rc<RefCell<APIClient>>,
body: CursorPageResponse<RunStep>,
options: FinalRequestOptions<StepListParams>,
| {
CursorPage::new(client, body, options)
};
self.client.as_ref().unwrap().borrow().get_api_list(
&format!("/threads/{thread_id}/runs/{run_id}/steps"),
page_constructor,
Some(core::RequestOptions::<StepListParams> {
query: Some(query),
..Default::default()
}),
).await
}
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct CodeInterpreterLogs {
pub index: u32,
#[serde(rename = "type")]
pub kind: code_interpreter_logs::Type,
#[serde(skip_serializing_if = "Option::is_none")]
pub logs: Option<String>,
}
pub mod code_interpreter_logs {
use super::*;
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum Type {
#[default]
Logs,
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct CodeInterpreterOutputImage {
pub index: u32,
#[serde(rename = "type")]
pub kind: code_interpreter_output_image::Type,
#[serde(skip_serializing_if = "Option::is_none")]
pub image: Option<code_interpreter_output_image::Image>,
}
pub mod code_interpreter_output_image {
use super::*;
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum Type {
#[default]
Image,
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct Image {
#[serde(skip_serializing_if = "Option::is_none")]
file_id: Option<String>,
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct CodeInterpreterToolCall {
pub id: String,
pub code_interpreter: code_interpreter_tool_call::CodeInterpreter,
#[serde(rename = "type")]
pub kind: code_interpreter_tool_call::Type,
}
pub mod code_interpreter_tool_call {
use super::*;
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct CodeInterpreter {
pub input: String,
pub outputs: Vec<Output>,
}
pub mod code_interpreter {
use super::*;
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct Logs {
pub logs: String,
#[serde(rename = "type")]
pub kind: logs::Type,
}
pub mod logs {
use super::*;
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum Type {
#[default]
Logs,
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct Image {
pub image: image::Image,
#[serde(rename = "type")]
pub kind: image::Type,
}
pub mod image {
use super::*;
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct Image {
file_id: String,
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum Type {
#[default]
Image,
}
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum Type {
#[default]
CodeInterpreter,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged, rename_all = "snake_case")]
pub enum Output {
Logs(code_interpreter::Logs),
Image(code_interpreter::Image),
}
impl Default for Output {
fn default() -> Self {
Output::Logs(Default::default())
}
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct CodeInterpreterToolCallDelta {
pub index: u32,
#[serde(rename = "type")]
pub kind: code_interpreter_tool_call_delta::Type,
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub code_interpreter: Option<code_interpreter_tool_call_delta::CodeInterpreter>,
}
pub mod code_interpreter_tool_call_delta {
use super::*;
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct CodeInterpreter {
#[serde(skip_serializing_if = "Option::is_none")]
pub input: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub outputs: Option<Vec<code_interpreter::Output>>,
}
pub mod code_interpreter {
use super::*;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged, rename_all = "snake_case")]
pub enum Output {
CodeInterpreterLogs(CodeInterpreterLogs),
CodeInterpreterOutputImage(CodeInterpreterOutputImage),
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum Type {
#[default]
CodeInterpreter,
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct FileSearchToolCall {
pub id: String,
pub file_search: Value,
#[serde(rename = "type")]
pub kind: file_search_tool_call::Type,
}
pub mod file_search_tool_call {
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 struct FileSearchToolCallDelta {
pub file_search: Value,
pub index: u32,
#[serde(rename = "type")]
pub kind: file_search_tool_call_delta::Type,
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
}
pub mod file_search_tool_call_delta {
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 struct FunctionToolCall {
pub id: String,
pub function: function_tool_call::Function,
#[serde(rename = "type")]
pub kind: function_tool_call::Type,
}
pub mod function_tool_call {
use super::*;
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct Function {
arguments: String,
name: String,
output: Option<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 FunctionToolCallDelta {
pub index: u32,
#[serde(rename = "type")]
pub kind: function_tool_call_delta::Type,
#[serde(rename = "type")]
pub id: Option<String>,
#[serde(rename = "type")]
pub function: Option<function_tool_call_delta::Function>,
}
pub mod function_tool_call_delta {
use super::*;
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct Function {
#[serde(skip_serializing_if = "Option::is_none")]
pub arguments: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub output: Option<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 MessageCreationStepDetails {
pub message_creation: message_creation_step_details::MessageCreation,
#[serde(rename = "type")]
pub kind: message_creation_step_details::Type,
}
pub mod message_creation_step_details {
use super::*;
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct MessageCreation {
message_id: String,
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum Type {
#[default]
MessageCreation,
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct RunStep {
pub id: String,
pub assistant_id: String,
pub cancelled_at: Option<u64>,
pub completed_at: Option<u64>,
pub created_at: u64,
pub expired_at: Option<u64>,
pub failed_at: Option<u64>,
pub last_error: Option<run_step::LastError>,
pub metadata: Option<Value>,
pub object: run_step::Object,
pub run_id: String,
pub status: run_step::Status,
pub step_details: run_step::StepDetails,
pub thread_id: String,
#[serde(rename = "type")]
pub kind: run_step::Type,
pub usage: Option<run_step::Usage>,
}
pub mod run_step {
use super::*;
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct LastError {
pub code: last_error::Code,
pub message: String,
}
pub mod last_error {
use serde::{Deserialize, Serialize};
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
#[serde(untagged, rename_all = "snake_case")]
pub enum Code {
#[default]
ServerError,
RateLimitExceeded,
}
}
#[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)]
#[serde(untagged, rename_all = "snake_case")]
pub enum Status {
#[default]
InProgress,
Cancelled,
Failed,
Completed,
Expired,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged, rename_all = "snake_case")]
pub enum StepDetails {
MessageCreationStepDetails(MessageCreationStepDetails),
ToolCallsStepDetails(ToolCallsStepDetails),
}
impl Default for StepDetails {
fn default() -> Self {
StepDetails::MessageCreationStepDetails(Default::default())
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum Type {
#[default]
MessageCreation,
ToolCalls,
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
#[serde(untagged, rename_all = "snake_case")]
pub enum Object {
#[default]
#[serde(rename = "thread.run.step")]
ThreadRunStep,
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct RunStepDelta {
#[serde(skip_serializing_if = "Option::is_none")]
pub step_details: Option<run_step_delta::StepDetails>,
}
pub mod run_step_delta {
use super::*;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged, rename_all = "snake_case")]
pub enum StepDetails {
RunStepDeltaMessageDelta(RunStepDeltaMessageDelta),
ToolCallDeltaObject(ToolCallDeltaObject),
}
impl Default for StepDetails {
fn default() -> Self {
StepDetails::RunStepDeltaMessageDelta(Default::default())
}
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct RunStepDeltaEvent {
pub id: String,
pub delta: RunStepDelta,
pub object: run_step_delta_event::Object,
}
pub mod run_step_delta_event {
use super::*;
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
#[serde(untagged, rename_all = "snake_case")]
pub enum Object {
#[default]
#[serde(rename = "thread.run.step.delta")]
ThreadRunStepDelta,
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct RunStepDeltaMessageDelta {
pub kind: run_step_delta_message_delta::Type,
#[serde(skip_serializing_if = "Option::is_none")]
pub message_creation: Option<run_step_delta_message_delta::MessageCreation>,
}
pub mod run_step_delta_message_delta {
use super::*;
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct MessageCreation {
#[serde(skip_serializing_if = "Option::is_none")]
pub message_id: Option<String>,
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum Type {
#[default]
MessageCreation,
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged, rename_all = "snake_case")]
pub enum ToolCall {
CodeInterpreterToolCall(CodeInterpreterToolCall),
FileSearchToolCall(FileSearchToolCall),
FunctionToolCall(FunctionToolCall),
}
impl Default for ToolCall {
fn default() -> Self {
ToolCall::CodeInterpreterToolCall(Default::default())
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged, rename_all = "snake_case")]
pub enum ToolCallDelta {
CodeInterpreterToolCallDelta(CodeInterpreterToolCallDelta),
FileSearchToolCallDelta(FileSearchToolCallDelta),
FunctionToolCallDelta(FunctionToolCallDelta),
}
impl Default for ToolCallDelta {
fn default() -> Self {
ToolCallDelta::CodeInterpreterToolCallDelta(Default::default())
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct ToolCallDeltaObject {
#[serde(rename = "type")]
pub kind: tool_call_delta_object::Type,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_calls: Option<Vec<ToolCallDelta>>,
}
pub mod tool_call_delta_object {
use super::*;
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum Type {
#[default]
ToolCalls,
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct ToolCallsStepDetails {
pub tool_calls: Vec<ToolCall>,
#[serde(rename = "type")]
pub kind: tool_calls_step_details::Type,
}
pub mod tool_calls_step_details {
use super::*;
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum Type {
#[default]
ToolCalls,
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct StepListParams {
pub cursor_page: CursorPageParams,
#[serde(skip_serializing_if = "Option::is_none")]
pub before: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub order: Option<step_list_params::Order>,
}
pub mod step_list_params {
use super::*;
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
#[serde(untagged, rename_all = "snake_case")]
pub enum Order {
#[default]
Asc,
Desc,
}
}