mirror of
https://github.com/router-for-me/CLIProxyAPI.git
synced 2026-02-03 13:00:52 +08:00
AMP CLI sends Gemini requests to non-standard paths that were being directly proxied to ampcode.com without checking for local OAuth. This fix adds: - GeminiBridge handler to transform AMP CLI paths to standard format - Enhanced model extraction from AMP's /publishers/google/models/* paths - FallbackHandler wrapper to check for local OAuth before proxying Flow: - If user has local Google OAuth → use it (free tier) - If no local OAuth → fallback to ampcode.com (charges credits) Fixes issue where gemini-3-pro-preview requests always charged AMP credits even when user had valid Google Cloud OAuth configured.
46 lines
1.4 KiB
Go
46 lines
1.4 KiB
Go
package amp
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/router-for-me/CLIProxyAPI/v6/sdk/api/handlers/gemini"
|
|
)
|
|
|
|
// createGeminiBridgeHandler creates a handler that bridges AMP CLI's non-standard Gemini paths
|
|
// to our standard Gemini handler by rewriting the request context.
|
|
//
|
|
// AMP CLI format: /publishers/google/models/gemini-3-pro-preview:streamGenerateContent
|
|
// Standard format: /models/gemini-3-pro-preview:streamGenerateContent
|
|
//
|
|
// This extracts the model+method from the AMP path and sets it as the :action parameter
|
|
// so the standard Gemini handler can process it.
|
|
func createGeminiBridgeHandler(geminiHandler *gemini.GeminiAPIHandler) gin.HandlerFunc {
|
|
return func(c *gin.Context) {
|
|
// Get the full path from the catch-all parameter
|
|
path := c.Param("path")
|
|
|
|
// Extract model:method from AMP CLI path format
|
|
// Example: /publishers/google/models/gemini-3-pro-preview:streamGenerateContent
|
|
if idx := strings.Index(path, "/models/"); idx >= 0 {
|
|
// Extract everything after "/models/"
|
|
actionPart := path[idx+8:] // Skip "/models/"
|
|
|
|
// Set this as the :action parameter that the Gemini handler expects
|
|
c.Params = append(c.Params, gin.Param{
|
|
Key: "action",
|
|
Value: actionPart,
|
|
})
|
|
|
|
// Call the standard Gemini handler
|
|
geminiHandler.GeminiHandler(c)
|
|
return
|
|
}
|
|
|
|
// If we can't parse the path, return 400
|
|
c.JSON(400, gin.H{
|
|
"error": "Invalid Gemini API path format",
|
|
})
|
|
}
|
|
}
|