File size: 4,263 Bytes
94c29e9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
use chatgpt_rs::api::server;
use chatgpt_rs::{log_error, log_info, log_success};
use std::env;

fn print_usage() {
    println!("Usage: api_server [OPTIONS]");
    println!();
    println!("Options:");
    println!("  --host <HOST>      Server host (default: 0.0.0.0)");
    println!("  --port <PORT>      Server port (default: 7860)");
    println!("  --proxy <PROXY>    Default proxy URL (default: http://127.0.0.1:1082)");
    println!("  --help             Show this help message");
    println!();
    println!("Examples:");
    println!("  api_server");
    println!("  api_server --port 8080");
    println!("  api_server --proxy http://proxy.example.com:8080");
    println!("  api_server --host 127.0.0.1 --port 8080 --proxy http://localhost:7890");
}

#[tokio::main]
async fn main() {
    tracing_subscriber::fmt::init();

    let args: Vec<String> = env::args().collect();
    
    // Parse command line arguments
    let mut host = "0.0.0.0".to_string();
    let mut port = 7860u16;
    let mut default_proxy = Some("http://127.0.0.1:1082".to_string());
    
    let mut i = 1;
    while i < args.len() {
        match args[i].as_str() {
            "--help" | "-h" => {
                print_usage();
                return;
            }
            "--host" => {
                if i + 1 < args.len() {
                    host = args[i + 1].clone();
                    i += 2;
                } else {
                    log_error!("--host requires a value");
                    std::process::exit(1);
                }
            }
            "--port" => {
                if i + 1 < args.len() {
                    match args[i + 1].parse::<u16>() {
                        Ok(p) => port = p,
                        Err(_) => {
                            log_error!("Invalid port number: {}", args[i + 1]);
                            std::process::exit(1);
                        }
                    }
                    i += 2;
                } else {
                    log_error!("--port requires a value");
                    std::process::exit(1);
                }
            }
            "--proxy" => {
                if i + 1 < args.len() {
                    default_proxy = Some(args[i + 1].clone());
                    i += 2;
                } else {
                    log_error!("--proxy requires a value");
                    std::process::exit(1);
                }
            }
            "--no-proxy" => {
                default_proxy = None;
                i += 1;
            }
            _ => {
                log_error!("Unknown option: {}", args[i]);
                println!();
                print_usage();
                std::process::exit(1);
            }
        }
    }

    // Environment variables can override command line args
    if let Ok(env_host) = env::var("API_HOST") {
        host = env_host;
    }
    
    if let Ok(env_port) = env::var("API_PORT") {
        if let Ok(p) = env_port.parse::<u16>() {
            port = p;
        }
    }
    
    if let Ok(env_proxy) = env::var("DEFAULT_PROXY") {
        default_proxy = Some(env_proxy);
    }

    log_info!("Starting ChatGPT-RS API Server");
    log_info!("================================");
    log_info!("Host: {}", host);
    log_info!("Port: {}", port);
    
    if let Some(ref proxy) = default_proxy {
        log_info!("Default Proxy: {}", proxy);
    } else {
        log_info!("Default Proxy: None");
    }
    
    log_info!("================================");
    log_info!("Endpoints:");
    log_info!("  POST /v1/chat/completions - OpenAI-compatible chat completions");
    log_info!("  POST /api/v1/chat/completions - Alternative API path");
    log_info!("  POST /hf/v1/chat/completions - HuggingFace-compatible API path");
    log_info!("  GET  /v1/models - List available models");
    log_info!("  GET  /api/v1/models - List available models (alternative path)");
    log_info!("  GET  /hf/v1/models - List available models (HuggingFace path)");
    log_info!("================================");

    if let Err(err) = server::run(&host, port, default_proxy).await {
        log_error!("API server failed: {}", err);
        std::process::exit(1);
    }
    log_success!("API server stopped");
}