| |
| |
| |
| package main |
|
|
| import ( |
| "context" |
| "flag" |
| "fmt" |
| "os" |
|
|
| configaccess "github.com/router-for-me/CLIProxyAPI/v6/internal/access/config_access" |
| "github.com/router-for-me/CLIProxyAPI/v6/internal/buildinfo" |
| "github.com/router-for-me/CLIProxyAPI/v6/internal/cmd" |
| "github.com/router-for-me/CLIProxyAPI/v6/internal/logging" |
| "github.com/router-for-me/CLIProxyAPI/v6/internal/managementasset" |
| _ "github.com/router-for-me/CLIProxyAPI/v6/internal/translator" |
| "github.com/router-for-me/CLIProxyAPI/v6/internal/usage" |
| "github.com/router-for-me/CLIProxyAPI/v6/internal/util" |
| sdkAuth "github.com/router-for-me/CLIProxyAPI/v6/sdk/auth" |
| coreauth "github.com/router-for-me/CLIProxyAPI/v6/sdk/cliproxy/auth" |
| log "github.com/sirupsen/logrus" |
| ) |
|
|
| var ( |
| Version = "dev" |
| Commit = "none" |
| BuildDate = "unknown" |
| DefaultConfigPath = "" |
| ) |
|
|
| |
| func init() { |
| logging.SetupBaseLogger() |
| buildinfo.Version = Version |
| buildinfo.Commit = Commit |
| buildinfo.BuildDate = BuildDate |
| } |
|
|
| |
| |
| |
| func main() { |
| fmt.Printf("CLIProxyAPI Version: %s, Commit: %s, BuiltAt: %s\n", buildinfo.Version, buildinfo.Commit, buildinfo.BuildDate) |
|
|
| |
| var login bool |
| var codexLogin bool |
| var claudeLogin bool |
| var qwenLogin bool |
| var iflowLogin bool |
| var iflowCookie bool |
| var noBrowser bool |
| var oauthCallbackPort int |
| var antigravityLogin bool |
| var projectID string |
| var vertexImport string |
| var configPath string |
| var password string |
|
|
| |
| flag.BoolVar(&login, "login", false, "Login Google Account") |
| flag.BoolVar(&codexLogin, "codex-login", false, "Login to Codex using OAuth") |
| flag.BoolVar(&claudeLogin, "claude-login", false, "Login to Claude using OAuth") |
| flag.BoolVar(&qwenLogin, "qwen-login", false, "Login to Qwen using OAuth") |
| flag.BoolVar(&iflowLogin, "iflow-login", false, "Login to iFlow using OAuth") |
| flag.BoolVar(&iflowCookie, "iflow-cookie", false, "Login to iFlow using Cookie") |
| flag.BoolVar(&noBrowser, "no-browser", false, "Don't open browser automatically for OAuth") |
| flag.IntVar(&oauthCallbackPort, "oauth-callback-port", 0, "Override OAuth callback port (defaults to provider-specific port)") |
| flag.BoolVar(&antigravityLogin, "antigravity-login", false, "Login to Antigravity using OAuth") |
| flag.StringVar(&projectID, "project_id", "", "Project ID (Gemini only, not required)") |
| flag.StringVar(&configPath, "config", DefaultConfigPath, "Configure File Path") |
| flag.StringVar(&vertexImport, "vertex-import", "", "Import Vertex service account key JSON file") |
| flag.StringVar(&password, "password", "", "") |
|
|
| flag.CommandLine.Usage = func() { |
| out := flag.CommandLine.Output() |
| _, _ = fmt.Fprintf(out, "Usage of %s\n", os.Args[0]) |
| flag.CommandLine.VisitAll(func(f *flag.Flag) { |
| if f.Name == "password" { |
| return |
| } |
| s := fmt.Sprintf(" -%s", f.Name) |
| name, unquoteUsage := flag.UnquoteUsage(f) |
| if name != "" { |
| s += " " + name |
| } |
| if len(s) <= 4 { |
| s += " " |
| } else { |
| s += "\n " |
| } |
| if unquoteUsage != "" { |
| s += unquoteUsage |
| } |
| if f.DefValue != "" && f.DefValue != "false" && f.DefValue != "0" { |
| s += fmt.Sprintf(" (default %s)", f.DefValue) |
| } |
| _, _ = fmt.Fprint(out, s+"\n") |
| }) |
| } |
|
|
| |
| flag.Parse() |
|
|
| |
| deployEnv := os.Getenv("DEPLOY") |
| isCloudDeploy := deployEnv == "cloud" |
|
|
| |
| bootstrap, err := Bootstrap(context.Background(), configPath, isCloudDeploy) |
| if err != nil { |
| log.Errorf("failed to bootstrap application: %v", err) |
| return |
| } |
|
|
| cfg := bootstrap.Config |
| configFilePath := bootstrap.ConfigFilePath |
|
|
| |
| var configFileExists bool |
| if isCloudDeploy { |
| if info, errStat := os.Stat(configFilePath); errStat != nil { |
| |
| log.Info("Cloud deploy mode: No configuration file detected; standing by for configuration") |
| configFileExists = false |
| } else if info.IsDir() { |
| log.Info("Cloud deploy mode: Config path is a directory; standing by for configuration") |
| configFileExists = false |
| } else if cfg.Port == 0 { |
| |
| |
| log.Info("Cloud deploy mode: Configuration file is empty or invalid; standing by for valid configuration") |
| configFileExists = false |
| } else { |
| log.Info("Cloud deploy mode: Configuration file detected; starting service") |
| configFileExists = true |
| } |
| } |
| usage.SetStatisticsEnabled(cfg.UsageStatisticsEnabled) |
| coreauth.SetQuotaCooldownDisabled(cfg.DisableCooling) |
|
|
| if err = logging.ConfigureLogOutput(cfg); err != nil { |
| log.Errorf("failed to configure log output: %v", err) |
| return |
| } |
|
|
| log.Infof("CLIProxyAPI Version: %s, Commit: %s, BuiltAt: %s", buildinfo.Version, buildinfo.Commit, buildinfo.BuildDate) |
|
|
| |
| util.SetLogLevel(cfg) |
|
|
| if resolvedAuthDir, errResolveAuthDir := util.ResolveAuthDir(cfg.AuthDir); errResolveAuthDir != nil { |
| log.Errorf("failed to resolve auth directory: %v", errResolveAuthDir) |
| return |
| } else { |
| cfg.AuthDir = resolvedAuthDir |
| } |
| managementasset.SetCurrentConfig(cfg) |
|
|
| |
| options := &cmd.LoginOptions{ |
| NoBrowser: noBrowser, |
| CallbackPort: oauthCallbackPort, |
| } |
|
|
| |
| sdkAuth.RegisterTokenStore(bootstrap.TokenStore) |
|
|
| |
| configaccess.Register() |
|
|
| |
|
|
| if vertexImport != "" { |
| |
| cmd.DoVertexImport(cfg, vertexImport) |
| } else if login { |
| |
| cmd.DoLogin(cfg, projectID, options) |
| } else if antigravityLogin { |
| |
| cmd.DoAntigravityLogin(cfg, options) |
| } else if codexLogin { |
| |
| cmd.DoCodexLogin(cfg, options) |
| } else if claudeLogin { |
| |
| cmd.DoClaudeLogin(cfg, options) |
| } else if qwenLogin { |
| |
| cmd.DoQwenLogin(cfg, options) |
| } else if iflowLogin { |
| cmd.DoIFlowLogin(cfg, options) |
| } else if iflowCookie { |
| cmd.DoIFlowCookieAuth(cfg, options) |
| } else { |
| |
| if isCloudDeploy && !configFileExists { |
| |
| cmd.WaitForCloudDeploy() |
| return |
| } |
| |
| managementasset.StartAutoUpdater(context.Background(), configFilePath) |
| cmd.StartService(cfg, configFilePath, password) |
| } |
| } |
|
|