Perplexity with Mastra
Overview
Section titled “Overview”Mastra is an open-source TypeScript framework for building AI agents and workflows. Wire Perplexity's Agent API into a Mastra Agent through the Open Responses provider, or expose the Search API as a Mastra-compatible tool.
The Mastra ecosystem provides two Perplexity integrations:
- Agent API — Run the Agent API inside a Mastra
Agentthrough the Open Responses provider. - Perplexity Search tool — Expose the Search API as a Mastra tool for ranked web results.
API Key Setup
Section titled “API Key Setup”Both integrations read your Perplexity API key from the environment:
export PERPLEXITY_API_KEY="your_api_key_here"The Search tool also accepts PPLX_API_KEY as a fallback.
Get API Key
Generate your API key from the Perplexity dashboard.
Agent API
Section titled “Agent API”The Agent API speaks the Open Responses standard, so the @ai-sdk/open-responses provider connects to it directly. Point the provider at Perplexity's /v1/responses endpoint, then pass the model id to your Mastra Agent:
npm install @mastra/core @ai-sdk/open-responsesimport { Agent } from "@mastra/core/agent";
import { createOpenResponses } from "@ai-sdk/open-responses";
const perplexity = createOpenResponses({
name: "perplexity",
url: "https://api.perplexity.ai/v1/responses",
apiKey: process.env.PERPLEXITY_API_KEY,
});
const agent = new Agent({
id: "research-agent",
name: "Research Agent",
instructions: "Answer questions clearly and concisely.",
// Any Agent API model, e.g. openai/gpt-5.6-luna (faster) or openai/gpt-5.6-sol (higher quality).
model: perplexity("openai/gpt-5.6-luna"),
});
const result = await agent.generate("Explain what the Perplexity Agent API is in two sentences.");
console.log(result.text);The agent supports both agent.generate(...) and agent.stream(...). See the Agent API quickstart for the full model list, built-in tools, and presets. For web-grounded answers, add the web_search tool (below).
Web-Grounded Answers
Section titled “Web-Grounded Answers”Add the web_search tool to ground the agent's answers in real-time results from Perplexity's web search. The @ai-sdk/open-responses provider sends a fixed request body and does not expose the Agent API's built-in tools as first-class options, so enable web_search by adding it to the body in the provider's fetch hook — every call the agent makes through this provider is then grounded:
import { Agent } from "@mastra/core/agent";
import { createOpenResponses } from "@ai-sdk/open-responses";
// The provider doesn't surface sources on the result, so capture them in the hook.
let sources = [];
const perplexity = createOpenResponses({
name: "perplexity",
url: "https://api.perplexity.ai/v1/responses",
apiKey: process.env.PERPLEXITY_API_KEY,
fetch: async (url, options) => {
const body = JSON.parse(options.body as string);
// Enable the built-in web_search tool by adding it to the request body.
body.tools = [{ type: "web_search" }];
const response = await fetch(url, { ...options, body: JSON.stringify(body) });
// Sources arrive as a separate `search_results` item in the response `output` array.
// (Skip for streaming, where the body is an event stream rather than JSON.)
if (!body.stream) {
const raw = await response.clone().json();
sources = raw.output
.filter((item) => item.type === "search_results")
.flatMap((item) => item.results); // each: { title, url, snippet, date, ... }
}
return response;
},
});
const agent = new Agent({
id: "research-agent",
name: "Research Agent",
instructions: "Answer questions with up-to-date information from the web.",
model: perplexity("openai/gpt-5.6-luna"),
});
const result = await agent.generate("What are the latest breakthroughs in fusion energy this year?");
console.log(result.text);
for (const source of sources) {
console.log(source.title, source.url);
}The answer is grounded server-side, but @ai-sdk/open-responses does not surface the sources on the result — result.sources is empty — so the fetch hook reads the raw search_results items directly. See Reading Sources from the Response for the full response shape.
Perplexity Search Tool
Section titled “Perplexity Search Tool”The @mastra/perplexity package wraps the Search API as a Mastra-compatible tool. Use this when you want raw ranked web results to feed into an agent.
npm install @mastra/perplexity zodimport { createPerplexitySearchTool } from "@mastra/perplexity";
const searchTool = createPerplexitySearchTool({
apiKey: process.env.PERPLEXITY_API_KEY,
});
const results = await searchTool.execute({
context: {
query: "Latest advances in nuclear fusion",
maxResults: 5,
searchRecencyFilter: "month",
},
});
for (const result of results) {
console.log(result.title, result.url);
}The tool ID is perplexity-search and supported input parameters include query, maxResults, searchDomainFilter, searchRecencyFilter, searchAfterDateFilter, and searchBeforeDateFilter. Each result includes title, url, snippet, and an optional date.
To register multiple Perplexity tools at once, use createPerplexityTools(config?). See the Mastra Perplexity tool reference for the full schema.
Links & Resources
Section titled “Links & Resources”Agent API Quickstart
Build with Agent API models, tools, and presets.
Perplexity SDK
Install and configure the official Perplexity SDK.
Perplexity Search Tool
Wrap the Perplexity Search API as a Mastra tool.
Mastra Docs
Learn more about agents, tools, and workflows in Mastra.
Support
Section titled “Support”Need help with the integration?
- Browse the Mastra documentation
- Review our FAQ