Loading...
Loading...
Use for creating websets, running searches, importing CSV data, managing items, and adding enrichments to extract structured data.
npx skill4agent add benjaminjackson/exa-skills exa-websets-search--helpexa-ai <command> --helpjq$(...)# Less reliable: nested command substitution
webset_id=$(exa-ai webset-create --search '{"query":"tech startups","count":1}' | jq -r '.webset_id')
# More reliable: run directly, then parse
exa-ai webset-create --search '{"query":"tech startups","count":1}'
# Then in a follow-up command if needed:
webset_id=$(cat output.json | jq -r '.webset_id')--waitexa-ai --helpjq| jq -r '.webset_id'companypersonarticleresearch_papercustomwebset_id=$(exa-ai webset-create \
--search '{"query":"AI startups in San Francisco","count":1}' | jq -r '.webset_id')exa-ai webset-create \
--search '{
"query": "Technology companies focused on developer tools",
"count": 1,
"entity": {
"type": "company"
},
"criteria": [
{
"description": "Companies with 50-500 employees indicating growth stage"
},
{
"description": "Primary product is developer tools, APIs, or infrastructure"
}
]
}'exa-ai webset-create \
--search '{
"query": "Nonprofits focused on economic justice",
"count": 1,
"entity": {
"type": "custom",
"description": "nonprofit"
},
"criteria": [
{
"description": "Primary focus on economic justice"
},
{
"description": "Annual operating budget between $1M and $10M"
}
]
}'import_id=$(exa-ai import-create companies.csv \
--count 100 \
--title "Companies" \
--format csv \
--entity-type company | jq -r '.import_id')
exa-ai webset-create --import $import_idwebset_id=$(exa-ai webset-create \
--search '{"query":"tech startups","count":1}' | jq -r '.webset_id')
exa-ai webset-item-list $webset_id# Expand to 2 results (use same query and criteria from validation)
exa-ai webset-search-create $webset_id \
--query "tech startups" \
--behavior override \
--count 2
exa-ai webset-item-list $webset_idexa-ai enrichment-create $webset_id \
--description "Company website" --format url --title "Website"
exa-ai enrichment-create $webset_id \
--description "Employee count" --format text --title "Team Size"exa-ai webset-list
exa-ai webset-get ws_abc123
exa-ai webset-update ws_abc123 --metadata '{"status":"active","owner":"team"}'
exa-ai webset-delete ws_abc123--behaviorwebset-search-create--behavior override--behavior# Step 1: Test search with criteria (MUST use override for first search)
exa-ai webset-search-create ws_abc123 \
--query "Progressive nonprofits in California" \
--behavior override \
--count 1 \
--criteria '[
{"description": "Annual budget between $1M and $10M"},
{"description": "Primary focus on economic justice, affordability, living wages, or worker power"},
{"description": "Established communications, narrative strategy, or messaging function"}
]'
# Verify quality, then append MORE results with IDENTICAL query and criteria
exa-ai webset-search-create ws_abc123 \
--query "Progressive nonprofits in California" \
--behavior append \
--count 5 \
--criteria '[
{"description": "Annual budget between $1M and $10M"},
{"description": "Primary focus on economic justice, affordability, living wages, or worker power"},
{"description": "Established communications, narrative strategy, or messaging function"}
]'# Create criteria file once
cat > criteria.json <<'EOF'
[
{"description": "Annual budget between $1M and $10M"},
{"description": "Primary focus on economic justice, affordability, living wages, or worker power"},
{"description": "Established communications, narrative strategy, or messaging function"}
]
EOF
# Use consistently across all searches (first search needs override)
exa-ai webset-search-create ws_abc123 \
--query "Progressive nonprofits in California" \
--behavior override \
--count 1 \
--criteria @criteria.json
exa-ai webset-search-create ws_abc123 \
--query "Progressive nonprofits in California" \
--behavior append \
--count 5 \
--criteria @criteria.json# First search on webset (must use override)
exa-ai webset-search-create ws_abc123 \
--query "AI startups in San Francisco" \
--behavior override \
--count 1
# Append to collection
exa-ai webset-search-create ws_abc123 \
--query "SaaS companies Series B" \
--behavior append \
--count 1
# Override collection
exa-ai webset-search-create ws_abc123 \
--query "top tech companies" \
--behavior override \
--count 1webset_id="ws_abc123"
search_id=$(exa-ai webset-search-create $webset_id \
--query "fintech startups" \
--behavior override \
--count 1 | jq -r '.search_id')
exa-ai webset-search-get $webset_id $search_id
exa-ai webset-search-cancel $webset_id $search_id# Create import
import_id=$(exa-ai import-create companies.csv \
--count 100 \
--title "Tech Companies" \
--format csv \
--entity-type company | jq -r '.import_id')
# Create webset from import
webset_id=$(exa-ai webset-create --import $import_id | jq -r '.webset_id')exa-ai import-create products.csv \
--count 5 \
--title "Product List" \
--format csv \
--entity-type custom \
--entity-description "Consumer electronics products"exa-ai import-list
exa-ai import-get imp_abc123--importsearch.scope# ❌ INVALID
exa-ai webset-create --import import_abc \
--search '{"scope":[{"source":"import","id":"import_abc"}]}'
# ✅ Scoped search only
exa-ai webset-create \
--search '{"query":"CEOs","scope":[{"source":"import","id":"import_abc"}]}'
# ✅ Relationship traversal
exa-ai webset-search-create ws_abc --query "investors" --behavior override \
--scope '[{"source":"webset","id":"webset_abc","relationship":{"definition":"investors of","limit":5}}]'# List items
exa-ai webset-item-list ws_abc123
exa-ai webset-item-list ws_abc123 --output-format pretty
# Get item details
exa-ai webset-item-get item_xyz789
# Delete item
exa-ai webset-item-delete item_xyz789# Get all item IDs
exa-ai webset-item-list ws_abc123 --output-format json | jq -r '.[].id'
# Count items
exa-ai webset-item-list ws_abc123 --output-format json | jq 'length'exa-ai enrichment-create --helpexa-ai enrichment-update --help# Text enrichment
exa-ai enrichment-create ws_abc123 \
--description "Number of employees as of latest data" \
--format text \
--title "Team Size"
# URL enrichment
exa-ai enrichment-create ws_abc123 \
--description "Primary company website URL" \
--format url \
--title "Website"
# Options enrichment
exa-ai enrichment-create ws_abc123 \
--description "Current funding stage" \
--format options \
--options '[
{"label":"Pre-seed"},
{"label":"Seed"},
{"label":"Series A"},
{"label":"Series B"},
{"label":"Series C+"},
{"label":"Public"}
]' \
--title "Funding Stage"cat > industries.json <<'EOF'
[
{"label": "SaaS"},
{"label": "Developer Tools"},
{"label": "AI/ML"},
{"label": "Fintech"},
{"label": "Healthcare"},
{"label": "Other"}
]
EOF
exa-ai enrichment-create ws_abc123 \
--description "Primary industry or sector" \
--format options \
--options @industries.json \
--title "Industry"exa-ai enrichment-create ws_abc123 \
--description "Technology stack" \
--format text \
--instructions "Focus only on backend technologies and databases. Ignore frontend frameworks." \
--title "Backend Tech"# List enrichments
exa-ai enrichment-list ws_abc123
exa-ai enrichment-list ws_abc123 --output-format pretty
# Get details
exa-ai enrichment-get ws_abc123 enr_xyz789
# Update extraction prompt (description)
exa-ai enrichment-update ws_abc123 enr_xyz789 \
--description "Exact employee count from most recent source"
# Update format and options
exa-ai enrichment-update ws_abc123 enr_xyz789 \
--format options \
--options '[{"label":"Small"},{"label":"Medium"},{"label":"Large"}]'
# Update metadata
exa-ai enrichment-update ws_abc123 enr_xyz789 \
--metadata '{"source":"manual","updated":"2024-01-15"}'
# Note: Cannot update --instructions or --title (creation-only parameters)
# To change instructions, delete and recreate the enrichment
# Delete
exa-ai enrichment-delete ws_abc123 enr_xyz789
# Cancel running enrichment
exa-ai enrichment-cancel ws_abc123 enr_xyz789--wait--behavior append--behavior override--behavior append--behavior override--modewebset-search-getjq--output-schema--summary-schema{"type":"object","properties":{"field_name":{"type":"string"}}}{"properties":{"field_name":{"type":"string"}}} // ❌ Missing "type":"object"# ✅ CORRECT - object wrapper included
exa-ai search "AI news" \
--summary-schema '{"type":"object","properties":{"headline":{"type":"string"}}}'
# ❌ WRONG - missing object wrapper
exa-ai search "AI news" \
--summary-schema '{"properties":{"headline":{"type":"string"}}}'toon# ❌ WRONG - toon is not JSON
exa-ai search "query" --output-format toon | jq -r '.results'
# ✅ CORRECT - use JSON (default) with jq
exa-ai search "query" | jq -r '.results[].title'
# ✅ CORRECT - use toon for direct reading only
exa-ai search "query" --output-format toonexa-ai search "query" --output-format toonexa-ai search "query" | jq -r '.results[].title'exa-ai search "query" --summary-schema '{...}' | jq -r '.results[].summary | fromjson'# ❌ WRONG - nested command substitution
webset_id=$(exa-ai webset-create --search '{"query":"..."}' | jq -r '.webset_id')
# ✅ CORRECT - run directly, then parse
exa-ai webset-create --search '{"query":"..."}'
# Then in a follow-up command:
webset_id=$(cat output.json | jq -r '.webset_id')$(...)# ❌ WRONG - deeply nested
result=$(exa-ai search "$(cat query.txt | tr '\n' ' ')" --num-results $(cat config.json | jq -r '.count'))
# ✅ CORRECT - sequential steps
query=$(cat query.txt | tr '\n' ' ')
count=$(cat config.json | jq -r '.count')
exa-ai search "$query" --num-results $count# ❌ Less maintainable - everything in one line
exa-ai webset-create --search '{"query":"startups","count":1}' | jq -r '.webset_id' | xargs -I {} exa-ai webset-search-create {} --query "AI" --behavior override
# ✅ More maintainable - clear steps
exa-ai webset-create --search '{"query":"startups","count":1}'
webset_id=$(jq -r '.webset_id' < output.json)
exa-ai webset-search-create $webset_id --query "AI" --behavior override