Toumaima commited on
Commit
1421d5c
·
verified ·
1 Parent(s): 50171ef

train my agent to solve chess problems

Browse files
Files changed (1) hide show
  1. app.py +46 -4
app.py CHANGED
@@ -10,6 +10,14 @@ from smolagents import CodeAgent, DuckDuckGoSearchTool, HfApiModel
10
  DEFAULT_API_URL = "https://agents-course-unit4-scoring.hf.space"
11
 
12
  # --- Basic Agent Definition ---
 
 
 
 
 
 
 
 
13
  class BasicAgent:
14
  def __init__(self):
15
  print("BasicAgent initialized.")
@@ -29,16 +37,13 @@ class BasicAgent:
29
  self.agent.prompt_templates["system_prompt"] = self.agent.prompt_templates["system_prompt"] + SYSTEM_PROMPT
30
 
31
  def maybe_reversed(self, text: str) -> bool:
32
- """Heuristically checks if a sentence is reversed letter-by-letter."""
33
  words = text.split()
34
  reversed_ratio = sum(1 for word in words if word[::-1].lower() in {"if", "you", "understand", "this", "sentence", "write", "opposite", "of", "the", "word", "left", "answer"}) / len(words)
35
- return reversed_ratio > 0.3 # adjustable threshold
36
 
37
  def solve_riddle(self, question: str) -> str:
38
- """Handles reversed sentence logic riddles."""
39
  reversed_text = question[::-1]
40
  if "opposite of the word" in reversed_text:
41
- import re
42
  match = re.search(r"opposite of the word ['\"](\w+)['\"]", reversed_text)
43
  if match:
44
  word = match.group(1).lower()
@@ -47,6 +52,43 @@ class BasicAgent:
47
  return f"FINAL ANSWER: {opposite}"
48
  return f"FINAL ANSWER: COULD_NOT_SOLVE"
49
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
50
  def __call__(self, question: str) -> str:
51
  print(f"Agent received question (first 50 chars): {question[:50]}...")
52
 
 
10
  DEFAULT_API_URL = "https://agents-course-unit4-scoring.hf.space"
11
 
12
  # --- Basic Agent Definition ---
13
+ class BasicAgent:
14
+ import re
15
+ import chess
16
+ import chess.engine
17
+ from PIL import Image
18
+ from io import BytesIO
19
+ import base64
20
+
21
  class BasicAgent:
22
  def __init__(self):
23
  print("BasicAgent initialized.")
 
37
  self.agent.prompt_templates["system_prompt"] = self.agent.prompt_templates["system_prompt"] + SYSTEM_PROMPT
38
 
39
  def maybe_reversed(self, text: str) -> bool:
 
40
  words = text.split()
41
  reversed_ratio = sum(1 for word in words if word[::-1].lower() in {"if", "you", "understand", "this", "sentence", "write", "opposite", "of", "the", "word", "left", "answer"}) / len(words)
42
+ return reversed_ratio > 0.3
43
 
44
  def solve_riddle(self, question: str) -> str:
 
45
  reversed_text = question[::-1]
46
  if "opposite of the word" in reversed_text:
 
47
  match = re.search(r"opposite of the word ['\"](\w+)['\"]", reversed_text)
48
  if match:
49
  word = match.group(1).lower()
 
52
  return f"FINAL ANSWER: {opposite}"
53
  return f"FINAL ANSWER: COULD_NOT_SOLVE"
54
 
55
+ def is_chess_question(self, question: str) -> bool:
56
+ keywords = ["chess", "algebraic notation", "checkmate", "bishop", "rook", "knight", "position", "board"]
57
+ return any(k in question.lower() for k in keywords)
58
+
59
+ def extract_board_from_image(self, image_data: str) -> chess.Board:
60
+ # Stub implementation; replace with real image-to-FEN logic
61
+ # For now, simulate a board with forced mate
62
+ board = chess.Board()
63
+ board.set_fen("6k1/5ppp/8/8/8/8/5PPP/6K1 b - - 0 1") # Example stub position
64
+ return board
65
+
66
+ def find_best_move(self, board: chess.Board) -> str:
67
+ try:
68
+ with chess.engine.SimpleEngine.popen_uci("/usr/games/stockfish") as engine:
69
+ result = engine.play(board, chess.engine.Limit(time=0.1))
70
+ return f"FINAL ANSWER: {board.san(result.move)}"
71
+ except Exception as e:
72
+ return f"FINAL ANSWER: ENGINE_ERROR: {e}"
73
+
74
+ def __call__(self, question: str) -> str:
75
+ print(f"Agent received question (first 50 chars): {question[:50]}...")
76
+
77
+ if self.maybe_reversed(question):
78
+ print("Detected likely reversed text. Attempting riddle solving...")
79
+ return self.solve_riddle(question)
80
+
81
+ if self.is_chess_question(question):
82
+ print("Detected chess-related question. Attempting board extraction...")
83
+ # You would extract image info from the question or context here
84
+ # For now, we'll simulate board analysis
85
+ board = self.extract_board_from_image("") # Replace with actual image
86
+ return self.find_best_move(board)
87
+
88
+ final_answer = self.agent.run(question)
89
+ print(f"Agent returning final answer: {final_answer}")
90
+ return final_answer
91
+
92
  def __call__(self, question: str) -> str:
93
  print(f"Agent received question (first 50 chars): {question[:50]}...")
94