• erio's avatar
    feat(gateway): add web search emulation for Anthropic API Key accounts · 1b53ffca
    erio authored
    Inject web search capability for Claude Console (API Key) accounts that
    don't natively support Anthropic's web_search tool. When a pure
    web_search request is detected, the gateway calls Brave Search or Tavily
    API directly and constructs an Anthropic-protocol-compliant SSE/JSON
    response without forwarding to upstream.
    
    Backend:
    - New `pkg/websearch/` SDK: Brave and Tavily provider implementations
      with io.LimitReader, proxy support, and Redis-based quota tracking
      (Lua atomic INCR + TTL, DECR rollback on failure)
    - Global config via `settings.web_search_emulation_config` (JSON) with
      in-process cache + singleflight, input validation, API key merge on
      save, and sanitized API responses
    - Channel-level toggle via `channels.features_config` JSONB column
      (DB migration 101)
    - Account-level toggle via `accounts.extra.web_search_emulation`
    - Request interception in `Forward()` with SSE streaming response
      construction using json.Marshal (no manual string concatenation)
    - Manager hot-reload: `RebuildWebSearchManager()` called on config save
      and startup via `SetWebSearchRedisClient()`
    - 70 unit tests covering providers, manager, config validation,
      sanitization, tool detection, query extraction, and response building
    
    Frontend:
    - Settings → Gateway tab: Web Search Emulation config card with global
      toggle, provider list (add/remove, API key, priority, quota, proxy)
    - Channels → Anthropic tab: web search emulation toggle with global
      state linkage (disabled when global off)
    - Account Create/Edit modals: web search emulation toggle for API Key
      type with Toggle component
    - Full i18n coverage (zh + en)
    1b53ffca
channel_repo.go 15 KB