pub use crate::workers::{
JobManifest, NatsNsedWorker, NatsScratchpadStore, UserToolHandlerFactory, WorkerConfig,
WorkerHook,
};
use crate::agents::ChatCapable;
use crate::agents::{NatsUserToolHandlerFactory, ProposerEvaluatorAgent};
use crate::telemetry::TelemetryEmitterMux;
use anyhow::Result;
use std::sync::Arc;
pub trait NatsNsedWorkerExt {
fn from_agent(
agent: ProposerEvaluatorAgent,
config: WorkerConfig,
telemetry: Option<TelemetryEmitterMux>,
) -> impl std::future::Future<Output = Result<NatsNsedWorker>> + Send;
}
impl NatsNsedWorkerExt for NatsNsedWorker {
async fn from_agent(
agent: ProposerEvaluatorAgent,
config: WorkerConfig,
telemetry: Option<TelemetryEmitterMux>,
) -> Result<NatsNsedWorker> {
let agent_config = agent.config.clone();
let chat_agent: Arc<dyn ChatCapable> = Arc::new(agent.clone());
let worker = NatsNsedWorker::new(agent, agent_config, config, telemetry)
.await?
.with_user_tool_factory(Arc::new(NatsUserToolHandlerFactory))
.with_chat(chat_agent);
Ok(worker)
}
}
pub trait NatsNsedWorkerStatusExt {
fn with_status_server(self, port: u16) -> Self;
}
impl NatsNsedWorkerStatusExt for NatsNsedWorker {
fn with_status_server(self, _port: u16) -> Self {
let worker = self.with_status(_port);
#[cfg(feature = "status-server")]
{
if let Some(status) = worker.status().cloned() {
let chat = worker.chat_agent().cloned();
let config = worker.agent_config().clone();
let api_error_telemetry = worker.telemetry().cloned().map(|emitter| {
std::sync::Arc::new(crate::api_error_middleware::ApiErrorTelemetry::new(
emitter,
worker.agent_id(),
))
});
tokio::spawn(crate::status::server::StatusServer::run(
_port,
status,
chat,
config,
api_error_telemetry,
));
}
}
worker
}
}