1use crate::types::{BusMessage, LlmRequest, LlmResponse, ToolCall, ToolDef, ToolResult};
2use anyhow::Result;
3use serde_json::Value;
4
5#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
7pub struct MemoryHit {
8 pub key: String,
9 pub value: Value,
10 pub score: f32,
11}
12
13#[async_trait::async_trait]
15pub trait LlmProvider: Send + Sync {
16 async fn generate(&self, req: LlmRequest) -> Result<LlmResponse>;
18
19 fn name(&self) -> &str;
21
22 fn supports_model(&self, model: &str) -> bool;
24}
25
26#[async_trait::async_trait]
28pub trait Bus: Send + Sync {
29 async fn publish(&self, msg: BusMessage) -> Result<()>;
31
32 async fn subscribe(
34 &self,
35 topic: &str,
36 handler: Box<dyn Fn(BusMessage) -> std::pin::Pin<Box<dyn std::future::Future<Output = ()> + Send>> + Send + Sync>,
37 ) -> Result<()>;
38
39 async fn start(&self) -> Result<()>;
41
42 async fn stop(&self) -> Result<()>;
44}
45
46#[async_trait::async_trait]
48pub trait MemoryStore: Send + Sync {
49 async fn store(&self, namespace: &str, key: &str, value: Value) -> Result<()>;
51
52 async fn retrieve(&self, namespace: &str, key: &str) -> Result<Option<Value>>;
54
55 async fn search(&self, namespace: &str, query: &str, top_k: usize) -> Result<Vec<MemoryHit>>;
57
58 async fn delete(&self, namespace: &str, key: &str) -> Result<()>;
60}
61
62#[async_trait::async_trait]
64pub trait ToolExecutor: Send + Sync {
65 async fn execute(&self, call: ToolCall) -> Result<ToolResult>;
67
68 fn list_tools(&self) -> Vec<ToolDef>;
70}