feat(skills): add DuckDuckGo search skill as Firecrawl fallback

This commit is contained in:
Aayush Chaudhary
2026-03-02 09:08:59 +05:30
parent 8bc2de4ab6
commit c2d8d17285
2 changed files with 165 additions and 0 deletions

View File

@@ -0,0 +1,133 @@
---
name: duckduckgo-search
description: Get web search results from DuckDuckGo. Use as fallback when Firecrawl unavailable. No API key needed.
version: 1.0.0
author: Hermes Agent
license: MIT
metadata:
hermes:
tags: [Search, DuckDuckGo, Web Search, API, Free]
related_skills: [arxiv, ocr-and-documents]
---
# DuckDuckGo Search
Fast, free web search. No API key required. Use when Firecrawl is unavailable.
## Quick Reference
| Action | Command |
|--------|---------|
| Web search | `ddgs text "python async" -k 5` |
| Images | `ddgs images "cat"` |
| News | `ddgs news "AI"` |
| Videos | `ddgs videos "tutorial"` |
| **Curl fallback** | `curl "https://api.duckduckgo.com/?q=QUERY&format=json"` |
## Prerequisites
### Option 1: Python Library (Recommended)
```bash
pip install ddgs
ddgs --help
```
### Option 2: Curl Only (No Dependencies)
```bash
# Verify curl is available
curl --version
```
No installation needed — curl is standard on all platforms.
## Web Search
### Library (ddgs)
```bash
# Basic search
ddgs text "python async programming" -k 5
# With region filter
ddgs text "best restaurants Tokyo" -k 3 -r jp-jp
# Safe search
ddgs text "medical advice" -k 5 -s off
```
### Parameters
| Flag | Description | Example |
|------|-------------|---------|
| `-k` | Max results | `-k 5` |
| `-r` | Region | `-r us-en` |
| `-s` | Safe search | `-s off` |
### Curl Fallback
```bash
# Basic search
curl -s "https://api.duckduckgo.com/?q=python+async&format=json&limit=5"
# Parse results
curl -s "..." | jq -r '.RelatedTopics[] | "\(.Text) - \(.FirstURL)"'
```
## Other Search Types
```bash
# Images
ddgs images "landscape" -k 10
# News
ddgs news "artificial intelligence" -k 5
# Videos
ddgs videos "python tutorial" -k 5
```
## Integration
After finding URLs, retrieve full content with `web_extract`:
```bash
# Find with DDG, then extract
ddgs text "fastapi tutorial" -k 3
# Copy URL from output
web_extract(urls=["https://fastapi.tiangolo.com/tutorial/"])
```
This is the standard pattern:
1. **DuckDuckGo** → finds URLs
2. **web_extract** → retrieves full content
## Use Cases
| Scenario | Tool | Reason |
|----------|------|--------|
| "Find tutorials on X" | `ddgs text` + `web_extract` | Need full content |
| Firecrawl unavailable | `ddgs text` | Free fallback |
| Quick image search | `ddgs images` | Find images |
| Latest news | `ddgs news` | News results |
## Error Handling
```bash
# Check if library installed
ddgs --help 2>/dev/null || echo "Using curl fallback"
# Rate limiting - add delay
sleep 1
# No results - try different query
ddgs text "different keywords" -k 5
```
## Notes
- **No API key required** — completely free
- **Rate limit**: ~1 request/second recommended
- **Always follow up** with `web_extract` for full content
- Curl fallback has limited results (DDG API restrictions)

View File

@@ -0,0 +1,32 @@
#!/bin/bash
# DuckDuckGo Search Helper Script
# Fallback for when ddgs library is unavailable
# Usage: ./duckduckgo.sh [text|images|news|videos] <query> [limit]
set -e
MODE="${1:-text}"
QUERY="$2"
LIMIT="${3:-5}"
if [ -z "$QUERY" ]; then
echo "Usage: $0 [text|images|news|videos] <query> [limit]"
echo "Examples:"
echo " $0 text 'python async' 5"
echo " $0 images 'cat' 10"
exit 1
fi
# URL encode query
ENCODED_QUERY=$(echo "$QUERY" | sed 's/ /+/g' | sed 's/&/%26/g' | sed 's/=/%3D/g')
case "$MODE" in
text|images|news|videos)
curl -s "https://api.duckduckgo.com/?q=${ENCODED_QUERY}&format=json&limit=${LIMIT}"
;;
*)
echo "Unknown mode: $MODE"
echo "Valid modes: text, images, news, videos"
exit 1
;;
esac