Commit Graph

25 Commits

  • Fixed: #607
    refactor(config): re-export internal configuration types for SDK consumers
  • fix(api): update route patterns to support wildcards for Gemini actions
    Normalize action handling by accommodating wildcard patterns in route definitions for Gemini endpoints. Adjust `request.Action` parsing logic to correctly process routes with prefixed actions.
  • feat(config): add support for model prefixes and prefix normalization
    Refactor model management to include an optional `prefix` field for model credentials, enabling better namespace handling. Update affected configuration files, APIs, and handlers to support prefix normalization and routing. Remove unused OpenAI compatibility provider logic to simplify processing.
  • fix(api): prevent double logging for error responses
    The WriteErrorResponse function now caches the error response body in the gin context.
    
    The deferred request logger checks for this cached response. If an error response is found, it bypasses the standard response logging. This prevents scenarios where an error is logged twice or an empty payload log overwrites the original, more detailed error log.
  • feat(api): return structured JSON error responses
    The API error handling is updated to return a structured JSON payload
    instead of a plain text message. This provides more context and allows
    clients to programmatically handle different error types.
    
    The new error response has the following structure:
    {
      "error": {
        "message": "...",
        "type": "..."
      }
    }
    
    The `type` field is determined by the HTTP status code, such as
    `authentication_error`, `rate_limit_error`, or `server_error`.
    
    If the underlying error message from an upstream service is already a
    valid JSON string, it will be preserved and returned directly.
    
    BREAKING CHANGE: API error responses are now in a structured JSON
    format instead of plain text. Clients expecting plain text error
    messages will need to be updated to parse the new JSON body.
  • Update sdk/api/handlers/claude/code_handlers.go
    thank you gemini
    
    Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
  • fix: flush Claude SSE chunks immediately to match OpenAI behavior
    - Write each SSE chunk directly to c.Writer and flush immediately
    - Remove buffered writer and ticker-based flushing that caused delayed output
    - Add 500ms timeout case for consistency with OpenAI/Gemini handlers
    - Clean up unused bufio import
    
    This fixes the 'not streaming' issue where small responses were held
    in the buffer until timeout/threshold was reached.
    
    Amp-Thread-ID: https://ampcode.com/threads/T-019b1186-164e-740c-96ab-856f64ee6bee
    Co-authored-by: Amp <amp@ampcode.com>
  • feat(util): implement dynamic thinking suffix normalization and refactor budget resolution logic
    - Added support for parsing and normalizing dynamic thinking model suffixes.
    - Centralized budget resolution across executors and payload helpers.
    - Retired legacy Gemini-specific thinking handlers in favor of unified logic.
    - Updated executors to use metadata-based thinking configuration.
    - Added `ResolveOriginalModel` utility for resolving normalized upstream models using request metadata.
    - Updated executors (Gemini, Codex, iFlow, OpenAI, Qwen) to incorporate upstream model resolution and substitute model values in payloads and request URLs.
    - Ensured fallbacks handle cases with missing or malformed metadata to derive models robustly.
    - Refactored upstream model resolution to dynamically incorporate metadata for selecting and normalizing models.
    - Improved handling of thinking configurations and model overrides in executors.
    - Removed hardcoded thinking model entries and migrated logic to metadata-based resolution.
    - Updated payload mutations to always include the resolved model.
  • Fixed: #339
    **feat(handlers, executor): add Gemini 3 Pro Preview support and refine Claude system instructions**
    
    - Added support for the new "Gemini 3 Pro Preview" action in Gemini handlers, including detailed metadata and configuration.
    - Removed redundant `cache_control` field from Claude system instructions for cleaner payload structure.
  • **fix(handlers): refactor API response capture to append data safely**
    - Introduced `appendAPIResponse` helper to preserve and append data to existing API responses.
    - Ensured newline inclusion when appending, if necessary.
    - Improved `nil` and data type checks for response handling.
    - Updated middleware to skip request logging for `GET` requests.
  • Add AMP fallback proxy and shared Gemini normalization
    - add fallback handler that forwards Amp provider requests to ampcode.com when the provider isn’t configured locally
    - wrap AMP provider routes with the fallback so requests always have a handler
    - share Gemini thinking model normalization helper between core handlers and AMP fallback
  • feat: Add Amp CLI integration with comprehensive documentation
    Add full Amp CLI support to enable routing AI model requests through the proxy
    while maintaining Amp-specific features like thread management, user info, and
    telemetry. Includes complete documentation and pull bot configuration.
    
    Features:
    - Modular architecture with RouteModule interface for clean integration
    - Reverse proxy for Amp management routes (thread/user/meta/ads/telemetry)
    - Provider-specific route aliases (/api/provider/{provider}/*)
    - Secret management with precedence: config > env > file
    - 5-minute secret caching to reduce file I/O
    - Automatic gzip decompression for responses
    - Proper connection cleanup to prevent leaks
    - Localhost-only restriction for management routes (configurable)
    - CORS protection for management endpoints
    
    Documentation:
    - Complete setup guide (USING_WITH_FACTORY_AND_AMP.md)
    - OAuth setup for OpenAI (ChatGPT Plus/Pro) and Anthropic (Claude Pro/Max)
    - Factory CLI config examples with all model variants
    - Amp CLI/IDE configuration examples
    - tmux setup for remote server deployment
    - Screenshots and diagrams
    
    Configuration:
    - Pull bot disabled for this repo (manual rebase workflow)
    - Config fields: AmpUpstreamURL, AmpUpstreamAPIKey, AmpRestrictManagementToLocalhost
    - Compatible with upstream DisableCooling and other features
    
    Technical details:
    - internal/api/modules/amp/: Complete Amp routing module
    - sdk/api/httpx/: HTTP utilities for gzip/transport
    - 94.6% test coverage with 34 comprehensive test cases
    - Clean integration minimizes merge conflict risk
    
    Security:
    - Management routes restricted to localhost by default
    - Configurable via amp-restrict-management-to-localhost
    - Prevents drive-by browser attacks on user data
    
    This provides a production-ready foundation for Amp CLI integration while
    maintaining clean separation from upstream code for easy rebasing.
    
    Amp-Thread-ID: https://ampcode.com/threads/T-9e2befc5-f969-41c6-890c-5b779d58cf18
  • feat: add auto model resolution and model creation timestamp tracking
    - Add 'created' field to model registry for tracking model creation time
    - Implement GetFirstAvailableModel() to find the first available model by newest creation timestamp
    - Add ResolveAutoModel() utility function to resolve "auto" model name to actual available model
    - Update request handler to resolve "auto" model before processing requests
    - Ensures automatic model selection when "auto" is specified as model name
    
    This enables dynamic model selection based on availability and creation time, improving the user experience when no specific model is requested.
  • Add support for dynamic model providers
    Implements functionality to parse model names with provider information in the format "provider://model" This allows dynamic provider selection rather than relying only on predefined mappings.
    
    The change affects all execution methods to properly handle these dynamic model specifications while maintaining compatibility with the existing approach for standard model names.
  • feat: improve error handling with added status codes and headers
    - Updated Execute methods to include enhanced error handling via `StatusCode` and `Headers` extraction.
    - Introduced structured error responses for cooling down scenarios, providing additional metadata and retry suggestions.
    - Refined quota management, allowing for differentiation between cool-down, disabled, and other block reasons.
    - Improved model filtering logic based on client availability and suspension criteria.
  • Feature: #103
    feat(gemini): add Gemini thinking configuration support and metadata normalization
    
    - Introduced logic to parse and apply `thinkingBudget` and `include_thoughts` configurations from metadata.
    - Enhanced request handling to include normalized Gemini model metadata, preserving the original model identifier.
    - Updated Gemini and Gemini-CLI executors to apply thinking configuration based on metadata overrides.
    - Refactored handlers to support metadata extraction and cloning during request preparation.
  • fix: add Claude→Claude passthrough to prevent SSE event fragmentation
    When from==to (Claude→Claude scenario), directly forward SSE stream
    line-by-line without invoking TranslateStream. This preserves the
    multi-line SSE event structure (event:/data:/blank) and prevents
    JSON parsing errors caused by event fragmentation.
    
    Resolves: JSON parsing error when using Claude Code streaming responses
    
    fix: correct SSE event formatting in Handler layer
    
    Remove duplicate newline additions (\n\n) that were breaking SSE event format.
    The Executor layer already provides properly formatted SSE chunks with correct
    line endings, so the Handler should forward them as-is without modification.
    
    Changes:
    - Remove redundant \n\n addition after each chunk
    - Add len(chunk) > 0 check before writing
    - Format error messages as proper SSE events (event: error\ndata: {...}\n\n)
    - Add chunkIdx counter for future debugging needs
    
    This fixes JSON parsing errors caused by malformed SSE event streams.
    
    fix: update comments for clarity in SSE event forwarding
  • refactor(config): migrate to SDKConfig and streamline proxy handling
    - Replaced `config.Config` with `config.SDKConfig` across components for simpler configuration management.
    - Updated proxy setup functions and handlers to align with `SDKConfig` improvements.
    - Reorganized handler imports to match new SDK structure.