Repository navigation
Conversation
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What it adds
Outcrawl (https://outcrawl.ai) as a keyed web search engine, built the same way as Brave (#1650) and Firecrawl: an
outcrawlsearch platform whose key lives in the normal key pool, plus an adapter inservices/search.ts. Outcrawl is a search and scrape API for AI agents. Its free tier is 1,000 credits a month, no card needed, which fits the catalog's "free to start without a credit card" rule.server/src/providers/outcrawl.ts:OutcrawlProvider(search only). Validation reads the account's credit balance (GET https://api.outcrawl.ai/v1/creditswith the bearer key), which spends nothing, like the Firecrawl and Linkup probes. It goes through the sharedprobe, so 401/403 is a bad key, other 4xx still proves the key, and 5xx or a timeout is inconclusive.outcrawladapter inservices/search.ts: sendsPOST /v1/searchwith{ query, limit }and maps each hit'stitle,urlandsnippetto{ title, url, content }throughkeepHits. Outcrawl returns hits already ranked and with no score, sokeepHitsscores them by position. It has no news vertical, so a news search runs as a web search (same as Keenable). Error handling needs nothing special: 401 benches the key, 402 (out of credits) takes the long credit cooldown, 429 the rate-limit cooldown, all through the existingcoolDown.outcrawlappended toSEARCH_PLATFORMS(shared, server, client), thePlatformunion, the keys route,key-parser(OUTCRAWL_prefix and auth.json),SEARCH_PLATFORM_INFO, the Add key picker ("Outcrawl (1,000 credits/month)", linking to https://outcrawl.ai/console/keys) and the platform color map. Every list keeps its order, with Outcrawl after Brave.Defaults
Opt-in only. No existing engine, order or default changes. Like every engine, it only runs once the catalog has a
searchEnginesrow for it, so the row, its priority and its Premium/Free timing are your call. A row like{ platform: 'outcrawl', engineId: 'outcrawl-search', displayName: 'Outcrawl Search', quotaLabel: '1,000 credits/month', features: { news: false, answer: false, fullContent: false } }matches what the adapter does.What is sent to Outcrawl
The search query,
limit, and the API key in theAuthorizationheader. Nothing else.How I tested
providers/search-providers.test.ts: Outcrawl added to the shared validation cases (no-cost probe URL and method, 401 invalid, other 4xx authenticated, 5xx and timeout inconclusive, chat refused) and to the registry check.services/search.test.ts: request URL, bearer header and body, hit mapping (entity decoding, hits without a URL dropped, title falling back to the URL, rank scores), a 401 benching the key, and a 402 parking it for the credit cooldown.npx vitest runonsearch.test.ts,search-providers.test.ts,catalog-sync.test.tsandkeys.test.ts: 201 passed.npm run test -w server): 382 files passed, 4818 tests passed, 6 skipped. One timing test failed in that run (compression.test.ts, "stays within the 100 KB synchronous performance budget"); it passes when run on its own (21 of 21) and does not touch search.npx vitest run436 passed (56 files),tsc -bclean,check:i18npassed for 60 locales.npm run lintclean;tsc --noEmit(server) clean.outcrawl-searchengine row, thenOutcrawlProvider.validateKey(key)returnedtrueandrunSearch('open source LLM API gateway', { engine: 'outcrawl-search', maxResults: 5 })returnedprovider: outcrawl, 5 results from llmgateway.io (2), github.com (2) and litellm.ai, each with a title and snippet.Disclosure: I work on Outcrawl.
This PR was prepared with AI assistance (omp with Claude): the code, tests and this description were written with it, and the tests and the live call above were run as part of preparing it.