vtcode_llm/
http_client.rs1use reqwest::Client;
7use std::time::Duration;
8
9use vtcode_config::TimeoutsConfig;
10
11pub struct HttpClientFactory;
13
14impl HttpClientFactory {
15 pub fn for_llm(config: &TimeoutsConfig) -> Client {
20 vtcode_commons::http::create_client_with_timeouts(Duration::from_secs(30), Self::llm_timeout(config))
21 }
22
23 pub(crate) fn for_llm_without_redirects(config: &TimeoutsConfig) -> Result<Client, reqwest::Error> {
24 vtcode_commons::http::create_client_without_redirects(Duration::from_secs(30), Self::llm_timeout(config))
25 }
26
27 fn llm_timeout(config: &TimeoutsConfig) -> Duration {
28 let timeout_secs = if config.default_ceiling_seconds > 0 {
29 config.default_ceiling_seconds
30 } else {
31 180 };
33
34 Duration::from_secs(timeout_secs)
35 }
36
37 pub fn for_streaming(config: &TimeoutsConfig) -> Client {
42 let timeout_secs = if config.streaming_ceiling_seconds > 0 {
43 config.streaming_ceiling_seconds
44 } else {
45 600 };
47
48 Client::builder()
49 .timeout(Duration::from_secs(timeout_secs))
50 .connect_timeout(Duration::from_secs(30))
51 .pool_idle_timeout(Some(Duration::from_secs(90)))
52 .pool_max_idle_per_host(1)
53 .build()
54 .unwrap_or_else(|_| Client::new())
55 }
56
57 pub(crate) fn with_timeouts(request_timeout: Duration, connect_timeout: Duration) -> Client {
61 vtcode_commons::http::create_client_with_timeouts(connect_timeout, request_timeout)
62 }
63
64 pub fn default_client() -> Client {
68 vtcode_commons::http::create_client_with_timeouts(Duration::from_secs(30), Duration::from_secs(180))
69 }
70}
71
72#[cfg(test)]
73mod tests {
74 use super::*;
75
76 #[test]
77 fn default_client_is_created() {
78 let client = HttpClientFactory::default_client();
79 drop(client);
81 }
82
83 #[test]
84 fn for_llm_uses_config_timeout() {
85 let config = TimeoutsConfig::default();
86 let client = HttpClientFactory::for_llm(&config);
87 drop(client);
88 }
89
90 #[test]
91 fn for_streaming_uses_longer_timeout() {
92 let config = TimeoutsConfig::default();
93 let client = HttpClientFactory::for_streaming(&config);
94 drop(client);
95 }
96}