EX

exa-core-workflow-b

Adds secondary Exa workflows including semantic similarity searches, content fetching, and AI-generated answers.

Install

mkdir -p .claude/skills/exa-core-workflow-b && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/8173" && unzip -o skill.zip -d .claude/skills/exa-core-workflow-b && rm skill.zip

Installs to .claude/skills/exa-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 Exa findSimilar, getContents, answer, and streaming answer workflows.
77 charsno explicit “when” trigger
Intermediate

Key capabilities

  • Discover pages semantically related to a URL
  • Retrieve text and highlights for known URLs
  • Generate AI answers with web citations
  • Stream answer chunks for real-time display

How it works

The workflow utilizes specific Exa endpoints like findSimilar, getContents, and answer to process URLs or generate AI responses based on web data.

Inputs & outputs

You give it
Seed URL or list of URLs
You get back
Similar pages, page content, or AI-generated answers

When to use exa-core-workflow-b

  • Finding semantically similar pages
  • Retrieving website content for processing
  • Generating AI answers with citations
  • Executing similarity searches

About this skill

Exa Core Workflow B — Similarity, Contents & Answer

Overview

Secondary Exa workflow covering three endpoints beyond search: findSimilar (discover pages semantically related to a URL), getContents (retrieve text/highlights for known URLs), and answer (get AI-generated answers with web citations). These complement the primary search workflow in exa-core-workflow-a.

Prerequisites

  • exa-js installed and EXA_API_KEY configured
  • Familiarity with exa-core-workflow-a search patterns

Instructions

Step 1: Find Similar Pages

import Exa from "exa-js";

const exa = new Exa(process.env.EXA_API_KEY);

// findSimilar takes a URL (not a query string) and returns
// pages with semantically similar content
const similar = await exa.findSimilar(
  "https://openai.com/research/gpt-4",
  {
    numResults: 10,
    excludeSourceDomain: true, // exclude openai.com from results
    startPublishedDate: "2024-01-01T00:00:00.000Z",
    excludeDomains: ["reddit.com", "twitter.com"],
  }
);

for (const r of similar.results) {
  console.log(`${r.title} — ${r.url}`);
}

Step 2: Find Similar with Contents

// findSimilarAndContents combines similarity search + content extraction
const results = await exa.findSimilarAndContents(
  "https://huggingface.co/blog/llama3",
  {
    numResults: 5,
    text: { maxCharacters: 2000 },
    highlights: { maxCharacters: 500, query: "open source LLM" },
    excludeSourceDomain: true,
  }
);

for (const r of results.results) {
  console.log(`## ${r.title}`);
  console.log(`URL: ${r.url}`);
  console.log(`Highlights: ${r.highlights?.join(" | ")}`);
  console.log(`Text preview: ${r.text?.substring(0, 300)}...\n`);
}

Step 3: Get Contents for Known URLs

// getContents retrieves page content for a list of URLs you already have
// Useful when you have URLs from a previous search or external source
const contents = await exa.getContents(
  [
    "https://arxiv.org/abs/2401.00001",
    "https://arxiv.org/abs/2401.00002",
    "https://blog.example.com/article",
  ],
  {
    text: { maxCharacters: 3000 },
    highlights: { maxCharacters: 500 },
    summary: { query: "key findings and methodology" },
    livecrawl: "preferred",     // try fresh, fall back to cache
    livecrawlTimeout: 15000,    // 15s timeout
    // Subpage crawling: retrieve linked pages from each URL
    subpages: 3,                // crawl up to 3 subpages per URL
    subpageTarget: "documentation",  // find subpages matching this term
  }
);

for (const r of contents.results) {
  console.log(`${r.title}: ${r.text?.length || 0} chars`);
  if (r.summary) console.log(`Summary: ${r.summary}`);
}

Step 4: AI-Powered Answer with Citations

// answer() searches the web and returns an AI-generated answer with sources
const answer = await exa.answer(
  "What are the key differences between RAG and fine-tuning for LLMs?",
  {
    text: true,
    // The answer response includes citations linking to source results
  }
);

console.log("Answer:", answer.answer);
console.log("\nSources:");
for (const r of answer.results) {
  console.log(`  - ${r.title}: ${r.url}`);
}

Step 5: Streaming Answer

// streamAnswer returns chunks as they're generated
for await (const chunk of exa.streamAnswer(
  "What is the current state of quantum computing in 2025?"
)) {
  if (chunk.content) {
    process.stdout.write(chunk.content);
  }
  if (chunk.citations) {
    console.log("\n\nCitations:", JSON.stringify(chunk.citations, null, 2));
  }
}

Output

  • Similar pages discovered from a seed URL
  • Page content (text, highlights, summary) for known URLs
  • AI-generated answers with web source citations
  • Streaming answer chunks for real-time display

Error Handling

ErrorHTTP CodeCauseSolution
INVALID_URLS400Malformed URLs in getContentsValidate URLs have protocol
CRAWL_NOT_FOUND404Content unavailable at URLVerify URL is accessible
CRAWL_TIMEOUT504Live crawl exceeded timeoutIncrease livecrawlTimeout
SOURCE_NOT_AVAILABLE403Paywalled or blocked contentTry without livecrawl: "always"
UNABLE_TO_GENERATE_RESPONSE501Insufficient data for answerRephrase query or add context
Empty similar.results200Seed URL not indexedTry a more popular seed URL

