Universal research skill — multi-engine search + multi-layer fallback fetching + structured results.
research() action for search + fetch + fusiontext
┌─────────────────────────────────────────────┐
│ smart-research 统一入口 │
└─────────────────────────────────────────────┘
│
┌─────────────────┼─────────────────┐
▼ ▼ ▼
┌────────┐ ┌────────┐ ┌────────┐
│ Search │ │ Fetch │ │ Fusion │
│ Layer │ │ Layer │ │ Layer │
└────────┘ └────────┘ └────────┘
python
result = main({
"action": "research",
"query": "Python tutorial",
"num_results": 5,
"crawl_depth": 3
})
python
result = main({
"action": "search",
"query": "machine learning latest research",
"num_results": 5
})
python
result = main({
"action": "fetch",
"url": "https://example.com/article"
})
python
result = main({
"action": "deep_search",
"query": "AI agent trends 2024",
"num_results": 5
})
ParameterTypeRequiredDefaultDescriptionactionstringYes-Operation type: research, search, fetch, deep_search``querystringConditional-Search query (required for research/ search/ deep_search)urlstringConditional-Target URL (required for fetch)num_resultsintNo5Number of search results (1-20)crawl_depthintNo3Number of top results to fetch details (1-10)
json
{
"success": true,
"query": "Python tutorial",
"search_results": [
{
"title": "Result title",
"href": "https://example.com",
"body": "Snippet content",
"score": 85.5,
"source_type": "baidu",
"fetch_method": "crawl4ai",
"fetched_at": "2024-01-01T12:00:00Z"
}
],
"message": "Research completed"
}
json
{
"success": true,
"url": "https://example.com",
"content": "# Article Title\n\nClean markdown content...",
"source": "jina",
"fetched_at": "2024-01-01T12:00:00Z"
}
yaml
type: script
script_path: scripts/smart_research.py
entry_point: main
dependencies:
- uv>=0.1.0
- requests>=2.28.0
- baidusearch>=1.0.3
- crawl4ai>=0.8.0
- playwright>=1.40.0
Each URL automatically tries:
PriorityServiceTimeoutDescription1crawl4ai15sAI-powered, local2Jina Reader10sFree, no key needed3markdown.new8sSimple pages4defuddle8sBetter noise reduction5Playwright30sDynamic rendering
{"success": false, "message": "..."} on errors