stivenDR14
commited on
Commit
·
97e737a
1
Parent(s):
89e5d16
agent file cleaned
Browse files
agent.py
CHANGED
@@ -1,5 +1,5 @@
|
|
1 |
"""
|
2 |
-
Intelligent AI Agent using LlamaIndex with
|
3 |
This module contains the agent class with advanced tools and reasoning.
|
4 |
"""
|
5 |
|
@@ -23,17 +23,14 @@ except Exception as e:
|
|
23 |
|
24 |
# LlamaIndex imports
|
25 |
try:
|
26 |
-
from llama_index.core.agent.workflow import CodeActAgent
|
27 |
-
from llama_index.core.workflow import Context
|
28 |
from llama_index.core.agent.workflow import (
|
29 |
ToolCall,
|
30 |
ToolCallResult,
|
31 |
FunctionAgent,
|
32 |
AgentStream,
|
33 |
)
|
34 |
-
from llama_index.llms.huggingface import HuggingFaceLLM
|
35 |
from llama_index.core.tools import FunctionTool
|
36 |
-
from llama_index.tools.duckduckgo import DuckDuckGoSearchToolSpec
|
37 |
from llama_index.tools.wikipedia import WikipediaToolSpec
|
38 |
from llama_index.tools.tavily_research.base import TavilyToolSpec
|
39 |
#from llama_index.llms.ollama import Ollama
|
@@ -44,59 +41,7 @@ except ImportError as e:
|
|
44 |
print(f"LlamaIndex imports not available: {e}")
|
45 |
LLAMA_INDEX_AVAILABLE = False
|
46 |
|
47 |
-
MODEL = "microsoft/Phi-3.5-mini-instruct"
|
48 |
-
|
49 |
-
class SimpleCodeExecutor:
|
50 |
-
"""
|
51 |
-
A simple code executor that runs Python code with state persistence.
|
52 |
-
NOTE: not safe for production use! Use with caution.
|
53 |
-
"""
|
54 |
-
|
55 |
-
def __init__(self, locals_dict: Dict[str, Any], globals_dict: Dict[str, Any]):
|
56 |
-
"""Initialize the code executor."""
|
57 |
-
self.globals = globals_dict
|
58 |
-
self.locals = locals_dict
|
59 |
-
|
60 |
-
def execute(self, code: str) -> Tuple[bool, str, Any]:
|
61 |
-
"""Execute Python code and capture output and return values."""
|
62 |
-
stdout = io.StringIO()
|
63 |
-
stderr = io.StringIO()
|
64 |
-
|
65 |
-
output = ""
|
66 |
-
return_value = None
|
67 |
-
try:
|
68 |
-
with contextlib.redirect_stdout(stdout), contextlib.redirect_stderr(stderr):
|
69 |
-
try:
|
70 |
-
tree = ast.parse(code)
|
71 |
-
last_node = tree.body[-1] if tree.body else None
|
72 |
-
|
73 |
-
if isinstance(last_node, ast.Expr):
|
74 |
-
last_line = code.rstrip().split("\n")[-1]
|
75 |
-
exec_code = (
|
76 |
-
code[: -len(last_line)]
|
77 |
-
+ "\n__result__ = "
|
78 |
-
+ last_line
|
79 |
-
)
|
80 |
-
exec(exec_code, self.globals, self.locals)
|
81 |
-
return_value = self.locals.get("__result__")
|
82 |
-
else:
|
83 |
-
exec(code, self.globals, self.locals)
|
84 |
-
except:
|
85 |
-
exec(code, self.globals, self.locals)
|
86 |
-
|
87 |
-
output = stdout.getvalue()
|
88 |
-
if stderr.getvalue():
|
89 |
-
output += "\n" + stderr.getvalue()
|
90 |
-
|
91 |
-
except Exception as e:
|
92 |
-
output = f"Error: {type(e).__name__}: {str(e)}\n"
|
93 |
-
output += traceback.format_exc()
|
94 |
-
|
95 |
-
if return_value is not None:
|
96 |
-
output += "\n\n" + str(return_value)
|
97 |
-
|
98 |
-
return output
|
99 |
-
|
100 |
|
101 |
class BasicAgent:
|
102 |
"""
|
@@ -248,41 +193,6 @@ class BasicAgent:
|
|
248 |
|
249 |
print(f"✅ Total {len(self.tools)} tools initialized")
|
250 |
|
251 |
-
def _initialize_code_executor(self):
|
252 |
-
"""Initialize the code executor with necessary imports and functions."""
|
253 |
-
# Prepare locals with math functions
|
254 |
-
code_locals = {
|
255 |
-
"add_numbers": lambda a, b: a + b,
|
256 |
-
"subtract_numbers": lambda a, b: a - b,
|
257 |
-
"multiply_numbers": lambda a, b: a * b,
|
258 |
-
"divide_numbers": lambda a, b: a / b if b != 0 else "Error: Division by zero",
|
259 |
-
"power_numbers": lambda a, b: a ** b,
|
260 |
-
"calculate_percentage": lambda v, p: (v * p) / 100,
|
261 |
-
}
|
262 |
-
|
263 |
-
# Prepare globals with common imports
|
264 |
-
code_globals = {
|
265 |
-
"__builtins__": __builtins__,
|
266 |
-
"math": __import__("math"),
|
267 |
-
"datetime": __import__("datetime"),
|
268 |
-
"json": __import__("json"),
|
269 |
-
"re": __import__("re"),
|
270 |
-
}
|
271 |
-
|
272 |
-
try:
|
273 |
-
code_globals["numpy"] = __import__("numpy")
|
274 |
-
code_globals["np"] = code_globals["numpy"]
|
275 |
-
except ImportError:
|
276 |
-
pass
|
277 |
-
|
278 |
-
try:
|
279 |
-
code_globals["pandas"] = __import__("pandas")
|
280 |
-
code_globals["pd"] = code_globals["pandas"]
|
281 |
-
except ImportError:
|
282 |
-
pass
|
283 |
-
|
284 |
-
self.code_executor = SimpleCodeExecutor(code_locals, code_globals)
|
285 |
-
print("✅ Code executor initialized")
|
286 |
|
287 |
def _initialize_agent(self):
|
288 |
"""Initialize the CodeAct Agent (deferred initialization)."""
|
@@ -354,7 +264,7 @@ class BasicAgent:
|
|
354 |
response = await self._async_agent_run(question)
|
355 |
return response
|
356 |
except Exception as e:
|
357 |
-
print(f"Error with
|
358 |
return f"FINAL ANSWER: Error processing question - {str(e)}"
|
359 |
else:
|
360 |
return "FINAL ANSWER: Agent not properly initialized"
|
|
|
1 |
"""
|
2 |
+
Intelligent AI Agent using LlamaIndex with websearch capabilities
|
3 |
This module contains the agent class with advanced tools and reasoning.
|
4 |
"""
|
5 |
|
|
|
23 |
|
24 |
# LlamaIndex imports
|
25 |
try:
|
|
|
|
|
26 |
from llama_index.core.agent.workflow import (
|
27 |
ToolCall,
|
28 |
ToolCallResult,
|
29 |
FunctionAgent,
|
30 |
AgentStream,
|
31 |
)
|
32 |
+
#from llama_index.llms.huggingface import HuggingFaceLLM
|
33 |
from llama_index.core.tools import FunctionTool
|
|
|
34 |
from llama_index.tools.wikipedia import WikipediaToolSpec
|
35 |
from llama_index.tools.tavily_research.base import TavilyToolSpec
|
36 |
#from llama_index.llms.ollama import Ollama
|
|
|
41 |
print(f"LlamaIndex imports not available: {e}")
|
42 |
LLAMA_INDEX_AVAILABLE = False
|
43 |
|
44 |
+
#MODEL = "microsoft/Phi-3.5-mini-instruct"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
45 |
|
46 |
class BasicAgent:
|
47 |
"""
|
|
|
193 |
|
194 |
print(f"✅ Total {len(self.tools)} tools initialized")
|
195 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
196 |
|
197 |
def _initialize_agent(self):
|
198 |
"""Initialize the CodeAct Agent (deferred initialization)."""
|
|
|
264 |
response = await self._async_agent_run(question)
|
265 |
return response
|
266 |
except Exception as e:
|
267 |
+
print(f"Error with agent: {e}")
|
268 |
return f"FINAL ANSWER: Error processing question - {str(e)}"
|
269 |
else:
|
270 |
return "FINAL ANSWER: Agent not properly initialized"
|
app.py
CHANGED
@@ -162,6 +162,10 @@ with gr.Blocks() as demo:
|
|
162 |
**Disclaimers:**
|
163 |
Once clicking on the "submit button, it can take quite some time ( this is the time for the agent to go through all the questions).
|
164 |
This space provides a basic setup and is intentionally sub-optimal to encourage you to develop your own, more robust solution. For instance for the delay process of the submit button, a solution could be to cache the answers and submit in a seperate action or even to answer the questions in async.
|
|
|
|
|
|
|
|
|
165 |
"""
|
166 |
)
|
167 |
|
|
|
162 |
**Disclaimers:**
|
163 |
Once clicking on the "submit button, it can take quite some time ( this is the time for the agent to go through all the questions).
|
164 |
This space provides a basic setup and is intentionally sub-optimal to encourage you to develop your own, more robust solution. For instance for the delay process of the submit button, a solution could be to cache the answers and submit in a seperate action or even to answer the questions in async.
|
165 |
+
|
166 |
+
---
|
167 |
+
My certificate of completion: [](https://huggingface.co/datasets/agents-course/final-certificates/resolve/main/certificates/stiv14/2025-06-27.png)
|
168 |
+
|
169 |
"""
|
170 |
)
|
171 |
|