use std::sync::Arc;
use anyhow::Result;
use agent_base::{AgentBuilder, AgentRuntime, AgentResult, ReasoningEffort, RunOutcome, RuntimeEvent, SafetyConfig, SessionId};
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,
}
#[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;
}
}