1pub mod anthropic;
7mod error;
8pub mod factory;
9pub mod http;
10pub mod openai;
11pub mod structured;
12mod token_estimation;
13mod types;
14pub mod zhipu;
15
16pub use anthropic::AnthropicClient;
18pub(crate) use error::non_retryable_llm_error_message;
19pub use error::NonRetryableLlmError;
20pub use factory::{create_client_with_config, LlmConfig};
21pub use http::{
22 clear_http_metrics_callback, default_http_client, set_http_metrics_callback, HttpClient,
23 HttpMetricsCallback, HttpMetricsRecord, HttpResponse, StreamingHttpResponse,
24};
25pub use openai::OpenAiClient;
26pub(crate) use token_estimation::{estimate_message_tokens, estimate_prompt_tokens};
27pub use types::*;
28pub use zhipu::ZhipuClient;
29
30use anyhow::Result;
31use async_trait::async_trait;
32use tokio::sync::mpsc;
33use tokio_util::sync::CancellationToken;
34
35#[async_trait]
37pub trait LlmClient: Send + Sync {
38 fn fork_for_session(&self, _session_id: &str) -> Option<std::sync::Arc<dyn LlmClient>> {
45 None
46 }
47
48 async fn complete(
50 &self,
51 messages: &[Message],
52 system: Option<&str>,
53 tools: &[ToolDefinition],
54 ) -> Result<LlmResponse>;
55
56 async fn complete_streaming(
60 &self,
61 messages: &[Message],
62 system: Option<&str>,
63 tools: &[ToolDefinition],
64 cancel_token: CancellationToken,
65 ) -> Result<mpsc::Receiver<StreamEvent>>;
66
67 fn native_structured_support(&self) -> structured::NativeStructuredSupport {
72 structured::NativeStructuredSupport::None
73 }
74
75 async fn complete_structured(
82 &self,
83 messages: &[Message],
84 system: Option<&str>,
85 tools: &[ToolDefinition],
86 _directive: &structured::StructuredDirective,
87 ) -> Result<LlmResponse> {
88 self.complete(messages, system, tools).await
89 }
90
91 async fn complete_streaming_structured(
94 &self,
95 messages: &[Message],
96 system: Option<&str>,
97 tools: &[ToolDefinition],
98 _directive: &structured::StructuredDirective,
99 cancel_token: CancellationToken,
100 ) -> Result<mpsc::Receiver<StreamEvent>> {
101 self.complete_streaming(messages, system, tools, cancel_token)
102 .await
103 }
104}
105
106#[cfg(test)]
108#[path = "tests.rs"]
109mod tests_file;