use std::sync::Arc;
use agent_base::{
AgentBuilder, AgentResult, AgentRuntime, ReasoningEffort, RunOutcome, RuntimeEvent, SafetyConfig, SessionId,
};
use anyhow::Result;
use crate::agent::builder::base_agent_builder;
#[derive(Clone)]
pub struct PhiAgentConfig {
pub model: String,
pub enable_thinking: bool,
pub thinking_budget: Option<u64>,
pub thinking_effort: ReasoningEffort,
pub safety: SafetyConfig,
pub max_turns: Option<u32>,
}
#[derive(Clone)]
pub struct PhiAgent {
runtime: AgentRuntime,
pub config: PhiAgentConfig,
}
impl PhiAgent {
pub fn builder(llm_client: Arc<dyn agent_base::LlmClient>, system_prompt: String) -> AgentBuilder {
base_agent_builder(llm_client).system_prompt(system_prompt)
}
pub fn build(builder: AgentBuilder, config: PhiAgentConfig) -> Result<Self> {
let runtime = builder.build()?;
Ok(Self { runtime, config })
}
pub async fn create_session(&self) -> SessionId {
self.runtime.create_session().await
}
pub async fn run_turn<F>(&self, session_id: SessionId, query: &str, on_event: F) -> AgentResult<RunOutcome>
where
F: FnMut(RuntimeEvent) -> AgentResult<()> + Send,
{
self.runtime.run_turn(session_id, query, on_event).await
}
pub fn cancel(&self) {
self.runtime.cancel();
}
pub fn is_cancelled(&self) -> bool {
self.runtime.is_cancelled()
}
pub async fn set_reasoning_effort(&self, effort: ReasoningEffort) {
self.runtime.set_reasoning_effort(effort).await;
}
pub fn runtime(&self) -> &AgentRuntime {
&self.runtime
}
pub async fn list_tools(&self) -> Vec<agent_base::ToolMetadata> {
let tools = self.runtime.tools_mut();
let registry = tools.read().await;
registry.metadatas()
}
}