use std::time::Duration;
use basis::{Effort, SystemPrompt};
use crate::{approve::Approve, handle::TaskHandle};
pub const DEFAULT_DEADLINE: Duration = Duration::from_secs(30 * 60);
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub enum Continuation {
#[default]
New,
Latest,
Named(TaskHandle),
}
#[derive(Debug, Clone, PartialEq)]
pub struct RunSpec {
pub(crate) prompt: String,
pub(crate) provider: Option<String>,
pub(crate) base_url: Option<String>,
pub(crate) model: Option<String>,
pub(crate) shell: bool,
pub(crate) system_prompt: Option<SystemPrompt>,
pub(crate) effort: Option<Effort>,
pub(crate) approve: Approve,
pub(crate) deadline: Option<Duration>,
pub(crate) tool_budget: Option<usize>,
pub(crate) token_budget: Option<u64>,
pub(crate) detached: bool,
pub(crate) continuation: Continuation,
}
impl RunSpec {
pub fn new(prompt: impl Into<String>) -> Self {
Self {
prompt: prompt.into(),
provider: None,
base_url: None,
model: None,
shell: true,
system_prompt: None,
effort: None,
approve: Approve::default(),
deadline: None,
tool_budget: None,
token_budget: None,
detached: false,
continuation: Continuation::default(),
}
}
pub fn with_provider(self, provider: impl Into<String>) -> Self {
Self {
provider: Some(provider.into()),
..self
}
}
pub fn with_base_url(self, base_url: impl Into<String>) -> Self {
Self {
base_url: Some(base_url.into()),
..self
}
}
pub fn with_model(self, model: impl Into<String>) -> Self {
Self {
model: Some(model.into()),
..self
}
}
pub fn without_shell(self) -> Self {
Self {
shell: false,
..self
}
}
pub fn with_system_prompt(self, system_prompt: SystemPrompt) -> Self {
Self {
system_prompt: Some(system_prompt),
..self
}
}
pub fn with_effort(self, effort: Effort) -> Self {
Self {
effort: Some(effort),
..self
}
}
pub fn with_approve(self, approve: Approve) -> Self {
Self { approve, ..self }
}
pub fn with_deadline(self, deadline: Duration) -> Self {
Self {
deadline: Some(deadline),
..self
}
}
pub fn with_tool_budget(self, tool_budget: usize) -> Self {
Self {
tool_budget: Some(tool_budget),
..self
}
}
pub fn with_token_budget(self, token_budget: u64) -> Self {
Self {
token_budget: Some(token_budget),
..self
}
}
pub fn detached(self) -> Self {
Self {
detached: true,
..self
}
}
pub fn continuing(self, continuation: Continuation) -> Self {
Self {
continuation,
..self
}
}
}