use std::sync::Arc;
use serde::{Deserialize, Serialize};
use crate::client::{Error, GeminiClient};
use crate::interactions::environment::EnvironmentConfig;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct SavedAgent {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub base_agent: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub system_instruction: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub base_environment: Option<EnvironmentConfig>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub created: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub updated: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct CreateAgentRequest {
pub id: String,
pub base_agent: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub system_instruction: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub base_environment: Option<EnvironmentConfig>,
}
impl CreateAgentRequest {
pub fn new(id: impl Into<String>, base_agent: impl Into<String>) -> Self {
Self {
id: id.into(),
base_agent: base_agent.into(),
system_instruction: None,
base_environment: None,
}
}
pub fn with_system_instruction(mut self, text: impl Into<String>) -> Self {
self.system_instruction = Some(text.into());
self
}
pub fn with_base_environment(mut self, config: EnvironmentConfig) -> Self {
self.base_environment = Some(config);
self
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ListAgentsResponse {
#[serde(default)]
pub agents: Vec<SavedAgent>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub next_page_token: Option<String>,
}
pub struct ManagedAgentBuilder {
client: Arc<GeminiClient>,
request: CreateAgentRequest,
}
impl ManagedAgentBuilder {
pub(crate) fn new(client: Arc<GeminiClient>) -> Self {
Self { client, request: CreateAgentRequest::new("", "") }
}
pub fn id(mut self, id: impl Into<String>) -> Self {
self.request.id = id.into();
self
}
pub fn base_agent(mut self, agent: impl Into<String>) -> Self {
self.request.base_agent = agent.into();
self
}
pub fn system_instruction(mut self, text: impl Into<String>) -> Self {
self.request.system_instruction = Some(text.into());
self
}
pub fn base_environment(mut self, config: EnvironmentConfig) -> Self {
self.request.base_environment = Some(config);
self
}
pub async fn build_and_save(self) -> Result<SavedAgent, Error> {
self.client.create_agent(self.request).await
}
}