ai_search.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. #!/usr/bin/env python3
  2. """
  3. AI搜索工具
  4. 调用AI搜索回答用户问题,返回多模态参考源、总结答案和追问问题
  5. """
  6. import requests
  7. import json
  8. import os
  9. import argparse
  10. from datetime import datetime
  11. from typing import Dict, Any
  12. class AISearch:
  13. """AI搜索API封装类"""
  14. BASE_URL = "http://47.84.182.56:8001"
  15. TOOL_NAME = "ai_search"
  16. def __init__(self, results_dir: str = None):
  17. """
  18. 初始化API客户端
  19. Args:
  20. results_dir: 结果输出目录,默认为项目根目录下的 data/search 文件夹
  21. """
  22. self.api_url = f"{self.BASE_URL}/tools/call/{self.TOOL_NAME}"
  23. # 设置结果输出目录
  24. if results_dir:
  25. self.results_base_dir = results_dir
  26. else:
  27. # 默认使用项目根目录的 data/search 文件夹
  28. script_dir = os.path.dirname(os.path.abspath(__file__))
  29. project_root = os.path.dirname(os.path.dirname(script_dir))
  30. self.results_base_dir = os.path.join(project_root, "data", "search")
  31. def search(self, query: str, timeout: int = 60) -> Dict[str, Any]:
  32. """
  33. 执行AI搜索
  34. Args:
  35. query: 搜索查询内容
  36. timeout: 请求超时时间(秒),默认60秒(AI搜索可能需要更长时间)
  37. Returns:
  38. API响应的JSON数据
  39. 返回数据中:
  40. - type=source: 参考源(网页、图片等)
  41. - type=answer: 总结答案
  42. - type=follow_up: 追问问题
  43. Raises:
  44. requests.exceptions.RequestException: 请求失败时抛出异常
  45. """
  46. payload = {
  47. "query": query
  48. }
  49. try:
  50. response = requests.post(
  51. self.api_url,
  52. json=payload,
  53. timeout=timeout,
  54. headers={"Content-Type": "application/json"}
  55. )
  56. response.raise_for_status()
  57. return response.json()
  58. except requests.exceptions.RequestException as e:
  59. print(f"请求失败: {e}")
  60. raise
  61. def save_result(self, query: str, result: Dict[str, Any]) -> str:
  62. """
  63. 保存结果到文件
  64. 目录结构: results/ai_search/query关键词/时间戳.json
  65. Args:
  66. query: 搜索查询内容
  67. result: API返回的结果
  68. Returns:
  69. 保存的文件路径
  70. """
  71. # 从query中提取简短的关键词作为文件夹名(取前20个字符)
  72. query_short = query[:20].replace('/', '_').replace('\\', '_')
  73. # 创建目录结构: results/ai_search/query/
  74. result_dir = os.path.join(self.results_base_dir, "ai_search", query_short)
  75. os.makedirs(result_dir, exist_ok=True)
  76. # 文件名使用时间戳
  77. timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
  78. filename = f"{timestamp}.json"
  79. filepath = os.path.join(result_dir, filename)
  80. # 保存结果
  81. with open(filepath, 'w', encoding='utf-8') as f:
  82. json.dump(result, f, ensure_ascii=False, indent=2)
  83. return filepath
  84. def main():
  85. """示例使用"""
  86. # 解析命令行参数
  87. parser = argparse.ArgumentParser(description='AI搜索工具')
  88. parser.add_argument(
  89. '--results-dir',
  90. type=str,
  91. default='data/search',
  92. help='结果输出目录 (默认: data/search)'
  93. )
  94. parser.add_argument(
  95. '--query',
  96. type=str,
  97. required=True,
  98. help='搜索查询内容 (必填)'
  99. )
  100. args = parser.parse_args()
  101. # 创建API客户端实例
  102. client = AISearch(results_dir=args.results_dir)
  103. # 执行搜索并保存
  104. try:
  105. result = client.search(args.query)
  106. filepath = client.save_result(args.query, result)
  107. print(f"Output: {filepath}")
  108. except Exception as e:
  109. print(f"Error: {e}", file=__import__('sys').stderr)
  110. if __name__ == "__main__":
  111. main()