|
|
from smolagents import Tool |
|
|
from stockfish import Stockfish |
|
|
import traceback |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ChessAnalysisTool(Tool): |
|
|
name = "_my_tool_chess_analysis" |
|
|
description = """ |
|
|
Analyze chess position provided as FEN notation and answer with best move for player color |
|
|
To invoke the tool use code as below |
|
|
<code> |
|
|
best_answer = _my_tool_chess_analysis(fen=loaded_fen, player_color="dummy") |
|
|
</code> |
|
|
""" |
|
|
|
|
|
inputs = { |
|
|
"fen": { |
|
|
"type": "string", |
|
|
"description": "board position in FEN notation", |
|
|
}, |
|
|
"player_color": { |
|
|
"type": "string", |
|
|
"description": "black or white to make next move", |
|
|
"nullable": True |
|
|
} |
|
|
} |
|
|
|
|
|
output_type = "string" |
|
|
|
|
|
is_initialized = True |
|
|
|
|
|
def __init__(self): |
|
|
print(f"***KS*** Chess analysis tool initializing ...") |
|
|
self.engine = Stockfish() |
|
|
print(f"***KS*** Chess analysis tool initialized with engine: {self.engine}") |
|
|
|
|
|
def initialize(self): |
|
|
print(f"***KS*** Chess analysis tool initialized (2) with engine: {self.engine}") |
|
|
|
|
|
def forward(self, fen: str, player_color = "") -> str: |
|
|
|
|
|
print(f"***KS*** Chess analysis tool getting best move for player: {player_color} with position: {fen}") |
|
|
best_move = "" |
|
|
try: |
|
|
self.engine.set_fen_position(fen) |
|
|
board = self.engine.get_board_visual() |
|
|
print(f"{board}") |
|
|
top_3_moves = self.engine.get_top_moves(3) |
|
|
print(f"Top 3 moves:\n{top_3_moves}") |
|
|
best_move = self.engine.get_best_move() |
|
|
except Exception as ex: |
|
|
print(traceback.format_exc()) |
|
|
print(f"***KS*** Exception invoking ChessAnalysisTool: {ex}") |
|
|
|
|
|
return f"FINAL ANSWER: {best_move}" |
|
|
|