1use anyhow::Result;
4use colored::*;
5
6pub async fn handle(
8 port: Option<u16>,
9 host: Option<String>,
10 provider: Option<String>,
11 model: Option<String>,
12 api_key: Option<String>,
13 generate_key: bool,
14) -> Result<()> {
15 let port_val = port.unwrap_or(8080);
17 let host_str = host.unwrap_or_else(|| "127.0.0.1".to_string());
18
19 let final_api_key = if generate_key {
21 let generated_key = crate::services::proxy::generate_api_key();
22 println!(
23 "{} Generated API key: {}",
24 "🔑".green(),
25 generated_key.bold()
26 );
27 Some(generated_key)
28 } else {
29 api_key
30 };
31
32 if let Some(ref provider_name) = provider {
34 let config = crate::config::Config::load()?;
35 if !config.has_provider(provider_name) {
36 anyhow::bail!(
37 "Provider '{}' not found. Add it first with 'lc providers add'",
38 provider_name
39 );
40 }
41 }
42
43 if let Some(ref model_name) = model {
45 let config = crate::config::Config::load()?;
46
47 if let Some(_alias_target) = config.get_alias(model_name) {
49 } else if model_name.contains(':') {
51 let parts: Vec<&str> = model_name.splitn(2, ':').collect();
53 if parts.len() == 2 {
54 let provider_name = parts[0];
55 if !config.has_provider(provider_name) {
56 anyhow::bail!(
57 "Provider '{}' not found in model specification '{}'",
58 provider_name,
59 model_name
60 );
61 }
62 }
63 } else {
64 }
67 }
68
69 println!("\n{}", "Proxy Server Configuration:".bold().blue());
71 println!(" {} {}:{}", "Address:".bold(), host_str, port_val);
72
73 if let Some(ref provider_filter) = provider {
74 println!(
75 " {} {}",
76 "Provider Filter:".bold(),
77 provider_filter.green()
78 );
79 } else {
80 println!(
81 " {} {}",
82 "Provider Filter:".bold(),
83 "All providers".dimmed()
84 );
85 }
86
87 if let Some(ref model_filter) = model {
88 println!(" {} {}", "Model Filter:".bold(), model_filter.green());
89 } else {
90 println!(" {} {}", "Model Filter:".bold(), "All models".dimmed());
91 }
92
93 if final_api_key.is_some() {
94 println!(" {} {}", "Authentication:".bold(), "Enabled".green());
95 } else {
96 println!(" {} {}", "Authentication:".bold(), "Disabled".yellow());
97 }
98
99 println!("\n{}", "Available endpoints:".bold().blue());
100 println!(" {} http://{}:{}/models", "•".blue(), host_str, port_val);
101 println!(" {} http://{}:{}/v1/models", "•".blue(), host_str, port_val);
102 println!(" {} http://{}:{}/chat/completions", "•".blue(), host_str, port_val);
103 println!(
104 " {} http://{}:{}/v1/chat/completions",
105 "•".blue(),
106 host_str,
107 port_val
108 );
109
110 println!("\n{} Press Ctrl+C to stop the server\n", "💡".yellow());
111
112 crate::services::proxy::start_proxy_server(
114 host_str,
115 port_val,
116 provider,
117 model,
118 final_api_key,
119 )
120 .await?;
121
122 Ok(())
123}