use std::time::Duration;
use serde_json::Value;
#[derive(Clone, Copy, Debug, Default, Eq, Hash, PartialEq)]
pub enum ReasoningEffort {
None,
Minimal,
Low,
Medium,
High,
#[default]
XHigh,
Max,
}
impl ReasoningEffort {
pub const fn as_str(self) -> &'static str {
match self {
Self::None => "none",
Self::Minimal => "minimal",
Self::Low => "low",
Self::Medium => "medium",
Self::High => "high",
Self::XHigh => "xhigh",
Self::Max => "max",
}
}
}
#[derive(Clone, Debug, PartialEq)]
pub struct DynamicTool {
pub name: String,
pub description: String,
pub input_schema: Value,
}
impl DynamicTool {
pub fn new(
name: impl Into<String>,
description: impl Into<String>,
input_schema: Value,
) -> Self {
Self {
name: name.into(),
description: description.into(),
input_schema,
}
}
}
#[derive(Clone, Debug, PartialEq)]
pub struct AgentRequest {
pub input: String,
pub model: String,
pub reasoning_effort: ReasoningEffort,
pub previous_thread_id: Option<String>,
pub tools: Vec<DynamicTool>,
pub ephemeral: bool,
pub timeout: Duration,
}
impl AgentRequest {
pub fn new(input: impl Into<String>, model: impl Into<String>) -> Self {
Self {
input: input.into(),
model: model.into(),
reasoning_effort: ReasoningEffort::XHigh,
previous_thread_id: None,
tools: Vec::new(),
ephemeral: false,
timeout: Duration::from_secs(10 * 60),
}
}
}
#[derive(Clone, Debug, PartialEq)]
pub struct DynamicToolCall {
pub call_id: String,
pub tool: String,
pub arguments: Value,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct ToolResult {
pub success: bool,
pub text: String,
}
impl ToolResult {
pub fn success(text: impl Into<String>) -> Self {
Self {
success: true,
text: text.into(),
}
}
pub fn failure(text: impl Into<String>) -> Self {
Self {
success: false,
text: text.into(),
}
}
}
#[derive(Clone, Debug, Default, Eq, PartialEq)]
pub struct TokenUsage {
pub input_tokens: u64,
pub output_tokens: u64,
pub cached_input_tokens: u64,
pub reasoning_output_tokens: u64,
pub last_input_tokens: Option<u64>,
pub last_output_tokens: Option<u64>,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct CompletedTurn {
pub thread_id: String,
pub turn_id: String,
pub answer: String,
pub usage: Option<TokenUsage>,
}
#[derive(Clone, Debug, PartialEq)]
pub enum AgentEvent {
ProviderInput(String),
ToolCall(DynamicToolCall),
Completed(CompletedTurn),
}