3 Commits

  • refactor: improve gemini bridge testability and code quality
    - Change createGeminiBridgeHandler to accept gin.HandlerFunc instead of *gemini.GeminiAPIHandler
      This allows tests to inject mock handlers instead of duplicating bridge logic
    - Replace magic number 8 with len(modelsPrefix) for better maintainability
    - Remove redundant test case that doesn't test edge case in production
    - Update routes.go to pass geminiHandlers.GeminiHandler directly
    
    Addresses PR review feedback on test architecture and code clarity.
    
    Amp-Thread-ID: https://ampcode.com/threads/T-1ae2c691-e434-4b99-a49a-10cabd3544db
  • fix(amp): pass mapped model to gemini bridge via context
    Gemini handler extracts model from URL path, not JSON body, so
    rewriting the request body alone wasn't sufficient for model mapping.
    
    - Add MappedModelContextKey constant for context passing
    - Update routes.go to use NewFallbackHandlerWithMapper
    - Add check for valid mapping before routing to local handler
    - Add tests for gemini bridge model mapping
  • fix(amp): enable OAuth fallback for Gemini v1beta1 routes
    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.