use async_trait::async_trait;
use std::sync::Arc;
use super::{Orchestrator, RunContext};
use crate::task::AgentTask;
use crate::AgentError;
pub struct TaskAdapter {
inner: Arc<dyn Orchestrator<Input = String, Output = String>>,
}
impl TaskAdapter {
pub fn new(inner: Arc<dyn Orchestrator<Input = String, Output = String>>) -> Self {
Self { inner }
}
}
#[async_trait]
impl Orchestrator for TaskAdapter {
type Input = AgentTask;
type Output = String;
async fn run_with_context(
&self,
task: Self::Input,
ctx: &RunContext,
) -> Result<Self::Output, AgentError> {
log::debug!(
target: "lc_agents::orchestrator",
"TaskAdapter dispatch objective='{}' trace_id = {}",
task.objective,
ctx.trace_id
);
self.inner.run_with_context(task.objective, ctx).await
}
}
pub fn task_adapter(
inner: Arc<dyn Orchestrator<Input = String, Output = String>>,
) -> Arc<dyn Orchestrator<Input = AgentTask, Output = String>> {
Arc::new(TaskAdapter::new(inner))
}