Adding Exa as a web search plugin#50281
Conversation
Co-Authored-By: Louis Walsh <[email protected]>
Co-Authored-By: Louis Walsh <[email protected]>
Co-Authored-By: Louis Walsh <[email protected]>
Greptile SummaryThis PR adds Exa as a new bundled web search provider, following the exact same patterns established by Brave, Firecrawl, and other existing bundled providers — additive changes only, no modifications to core types or schemas. Changes:
Implementation quality: The provider correctly uses One nit found: Confidence Score: 5/5
Prompt To Fix All With AIThis is a comment left during a code review.
Path: extensions/exa/src/exa-web-search-provider.ts
Line: 90
Comment:
**Redundant `?? undefined` fallback**
`entry.publishedDate` is already typed as `string | undefined`, so appending `?? undefined` is a no-op — if the value is already `undefined`, the nullish coalescing just returns `undefined` again. The field can simply be assigned directly, matching how other result fields like `siteName` handle the same pattern via `|| undefined` (which additionally coerces empty string to `undefined`).
```suggestion
published: entry.publishedDate,
```
How can I resolve this? If you propose a fix, please make it concise.Last reviewed commit: "refactor: move exa t..." |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 5a3720f976
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 82afdc5bcf
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
| signupUrl: "https://exa.ai/", | ||
| docsUrl: "https://docs.exa.ai/", | ||
| autoDetectOrder: 65, | ||
| credentialPath: "plugins.entries.exa.config.webSearch.apiKey", |
There was a problem hiding this comment.
Register Exa's credential path with secret tooling
This provider advertises plugins.entries.exa.config.webSearch.apiKey, but the static secret registry was not updated for that path (src/secrets/target-registry-data.ts still only lists the existing Brave/Google/xAI/Moonshot/Perplexity/Firecrawl web-search entries). Because discoverConfigSecretTargets() drives both openclaw secrets configure (src/secrets/configure-plan.ts:88) and openclaw secrets audit (src/secrets/audit.ts:215), an Exa key stored at the new plugin path is invisible to those workflows: operators cannot manage it through the configure flow, manual plans using that target type fail validation, and audits miss plaintext Exa keys entirely.
Useful? React with 👍 / 👎.
|
Hey @louiswalsh 👋 — I implemented the same Exa integration as a plugin extension in #49319 (following the firecrawl/moonshot pattern). Happy to help review, test, or merge efforts if it makes sense to consolidate. Let me know! |
|
Thanks for pushing this. I'm closing this as a duplicate of #52617. This was targeting the same bundled Exa plugin outcome, and the merged PR now covers that path on top of current main. If you think there is still a gap in the landed version, point me to it and I can reopen review right away. |
Summary
extensions/exa/as a new bundled web search provider plugin (4 new files), registered it inBUNDLED_WEB_SEARCH_PLUGIN_IDS, and updated the contract registry + test expectations.Change Type (select all)
Scope (select all touched areas)
Linked Issue/PR
User-visible / Behavior Changes
exaweb search provider available whenEXA_API_KEYis set or configured viaopenclaw configure --section web.plugins.entries.exa.config.webSearch.apiKey.Security Impact (required)
NoNo— follows existingreadConfiguredSecretString/readProviderEnvValuepatternYes— POST tohttps://api.exa.ai/searchwithx-api-keyheaderNoNoYes, explain risk + mitigation: Network call is gated behind API key presence. Request goes throughwithTrustedWebSearchEndpoint(same as all other providers). No secrets are logged or exposed. Thex-exa-integration: "openclaw"header is sent for usage tracking only.Repro + Verification
Environment
EXA_API_KEY=exa-***Steps
EXA_API_KEYenvironment variableopenclaw configure --section weband select Exa, or let auto-detect pick it upweb_searchtool — should route through ExaExpected
Actual
Evidence
All 599 plugin tests pass (
pnpm vitest run src/plugins/). Lint clean (oxlint --type-aware: 0 warnings, 0 errors).Human Verification (required)
Review Conversations
Compatibility / Migration
YesYes— new optionalEXA_API_KEYenv var recognizedNoFailure Recovery (if this breaks)
"exa"fromBUNDLED_WEB_SEARCH_PLUGIN_IDSinsrc/plugins/bundled-web-search.ts, or setplugins.entries.exa.enabled: falsein config.src/plugins/bundled-web-search.ts(remove "exa" from array)EXA_API_KEYis set but Exa API is unreachable.Risks and Mitigations