update a few files
Browse files- app.py +119 -27
- notebook.ipynb +220 -27
- tools.py +19 -1
app.py
CHANGED
|
@@ -4,21 +4,106 @@ import requests
|
|
| 4 |
import inspect
|
| 5 |
import pandas as pd
|
| 6 |
import json
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 7 |
|
| 8 |
# (Keep Constants as is)
|
| 9 |
# --- Constants ---
|
| 10 |
DEFAULT_API_URL = "https://agents-course-unit4-scoring.hf.space"
|
| 11 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 12 |
# --- Basic Agent Definition ---
|
| 13 |
# ----- THIS IS WERE YOU CAN BUILD WHAT YOU WANT ------
|
| 14 |
class BasicAgent:
|
| 15 |
def __init__(self):
|
| 16 |
print("BasicAgent initialized.")
|
| 17 |
-
|
|
|
|
| 18 |
print(f"Agent received question (first 50 chars): {question[:50]}...")
|
| 19 |
-
fixed_answer = "This is a default answer."
|
| 20 |
-
print(f"Agent returning fixed answer: {fixed_answer}")
|
| 21 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 22 |
|
| 23 |
def run_and_submit_all( profile: gr.OAuthProfile | None):
|
| 24 |
"""
|
|
@@ -76,19 +161,23 @@ def run_and_submit_all( profile: gr.OAuthProfile | None):
|
|
| 76 |
results_log = []
|
| 77 |
answers_payload = []
|
| 78 |
print(f"Running agent on {len(questions_data)} questions...")
|
| 79 |
-
|
| 80 |
-
|
| 81 |
-
|
| 82 |
-
|
| 83 |
-
|
| 84 |
-
|
| 85 |
-
|
| 86 |
-
|
| 87 |
-
|
| 88 |
-
|
| 89 |
-
|
| 90 |
-
|
| 91 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 92 |
|
| 93 |
if not answers_payload:
|
| 94 |
print("Agent did not produce any answers to submit.")
|
|
@@ -102,18 +191,21 @@ def run_and_submit_all( profile: gr.OAuthProfile | None):
|
|
| 102 |
# 5. Submit
|
| 103 |
print(f"Submitting {len(answers_payload)} answers to: {submit_url}")
|
| 104 |
try:
|
| 105 |
-
response = requests.post(submit_url, json=submission_data, timeout=60)
|
| 106 |
-
response.raise_for_status()
|
| 107 |
-
result_data = response.json()
|
| 108 |
-
final_status = (
|
| 109 |
-
|
| 110 |
-
|
| 111 |
-
|
| 112 |
-
|
| 113 |
-
|
| 114 |
-
)
|
| 115 |
print("Submission successful.")
|
| 116 |
results_df = pd.DataFrame(results_log)
|
|
|
|
|
|
|
|
|
|
| 117 |
return final_status, results_df
|
| 118 |
except requests.exceptions.HTTPError as e:
|
| 119 |
error_detail = f"Server responded with status {e.response.status_code}."
|
|
|
|
| 4 |
import inspect
|
| 5 |
import pandas as pd
|
| 6 |
import json
|
| 7 |
+
import yaml
|
| 8 |
+
|
| 9 |
+
from smolagents import ToolCallingAgent, Tool, InferenceClientModel, DuckDuckGoSearchTool
|
| 10 |
+
from smolagents import WikipediaSearchTool, PythonInterpreterTool
|
| 11 |
+
from smolagents import OpenAIServerModel
|
| 12 |
+
from tools import fetch_file
|
| 13 |
+
|
| 14 |
+
from phoenix.otel import register
|
| 15 |
+
from openinference.instrumentation.smolagents import SmolagentsInstrumentor
|
| 16 |
+
|
| 17 |
+
register()
|
| 18 |
+
SmolagentsInstrumentor().instrument()
|
| 19 |
|
| 20 |
# (Keep Constants as is)
|
| 21 |
# --- Constants ---
|
| 22 |
DEFAULT_API_URL = "https://agents-course-unit4-scoring.hf.space"
|
| 23 |
|
| 24 |
+
import os
|
| 25 |
+
token = os.getenv("HF_TOKEN")
|
| 26 |
+
|
| 27 |
+
if token is None:
|
| 28 |
+
raise ValueError('You must set the HF_TOKEN environment variable')
|
| 29 |
+
else:
|
| 30 |
+
print('Token was found')
|
| 31 |
+
|
| 32 |
+
|
| 33 |
+
#model = InferenceClientModel(model_id="Qwen/Qwen3-32B", provider="nscale")
|
| 34 |
+
#model = InferenceClientModel(model_id="deepseek-ai/DeepSeek-R1", provider="nebius")
|
| 35 |
+
|
| 36 |
+
# Set your Gemini API key in the environment variable GEMINI_API_KEY_1
|
| 37 |
+
model = OpenAIServerModel(
|
| 38 |
+
model_id="gemini-2.5-flash",
|
| 39 |
+
api_base="https://generativelanguage.googleapis.com/v1beta",
|
| 40 |
+
api_key=os.getenv("GEMINI_API_KEY_1")
|
| 41 |
+
)
|
| 42 |
+
print('GEMINI_API_KEY_1 was found:', os.getenv("GEMINI_API_KEY_1") is not None)
|
| 43 |
+
|
| 44 |
# --- Basic Agent Definition ---
|
| 45 |
# ----- THIS IS WERE YOU CAN BUILD WHAT YOU WANT ------
|
| 46 |
class BasicAgent:
|
| 47 |
def __init__(self):
|
| 48 |
print("BasicAgent initialized.")
|
| 49 |
+
|
| 50 |
+
def __call__(self, taskid: str, question: str) -> str:
|
| 51 |
print(f"Agent received question (first 50 chars): {question[:50]}...")
|
| 52 |
+
#fixed_answer = "This is a default answer."
|
| 53 |
+
#print(f"Agent returning fixed answer: {fixed_answer}")
|
| 54 |
+
|
| 55 |
+
# Define the prompt for the agent
|
| 56 |
+
# Report your thoughts, and finish your answer with the following template:
|
| 57 |
+
|
| 58 |
+
prompt = f"""
|
| 59 |
+
|
| 60 |
+
You are a general AI assistant.
|
| 61 |
+
I will ask you a question and you can use 10 steps to answer the question.
|
| 62 |
+
You can use the tools I provide you to answer my question. Every tool call reduces the number
|
| 63 |
+
of remaining steps available to answer the question.
|
| 64 |
+
|
| 65 |
+
YOUR FINAL ANSWER has be a number OR as few words as possible OR a comma separated list of numbers and/or strings.
|
| 66 |
+
If you are asked for a number, do not use comma to write your number neither use units such as $ or percent sign unless specified otherwise.
|
| 67 |
+
If you are asked for a string, do not use articles, neither abbreviations (e.g. for cities), and write the digits in plain text unless specified otherwise.
|
| 68 |
+
If you are asked for a comma separated list, apply the above rules depending of whether the element to be put in the list is a number or a string.
|
| 69 |
+
|
| 70 |
+
Finish your answer with the following template:
|
| 71 |
+
FINAL ANSWER: [YOUR FINAL ANSWER].
|
| 72 |
+
|
| 73 |
+
The taskid is {taskid}. If you need to download a file that comes with the question then use
|
| 74 |
+
the taskid to fetch the file
|
| 75 |
+
The question is '{question}'.
|
| 76 |
+
|
| 77 |
+
"""
|
| 78 |
+
|
| 79 |
+
agent = ToolCallingAgent(
|
| 80 |
+
tools=[
|
| 81 |
+
DuckDuckGoSearchTool(),
|
| 82 |
+
WikipediaSearchTool(),
|
| 83 |
+
fetch_file,
|
| 84 |
+
],
|
| 85 |
+
model=model,
|
| 86 |
+
max_steps=10,
|
| 87 |
+
#tool_choice="auto",
|
| 88 |
+
)
|
| 89 |
+
|
| 90 |
+
# Run the agent with the prompt
|
| 91 |
+
fixed_answer = agent.run(prompt)
|
| 92 |
+
# Clean the answer
|
| 93 |
+
cleaned_answer = self.clean_answer(fixed_answer)
|
| 94 |
+
|
| 95 |
+
print(f"Agent returned cleaned answer: {cleaned_answer}")
|
| 96 |
+
return cleaned_answer
|
| 97 |
+
|
| 98 |
+
def clean_answer(self, answer: str) -> str:
|
| 99 |
+
# Remove "FINAL ANSWER:" (with or without trailing space)
|
| 100 |
+
answer = answer.replace("FINAL ANSWER:", "").strip()
|
| 101 |
+
# Remove last character if it is a period
|
| 102 |
+
if answer.endswith("."):
|
| 103 |
+
answer = answer[:-1]
|
| 104 |
+
return answer
|
| 105 |
+
|
| 106 |
+
|
| 107 |
|
| 108 |
def run_and_submit_all( profile: gr.OAuthProfile | None):
|
| 109 |
"""
|
|
|
|
| 161 |
results_log = []
|
| 162 |
answers_payload = []
|
| 163 |
print(f"Running agent on {len(questions_data)} questions...")
|
| 164 |
+
|
| 165 |
+
item = questions_data[0] if questions_data else None
|
| 166 |
+
#for item in questions_data:
|
| 167 |
+
|
| 168 |
+
task_id = item.get("task_id")
|
| 169 |
+
question_text = item.get("question")
|
| 170 |
+
#if not task_id or question_text is None:
|
| 171 |
+
# print(f"Skipping item with missing task_id or question: {item}")
|
| 172 |
+
# continue
|
| 173 |
+
try:
|
| 174 |
+
submitted_answer = agent(task_id, question_text)
|
| 175 |
+
answers_payload.append({"task_id": task_id, "submitted_answer": submitted_answer})
|
| 176 |
+
print(f"Task ID: {task_id}, Question: {question_text[:50]}..., Submitted Answer: {submitted_answer}")
|
| 177 |
+
results_log.append({"Task ID": task_id, "Question": question_text, "Submitted Answer": submitted_answer})
|
| 178 |
+
except Exception as e:
|
| 179 |
+
print(f"Error running agent on task {task_id}: {e}")
|
| 180 |
+
results_log.append({"Task ID": task_id, "Question": question_text, "Submitted Answer": f"AGENT ERROR: {e}"})
|
| 181 |
|
| 182 |
if not answers_payload:
|
| 183 |
print("Agent did not produce any answers to submit.")
|
|
|
|
| 191 |
# 5. Submit
|
| 192 |
print(f"Submitting {len(answers_payload)} answers to: {submit_url}")
|
| 193 |
try:
|
| 194 |
+
#response = requests.post(submit_url, json=submission_data, timeout=60)
|
| 195 |
+
#response.raise_for_status()
|
| 196 |
+
#result_data = response.json()
|
| 197 |
+
#final_status = (
|
| 198 |
+
# f"Submission Successful!\n"
|
| 199 |
+
# f"User: {result_data.get('username')}\n"
|
| 200 |
+
# f"Overall Score: {result_data.get('score', 'N/A')}% "
|
| 201 |
+
# f"({result_data.get('correct_count', '?')}/{result_data.get('total_attempted', '?')} correct)\n"
|
| 202 |
+
# f"Message: {result_data.get('message', 'No message received.')}"
|
| 203 |
+
#)
|
| 204 |
print("Submission successful.")
|
| 205 |
results_df = pd.DataFrame(results_log)
|
| 206 |
+
# delete this the next line
|
| 207 |
+
final_status = "Dummy status"
|
| 208 |
+
|
| 209 |
return final_status, results_df
|
| 210 |
except requests.exceptions.HTTPError as e:
|
| 211 |
error_detail = f"Server responded with status {e.response.status_code}."
|
notebook.ipynb
CHANGED
|
@@ -10,10 +10,18 @@
|
|
| 10 |
},
|
| 11 |
{
|
| 12 |
"cell_type": "code",
|
| 13 |
-
"execution_count":
|
| 14 |
"id": "6cff8644",
|
| 15 |
"metadata": {},
|
| 16 |
-
"outputs": [
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 17 |
"source": [
|
| 18 |
"import os\n",
|
| 19 |
"token = os.getenv(\"HF_TOKEN\")\n",
|
|
@@ -27,19 +35,32 @@
|
|
| 27 |
},
|
| 28 |
{
|
| 29 |
"cell_type": "code",
|
| 30 |
-
"execution_count":
|
| 31 |
"id": "a414cce1",
|
| 32 |
"metadata": {},
|
| 33 |
-
"outputs": [
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 34 |
"source": [
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 35 |
"import yaml\n",
|
| 36 |
"\n",
|
| 37 |
-
"from smolagents import
|
| 38 |
"from smolagents import OpenAIServerModel\n",
|
| 39 |
"from tools import fetch_file\n",
|
| 40 |
"\n",
|
| 41 |
"#model = InferenceClientModel(model_id=\"Qwen/Qwen3-32B\", provider=\"nscale\")\n",
|
| 42 |
-
"model = InferenceClientModel(model_id=\"deepseek-ai/DeepSeek-R1
|
| 43 |
"\n",
|
| 44 |
"# Set your Gemini API key in the environment variable GEMINI_API_KEY_1\n",
|
| 45 |
"#model = OpenAIServerModel(\n",
|
|
@@ -49,25 +70,53 @@
|
|
| 49 |
"# ) \n",
|
| 50 |
"#print('API key was found:', os.getenv(\"GEMINI_API_KEY_1\") is not None)\n",
|
| 51 |
"\n",
|
| 52 |
-
"#
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 53 |
"\n",
|
| 54 |
-
"
|
| 55 |
-
"
|
| 56 |
-
"
|
| 57 |
-
"
|
| 58 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
| 59 |
"\n",
|
| 60 |
-
"
|
| 61 |
-
"\
|
| 62 |
"\n",
|
| 63 |
-
"
|
| 64 |
-
" model=model, \n",
|
| 65 |
-
" tools=[fetch_file, DuckDuckGoSearchTool(), WikipediaSearchTool()], \n",
|
| 66 |
-
" add_base_tools=True,\n",
|
| 67 |
-
" additional_authorized_imports=['requests', 'bs4'] \n",
|
| 68 |
-
" )\n",
|
| 69 |
"\n",
|
| 70 |
-
"\n"
|
| 71 |
]
|
| 72 |
},
|
| 73 |
{
|
|
@@ -80,10 +129,155 @@
|
|
| 80 |
},
|
| 81 |
{
|
| 82 |
"cell_type": "code",
|
| 83 |
-
"execution_count":
|
| 84 |
"id": "09b50aa1",
|
| 85 |
"metadata": {},
|
| 86 |
-
"outputs": [
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 87 |
"source": [
|
| 88 |
"item = {\n",
|
| 89 |
" \"task_id\": \"8e867cd7-cff9-4e6c-867a-ff5ddc2550be\",\n",
|
|
@@ -93,12 +287,11 @@
|
|
| 93 |
" }\n",
|
| 94 |
"\n",
|
| 95 |
"question_text = item[\"question\"]\n",
|
| 96 |
-
"
|
| 97 |
"\n",
|
| 98 |
-
"
|
| 99 |
"\n",
|
| 100 |
-
"
|
| 101 |
-
"submitted_answer = agent(prompt_with_question)\n"
|
| 102 |
]
|
| 103 |
}
|
| 104 |
],
|
|
|
|
| 10 |
},
|
| 11 |
{
|
| 12 |
"cell_type": "code",
|
| 13 |
+
"execution_count": 19,
|
| 14 |
"id": "6cff8644",
|
| 15 |
"metadata": {},
|
| 16 |
+
"outputs": [
|
| 17 |
+
{
|
| 18 |
+
"name": "stdout",
|
| 19 |
+
"output_type": "stream",
|
| 20 |
+
"text": [
|
| 21 |
+
"Token was found\n"
|
| 22 |
+
]
|
| 23 |
+
}
|
| 24 |
+
],
|
| 25 |
"source": [
|
| 26 |
"import os\n",
|
| 27 |
"token = os.getenv(\"HF_TOKEN\")\n",
|
|
|
|
| 35 |
},
|
| 36 |
{
|
| 37 |
"cell_type": "code",
|
| 38 |
+
"execution_count": 21,
|
| 39 |
"id": "a414cce1",
|
| 40 |
"metadata": {},
|
| 41 |
+
"outputs": [
|
| 42 |
+
{
|
| 43 |
+
"name": "stdout",
|
| 44 |
+
"output_type": "stream",
|
| 45 |
+
"text": [
|
| 46 |
+
"BasicAgent initialized.\n"
|
| 47 |
+
]
|
| 48 |
+
}
|
| 49 |
+
],
|
| 50 |
"source": [
|
| 51 |
+
"import os\n",
|
| 52 |
+
"import requests\n",
|
| 53 |
+
"import inspect\n",
|
| 54 |
+
"import pandas as pd\n",
|
| 55 |
+
"import json\n",
|
| 56 |
"import yaml\n",
|
| 57 |
"\n",
|
| 58 |
+
"from smolagents import ToolCallingAgent, Tool, InferenceClientModel, DuckDuckGoSearchTool, WikipediaSearchTool\n",
|
| 59 |
"from smolagents import OpenAIServerModel\n",
|
| 60 |
"from tools import fetch_file\n",
|
| 61 |
"\n",
|
| 62 |
"#model = InferenceClientModel(model_id=\"Qwen/Qwen3-32B\", provider=\"nscale\")\n",
|
| 63 |
+
"model = InferenceClientModel(model_id=\"deepseek-ai/DeepSeek-R1\", provider=\"nebius\")\n",
|
| 64 |
"\n",
|
| 65 |
"# Set your Gemini API key in the environment variable GEMINI_API_KEY_1\n",
|
| 66 |
"#model = OpenAIServerModel(\n",
|
|
|
|
| 70 |
"# ) \n",
|
| 71 |
"#print('API key was found:', os.getenv(\"GEMINI_API_KEY_1\") is not None)\n",
|
| 72 |
"\n",
|
| 73 |
+
"# --- Basic Agent Definition ---\n",
|
| 74 |
+
"# ----- THIS IS WERE YOU CAN BUILD WHAT YOU WANT ------\n",
|
| 75 |
+
"class BasicAgent:\n",
|
| 76 |
+
" def __init__(self):\n",
|
| 77 |
+
" print(\"BasicAgent initialized.\")\n",
|
| 78 |
+
" def __call__(self, taskid: str, question: str) -> str:\n",
|
| 79 |
+
" print(f\"Agent received question (first 50 chars): {question[:50]}...\")\n",
|
| 80 |
+
" #fixed_answer = \"This is a default answer.\"\n",
|
| 81 |
+
" #print(f\"Agent returning fixed answer: {fixed_answer}\")\n",
|
| 82 |
+
"\n",
|
| 83 |
+
" prompt = f\"\"\"\n",
|
| 84 |
+
" \n",
|
| 85 |
+
" You are a general AI assistant. \n",
|
| 86 |
+
" I will ask you a question and you can use 9 steps to answer the question.\n",
|
| 87 |
+
" You can use the tools I provide you to answer my question. Every tool call reduces the number \n",
|
| 88 |
+
" of remaining steps available to answer the question. \n",
|
| 89 |
+
" Report your thoughts, and finish your answer with the following template: \n",
|
| 90 |
+
" FINAL ANSWER: [YOUR FINAL ANSWER]. \n",
|
| 91 |
+
" \n",
|
| 92 |
+
" YOUR FINAL ANSWER should be a number OR as few words as possible OR a comma separated list of numbers and/or strings.\n",
|
| 93 |
+
" If you are asked for a number, don’t use comma to write your number neither use units such as $ or percent sign unless specified otherwise.\n",
|
| 94 |
+
" If you are asked for a string, don’t use articles, neither abbreviations (e.g. for cities), and write the digits in plain text unless specified otherwise.\n",
|
| 95 |
+
" If you are asked for a comma separated list, apply the above rules depending of whether the element to be put in the list is a number or a string. \n",
|
| 96 |
+
"\n",
|
| 97 |
+
" The taskid is {taskid}. If you need to download a file that comes with the question then use the taskid to fetch the file\n",
|
| 98 |
+
" The question is '{question}'.\n",
|
| 99 |
+
"\n",
|
| 100 |
+
" You have 9 steps to answer the question.\n",
|
| 101 |
+
"\n",
|
| 102 |
+
" \"\"\"\n",
|
| 103 |
"\n",
|
| 104 |
+
" agent = ToolCallingAgent(\n",
|
| 105 |
+
" tools=[\n",
|
| 106 |
+
" fetch_file, \n",
|
| 107 |
+
" DuckDuckGoSearchTool(), \n",
|
| 108 |
+
" WikipediaSearchTool()\n",
|
| 109 |
+
" ], \n",
|
| 110 |
+
" model=model, \n",
|
| 111 |
+
" max_steps=9,\n",
|
| 112 |
+
" )\n",
|
| 113 |
"\n",
|
| 114 |
+
" # Run the agent with the prompt\n",
|
| 115 |
+
" fixed_answer = agent.run(prompt)\n",
|
| 116 |
"\n",
|
| 117 |
+
" return fixed_answer\n",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 118 |
"\n",
|
| 119 |
+
"agent = BasicAgent()\n"
|
| 120 |
]
|
| 121 |
},
|
| 122 |
{
|
|
|
|
| 129 |
},
|
| 130 |
{
|
| 131 |
"cell_type": "code",
|
| 132 |
+
"execution_count": 22,
|
| 133 |
"id": "09b50aa1",
|
| 134 |
"metadata": {},
|
| 135 |
+
"outputs": [
|
| 136 |
+
{
|
| 137 |
+
"name": "stdout",
|
| 138 |
+
"output_type": "stream",
|
| 139 |
+
"text": [
|
| 140 |
+
"Agent received question (first 50 chars): How many studio albums were published by Mercedes ...\n"
|
| 141 |
+
]
|
| 142 |
+
},
|
| 143 |
+
{
|
| 144 |
+
"data": {
|
| 145 |
+
"text/html": [
|
| 146 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #d4b702; text-decoration-color: #d4b702\">╭──────────────────────────────────────────────────── </span><span style=\"color: #d4b702; text-decoration-color: #d4b702; font-weight: bold\">New run</span><span style=\"color: #d4b702; text-decoration-color: #d4b702\"> ────────────────────────────────────────────────────╮</span>\n",
|
| 147 |
+
"<span style=\"color: #d4b702; text-decoration-color: #d4b702\">│</span> <span style=\"color: #d4b702; text-decoration-color: #d4b702\">│</span>\n",
|
| 148 |
+
"<span style=\"color: #d4b702; text-decoration-color: #d4b702\">│</span> <span style=\"font-weight: bold\">You are a general AI assistant. </span> <span style=\"color: #d4b702; text-decoration-color: #d4b702\">│</span>\n",
|
| 149 |
+
"<span style=\"color: #d4b702; text-decoration-color: #d4b702\">│</span> <span style=\"font-weight: bold\"> I will ask you a question and you can use 9 steps to answer the question.</span> <span style=\"color: #d4b702; text-decoration-color: #d4b702\">│</span>\n",
|
| 150 |
+
"<span style=\"color: #d4b702; text-decoration-color: #d4b702\">│</span> <span style=\"font-weight: bold\"> You can use the tools I provide you to answer my question. Every tool call reduces the number </span> <span style=\"color: #d4b702; text-decoration-color: #d4b702\">│</span>\n",
|
| 151 |
+
"<span style=\"color: #d4b702; text-decoration-color: #d4b702\">│</span> <span style=\"font-weight: bold\"> of remaining steps available to answer the question. </span> <span style=\"color: #d4b702; text-decoration-color: #d4b702\">│</span>\n",
|
| 152 |
+
"<span style=\"color: #d4b702; text-decoration-color: #d4b702\">│</span> <span style=\"font-weight: bold\"> Report your thoughts, and finish your answer with the following template: </span> <span style=\"color: #d4b702; text-decoration-color: #d4b702\">│</span>\n",
|
| 153 |
+
"<span style=\"color: #d4b702; text-decoration-color: #d4b702\">│</span> <span style=\"font-weight: bold\"> FINAL ANSWER: [YOUR FINAL ANSWER\\]. </span> <span style=\"color: #d4b702; text-decoration-color: #d4b702\">│</span>\n",
|
| 154 |
+
"<span style=\"color: #d4b702; text-decoration-color: #d4b702\">│</span> <span style=\"font-weight: bold\"> </span> <span style=\"color: #d4b702; text-decoration-color: #d4b702\">│</span>\n",
|
| 155 |
+
"<span style=\"color: #d4b702; text-decoration-color: #d4b702\">│</span> <span style=\"font-weight: bold\"> YOUR FINAL ANSWER should be a number OR as few words as possible OR a comma separated list of numbers </span> <span style=\"color: #d4b702; text-decoration-color: #d4b702\">│</span>\n",
|
| 156 |
+
"<span style=\"color: #d4b702; text-decoration-color: #d4b702\">│</span> <span style=\"font-weight: bold\">and/or strings.</span> <span style=\"color: #d4b702; text-decoration-color: #d4b702\">│</span>\n",
|
| 157 |
+
"<span style=\"color: #d4b702; text-decoration-color: #d4b702\">│</span> <span style=\"font-weight: bold\"> If you are asked for a number, don’t use comma to write your number neither use units such as $ or </span> <span style=\"color: #d4b702; text-decoration-color: #d4b702\">│</span>\n",
|
| 158 |
+
"<span style=\"color: #d4b702; text-decoration-color: #d4b702\">│</span> <span style=\"font-weight: bold\">percent sign unless specified otherwise.</span> <span style=\"color: #d4b702; text-decoration-color: #d4b702\">│</span>\n",
|
| 159 |
+
"<span style=\"color: #d4b702; text-decoration-color: #d4b702\">│</span> <span style=\"font-weight: bold\"> If you are asked for a string, don’t use articles, neither abbreviations (e.g. for cities), and write </span> <span style=\"color: #d4b702; text-decoration-color: #d4b702\">│</span>\n",
|
| 160 |
+
"<span style=\"color: #d4b702; text-decoration-color: #d4b702\">│</span> <span style=\"font-weight: bold\">the digits in plain text unless specified otherwise.</span> <span style=\"color: #d4b702; text-decoration-color: #d4b702\">│</span>\n",
|
| 161 |
+
"<span style=\"color: #d4b702; text-decoration-color: #d4b702\">│</span> <span style=\"font-weight: bold\"> If you are asked for a comma separated list, apply the above rules depending of whether the element to </span> <span style=\"color: #d4b702; text-decoration-color: #d4b702\">│</span>\n",
|
| 162 |
+
"<span style=\"color: #d4b702; text-decoration-color: #d4b702\">│</span> <span style=\"font-weight: bold\">be put in the list is a number or a string. </span> <span style=\"color: #d4b702; text-decoration-color: #d4b702\">│</span>\n",
|
| 163 |
+
"<span style=\"color: #d4b702; text-decoration-color: #d4b702\">│</span> <span style=\"color: #d4b702; text-decoration-color: #d4b702\">│</span>\n",
|
| 164 |
+
"<span style=\"color: #d4b702; text-decoration-color: #d4b702\">│</span> <span style=\"font-weight: bold\"> The taskid is 8e867cd7-cff9-4e6c-867a-ff5ddc2550be. If you need to download a file that comes with the </span> <span style=\"color: #d4b702; text-decoration-color: #d4b702\">│</span>\n",
|
| 165 |
+
"<span style=\"color: #d4b702; text-decoration-color: #d4b702\">│</span> <span style=\"font-weight: bold\">question then use the taskid to fetch the file</span> <span style=\"color: #d4b702; text-decoration-color: #d4b702\">│</span>\n",
|
| 166 |
+
"<span style=\"color: #d4b702; text-decoration-color: #d4b702\">│</span> <span style=\"font-weight: bold\"> The question is 'How many studio albums were published by Mercedes Sosa between 2000 and 2009 </span> <span style=\"color: #d4b702; text-decoration-color: #d4b702\">│</span>\n",
|
| 167 |
+
"<span style=\"color: #d4b702; text-decoration-color: #d4b702\">│</span> <span style=\"font-weight: bold\">(included)? You can use the latest 2022 version of english wikipedia.'.</span> <span style=\"color: #d4b702; text-decoration-color: #d4b702\">│</span>\n",
|
| 168 |
+
"<span style=\"color: #d4b702; text-decoration-color: #d4b702\">│</span> <span style=\"color: #d4b702; text-decoration-color: #d4b702\">│</span>\n",
|
| 169 |
+
"<span style=\"color: #d4b702; text-decoration-color: #d4b702\">│</span> <span style=\"font-weight: bold\"> You have 9 steps to answer the question.</span> <span style=\"color: #d4b702; text-decoration-color: #d4b702\">│</span>\n",
|
| 170 |
+
"<span style=\"color: #d4b702; text-decoration-color: #d4b702\">│</span> <span style=\"color: #d4b702; text-decoration-color: #d4b702\">│</span>\n",
|
| 171 |
+
"<span style=\"color: #d4b702; text-decoration-color: #d4b702\">╰─ InferenceClientModel - deepseek-ai/DeepSeek-R1 ────────────────────────────────────────────────────────────────╯</span>\n",
|
| 172 |
+
"</pre>\n"
|
| 173 |
+
],
|
| 174 |
+
"text/plain": [
|
| 175 |
+
"\u001b[38;2;212;183;2m╭─\u001b[0m\u001b[38;2;212;183;2m───────────────────────────────────────────────────\u001b[0m\u001b[38;2;212;183;2m \u001b[0m\u001b[1;38;2;212;183;2mNew run\u001b[0m\u001b[38;2;212;183;2m \u001b[0m\u001b[38;2;212;183;2m───────────────────────────────────────────────────\u001b[0m\u001b[38;2;212;183;2m─╮\u001b[0m\n",
|
| 176 |
+
"\u001b[38;2;212;183;2m│\u001b[0m \u001b[38;2;212;183;2m│\u001b[0m\n",
|
| 177 |
+
"\u001b[38;2;212;183;2m│\u001b[0m \u001b[1mYou are a general AI assistant. \u001b[0m \u001b[38;2;212;183;2m│\u001b[0m\n",
|
| 178 |
+
"\u001b[38;2;212;183;2m│\u001b[0m \u001b[1m I will ask you a question and you can use 9 steps to answer the question.\u001b[0m \u001b[38;2;212;183;2m│\u001b[0m\n",
|
| 179 |
+
"\u001b[38;2;212;183;2m│\u001b[0m \u001b[1m You can use the tools I provide you to answer my question. Every tool call reduces the number \u001b[0m \u001b[38;2;212;183;2m│\u001b[0m\n",
|
| 180 |
+
"\u001b[38;2;212;183;2m│\u001b[0m \u001b[1m of remaining steps available to answer the question. \u001b[0m \u001b[38;2;212;183;2m│\u001b[0m\n",
|
| 181 |
+
"\u001b[38;2;212;183;2m│\u001b[0m \u001b[1m Report your thoughts, and finish your answer with the following template: \u001b[0m \u001b[38;2;212;183;2m│\u001b[0m\n",
|
| 182 |
+
"\u001b[38;2;212;183;2m│\u001b[0m \u001b[1m FINAL ANSWER: [YOUR FINAL ANSWER\\]. \u001b[0m \u001b[38;2;212;183;2m│\u001b[0m\n",
|
| 183 |
+
"\u001b[38;2;212;183;2m│\u001b[0m \u001b[1m \u001b[0m \u001b[38;2;212;183;2m│\u001b[0m\n",
|
| 184 |
+
"\u001b[38;2;212;183;2m│\u001b[0m \u001b[1m YOUR FINAL ANSWER should be a number OR as few words as possible OR a comma separated list of numbers \u001b[0m \u001b[38;2;212;183;2m│\u001b[0m\n",
|
| 185 |
+
"\u001b[38;2;212;183;2m│\u001b[0m \u001b[1mand/or strings.\u001b[0m \u001b[38;2;212;183;2m│\u001b[0m\n",
|
| 186 |
+
"\u001b[38;2;212;183;2m│\u001b[0m \u001b[1m If you are asked for a number, don’t use comma to write your number neither use units such as $ or \u001b[0m \u001b[38;2;212;183;2m│\u001b[0m\n",
|
| 187 |
+
"\u001b[38;2;212;183;2m│\u001b[0m \u001b[1mpercent sign unless specified otherwise.\u001b[0m \u001b[38;2;212;183;2m│\u001b[0m\n",
|
| 188 |
+
"\u001b[38;2;212;183;2m│\u001b[0m \u001b[1m If you are asked for a string, don’t use articles, neither abbreviations (e.g. for cities), and write \u001b[0m \u001b[38;2;212;183;2m│\u001b[0m\n",
|
| 189 |
+
"\u001b[38;2;212;183;2m│\u001b[0m \u001b[1mthe digits in plain text unless specified otherwise.\u001b[0m \u001b[38;2;212;183;2m│\u001b[0m\n",
|
| 190 |
+
"\u001b[38;2;212;183;2m│\u001b[0m \u001b[1m If you are asked for a comma separated list, apply the above rules depending of whether the element to \u001b[0m \u001b[38;2;212;183;2m│\u001b[0m\n",
|
| 191 |
+
"\u001b[38;2;212;183;2m│\u001b[0m \u001b[1mbe put in the list is a number or a string. \u001b[0m \u001b[38;2;212;183;2m│\u001b[0m\n",
|
| 192 |
+
"\u001b[38;2;212;183;2m│\u001b[0m \u001b[38;2;212;183;2m│\u001b[0m\n",
|
| 193 |
+
"\u001b[38;2;212;183;2m│\u001b[0m \u001b[1m The taskid is 8e867cd7-cff9-4e6c-867a-ff5ddc2550be. If you need to download a file that comes with the \u001b[0m \u001b[38;2;212;183;2m│\u001b[0m\n",
|
| 194 |
+
"\u001b[38;2;212;183;2m│\u001b[0m \u001b[1mquestion then use the taskid to fetch the file\u001b[0m \u001b[38;2;212;183;2m│\u001b[0m\n",
|
| 195 |
+
"\u001b[38;2;212;183;2m│\u001b[0m \u001b[1m The question is 'How many studio albums were published by Mercedes Sosa between 2000 and 2009 \u001b[0m \u001b[38;2;212;183;2m│\u001b[0m\n",
|
| 196 |
+
"\u001b[38;2;212;183;2m│\u001b[0m \u001b[1m(included)? You can use the latest 2022 version of english wikipedia.'.\u001b[0m \u001b[38;2;212;183;2m│\u001b[0m\n",
|
| 197 |
+
"\u001b[38;2;212;183;2m│\u001b[0m \u001b[38;2;212;183;2m│\u001b[0m\n",
|
| 198 |
+
"\u001b[38;2;212;183;2m│\u001b[0m \u001b[1m You have 9 steps to answer the question.\u001b[0m \u001b[38;2;212;183;2m│\u001b[0m\n",
|
| 199 |
+
"\u001b[38;2;212;183;2m│\u001b[0m \u001b[38;2;212;183;2m│\u001b[0m\n",
|
| 200 |
+
"\u001b[38;2;212;183;2m╰─\u001b[0m\u001b[38;2;212;183;2m InferenceClientModel - deepseek-ai/DeepSeek-R1 \u001b[0m\u001b[38;2;212;183;2m───────────────────────────────────────────────────────────────\u001b[0m\u001b[38;2;212;183;2m─╯\u001b[0m\n"
|
| 201 |
+
]
|
| 202 |
+
},
|
| 203 |
+
"metadata": {},
|
| 204 |
+
"output_type": "display_data"
|
| 205 |
+
},
|
| 206 |
+
{
|
| 207 |
+
"data": {
|
| 208 |
+
"text/html": [
|
| 209 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #d4b702; text-decoration-color: #d4b702\">━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ </span><span style=\"font-weight: bold\">Step </span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">1</span><span style=\"color: #d4b702; text-decoration-color: #d4b702\"> ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━</span>\n",
|
| 210 |
+
"</pre>\n"
|
| 211 |
+
],
|
| 212 |
+
"text/plain": [
|
| 213 |
+
"\u001b[38;2;212;183;2m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ \u001b[0m\u001b[1mStep \u001b[0m\u001b[1;36m1\u001b[0m\u001b[38;2;212;183;2m ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m\n"
|
| 214 |
+
]
|
| 215 |
+
},
|
| 216 |
+
"metadata": {},
|
| 217 |
+
"output_type": "display_data"
|
| 218 |
+
},
|
| 219 |
+
{
|
| 220 |
+
"data": {
|
| 221 |
+
"text/html": [
|
| 222 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #800000; text-decoration-color: #800000; font-weight: bold\">Error while generating output:</span>\n",
|
| 223 |
+
"<span style=\"color: #800000; text-decoration-color: #800000; font-weight: bold\">(Request ID: </span><span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">Root</span><span style=\"color: #800000; text-decoration-color: #800000; font-weight: bold\">=</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">1</span><span style=\"color: #800000; text-decoration-color: #800000; font-weight: bold\">-686d606c-1f8bffb50e7ac4b077a26fe0;</span><span style=\"color: #ffff00; text-decoration-color: #ffff00\">2128d2d1-4e56-4788-a9eb-3015f54f1e44</span><span style=\"color: #800000; text-decoration-color: #800000; font-weight: bold\">)</span>\n",
|
| 224 |
+
"\n",
|
| 225 |
+
"<span style=\"color: #800000; text-decoration-color: #800000; font-weight: bold\">Bad request:</span>\n",
|
| 226 |
+
"</pre>\n"
|
| 227 |
+
],
|
| 228 |
+
"text/plain": [
|
| 229 |
+
"\u001b[1;31mError while generating output:\u001b[0m\n",
|
| 230 |
+
"\u001b[1;31m(\u001b[0m\u001b[1;31mRequest ID: \u001b[0m\u001b[1;33mRoot\u001b[0m\u001b[1;31m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;31m-686d606c-1f8bffb50e7ac4b077a26fe0;\u001b[0m\u001b[93m2128d2d1-4e56-4788-a9eb-3015f54f1e44\u001b[0m\u001b[1;31m)\u001b[0m\n",
|
| 231 |
+
"\n",
|
| 232 |
+
"\u001b[1;31mBad request:\u001b[0m\n"
|
| 233 |
+
]
|
| 234 |
+
},
|
| 235 |
+
"metadata": {},
|
| 236 |
+
"output_type": "display_data"
|
| 237 |
+
},
|
| 238 |
+
{
|
| 239 |
+
"data": {
|
| 240 |
+
"text/html": [
|
| 241 |
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">[Step 1: Duration 0.80 seconds]</span>\n",
|
| 242 |
+
"</pre>\n"
|
| 243 |
+
],
|
| 244 |
+
"text/plain": [
|
| 245 |
+
"\u001b[2m[Step 1: Duration 0.80 seconds]\u001b[0m\n"
|
| 246 |
+
]
|
| 247 |
+
},
|
| 248 |
+
"metadata": {},
|
| 249 |
+
"output_type": "display_data"
|
| 250 |
+
},
|
| 251 |
+
{
|
| 252 |
+
"ename": "AgentGenerationError",
|
| 253 |
+
"evalue": "Error while generating output:\n(Request ID: Root=1-686d606c-1f8bffb50e7ac4b077a26fe0;2128d2d1-4e56-4788-a9eb-3015f54f1e44)\n\nBad request:",
|
| 254 |
+
"output_type": "error",
|
| 255 |
+
"traceback": [
|
| 256 |
+
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
|
| 257 |
+
"\u001b[1;31mHTTPError\u001b[0m Traceback (most recent call last)",
|
| 258 |
+
"File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python313\\site-packages\\huggingface_hub\\utils\\_http.py:409\u001b[0m, in \u001b[0;36mhf_raise_for_status\u001b[1;34m(response, endpoint_name)\u001b[0m\n\u001b[0;32m 408\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m--> 409\u001b[0m \u001b[43mresponse\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mraise_for_status\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 410\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m HTTPError \u001b[38;5;28;01mas\u001b[39;00m e:\n",
|
| 259 |
+
"File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python313\\site-packages\\requests\\models.py:1024\u001b[0m, in \u001b[0;36mResponse.raise_for_status\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 1023\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m http_error_msg:\n\u001b[1;32m-> 1024\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m HTTPError(http_error_msg, response\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m)\n",
|
| 260 |
+
"\u001b[1;31mHTTPError\u001b[0m: 400 Client Error: Bad Request for url: https://router.huggingface.co/nebius/v1/chat/completions",
|
| 261 |
+
"\nThe above exception was the direct cause of the following exception:\n",
|
| 262 |
+
"\u001b[1;31mBadRequestError\u001b[0m Traceback (most recent call last)",
|
| 263 |
+
"File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python313\\site-packages\\smolagents\\agents.py:1272\u001b[0m, in \u001b[0;36mToolCallingAgent._step_stream\u001b[1;34m(self, memory_step)\u001b[0m\n\u001b[0;32m 1271\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m-> 1272\u001b[0m chat_message: ChatMessage \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmodel\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mgenerate\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 1273\u001b[0m \u001b[43m \u001b[49m\u001b[43minput_messages\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1274\u001b[0m \u001b[43m \u001b[49m\u001b[43mstop_sequences\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mObservation:\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mCalling tools:\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1275\u001b[0m \u001b[43m \u001b[49m\u001b[43mtools_to_call_from\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtools_and_managed_agents\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1276\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 1278\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mlogger\u001b[38;5;241m.\u001b[39mlog_markdown(\n\u001b[0;32m 1279\u001b[0m content\u001b[38;5;241m=\u001b[39mchat_message\u001b[38;5;241m.\u001b[39mcontent \u001b[38;5;28;01mif\u001b[39;00m chat_message\u001b[38;5;241m.\u001b[39mcontent \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28mstr\u001b[39m(chat_message\u001b[38;5;241m.\u001b[39mraw),\n\u001b[0;32m 1280\u001b[0m title\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mOutput message of the LLM:\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[0;32m 1281\u001b[0m level\u001b[38;5;241m=\u001b[39mLogLevel\u001b[38;5;241m.\u001b[39mDEBUG,\n\u001b[0;32m 1282\u001b[0m )\n",
|
| 264 |
+
"File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python313\\site-packages\\smolagents\\models.py:1408\u001b[0m, in \u001b[0;36mInferenceClientModel.generate\u001b[1;34m(self, messages, stop_sequences, response_format, tools_to_call_from, **kwargs)\u001b[0m\n\u001b[0;32m 1399\u001b[0m completion_kwargs \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_prepare_completion_kwargs(\n\u001b[0;32m 1400\u001b[0m messages\u001b[38;5;241m=\u001b[39mmessages,\n\u001b[0;32m 1401\u001b[0m stop_sequences\u001b[38;5;241m=\u001b[39mstop_sequences,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 1406\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs,\n\u001b[0;32m 1407\u001b[0m )\n\u001b[1;32m-> 1408\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mclient\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mchat_completion\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mcompletion_kwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 1410\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_last_input_token_count \u001b[38;5;241m=\u001b[39m response\u001b[38;5;241m.\u001b[39musage\u001b[38;5;241m.\u001b[39mprompt_tokens\n",
|
| 265 |
+
"File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python313\\site-packages\\huggingface_hub\\inference\\_client.py:924\u001b[0m, in \u001b[0;36mInferenceClient.chat_completion\u001b[1;34m(self, messages, model, stream, frequency_penalty, logit_bias, logprobs, max_tokens, n, presence_penalty, response_format, seed, stop, stream_options, temperature, tool_choice, tool_prompt, tools, top_logprobs, top_p, extra_body)\u001b[0m\n\u001b[0;32m 917\u001b[0m request_parameters \u001b[38;5;241m=\u001b[39m provider_helper\u001b[38;5;241m.\u001b[39mprepare_request(\n\u001b[0;32m 918\u001b[0m inputs\u001b[38;5;241m=\u001b[39mmessages,\n\u001b[0;32m 919\u001b[0m parameters\u001b[38;5;241m=\u001b[39mparameters,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 922\u001b[0m api_key\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtoken,\n\u001b[0;32m 923\u001b[0m )\n\u001b[1;32m--> 924\u001b[0m data \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_inner_post\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrequest_parameters\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstream\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstream\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 926\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m stream:\n",
|
| 266 |
+
"File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python313\\site-packages\\huggingface_hub\\inference\\_client.py:280\u001b[0m, in \u001b[0;36mInferenceClient._inner_post\u001b[1;34m(self, request_parameters, stream)\u001b[0m\n\u001b[0;32m 279\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m--> 280\u001b[0m \u001b[43mhf_raise_for_status\u001b[49m\u001b[43m(\u001b[49m\u001b[43mresponse\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 281\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m response\u001b[38;5;241m.\u001b[39miter_lines() \u001b[38;5;28;01mif\u001b[39;00m stream \u001b[38;5;28;01melse\u001b[39;00m response\u001b[38;5;241m.\u001b[39mcontent\n",
|
| 267 |
+
"File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python313\\site-packages\\huggingface_hub\\utils\\_http.py:465\u001b[0m, in \u001b[0;36mhf_raise_for_status\u001b[1;34m(response, endpoint_name)\u001b[0m\n\u001b[0;32m 462\u001b[0m message \u001b[38;5;241m=\u001b[39m (\n\u001b[0;32m 463\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124mBad request for \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mendpoint_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m endpoint:\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m endpoint_name \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124mBad request:\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 464\u001b[0m )\n\u001b[1;32m--> 465\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m _format(BadRequestError, message, response) \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;21;01me\u001b[39;00m\n\u001b[0;32m 467\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m response\u001b[38;5;241m.\u001b[39mstatus_code \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m403\u001b[39m:\n",
|
| 268 |
+
"\u001b[1;31mBadRequestError\u001b[0m: (Request ID: Root=1-686d606c-1f8bffb50e7ac4b077a26fe0;2128d2d1-4e56-4788-a9eb-3015f54f1e44)\n\nBad request:",
|
| 269 |
+
"\nThe above exception was the direct cause of the following exception:\n",
|
| 270 |
+
"\u001b[1;31mAgentGenerationError\u001b[0m Traceback (most recent call last)",
|
| 271 |
+
"Cell \u001b[1;32mIn[22], line 11\u001b[0m\n\u001b[0;32m 8\u001b[0m question_text \u001b[38;5;241m=\u001b[39m item[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mquestion\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n\u001b[0;32m 9\u001b[0m task_id \u001b[38;5;241m=\u001b[39m item[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtask_id\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n\u001b[1;32m---> 11\u001b[0m submitted_answer \u001b[38;5;241m=\u001b[39m \u001b[43magent\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtask_id\u001b[49m\u001b[43m,\u001b[49m\u001b[43mquestion_text\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 13\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mSubmitted answer:\u001b[39m\u001b[38;5;124m\"\u001b[39m, submitted_answer)\n",
|
| 272 |
+
"Cell \u001b[1;32mIn[21], line 65\u001b[0m, in \u001b[0;36mBasicAgent.__call__\u001b[1;34m(self, taskid, question)\u001b[0m\n\u001b[0;32m 54\u001b[0m agent \u001b[38;5;241m=\u001b[39m ToolCallingAgent(\n\u001b[0;32m 55\u001b[0m tools\u001b[38;5;241m=\u001b[39m[\n\u001b[0;32m 56\u001b[0m fetch_file, \n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 61\u001b[0m max_steps\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m9\u001b[39m,\n\u001b[0;32m 62\u001b[0m )\n\u001b[0;32m 64\u001b[0m \u001b[38;5;66;03m# Run the agent with the prompt\u001b[39;00m\n\u001b[1;32m---> 65\u001b[0m fixed_answer \u001b[38;5;241m=\u001b[39m \u001b[43magent\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun\u001b[49m\u001b[43m(\u001b[49m\u001b[43mprompt\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 67\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m fixed_answer\n",
|
| 273 |
+
"File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python313\\site-packages\\smolagents\\agents.py:442\u001b[0m, in \u001b[0;36mMultiStepAgent.run\u001b[1;34m(self, task, stream, reset, images, additional_args, max_steps)\u001b[0m\n\u001b[0;32m 439\u001b[0m run_start_time \u001b[38;5;241m=\u001b[39m time\u001b[38;5;241m.\u001b[39mtime()\n\u001b[0;32m 440\u001b[0m \u001b[38;5;66;03m# Outputs are returned only at the end. We only look at the last step.\u001b[39;00m\n\u001b[1;32m--> 442\u001b[0m steps \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mlist\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_run_stream\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtask\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtask\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmax_steps\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmax_steps\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mimages\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mimages\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 443\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(steps[\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1\u001b[39m], FinalAnswerStep)\n\u001b[0;32m 444\u001b[0m output \u001b[38;5;241m=\u001b[39m steps[\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1\u001b[39m]\u001b[38;5;241m.\u001b[39moutput\n",
|
| 274 |
+
"File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python313\\site-packages\\smolagents\\agents.py:530\u001b[0m, in \u001b[0;36mMultiStepAgent._run_stream\u001b[1;34m(self, task, max_steps, images)\u001b[0m\n\u001b[0;32m 527\u001b[0m final_answer \u001b[38;5;241m=\u001b[39m output\u001b[38;5;241m.\u001b[39moutput\n\u001b[0;32m 528\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m AgentGenerationError \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[0;32m 529\u001b[0m \u001b[38;5;66;03m# Agent generation errors are not caused by a Model error but an implementation error: so we should raise them and exit.\u001b[39;00m\n\u001b[1;32m--> 530\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m e\n\u001b[0;32m 531\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m AgentError \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[0;32m 532\u001b[0m \u001b[38;5;66;03m# Other AgentError types are caused by the Model, so we should log them and iterate.\u001b[39;00m\n\u001b[0;32m 533\u001b[0m action_step\u001b[38;5;241m.\u001b[39merror \u001b[38;5;241m=\u001b[39m e\n",
|
| 275 |
+
"File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python313\\site-packages\\smolagents\\agents.py:517\u001b[0m, in \u001b[0;36mMultiStepAgent._run_stream\u001b[1;34m(self, task, max_steps, images)\u001b[0m\n\u001b[0;32m 515\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mlogger\u001b[38;5;241m.\u001b[39mlog_rule(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mStep \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstep_number\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m, level\u001b[38;5;241m=\u001b[39mLogLevel\u001b[38;5;241m.\u001b[39mINFO)\n\u001b[0;32m 516\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m--> 517\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43moutput\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_step_stream\u001b[49m\u001b[43m(\u001b[49m\u001b[43maction_step\u001b[49m\u001b[43m)\u001b[49m\u001b[43m:\u001b[49m\n\u001b[0;32m 518\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;66;43;03m# Yield streaming deltas\u001b[39;49;00m\n\u001b[0;32m 519\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mnot\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43misinstance\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43moutput\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m(\u001b[49m\u001b[43mActionOutput\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mToolOutput\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\u001b[43m:\u001b[49m\n\u001b[0;32m 520\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01myield\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43moutput\u001b[49m\n",
|
| 276 |
+
"File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python313\\site-packages\\smolagents\\agents.py:1289\u001b[0m, in \u001b[0;36mToolCallingAgent._step_stream\u001b[1;34m(self, memory_step)\u001b[0m\n\u001b[0;32m 1287\u001b[0m memory_step\u001b[38;5;241m.\u001b[39mtoken_usage \u001b[38;5;241m=\u001b[39m chat_message\u001b[38;5;241m.\u001b[39mtoken_usage\n\u001b[0;32m 1288\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m-> 1289\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m AgentGenerationError(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mError while generating output:\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;132;01m{\u001b[39;00me\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mlogger) \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;21;01me\u001b[39;00m\n\u001b[0;32m 1291\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m chat_message\u001b[38;5;241m.\u001b[39mtool_calls \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(chat_message\u001b[38;5;241m.\u001b[39mtool_calls) \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m0\u001b[39m:\n\u001b[0;32m 1292\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n",
|
| 277 |
+
"\u001b[1;31mAgentGenerationError\u001b[0m: Error while generating output:\n(Request ID: Root=1-686d606c-1f8bffb50e7ac4b077a26fe0;2128d2d1-4e56-4788-a9eb-3015f54f1e44)\n\nBad request:"
|
| 278 |
+
]
|
| 279 |
+
}
|
| 280 |
+
],
|
| 281 |
"source": [
|
| 282 |
"item = {\n",
|
| 283 |
" \"task_id\": \"8e867cd7-cff9-4e6c-867a-ff5ddc2550be\",\n",
|
|
|
|
| 287 |
" }\n",
|
| 288 |
"\n",
|
| 289 |
"question_text = item[\"question\"]\n",
|
| 290 |
+
"task_id = item[\"task_id\"]\n",
|
| 291 |
"\n",
|
| 292 |
+
"submitted_answer = agent(task_id,question_text)\n",
|
| 293 |
"\n",
|
| 294 |
+
"print(\"Submitted answer:\", submitted_answer)\n"
|
|
|
|
| 295 |
]
|
| 296 |
}
|
| 297 |
],
|
tools.py
CHANGED
|
@@ -1,7 +1,25 @@
|
|
| 1 |
-
from smolagents import tool
|
| 2 |
import requests
|
| 3 |
import json
|
| 4 |
import os
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 5 |
|
| 6 |
@tool
|
| 7 |
def fetch_questions(api_url: str) -> dict | None:
|
|
|
|
|
|
|
| 1 |
import requests
|
| 2 |
import json
|
| 3 |
import os
|
| 4 |
+
from smolagents import tool
|
| 5 |
+
from typing import Any, Optional
|
| 6 |
+
from smolagents.tools import Tool
|
| 7 |
+
|
| 8 |
+
class FinalAnswerTool(Tool):
|
| 9 |
+
name = "final_answer"
|
| 10 |
+
description = "Provides a final answer to the given problem."
|
| 11 |
+
inputs = {'answer': {'type': 'any', 'description': 'The final answer to the problem'}}
|
| 12 |
+
output_type = "any"
|
| 13 |
+
|
| 14 |
+
def forward(self, answer: Any) -> Any:
|
| 15 |
+
|
| 16 |
+
# Returns the final answer provided by the agent.
|
| 17 |
+
# FINAL ANSWER: [YOUR FINAL ANSWER].
|
| 18 |
+
|
| 19 |
+
return answer
|
| 20 |
+
|
| 21 |
+
def __init__(self, *args, **kwargs):
|
| 22 |
+
self.is_initialized = False
|
| 23 |
|
| 24 |
@tool
|
| 25 |
def fetch_questions(api_url: str) -> dict | None:
|