Skip to content

feat: add Perplexity as a first-class API provider#12230

Open
james-pplx wants to merge 1 commit intoRooCodeInc:mainfrom
james-pplx:feat/perplexity-provider
Open

feat: add Perplexity as a first-class API provider#12230
james-pplx wants to merge 1 commit intoRooCodeInc:mainfrom
james-pplx:feat/perplexity-provider

Conversation

@james-pplx
Copy link
Copy Markdown

@james-pplx james-pplx commented Apr 29, 2026

Summary

Adds Perplexity as a first-class API provider in Roo Code, targeting Perplexity's OpenAI-compatible chat-completions endpoint at https://api.perplexity.ai.

Models exposed (all 128k context):

  • sonar
  • sonar-pro (default)
  • sonar-reasoning
  • sonar-reasoning-pro

API key resolution order:

  1. perplexityApiKey from settings
  2. PERPLEXITY_API_KEY env var
  3. PPLX_API_KEY env var (fallback)

Changes

  • Types (packages/types/src/providers/perplexity.ts): PerplexityModelId, perplexityModels, perplexityDefaultModelId.
  • Provider settings (packages/types/src/provider-settings.ts): perplexity added to the ProviderName union, perplexitySchema added to the discriminated union and merged schema, registered in modelIdKeysByProvider and MODELS_BY_PROVIDER.
  • Secret keys (packages/types/src/global-settings.ts): perplexityApiKey added to SECRET_STATE_KEYS.
  • Handler (src/api/providers/perplexity.ts): PerplexityHandler extending BaseOpenAiCompatibleProvider, with resolvePerplexityApiKey helper for env-var fallback.
  • Factory (src/api/index.ts): wired into createHandlerForProvider.
  • Profile validation (src/shared/ProfileValidator.ts): perplexity resolves to apiModelId.
  • Webview UI (webview-ui/src/components/settings/providers/Perplexity.tsx): API-key field + sign-up link, mirroring Fireworks.tsx. Wired into ApiOptions.tsx, constants.ts, providerModelConfig.ts, useSelectedModel.ts, and validate.ts.
  • Locales (webview-ui/src/i18n/locales/en/settings.json): perplexityApiKey / getPerplexityApiKey strings added.

Testing

src/api/providers/__tests__/perplexity.spec.ts covers:

  • Correct base URL (https://api.perplexity.ai).
  • API key from settings.
  • PERPLEXITY_API_KEY env-var fallback.
  • PPLX_API_KEY env-var secondary fallback.
  • Settings key takes precedence over env vars.
  • Throws when no key is configured.
  • resolvePerplexityApiKey returns undefined for empty/unset cases.
  • Default model is sonar-pro.
  • Selecting sonar-reasoning-pro returns its ModelInfo.
  • Unknown model id falls back to default.
  • All four models exposed with 128k context.
  • createMessage streams text content.
  • createMessage passes the configured model id to the upstream client.
  • createMessage propagates upstream errors.

Run with: npx vitest run api/providers/__tests__/perplexity.spec.ts

Test plan

  • CI runs perplexity.spec.ts and passes.
  • Manual: set perplexityApiKey in settings, select a Perplexity model, send a message, verify streaming response.
  • Manual: unset settings key, set PERPLEXITY_API_KEY env, restart extension, verify provider works via env fallback.

Introduce a new Perplexity provider that targets Perplexity's
OpenAI-compatible chat-completions endpoint at https://api.perplexity.ai.
Models exposed: sonar, sonar-pro, sonar-reasoning, sonar-reasoning-pro
(all 128k context).

API key resolution order:
  1. perplexityApiKey from settings
  2. PERPLEXITY_API_KEY env var
  3. PPLX_API_KEY env var (fallback)

Wired into the provider registry (packages/types), api factory,
profile validation, webview settings UI, model picker, validation,
and English locale strings.

Tests cover construction, base URL/auth, env-var fallbacks, model
selection, streaming, and error propagation.
@dosubot dosubot Bot added size:L This PR changes 100-499 lines, ignoring generated files. Enhancement New feature or request labels Apr 29, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Enhancement New feature or request size:L This PR changes 100-499 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant