perplexity-core-workflow-b
Performs deep research using multi-turn Perplexity queries and synthesizes structured reports.
Install
mkdir -p .claude/skills/perplexity-core-workflow-b && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/7739" && unzip -o skill.zip -d .claude/skills/perplexity-core-workflow-b && rm skill.zipInstalls to .claude/skills/perplexity-core-workflow-b
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.
Execute Perplexity multi-turn research sessions and batch query pipelines.Key capabilities
- →Decompose a broad topic into focused sub-queries
- →Run multi-turn research sessions with context continuity
- →Deduplicate citations across a research session
- →Synthesize a structured research document
- →Compile a bibliography of all cited sources
- →Track token usage for cost analysis
How it works
This skill decomposes a broad research topic into specific questions, then conducts multi-turn research using the Perplexity Sonar API. It maintains conversation context, deduplicates citations, and compiles the results into a structured Markdown report.
Inputs & outputs
When to use perplexity-core-workflow-b
- →Generating deep-dive research briefs
- →Batch processing search queries
- →Conducting multi-turn research sessions
- →Synthesizing search results into reports
About this skill
Perplexity Core Workflow B: Multi-Query Research
Overview
Multi-turn research workflow using Perplexity Sonar API. Decomposes a broad topic into focused sub-queries, runs them with context continuity, deduplicates citations, and synthesizes a structured research document. Use sonar for fast passes and sonar-pro for deep dives.
Prerequisites
- Completed
perplexity-install-authsetup - Familiarity with
perplexity-core-workflow-a PERPLEXITY_API_KEYset
Instructions
Step 1: Conversational Research Session
import OpenAI from "openai";
const perplexity = new OpenAI({
apiKey: process.env.PERPLEXITY_API_KEY,
baseURL: "https://api.perplexity.ai",
});
type Message = OpenAI.ChatCompletionMessageParam;
class ResearchSession {
private messages: Message[] = [];
private allCitations: Set<string> = new Set();
constructor(systemPrompt: string = "You are a research assistant. Provide thorough, cited answers.") {
this.messages.push({ role: "system", content: systemPrompt });
}
async ask(question: string, model: "sonar" | "sonar-pro" = "sonar"): Promise<{
answer: string;
citations: string[];
}> {
this.messages.push({ role: "user", content: question });
const response = await perplexity.chat.completions.create({
model,
messages: this.messages,
} as any);
const answer = response.choices[0].message.content || "";
const citations = (response as any).citations || [];
// Maintain conversation context
this.messages.push({ role: "assistant", content: answer });
// Accumulate all citations across the session
citations.forEach((url: string) => this.allCitations.add(url));
return { answer, citations };
}
getAllCitations(): string[] {
return [...this.allCitations];
}
// Keep context manageable (Perplexity searches per turn)
trimHistory(keepLast: number = 6) {
const system = this.messages[0];
const recent = this.messages.slice(-(keepLast * 2));
this.messages = [system, ...recent];
}
}
Step 2: Batch Query Pipeline
interface ResearchPlan {
topic: string;
questions: string[];
}
interface ResearchReport {
topic: string;
sections: Array<{ question: string; answer: string; citations: string[] }>;
allCitations: string[];
totalTokens: number;
}
async function conductResearch(plan: ResearchPlan): Promise<ResearchReport> {
const sections: ResearchReport["sections"] = [];
const allCitations = new Set<string>();
let totalTokens = 0;
for (const question of plan.questions) {
const response = await perplexity.chat.completions.create({
model: "sonar-pro", // deeper research for each sub-question
messages: [
{ role: "system", content: `Research context: ${plan.topic}` },
{ role: "user", content: question },
],
} as any);
const answer = response.choices[0].message.content || "";
const citations = (response as any).citations || [];
sections.push({ question, answer, citations });
citations.forEach((url: string) => allCitations.add(url));
totalTokens += response.usage?.total_tokens || 0;
// Rate limit protection: 50 RPM for most tiers
await new Promise((r) => setTimeout(r, 1500));
}
return {
topic: plan.topic,
sections,
allCitations: [...allCitations],
totalTokens,
};
}
Step 3: Topic Decomposition
async function decomposeTopic(topic: string): Promise<string[]> {
const response = await perplexity.chat.completions.create({
model: "sonar",
messages: [
{
role: "system",
content: "Break this research topic into 4-6 specific, focused questions. Return one question per line, no numbering.",
},
{ role: "user", content: topic },
],
max_tokens: 500,
});
return (response.choices[0].message.content || "")
.split("\n")
.map((q) => q.trim())
.filter((q) => q.length > 10);
}
Step 4: Compile Research Report
function compileReport(report: ResearchReport): string {
let md = `# Research: ${report.topic}\n\n`;
for (const section of report.sections) {
md += `## ${section.question}\n\n`;
md += `${section.answer}\n\n`;
}
md += `## Bibliography\n\n`;
report.allCitations.forEach((url, i) => {
md += `${i + 1}. ${url}\n`;
});
md += `\n---\n`;
md += `*${report.sections.length} queries | ${report.allCitations.length} unique sources | ${report.totalTokens} tokens*\n`;
return md;
}
Step 5: Full Pipeline
async function researchTopic(topic: string): Promise<string> {
console.log(`Decomposing: ${topic}`);
const questions = await decomposeTopic(topic);
console.log(`Generated ${questions.length} sub-questions`);
const report = await conductResearch({ topic, questions });
console.log(`Found ${report.allCitations.length} unique sources`);
return compileReport(report);
}
// Usage
const markdown = await researchTopic("Impact of AI on drug discovery in 2025");
console.log(markdown);
Step 6: Python Multi-Query Research
import asyncio, os
from openai import OpenAI
client = OpenAI(api_key=os.environ["PERPLEXITY_API_KEY"], base_url="https://api.perplexity.ai")
def research_topic(topic: str, questions: list[str]) -> dict:
sections = []
all_citations = set()
for q in questions:
r = client.chat.completions.create(
model="sonar-pro",
messages=[
{"role": "system", "content": f"Research context: {topic}"},
{"role": "user", "content": q},
],
)
raw = r.model_dump()
citations = raw.get("citations", [])
sections.append({"question": q, "answer": r.choices[0].message.content, "citations": citations})
all_citations.update(citations)
return {"topic": topic, "sections": sections, "citations": list(all_citations)}
Error Handling
| Error | Cause | Solution |
|---|---|---|
429 Too Many Requests | Batch queries too fast | Add 1-2s delay between queries |
| Context overflow | Too many conversation turns | Call trimHistory() to keep last 6 turns |
| Contradictory answers | Different sources disagree | Flag contradictions for manual review |
| High cost | Using sonar-pro for all queries | Use sonar for decomposition, sonar-pro for deep dives |
Output
- Structured research document with multiple sections
- Consolidated bibliography of all cited sources
- Token usage for cost tracking
- Conversation session with context continuity
Resources
Next Steps
For common errors, see perplexity-common-errors.
When not to use it
- →When only a single, simple query is needed
- →When real-time, low-latency responses are critical
- →When manual review of every search result is preferred
Prerequisites
Limitations
- →Batch queries too fast can result in '429 Too Many Requests' errors
- →Too many conversation turns can lead to context overflow
- →Contradictory answers from different sources may require manual review
How it compares
This workflow automates the decomposition of topics and synthesis of multi-turn search results into a coherent document, unlike performing individual searches and manually compiling information.
Compared to similar skills
perplexity-core-workflow-b side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| perplexity-core-workflow-b (this skill) | 1 | 27d | Review | Intermediate |
| literature-review | 559 | 2mo | Review | Advanced |
| pi-share | 1 | 5mo | Review | Beginner |
| comprehensive-research-agent | 1 | 1mo | No flags | Advanced |
Try saying
Example prompts that trigger this skill in your AI assistant.
More by jeremylongshore
View all by jeremylongshore →You might also like
literature-review
K-Dense-AI
Conduct comprehensive, systematic literature reviews using multiple academic databases (PubMed, arXiv, bioRxiv, Semantic Scholar, etc.). This skill should be used when conducting systematic literature reviews, meta-analyses, research synthesis, or comprehensive literature searches across biomedical, scientific, and technical domains. Creates professionally formatted markdown documents and PDFs with verified citations in multiple citation styles (APA, Nature, Vancouver, etc.).
pi-share
mitsuhiko
Load and parse session transcripts from shittycodingagent.ai/buildwithpi.ai/buildwithpi.com (pi-share) URLs. Fetches gists, decodes embedded session data, and extracts conversation history.
comprehensive-research-agent
muratcankoylan
Ensure thorough validation, error recovery, and transparent reasoning in research tasks with multiple tool calls
claim-extraction
grammy-jiang
Extract atomic, typed, source-anchored claims from ingested sources into analysis/claims.jsonl (claims-v1). Two-stage: LLM check-worthiness detection, then JSON decomposition + classification. Tier 1+.
deep-research
richardnguyen0715
Universal deep research agent team. 13-agent pipeline for rigorous academic research on any topic. 7 modes: full research, quick brief, paper review, lit-review, fact-check, Socratic guided research dialogue, and systematic review with optional meta-analysis. Covers research question formulation, So
jupyter-notebook
davila7
Use when the user asks to create, scaffold, or edit Jupyter notebooks (`.ipynb`) for experiments, explorations, or tutorials; prefer the bundled templates and run the helper script `new_notebook.py` to generate a clean starting notebook.