| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- #!/usr/bin/env python3
- """
- AI搜索工具
- 调用AI搜索回答用户问题,返回多模态参考源、总结答案和追问问题
- """
- import requests
- import json
- import os
- import argparse
- from datetime import datetime
- from typing import Dict, Any
- import sys
- from pathlib import Path
- # 添加项目根目录到路径并导入配置
- sys.path.insert(0, str(Path(__file__).parent.parent.parent))
- from lib.config import get_data_dir
- class AISearch:
- """AI搜索API封装类"""
- BASE_URL = "http://47.84.182.56:8001"
- TOOL_NAME = "ai_search"
- def __init__(self, results_dir: str = None):
- """
- 初始化API客户端
- Args:
- results_dir: 结果输出目录,默认为项目根目录下的 data/search 文件夹
- """
- self.api_url = f"{self.BASE_URL}/tools/call/{self.TOOL_NAME}"
- # 设置结果输出目录
- if results_dir:
- self.results_base_dir = results_dir
- else:
- # 默认从配置读取
- self.results_base_dir = get_data_dir("search")
- def search(self, query: str, timeout: int = 60) -> Dict[str, Any]:
- """
- 执行AI搜索
- Args:
- query: 搜索查询内容
- timeout: 请求超时时间(秒),默认60秒(AI搜索可能需要更长时间)
- Returns:
- API响应的JSON数据
- 返回数据中:
- - type=source: 参考源(网页、图片等)
- - type=answer: 总结答案
- - type=follow_up: 追问问题
- Raises:
- requests.exceptions.RequestException: 请求失败时抛出异常
- """
- payload = {
- "query": query
- }
- try:
- response = requests.post(
- self.api_url,
- json=payload,
- timeout=timeout,
- headers={"Content-Type": "application/json"}
- )
- response.raise_for_status()
- return response.json()
- except requests.exceptions.RequestException as e:
- print(f"请求失败: {e}")
- raise
- def save_result(self, query: str, result: Dict[str, Any]) -> str:
- """
- 保存结果到文件
- 目录结构: results/ai_search/query关键词/时间戳.json
- Args:
- query: 搜索查询内容
- result: API返回的结果
- Returns:
- 保存的文件路径
- """
- # 从query中提取简短的关键词作为文件夹名(取前20个字符)
- query_short = query[:20].replace('/', '_').replace('\\', '_')
- # 创建目录结构: results/ai_search/query/
- result_dir = os.path.join(self.results_base_dir, "ai_search", query_short)
- os.makedirs(result_dir, exist_ok=True)
- # 文件名使用时间戳
- timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
- filename = f"{timestamp}.json"
- filepath = os.path.join(result_dir, filename)
- # 保存结果
- with open(filepath, 'w', encoding='utf-8') as f:
- json.dump(result, f, ensure_ascii=False, indent=2)
- return filepath
- def main():
- """示例使用"""
- # 解析命令行参数
- parser = argparse.ArgumentParser(description='AI搜索工具')
- parser.add_argument(
- '--results-dir',
- type=str,
- default=None,
- help='结果输出目录 (默认: 从配置读取,通常为 data/search)'
- )
- parser.add_argument(
- '--query',
- type=str,
- required=True,
- help='搜索查询内容 (必填)'
- )
- args = parser.parse_args()
- # 创建API客户端实例
- client = AISearch(results_dir=args.results_dir)
- # 执行搜索并保存
- try:
- result = client.search(args.query)
- filepath = client.save_result(args.query, result)
- print(f"Output: {filepath}")
- except Exception as e:
- print(f"Error: {e}", file=__import__('sys').stderr)
- if __name__ == "__main__":
- main()
|