1use async_trait::async_trait;
4use futures::Stream;
5use thiserror::Error;
6
7use crate::model::{Message, Response};
8use crate::options::{ModelOptions, TransportOptions};
9use rmcp::model::Tool;
10
11#[derive(Error, Debug)]
13pub enum ClientError {
14 #[error("HTTP error: {0}")]
15 Http(#[from] reqwest::Error),
16
17 #[error("JSON parse error: {0}")]
18 Parse(#[from] serde_json::Error),
19
20 #[error("Provider error: {0}")]
21 ProviderError(String),
22
23 #[error("Stream cancelled")]
24 StreamCancelled,
25
26 #[error("Configuration error: {0}")]
27 Config(String),
28}
29
30#[async_trait]
32pub trait Client: Send + Sync {
33 type ModelProvider: Send + Sync;
35
36 async fn request(
38 &self,
39 messages: Vec<Message>,
40 tools: Vec<Tool>,
41 ) -> Result<Response, ClientError>;
42
43 fn model_options(&self) -> &ModelOptions<Self::ModelProvider>;
45
46 fn transport_options(&self) -> &TransportOptions;
48}
49
50#[async_trait]
52pub trait StreamingClient: Client {
53 async fn request_stream(
55 &self,
56 messages: Vec<Message>,
57 tools: Vec<Tool>,
58 ) -> Result<
59 std::pin::Pin<Box<dyn Stream<Item = Result<Response, ClientError>> + Send>>,
60 ClientError,
61 >;
62}