ceylon_runtime/core/
agent.rs1use crate::core::error::Result;
2use crate::core::message::Message;
3use crate::core::request_queue::RequestQueue;
4use async_trait::async_trait;
5use std::sync::Arc;
6
7#[async_trait]
8pub trait Agent: Send + Sync {
9 fn name(&self) -> String;
10 async fn on_start(&mut self, _ctx: &mut AgentContext) -> Result<()> {
11 Ok(())
12 }
13 async fn on_message(&mut self, _msg: Message, _ctx: &mut AgentContext) -> Result<()> {
14 Ok(())
16 }
17
18 async fn on_generic_message(
21 &mut self,
22 msg: crate::core::message::GenericMessage,
23 _ctx: &mut AgentContext,
24 ) -> Result<crate::core::message::GenericResponse> {
25 Ok(crate::core::message::GenericResponse::new(msg.content))
27 }
28 async fn on_stop(&mut self, _ctx: &mut AgentContext) -> Result<()> {
29 Ok(())
30 }
31
32 fn tool_invoker(&self) -> Option<&crate::core::action::ToolInvoker> {
34 None }
36
37 fn tool_invoker_mut(&mut self) -> Option<&mut crate::core::action::ToolInvoker> {
39 None
40 }
41}
42
43pub struct AgentContext {
44 pub mesh_name: String,
45 request_queue: Option<Arc<RequestQueue>>,
46}
47
48impl AgentContext {
49 pub fn new(mesh_name: String, request_queue: Option<Arc<RequestQueue>>) -> Self {
51 Self {
52 mesh_name,
53 request_queue,
54 }
55 }
56
57 pub fn report_result(&self, request_id: &str, response: String) {
59 if let Some(queue) = &self.request_queue {
60 queue.complete(request_id, response);
61 }
62 }
63
64 pub fn has_request_queue(&self) -> bool {
66 self.request_queue.is_some()
67 }
68}