use crate::AgentError;
use llm_sdk::{boxed_stream::BoxedStream, Message, ModelResponse, Part, PartialModelResponse};
use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AgentRequest<TCtx> {
pub input: Vec<AgentItem>,
pub context: TCtx,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct AgentResponse {
pub output: Vec<AgentItem>,
pub content: Vec<Part>,
}
impl AgentResponse {
#[must_use]
pub fn text(&self) -> String {
self.content
.iter()
.filter_map(|part| match part {
Part::Text(part) => Some(part.text.as_str()),
_ => None,
})
.collect::<Vec<_>>()
.join(" ")
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "type", rename_all = "kebab-case")]
pub enum AgentItem {
Message(Message),
Model(ModelResponse),
Tool(AgentItemTool),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct AgentItemTool {
pub tool_call_id: String,
pub tool_name: String,
pub input: Value,
pub output: Vec<Part>,
pub is_error: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "event", rename_all = "kebab-case")]
pub enum AgentStreamEvent {
Partial(PartialModelResponse),
Item(AgentStreamItemEvent),
Response(AgentResponse),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "kebab-case")]
pub struct AgentStreamItemEvent {
pub index: usize,
pub item: AgentItem,
}
pub type AgentStream = BoxedStream<'static, Result<AgentStreamEvent, AgentError>>;