Problem or Motivation
OpenMAIC's web-search layer currently offers Tavily, Exa, Bocha, Brave, Baidu, SearXNG, MiniMax, Claude and Doubao. Users who already hold a Serply API key (a Google SERP API at https://serply.io) have no way to plug it into classroom generation without standing up a SearXNG instance or buying a second search subscription. The provider registry in lib/web-search/constants.ts and the adapter switch in lib/web-search/index.ts are designed for exactly this kind of addition, and the recent Exa provider (#1342) shows the accepted shape.
Disclosure: I am affiliated with Serply. This is a bring-your-own-key integration; nothing in OpenMAIC changes for users who do not configure it.
Proposed Solution
Add serply as a new API-key web-search provider, mirroring the Exa integration end to end:
lib/web-search/serply.ts: searchWithSerply calling GET https://api.serply.io/v1/search/?q=...&num=N with the X-Api-Key header via proxyFetch, mapping results[] (title, link, description) to WebSearchSource entries and dropping results without a URL.
- Registry entry in
WEB_SEARCH_PROVIDERS, 'serply' in WebSearchProviderId, dispatch case in searchWeb, env key name in the web-search route, SERPLY_API_KEY / SERPLY_BASE_URL / SERPLY_ENABLED in the server provider config, official base URL allowlist entry, default client settings + migration in lib/store/settings.ts.
settings.providerNames.serply in all 12 locales, .env.example, configuration.mdx + supported-models.mdx in all 6 doc locales, and skills/openmaic/references/provider-keys.md.
- Vitest coverage: adapter unit tests, dispatch, route, server config, constants, and the provider-neutrality guard debt table.
Acceptance Criteria
Alternatives Considered
- Pointing users at SearXNG with a Serply engine: requires self-hosting a second service and loses the key-based server-managed flow OpenMAIC already supports.
- A generic "custom HTTP search" provider: larger design change, and the neutrality guard intentionally keeps vendor knowledge inside per-provider adapters.
Area
Model / provider integration
Additional Context
I have the implementation ready and can open the PR right after this issue is acknowledged. It will be marked AI-assisted per CONTRIBUTING and includes Settings screenshots.
Problem or Motivation
OpenMAIC's web-search layer currently offers Tavily, Exa, Bocha, Brave, Baidu, SearXNG, MiniMax, Claude and Doubao. Users who already hold a Serply API key (a Google SERP API at https://serply.io) have no way to plug it into classroom generation without standing up a SearXNG instance or buying a second search subscription. The provider registry in
lib/web-search/constants.tsand the adapter switch inlib/web-search/index.tsare designed for exactly this kind of addition, and the recent Exa provider (#1342) shows the accepted shape.Disclosure: I am affiliated with Serply. This is a bring-your-own-key integration; nothing in OpenMAIC changes for users who do not configure it.
Proposed Solution
Add
serplyas a new API-key web-search provider, mirroring the Exa integration end to end:lib/web-search/serply.ts:searchWithSerplycallingGET https://api.serply.io/v1/search/?q=...&num=Nwith theX-Api-Keyheader viaproxyFetch, mappingresults[](title,link,description) toWebSearchSourceentries and dropping results without a URL.WEB_SEARCH_PROVIDERS,'serply'inWebSearchProviderId, dispatch case insearchWeb, env key name in the web-search route,SERPLY_API_KEY/SERPLY_BASE_URL/SERPLY_ENABLEDin the server provider config, official base URL allowlist entry, default client settings + migration inlib/store/settings.ts.settings.providerNames.serplyin all 12 locales,.env.example,configuration.mdx+supported-models.mdxin all 6 doc locales, andskills/openmaic/references/provider-keys.md.Acceptance Criteria
SERPLY_API_KEY(plus optionalSERPLY_BASE_URL,SERPLY_ENABLED=false) and the client shows it as server-managed.SERPLY_API_KEYwhen the provider is selected without credentials.pnpm format,pnpm lint,npx tsc --noEmitandpnpm teststay green.Alternatives Considered
Area
Model / provider integration
Additional Context
I have the implementation ready and can open the PR right after this issue is acknowledged. It will be marked AI-assisted per CONTRIBUTING and includes Settings screenshots.