unia/
client.rs

1//! Core client trait and error types.
2
3use 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/// Errors that can occur during client operations.
12#[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/// Main client trait for LLM providers.
31#[async_trait]
32pub trait Client: Send + Sync {
33    /// Provider-specific model options type.
34    type ModelProvider: Send + Sync;
35
36    /// Send a request to the LLM provider.
37    async fn request(
38        &self,
39        messages: Vec<Message>,
40        tools: Vec<Tool>,
41    ) -> Result<Response, ClientError>;
42
43    /// Get reference to the model options.
44    fn model_options(&self) -> &ModelOptions<Self::ModelProvider>;
45
46    /// Get reference to the transport options.
47    fn transport_options(&self) -> &TransportOptions;
48}
49
50/// Extension trait for streaming support.
51#[async_trait]
52pub trait StreamingClient: Client {
53    /// Send a streaming request to the LLM provider.
54    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}