Design

The design keeps provider differences behind narrow driver classes and keeps Laravel application code pointed at the manager.

classDiagram class SearchProviderManager { +searchImages(SearchQueryData) +searchWeb(SearchQueryData) -execute(method, query) } class SearchProviderInterface { +searchImages(query) +searchWeb(query) +supportsImageSearch() +supportsSiteFilter() } class SearchProviderDefinition class SearchResultCollection SearchProviderManager --> SearchProviderInterface SearchProviderManager --> SearchProviderDefinition SearchProviderInterface --> SearchResultCollection
Boundary rule

Application code should not parse Brave, Tavily, Exa, or Firecrawl payloads directly. Put provider-specific parsing in a driver and return normalized results.