use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use twox_hash::XxHash3_128;
#[derive(
Clone,
Debug,
PartialEq,
Serialize,
Deserialize,
JsonSchema,
arbitrary::Arbitrary,
)]
#[schemars(rename = "agent.script.AgentBase")]
pub struct AgentBase {
pub upstream: super::Upstream,
pub output_mode: super::OutputMode,
#[serde(flatten)]
#[schemars(schema_with = "crate::flatten_schema::<super::Script>")]
pub script: super::Script,
#[serde(skip_serializing_if = "Option::is_none")]
#[schemars(extend("omitempty" = true))]
pub mcp_servers: Option<super::super::McpServers>,
#[serde(skip_serializing_if = "Option::is_none")]
#[schemars(extend("omitempty" = true))]
pub laboratories: Option<super::super::Laboratories>,
#[serde(skip_serializing_if = "Option::is_none")]
#[schemars(extend("omitempty" = true))]
pub client_objectiveai_mcp: Option<super::super::ClientObjectiveaiMcp>,
}
impl AgentBase {
pub fn prepare(&mut self) {
self.mcp_servers = match self.mcp_servers.take() {
Some(mcp_servers) => {
super::super::mcp::mcp_servers::prepare(mcp_servers)
}
None => None,
};
self.laboratories = match self.laboratories.take() {
Some(laboratories) => {
super::super::laboratory::laboratories::prepare(laboratories)
}
None => None,
};
self.client_objectiveai_mcp = match self.client_objectiveai_mcp.take() {
Some(cm) => super::super::client_objectiveai_mcp::prepare(cm),
None => None,
};
}
pub fn validate(&self) -> Result<(), String> {
self.script.validate()?;
if let Some(mcp_servers) = &self.mcp_servers {
super::super::mcp::mcp_servers::validate(mcp_servers)?;
}
if let Some(laboratories) = &self.laboratories {
super::super::laboratory::laboratories::validate(laboratories)?;
}
if let Some(cm) = &self.client_objectiveai_mcp {
super::super::client_objectiveai_mcp::validate(cm)?;
}
Ok(())
}
pub fn merged_messages(
&self,
messages: Vec<super::super::completions::message::Message>,
) -> Vec<super::super::completions::message::Message> {
messages
}
pub fn id(&self) -> String {
let mut hasher = XxHash3_128::with_seed(0);
hasher.write(serde_json::to_string(self).unwrap().as_bytes());
format!("{:0>22}", base62::encode(hasher.finish_128()))
}
pub const fn model() -> &'static str {
"script"
}
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema)]
#[schemars(rename = "agent.script.Agent")]
pub struct Agent {
pub id: String,
#[serde(flatten)]
pub base: AgentBase,
}
impl TryFrom<AgentBase> for Agent {
type Error = String;
fn try_from(mut base: AgentBase) -> Result<Self, Self::Error> {
base.prepare();
base.validate()?;
let id = base.id();
Ok(Agent { id, base })
}
}