Omnitopia's picture
add @tool-analyze_chess_position
c5b633f verified
from smolagents import DuckDuckGoSearchTool, Tool, tool
import wikipediaapi
import os
import requests
class WikipediaSearchTool(Tool):
name = "wikipedia_search"
description = "查找英文维基百科的页面简介,输入应为一个词或短词组"
inputs = {
"query": {"type": "string", "description": "维基百科搜索关键词,例如人名/专名"}
}
output_type = "string"
def __init__(self, lang="en"):
super().__init__()
self.wiki = wikipediaapi.Wikipedia(language=lang, user_agent="celum")
def forward(self, query: str):
page = self.wiki.page(query)
if not page.exists():
return "No Wikipedia page found."
return page.summary[:1000]
@tool
def tavily_search(query: str) -> str:
"""
Search the web using Tavily API
Args:
query: The search query
Returns:
Search results as formatted text
"""
api_key = os.getenv("TAVILY_API_KEY")
if not api_key:
return "Tavily API key not found"
url = "https://api.tavily.com/search"
payload = {
"api_key": api_key,
"query": query,
"search_depth": "basic",
"include_answer": True,
"include_domains": [],
"exclude_domains": [],
"max_results": 5
}
try:
response = requests.post(url, json=payload, timeout=10)
response.raise_for_status()
data = response.json()
results = []
if data.get("answer"):
results.append(f"Quick Answer: {data['answer']}")
for result in data.get("results", [])[:3]:
results.append(f"Title: {result.get('title', 'N/A')}")
results.append(f"URL: {result.get('url', 'N/A')}")
results.append(f"Content: {result.get('content', 'N/A')[:200]}...")
results.append("---")
return "\n".join(results)
except Exception as e:
return f"Tavily search error: {str(e)}"
# 添加媒体分析工具
@tool
def analyze_media_file(file_path: str) -> str:
"""
分析媒体文件并返回基本信息
Args:
file_path: 文件路径
Returns:
文件信息和分析结果
"""
if not os.path.exists(file_path):
return f"File not found: {file_path}"
try:
file_size = os.path.getsize(file_path)
file_ext = os.path.splitext(file_path)[1].lower()
result = f"File: {os.path.basename(file_path)}\n"
result += f"Size: {file_size} bytes\n"
result += f"Extension: {file_ext}\n"
# 根据文件类型进行不同的分析
if file_ext in ['.png', '.jpg', '.jpeg', '.gif', '.bmp']:
try:
from PIL import Image
with Image.open(file_path) as img:
result += f"Image dimensions: {img.size[0]}x{img.size[1]}\n"
result += f"Image mode: {img.mode}\n"
result += f"Image format: {img.format}\n"
# 检测是否可能是棋盘
if abs(img.size[0] - img.size[1]) < 50:
result += "Note: Square aspect ratio - possibly a chess board\n"
except Exception as e:
result += f"Image analysis error: {str(e)}\n"
elif file_ext in ['.mp4', '.avi', '.mov', '.mkv']:
result += "Video file detected\n"
elif file_ext in ['.mp3', '.wav', '.m4a', '.flac']:
result += "Audio file detected\n"
elif file_ext in ['.pdf']:
result += "PDF file detected\n"
elif file_ext in ['.txt', '.csv', '.json']:
try:
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
result += f"Text length: {len(content)} characters\n"
result += f"Line count: {len(content.splitlines())}\n"
preview = content[:200].replace('\n', ' ')
result += f"Content preview: {preview}...\n"
except Exception as e:
result += f"Text analysis error: {str(e)}\n"
return result
except Exception as e:
return f"Error analyzing file: {str(e)}"
@tool
def analyze_chess_position(file_path: str) -> str:
"""
分析棋盘位置,尝试识别棋局
Args:
file_path: 棋盘图像路径
Returns:
棋局分析结果
"""
if not os.path.exists(file_path):
return f"File not found: {file_path}"
try:
file_size = os.path.getsize(file_path)
result = f"Chess board image found: {os.path.basename(file_path)} ({file_size} bytes)\n"
# 由于PIL被限制,我们提供一些通用的棋局分析提示
result += """
Based on typical chess endgame patterns, common winning moves include:
- Queen checks that lead to checkmate (Qd1+, Qe1+, etc.)
- Rook moves that create back-rank threats
- Knight forks that win material
- Bishop moves that control key squares
For endgame puzzles, look for:
1. Checks that force the king to a bad square
2. Pins and skewers
3. Back-rank weaknesses
4. Knight forks
5. Zugzwang positions
Without being able to process the image directly, I recommend using chess knowledge and pattern recognition.
"""
return result
except Exception as e:
return f"Error analyzing chess position: {str(e)}"
# 更新工具列表
my_tool_list = [
WikipediaSearchTool(),
DuckDuckGoSearchTool(),
tavily_search,
analyze_media_file,
analyze_chess_position,
]