Skill: hyqdq888/research-analyzer (version 1.0.2)

--- name: research-analyzer description: 综合研究分析工具 - 基于 Tavily API 的智能搜索和报告生成，支持深度研究、竞品分析、技术调研 homepage: https://github.com/openclaw/research-analyzer metadata: {"openclaw":{"emoji":"🔬","requires":{"bins":["node"],"env":["TAVILY_API_KEY"]},"primaryEnv":"TAVILY_API_KEY"}} --- # Research Analyzer 🔬 基于 Tavily API 的一站式研究分析工具，智能搜索网络信息并生成结构化研究报告。 ## 功能特性 - 🔍 **智能搜索** - Tavily 网络搜索，LLM 优化结果 - 📊 **数据分析** - 自动提取关键信息和趋势 - 📝 **报告生成** - 结构化研究报告输出 - 🌐 **双语支持** - 中英文混合搜索和分析 ## 快速开始 ### 基础研究 ```bash node {baseDir}/scripts/research.mjs "研究主题" ``` ### 深度研究 ```bash node {baseDir}/scripts/research.mjs "研究主题" --deep --output report.md ``` ## 使用场景 ### 场景1：市场研究 ```bash node scripts/research.mjs "AI Agent 市场趋势 2025" --deep ``` ### 场景2：深度研究 ```bash node scripts/research.mjs "机器学习在医疗诊断中的应用" --deep --output medical_ai_report.md ``` ### 场景3：竞品分析 ```bash node scripts/research.mjs "OpenAI vs Claude vs Gemini 对比分析" ``` ### 场景4：技术调研 ```bash node scripts/research.mjs "Rust vs Go 性能对比" ``` ## 参数说明 | 参数 | 说明 | 默认值 | |------|------|--------| | `--deep` | 深度搜索模式 | false | | `--output <file>` | 输出文件 | 控制台 | | `--max-results <n>` | 最大结果数 | 10 | ## 输出格式 ### 标准报告 ```markdown # 研究报告: [主题] ## 执行摘要 ... ## 关键发现 ... ## 数据来源 ... ## 结论与建议 ... ``` ## 依赖配置 需要设置 Tavily API Key（仅通过环境变量）： ```bash export TAVILY_API_KEY="tvly-xxx" ``` **安全说明**: - API Key 仅通过环境变量读取 - 不会读取任何本地配置文件 - 不会访问用户敏感目录 ## 许可 MIT License

path: scripts/research.mjs
content: #!/usr/bin/env node
/**
 * Research Analyzer - 智能研究分析工具
 * 基于 Tavily API 的网络搜索和报告生成
 */

import fs from 'fs';

// 解析参数
const args = process.argv.slice(2);
if (args.length === 0 || args[0] === '-h' || args[0] === '--help') {
  console.log(`Usage: research.mjs "query" [options]

Options:
  --deep              深度搜索模式 (获取更详细内容)
  --output <file>     输出文件路径
  --max-results <n>   最大结果数 (默认: 10, 最大: 20)

Examples:
  research.mjs "AI trends 2025"
  research.mjs "machine learning" --deep
  research.mjs "Rust vs Go" --deep --output report.md
`);
  process.exit(0);
}

const query = args[0];
const options = {
  deep: args.includes('--deep'),
  maxResults: 10
};

// 解析 max-results
const maxResultsIdx = args.indexOf('--max-results');
if (maxResultsIdx !== -1 && args[maxResultsIdx + 1]) {
  options.maxResults = parseInt(args[maxResultsIdx + 1], 10) || 10;
}

// 解析 output
const outputIdx = args.indexOf('--output');
const outputFile = outputIdx !== -1 ? args[outputIdx + 1] : null;

console.log(`🔬 Research Analyzer`);
console.log(`Query: ${query}`);
console.log(`Mode: ${options.deep ? '深度' : '标准'}\n`);

// 检查 API Key - 只从环境变量读取
const [REDACTED_SECRET]);

if (!apiKey) {
  console.error('Error: TAVILY_API_KEY environment variable not set');
  console.error('Please set your Tavily API key:');
  console.error('  export TAVILY_API_KEY="tvly-your-api-key"');
  console.error('Get your API key at https://tavily.com');
  process.exit(1);
}



// 执行搜索
async function performSearch() {
  try {
    const searchDepth = options.deep ? 'advanced' : 'basic';
    
    const body = {
      query: query,
      max_results: Math.min(options.maxResults, 20),
      search_depth: searchDepth,
      topic: 'general',
      include_raw_content: options.deep
    };

    console.log('🔍 Searching...');
    
    const resp = await fetch('https://api.tavily.com/search', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'Authorization': `Bearer ${apiKey}`
      },
      body: JSON.stringify(body)
    });

    if (!resp.ok) {
      const text = await resp.text().catch(() => '');
      throw new Error(`Search failed (${resp.status}): ${text}`);
    }

    const data = await resp.json();
    return data;
  } catch (error) {
    console.error('Search error:', error.message);
    process.exit(1);
  }
}

// 生成报告
function generateReport(query, data, options) {
  const results = data.results || [];
  const answer = data.answer || '';
  
  let report = `# 研究报告: ${query}\n\n`;
  
  // 执行摘要
  report += `## 执行摘要\n\n`;
  if (answer) {
    report += `${answer}\n\n`;
  } else {
    report += `本报告基于 ${results.length} 个来源，对「${query}」进行了${options.deep ? '深度' : '标准'}研究分析。\n\n`;
  }
  
  // 关键发现
  report += `## 关键发现\n\n`;
  if (results.length > 0) {
    results.slice(0, 5).forEach((r, i) => {
      const title = r.title || '无标题';
      const content = r.content ? r.content.slice(0, 200) + '...' : '无内容';
      report += `${i + 1}. **${title}**\n   ${content}\n\n`;
    });
  } else {
    report += `未找到相关结果。\n\n`;
  }
  
  // 数据来源
  report += `## 数据来源\n\n`;
  results.forEach((r, i) => {
    report += `${i + 1}. [${r.title || '无标题'}](${r.url || ''})\n`;
  });
  
  // 研究元数据
  report += `\n## 研究元数据\n\n`;
  report += `- 搜索模式: ${options.deep ? '深度' : '标准'}\n`;
  report += `- 结果数量: ${results.length}\n`;
  report += `- 响应时间: ${data.response_time || 'N/A'}s\n`;
  report += `- 生成时间: ${new Date().toLocaleString()}\n`;
  
  return report;
}

// 主函数
async function main() {
  const data = await performSearch();
  const report = generateReport(query, data, options);
  
  if (outputFile) {
    fs.writeFileSync(outputFile, report, 'utf-8');
    console.log(`✅ 报告已保存: ${outputFile}`);
  } else {
    console.log('\n' + '='.repeat(60));
    console.log(report);
  }
}

main();


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: clean (LOW)