Skip to main content
Perplexity

Search documentation

Type to search this documentation.

On this pageOverview

Perplexity with Mastra

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 Agent through the Open Responses provider.
  • Perplexity Search tool — Expose the Search API as a Mastra tool for ranked web results.

Both integrations read your Perplexity API key from the environment:

Bash
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.

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:

Bash
npm install @mastra/core @ai-sdk/open-responses
TypeScript
import { 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).

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:

TypeScript
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.

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.

Bash
npm install @mastra/perplexity zod
TypeScript
import { 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.

Need help with the integration?

Suggest an edit

Propose a replacement for this page. The site team reviews it before applying any changes.

Export
Documentation menu