mirror of
https://github.com/router-for-me/CLIProxyAPI.git
synced 2026-02-18 20:30:51 +08:00
Merge pull request #861 from umairimtiaz9/fix/gemini-cli-backend-project-id
fix(auth): use backend project ID for free tier Gemini CLI OAuth users
This commit is contained in:
@@ -2110,7 +2110,20 @@ func performGeminiCLISetup(ctx context.Context, httpClient *http.Client, storage
|
|||||||
finalProjectID := projectID
|
finalProjectID := projectID
|
||||||
if responseProjectID != "" {
|
if responseProjectID != "" {
|
||||||
if explicitProject && !strings.EqualFold(responseProjectID, projectID) {
|
if explicitProject && !strings.EqualFold(responseProjectID, projectID) {
|
||||||
log.Warnf("Gemini onboarding returned project %s instead of requested %s; keeping requested project ID.", responseProjectID, projectID)
|
// Check if this is a free user (gen-lang-client projects or free/legacy tier)
|
||||||
|
isFreeUser := strings.HasPrefix(projectID, "gen-lang-client-") ||
|
||||||
|
strings.EqualFold(tierID, "FREE") ||
|
||||||
|
strings.EqualFold(tierID, "LEGACY")
|
||||||
|
|
||||||
|
if isFreeUser {
|
||||||
|
// For free users, use backend project ID for preview model access
|
||||||
|
log.Infof("Gemini onboarding: frontend project %s maps to backend project %s", projectID, responseProjectID)
|
||||||
|
log.Infof("Using backend project ID: %s (recommended for preview model access)", responseProjectID)
|
||||||
|
finalProjectID = responseProjectID
|
||||||
|
} else {
|
||||||
|
// Pro users: keep requested project ID (original behavior)
|
||||||
|
log.Warnf("Gemini onboarding returned project %s instead of requested %s; keeping requested project ID.", responseProjectID, projectID)
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
finalProjectID = responseProjectID
|
finalProjectID = responseProjectID
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -118,6 +118,7 @@ func DoLogin(cfg *config.Config, projectID string, options *LoginOptions) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
activatedProjects := make([]string, 0, len(projectSelections))
|
activatedProjects := make([]string, 0, len(projectSelections))
|
||||||
|
seenProjects := make(map[string]bool)
|
||||||
for _, candidateID := range projectSelections {
|
for _, candidateID := range projectSelections {
|
||||||
log.Infof("Activating project %s", candidateID)
|
log.Infof("Activating project %s", candidateID)
|
||||||
if errSetup := performGeminiCLISetup(ctx, httpClient, storage, candidateID); errSetup != nil {
|
if errSetup := performGeminiCLISetup(ctx, httpClient, storage, candidateID); errSetup != nil {
|
||||||
@@ -134,6 +135,13 @@ func DoLogin(cfg *config.Config, projectID string, options *LoginOptions) {
|
|||||||
if finalID == "" {
|
if finalID == "" {
|
||||||
finalID = candidateID
|
finalID = candidateID
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Skip duplicates
|
||||||
|
if seenProjects[finalID] {
|
||||||
|
log.Infof("Project %s already activated, skipping", finalID)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
seenProjects[finalID] = true
|
||||||
activatedProjects = append(activatedProjects, finalID)
|
activatedProjects = append(activatedProjects, finalID)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -261,9 +269,41 @@ func performGeminiCLISetup(ctx context.Context, httpClient *http.Client, storage
|
|||||||
finalProjectID := projectID
|
finalProjectID := projectID
|
||||||
if responseProjectID != "" {
|
if responseProjectID != "" {
|
||||||
if explicitProject && !strings.EqualFold(responseProjectID, projectID) {
|
if explicitProject && !strings.EqualFold(responseProjectID, projectID) {
|
||||||
log.Warnf("Gemini onboarding returned project %s instead of requested %s; keeping requested project ID.", responseProjectID, projectID)
|
// Check if this is a free user (gen-lang-client projects or free/legacy tier)
|
||||||
|
isFreeUser := strings.HasPrefix(projectID, "gen-lang-client-") ||
|
||||||
|
strings.EqualFold(tierID, "FREE") ||
|
||||||
|
strings.EqualFold(tierID, "LEGACY")
|
||||||
|
|
||||||
|
if isFreeUser {
|
||||||
|
// Interactive prompt for free users
|
||||||
|
fmt.Printf("\n⚠️ Google returned a different project ID:\n")
|
||||||
|
fmt.Printf(" Requested (frontend): %s\n", projectID)
|
||||||
|
fmt.Printf(" Returned (backend): %s\n\n", responseProjectID)
|
||||||
|
fmt.Printf("ℹ️ Backend project IDs have access to preview models (gemini-3-*).\n")
|
||||||
|
fmt.Printf(" This is normal for free tier users.\n\n")
|
||||||
|
fmt.Printf("Which project ID would you like to use?\n")
|
||||||
|
fmt.Printf(" [1] Backend (recommended): %s\n", responseProjectID)
|
||||||
|
fmt.Printf(" [2] Frontend: %s\n\n", projectID)
|
||||||
|
fmt.Printf("Enter choice [1]: ")
|
||||||
|
|
||||||
|
reader := bufio.NewReader(os.Stdin)
|
||||||
|
choice, _ := reader.ReadString('\n')
|
||||||
|
choice = strings.TrimSpace(choice)
|
||||||
|
|
||||||
|
if choice == "2" {
|
||||||
|
log.Infof("Using frontend project ID: %s", projectID)
|
||||||
|
fmt.Println("⚠️ Warning: Frontend project IDs may not have access to preview models.")
|
||||||
|
finalProjectID = projectID
|
||||||
|
} else {
|
||||||
|
log.Infof("Using backend project ID: %s (recommended)", responseProjectID)
|
||||||
|
finalProjectID = responseProjectID
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Pro users: keep requested project ID (original behavior)
|
||||||
|
log.Warnf("Gemini onboarding returned project %s instead of requested %s; keeping requested project ID.", responseProjectID, projectID)
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
finalProjectID = responseProjectID
|
finalProjectID = responseProjectID
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user