use crate::{
message::Message,
node::{NodeContext, NodeErr, NodeOut, NodeType},
};
use async_trait::async_trait;
use schemars::{JsonSchema, Schema, schema_for};
use serde::{Deserialize, Serialize};
use super::ollama::OllamaAgent;
#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq)]
#[serde(untagged)]
pub enum BuiltInAgent {
#[serde(rename = "ollama")]
Ollama(OllamaAgent),
}
impl BuiltInAgent {
pub fn agent_name(&self) -> String {
match self {
BuiltInAgent::Ollama(inner) => inner.type_name(),
}
}
pub fn boxed_clone(&self) -> BuiltInAgent {
self.clone()
}
}
#[typetag::serde]
#[async_trait]
impl NodeType for BuiltInAgent {
fn type_name(&self) -> String {
self.agent_name().to_string()
}
fn schema(&self) -> Schema {
schema_for!(BuiltInAgent)
}
async fn process(&self, input: Message, context: &mut NodeContext) -> Result<NodeOut, NodeErr> {
match self {
BuiltInAgent::Ollama(inner) => inner.process(input, context).await,
}
}
fn clone_box(&self) -> Box<dyn NodeType> {
Box::new(self.clone())
}
}