Perplexity Multi-Environment Setup
Overview
Configure Perplexity Sonar API across dev/staging/prod. Key decisions per environment: which models are allowed (sonar vs sonar-pro), rate limits, and cost caps. All environments use the same base URL (https://api.perplexity.ai) but different API keys with different budget limits.
Environment Strategy
| Environment | Model | Rate Limit | Key Source | Monthly Budget |
|---|
| Development | sonar only | 5 RPM self-imposed | .env.local | $10 |
| Staging | sonar only | 20 RPM | CI secrets | $50 |
| Production | sonar + sonar-pro | 50 RPM | Secret manager | $500+ |
Prerequisites
- Separate Perplexity API keys per environment
openai package installed
- Secret management (env files for dev, vault/KMS for prod)
Instructions
Step 1: Configuration Structure
config/
perplexity/
base.ts # OpenAI client + base URL
development.ts # Dev: sonar only, low limits
staging.ts # Staging: sonar only, moderate limits
production.ts # Prod: full model access
index.ts # Environment resolver
Step 2: Base Configuration
import OpenAI from "openai";
export const PERPLEXITY_BASE_URL = "https://api.perplexity.ai";
export function createPerplexityClient(apiKey: string): OpenAI {
if (!apiKey) throw new Error("Perplexity API key is required");
if (!apiKey.startsWith("pplx-")) throw new Error("Invalid Perplexity API key format");
return new OpenAI({ apiKey, baseURL: PERPLEXITY_BASE_URL });
}
Step 3: Environment Configs
export const devConfig = {
apiKey: process.env.PERPLEXITY_API_KEY!,
defaultModel: "sonar" as const,
deepModel: "sonar" as const,
maxTokens: 512,
maxConcurrentRequests: 1,
cacheTTLMs: 24 * 3600_000,
};
export const stagingConfig = {
apiKey: process.env.PERPLEXITY_API_KEY_STAGING!,
defaultModel: "sonar" as const,
deepModel: "sonar" as const,
maxTokens: 1024,
maxConcurrentRequests: 2,
cacheTTLMs: 4 * 3600_000,
};
export const productionConfig = {
apiKey: process.env.PERPLEXITY_API_KEY_PROD!,
defaultModel: ,
: ,
: ,
: ,
: * ,
};
Step 4: Environment Resolver
import { createPerplexityClient } from "./base";
import { devConfig } from "./development";
import { stagingConfig } from "./staging";
import { productionConfig } from "./production";
type SearchDepth = "quick" | "deep";
const configs = {
development: devConfig,
staging: stagingConfig,
production: productionConfig,
};
export function getConfig() {
const env = process.env.NODE_ENV || "development";
const config = configs[env as keyof typeof configs];
if (!config) throw new Error(`Unknown environment: ${env}`);
if (!config.apiKey) throw new Error(`PERPLEXITY_API_KEY not set for ${env}`);
return config;
}
export function getClient() {
return createPerplexityClient(().);
}
(): {
cfg = ();
depth === ? cfg. : cfg.;
}
Step 5: Usage with Environment-Aware Search
import { getClient, getModelForDepth, getConfig } from "../config/perplexity";
export async function search(query: string, depth: "quick" | "deep" = "quick") {
const client = getClient();
const model = getModelForDepth(depth);
const config = getConfig();
const result = await client.chat.completions.create({
model,
messages: [
{ role: "system", content: "Provide accurate, well-sourced answers." },
{ role: "user", content: query },
],
max_tokens: depth === "deep" ? config.maxTokens : Math.min(512, config.maxTokens),
});
return {
answer: result.choices[0].message.content,
citations: (result as any).citations || [],
model,
: process..,
: result.,
};
}
Step 6: Secret Manager Integration (Production)
set -euo pipefail
gcloud secrets create perplexity-api-key-prod \
--data-file=<(echo -n "$PERPLEXITY_API_KEY_PROD")
aws secretsmanager create-secret \
--name perplexity/api-key-prod \
--secret-string "$PERPLEXITY_API_KEY_PROD"
vault kv put secret/perplexity api_key="$PERPLEXITY_API_KEY_PROD"
Error Handling
| Issue | Cause | Solution |
|---|
401 in staging | Wrong API key for environment | Verify PERPLEXITY_API_KEY_STAGING |
429 in dev | Exceeding self-imposed limit | Add request queuing |
| sonar-pro in dev | Config not restricting models | Set deepModel: "sonar" in dev config |
| High dev costs | Using production config locally | Ensure NODE_ENV=development is set |
Output
- Environment-specific Perplexity configurations
- Model routing by environment and query depth
- Secret manager integration for production keys
- Cost controls per environment
Resources
Next Steps
For deployment configuration, see perplexity-deploy-integration.