exa-deploy-integration
Provides deployment configurations and secret management for hosting Exa-based applications.
Install
mkdir -p .claude/skills/exa-deploy-integration && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/9038" && unzip -o skill.zip -d .claude/skills/exa-deploy-integration && rm skill.zipInstalls to .claude/skills/exa-deploy-integration
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Deploy Exa integrations to Vercel, Docker, and Cloud Run platforms.Key capabilities
- →Deploy Exa integrations to Vercel Edge Functions
- →Containerize Exa applications using Docker
- →Configure Google Cloud Run with secret management
- →Implement health check endpoints for production monitoring
- →Integrate Redis caching for production traffic
How it works
This skill provides deployment patterns and configuration examples for hosting Exa-powered applications on major cloud platforms.
Inputs & outputs
When to use exa-deploy-integration
- →Deploy search API endpoints to Vercel
- →Containerize Exa-powered applications with Docker
- →Configure production environment variables
- →Setup health check endpoints
About this skill
Exa Deploy Integration
Overview
Deploy applications using Exa's neural search API to production. Covers API endpoint creation, secret management per platform, caching for production traffic, and health check endpoints.
Prerequisites
- Exa API key stored in
EXA_API_KEYenvironment variable - Application using
exa-jsSDK - Platform CLI installed (vercel, docker, or gcloud)
Instructions
Step 1: Vercel Edge Function
// api/search.ts — Vercel API route
import Exa from "exa-js";
export const config = { runtime: "edge" };
export default async function handler(req: Request) {
if (req.method !== "POST") {
return new Response("Method not allowed", { status: 405 });
}
const exa = new Exa(process.env.EXA_API_KEY!);
const { query, numResults = 5 } = await req.json();
if (!query || typeof query !== "string") {
return Response.json({ error: "query is required" }, { status: 400 });
}
try {
const results = await exa.searchAndContents(query, {
type: "auto",
numResults: Math.min(numResults, 20),
text: { maxCharacters: 1000 },
highlights: { maxCharacters: 300, query },
});
return Response.json({
results: results.results.map(r => ({
title: r.title,
url: r.url,
score: r.score,
snippet: r.text?.substring(0, 300),
highlights: r.highlights,
})),
});
} catch (err: any) {
const status = err.status || 500;
return Response.json(
{ error: err.message, requestId: err.requestId },
{ status }
);
}
}
# Deploy to Vercel
vercel env add EXA_API_KEY production
vercel --prod
Step 2: Docker Deployment
FROM node:20-slim
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build
EXPOSE 3000
CMD ["node", "dist/index.js"]
// src/server.ts — Express search API
import express from "express";
import Exa from "exa-js";
const app = express();
app.use(express.json());
const exa = new Exa(process.env.EXA_API_KEY!);
app.post("/api/search", async (req, res) => {
const { query, numResults = 5, type = "auto" } = req.body;
try {
const results = await exa.searchAndContents(query, {
type,
numResults,
text: { maxCharacters: 1000 },
});
res.json(results);
} catch (err: any) {
res.status(err.status || 500).json({ error: err.message });
}
});
app.get("/health", async (_req, res) => {
try {
await exa.search("health", { numResults: 1 });
res.json({ status: "healthy", service: "exa" });
} catch {
res.status(503).json({ status: "unhealthy", service: "exa" });
}
});
app.listen(3000, () => console.log("Listening on :3000"));
Step 3: Google Cloud Run
set -euo pipefail
# Store API key in Secret Manager
echo -n "$EXA_API_KEY" | gcloud secrets create exa-api-key --data-file=-
# Deploy with secret mounted as env var
gcloud run deploy exa-search-api \
--source . \
--set-secrets=EXA_API_KEY=exa-api-key:latest \
--allow-unauthenticated \
--region us-central1
Step 4: Production Search with Redis Cache
import Exa from "exa-js";
import { Redis } from "ioredis";
import { createHash } from "crypto";
const exa = new Exa(process.env.EXA_API_KEY!);
const redis = new Redis(process.env.REDIS_URL!);
async function cachedSearch(query: string, opts: any = {}, ttl = 3600) {
const key = `exa:${createHash("sha256").update(JSON.stringify({ query, ...opts })).digest("hex")}`;
const cached = await redis.get(key);
if (cached) return JSON.parse(cached);
const results = await exa.searchAndContents(query, {
type: "auto",
numResults: 5,
text: { maxCharacters: 1000 },
...opts,
});
await redis.set(key, JSON.stringify(results), "EX", ttl);
return results;
}
Error Handling
| Issue | Cause | Solution |
|---|---|---|
| 401 in production | API key not set | Verify env var in deployment platform |
| Rate limited | Too many requests | Implement Redis cache + request queue |
| Slow responses | Large content requests | Reduce maxCharacters or numResults |
| Timeout on Edge | Query too complex | Use type: "fast" for edge functions |
| Cold start latency | Serverless cold start | Keep Exa client initialization outside handler |
Resources
Next Steps
For multi-environment setup, see exa-multi-env-setup. For production checklist, see exa-prod-checklist.
When not to use it
- →When deploying to environments without Node.js support
- →When serverless cold starts are unacceptable for latency
Prerequisites
Limitations
- →Edge functions may timeout on complex queries
- →Requires external secret management for production security
How it compares
It provides platform-specific configuration for secrets and runtime environments rather than generic deployment steps.
Compared to similar skills
exa-deploy-integration side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| exa-deploy-integration (this skill) | 0 | 27d | Review | Advanced |
| ecs | 2 | 3mo | Review | Intermediate |
| firecrawl-deploy-integration | 1 | 27d | Review | Intermediate |
| evernote-deploy-integration | 0 | 27d | Review | Intermediate |
Try saying
Example prompts that trigger this skill in your AI assistant.
More by jeremylongshore
View all by jeremylongshore →You might also like
ecs
itsmostafa
AWS ECS container orchestration for running Docker containers. Use when deploying containerized applications, configuring task definitions, setting up services, managing clusters, or troubleshooting container issues.
firecrawl-deploy-integration
jeremylongshore
Deploy FireCrawl integrations to Vercel, Fly.io, and Cloud Run platforms. Use when deploying FireCrawl-powered applications to production, configuring platform-specific secrets, or setting up deployment pipelines. Trigger with phrases like "deploy firecrawl", "firecrawl Vercel", "firecrawl production deploy", "firecrawl Cloud Run", "firecrawl Fly.io".
evernote-deploy-integration
jeremylongshore
Deploy Evernote integrations to production environments. Use when deploying to cloud platforms, configuring production, or setting up deployment pipelines. Trigger with phrases like "deploy evernote", "evernote production deploy", "release evernote", "evernote cloud deployment".
deployment-pipeline-design
wshobson
Design multi-stage CI/CD pipelines with approval gates, security checks, and deployment orchestration. Use when architecting deployment workflows, setting up continuous delivery, or implementing GitOps practices.
terraform-module-library
wshobson
Build reusable Terraform modules for AWS, Azure, and GCP infrastructure following infrastructure-as-code best practices. Use when creating infrastructure modules, standardizing cloud provisioning, or implementing reusable IaC components.
genkit-infra-expert
jeremylongshore
Execute use when deploying Genkit applications to production with Terraform. Trigger with phrases like "deploy genkit terraform", "provision genkit infrastructure", "firebase functions terraform", "cloud run deployment", or "genkit production infrastructure". Provisions Firebase Functions, Cloud Run services, GKE clusters, monitoring dashboards, and CI/CD for AI workflows.