Skip to content

feat: support SerpBase search - #34

Merged
oritwoen merged 1 commit into
mainfrom
feat/serpbase-provider
May 22, 2026
Merged

feat: support SerpBase search#34
oritwoen merged 1 commit into
mainfrom
feat/serpbase-provider

Conversation

@oritwoen

Copy link
Copy Markdown
Member

Adds SerpBase as opt-in Google SERP provider behind SERPBASE_API_KEY. Search stays simple: web by default, category can pick images, news, or videos, and maxResults just trims returned page because SerpBase docs don't expose a limit param.

SerpBase returns business errors inside JSON, sometimes with HTTP 200, so adapter checks status itself instead of trusting HTTP only. Docs and Pi/OpenCode/AI surfaces know about provider now. No issue - fixed directly.

@oritwoen oritwoen self-assigned this May 22, 2026
@oritwoen oritwoen linked an issue May 22, 2026 that may be closed by this pull request

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No issues found across 15 files

Confidence score: 5/5

  • Automated review surfaced no issues in the provided summaries.
  • No files require special attention.
Architecture diagram
sequenceDiagram
    participant API as API / Tool Invocation
    participant Resolver as resolve.ts
    participant Registry as registry.ts
    participant Provider as serpbase.ts
    participant SerpBaseAPI as SerpBase API
    participant ErrorHandler as errors.ts

    Note over API,ErrorHandler: NEW: SerpBase provider integration

    API->>Resolver: search(query, options)
    Resolver->>Resolver: detectAvailableProviders()
    Resolver->>Resolver: NEW: check SERPBASE_API_KEY env var
    alt SERPBASE_API_KEY set
        Resolver->>Registry: get provider factory for 'serpbase'
        Registry-->>Resolver: factory
        Resolver->>Provider: create(ProviderConfig{apiKey, baseURL})
        Provider-->>Resolver: SerpBaseProvider instance
    end

    alt Provider selected = 'serpbase'
        API->>Provider: search(query, { category, maxResults })
        Provider->>Provider: NEW: endpointForCategory(category)
        alt category = 'images'
            Provider->>Provider: endpoint = '/google/images'
        else category = 'news'
            Provider->>Provider: endpoint = '/google/news'
        else category = 'videos'
            Provider->>Provider: endpoint = '/google/videos'
        else default (web)
            Provider->>Provider: endpoint = '/google/search'
        end
        Provider->>Provider: build SerpBaseSearchRequest body
        Provider->>SerpBaseAPI: POST {baseURL}{endpoint} with 'X-API-Key' header
        SerpBaseAPI-->>Provider: SerpBaseSearchResponse (JSON)
        Provider->>Provider: NEW: assertSerpBaseSuccess(response)
        alt response.status != 0
            alt status = 1001
                Provider->>ErrorHandler: throw AuthError
            else status = 1029
                Provider->>ErrorHandler: throw RateLimitError(60)
            else status = 1020
                Provider->>ErrorHandler: throw AskwebError(insufficient credits)
            else other
                Provider->>ErrorHandler: throw AskwebError
            end
            ErrorHandler-->>Provider: error
            Provider-->>API: normalized error
        else response.status = 0 (success)
            Provider->>Provider: NEW: resultsForResponse(search_type)
            alt search_type = 'images'
                Provider->>Provider: use response.images[]
            else search_type = 'news'
                Provider->>Provider: use response.news[]
            else search_type = 'videos'
                Provider->>Provider: use response.videos[]
            else default
                Provider->>Provider: use response.organic[]
            end
            Provider->>Provider: NEW: mapResult() - transform to SearchResult
            Provider->>Provider: NEW: slice(0, clampMaxResults(maxResults))
            Provider-->>API: SearchResult[]
        end
    end

    Note over API,ErrorHandler: SerpBase uses business-level status codes inside JSON body<br/>rather than relying solely on HTTP status codes
Loading

Requires human review: This PR adds a new SerpBase search provider with 171 lines of core implementation logic including network calls, response parsing, error handling, and result mapping, which carries moderate risk of breakage or edge cases that warrant human review.

Re-trigger cubic

@oritwoen
oritwoen merged commit de43493 into main May 22, 2026
2 checks passed
@oritwoen
oritwoen deleted the feat/serpbase-provider branch May 22, 2026 17:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add SerpBase as an optional web search provider

1 participant