Examples

Competitive Intelligence Pipeline

async function findCompetitors(companyUrl: string) {
  // Find companies similar to a given company
  const similar = await exa.findSimilarAndContents(companyUrl, {
    numResults: 10,
    excludeSourceDomain: true,
    text: { maxCharacters: 500 },
    category: "company",
  });

  return similar.results.map(r => ({
    name: r.title,
    url: r.url,
    description: r.text?.substring(0, 200),
  }));
}

Batch URL Content Retrieval

async function enrichUrls(urls: string[]) {
  // Process URLs in batches to stay within rate limits
  const batchSize = 10;
  const allContents = [];

  for (let i = 0; i < urls.length; i += batchSize) {
    const batch = urls.slice(i, i + batchSize);
    const contents = await exa.getContents(batch, {
      text: { maxCharacters: 1500 },
      summary: { query: "main topic and key points" },
    });
    allContents.push(...contents.results);
  }

  return allContents;
}

Resources

Next Steps

For common errors, see exa-common-errors. For SDK patterns, see exa-sdk-patterns.

When not to use it

  • When performing primary search queries
  • When URLs are malformed or inaccessible

Prerequisites

exa-js installedEXA_API_KEY configured

Limitations

  • Seed URL must be indexed for similarity search
  • Live crawls may timeout if content is unavailable

How it compares

This workflow provides specialized endpoints for content retrieval and similarity analysis beyond standard keyword search.

Compared to similar skills

exa-core-workflow-b side by side with the closest alternatives in the catalog.

SkillInstallsUpdatedSafetyDifficulty
exa-core-workflow-b (this skill)027dReviewIntermediate
oRPC AI SDK Integration03moNo flagsIntermediate
add-ai-endpoint04moReviewIntermediate
llm-what-to-use-when05moCautionIntermediate

Try saying

Example prompts that trigger this skill in your AI assistant.

More by jeremylongshore

View all by jeremylongshore

analyzing-logs

jeremylongshore

Analyze application logs to detect performance issues, identify error patterns, and improve stability by extracting key insights.

14123

ollama-setup

jeremylongshore

Configure auto-configure Ollama when user needs local LLM deployment, free AI alternatives, or wants to eliminate hosted API costs. Trigger phrases: "install ollama", "local AI", "free LLM", "self-hosted AI", "replace OpenAI", "no API costs". Use when appropriate context detected. Trigger with relevant phrases based on skill purpose.

1167

backtesting-trading-strategies

jeremylongshore

Backtest crypto and traditional trading strategies against historical data. Calculates performance metrics (Sharpe, Sortino, max drawdown), generates equity curves, and optimizes strategy parameters. Use when user wants to test a trading strategy, validate signals, or compare approaches. Trigger with phrases like "backtest strategy", "test trading strategy", "historical performance", "simulate trades", "optimize parameters", or "validate signals".

1071

generating-database-seed-data

jeremylongshore

Process this skill enables AI assistant to generate realistic test data and database seed scripts for development and testing environments. it uses faker libraries to create realistic data, maintains relational integrity, and allows configurable data volumes. u... Use when working with databases or data models. Trigger with phrases like 'database', 'query', or 'schema'.

1033

cursor-codebase-indexing

jeremylongshore

Execute set up and optimize Cursor codebase indexing. Triggers on "cursor index setup", "codebase indexing", "index codebase", "cursor semantic search". Use when working with cursor codebase indexing functionality. Trigger with phrases like "cursor codebase indexing", "cursor indexing", "cursor".

885

testing-mobile-apps

jeremylongshore

Execute mobile app testing on iOS and Android devices/simulators. Use when performing specialized testing. Trigger with phrases like "test mobile app", "run iOS tests", or "validate Android functionality".

810

You might also like

oRPC AI SDK Integration

ali-master

Seamlessly use AI SDK inside your oRPC projects without any extra overhead.

00

add-ai-endpoint

malhajri07

Scaffold a Claude API powered endpoint with system prompt, structured output, token tracking, and rate limiting. Use when adding AI features like chatbot, matching, or text generation.

00

llm-what-to-use-when

TimelessP

Practical decision guide for choosing between Vercel AI SDK, LiteLLM, LightLLM, and direct provider SDKs based on runtime, deployment model, and constraints. Use when asked which LLM tooling to use for JS/TS apps, Python apps, static SPAs, or self-hosted inference.

00

mcp-builder

anthropics

Guide for creating high-quality MCP (Model Context Protocol) servers that enable LLMs to interact with external services through well-designed tools. Use when building MCP servers to integrate external APIs or services, whether in Python (FastMCP) or Node/TypeScript (MCP SDK).

136215

telegram-mini-app

davila7

Expert in building Telegram Mini Apps (TWA) - web apps that run inside Telegram with native-like experience. Covers the TON ecosystem, Telegram Web App API, payments, user authentication, and building viral mini apps that monetize. Use when: telegram mini app, TWA, telegram web app, TON app, mini app.

62163

stripe-integration

wshobson

Implement Stripe payment processing for robust, PCI-compliant payment flows including checkout, subscriptions, and webhooks. Use when integrating Stripe payments, building subscription systems, or implementing secure checkout flows.

48165

Search skills

Search the agent skills registry