mohamedelfeky-mo's picture
Update app.py
0900031 verified
from smolagents import CodeAgent, HfApiModel, tool as smol_tool, GradioUI
from smolagents.tools import Tool
import datetime
import pytz
import yaml
import tempfile
import gradio as gr
import os
import re
# Import the tools from your local folder
from tools.final_answer import FinalAnswerTool
from tools.visit_webpage import VisitWebpageTool
from tools.create_presentation import create_presentation
from tools.web_search import DuckDuckGoSearchTool
from tools.write_code import write_code_to_file
# =========================
# ADDITIONAL IN-LINE TOOLS
# =========================
@smol_tool
def create_document(text: str, format: str = "docx") -> str:
"""
Creates a document file (DOCX or PDF) containing the provided text.
Args:
text: The full textual content that will be written into the document.
format: The output file format. Must be either "docx" or "pdf".
"""
try:
import docx
from docx.shared import Pt
temp_dir = tempfile.mkdtemp()
doc = docx.Document()
doc.add_heading("Generated Document", 0)
for paragraph in text.split("\n"):
if paragraph.strip():
doc.add_paragraph(paragraph)
file_path = os.path.join(temp_dir, f"generated_document.{format.lower()}")
doc.save(file_path)
return file_path
except Exception as e:
return f"Error creating document: {str(e)}"
@smol_tool
def create_presentation_preview(title: str, slides: list[str]) -> list[str]:
"""
Create a presentation and return slide previews as images.
Args:
title: Presentation title
slides: List of slide contents
"""
from PIL import Image, ImageDraw
temp_dir = tempfile.mkdtemp()
image_paths = []
for i, slide_text in enumerate(slides, start=1):
img = Image.new("RGB", (800, 450), "white")
draw = ImageDraw.Draw(img)
draw.text((40, 40), f"{title}\n\nSlide {i}:\n{slide_text[:100]}", fill="black")
path = os.path.join(temp_dir, f"slide_{i}.png")
img.save(path)
image_paths.append(path)
return image_paths
# =========================
# AGENT SETUP
# =========================
final_answer = FinalAnswerTool()
visit_webpage = VisitWebpageTool()
web_search = DuckDuckGoSearchTool()
model = HfApiModel(
max_tokens=2096,
temperature=0.5,
model_id="Qwen/Qwen2.5-72B-Instruct", # Updated to a widely available stable ID
)
# Load the prompt templates we created earlier
with open("prompts.yaml", "r") as stream:
prompt_templates = yaml.safe_load(stream)
agent = CodeAgent(
model=model,
tools=[
final_answer,
visit_webpage,
web_search, # Added from your tools folder
create_document,
create_presentation,
create_presentation_preview,
write_code_to_file,
],
max_steps=10,
verbosity_level=1,
prompt_templates=prompt_templates,
)
# =========================
# UI CUSTOMIZATION
# =========================
class CustomGradioUI(GradioUI):
def build_interface(self):
with gr.Blocks(theme=gr.themes.Soft()) as interface:
gr.Markdown("# 🚀 Enterprise AI Agent")
gr.Markdown("Search the web, create docs, and generate PowerPoints instantly.")
chatbot = gr.Chatbot(height=500, show_label=False)
with gr.Row():
msg = gr.Textbox(placeholder="E.g., 'Research AI trends and make a 5-slide PPT'", scale=9)
submit = gr.Button("Send", variant="primary", scale=1)
with gr.Row():
download_btn = gr.Button("📂 Download Generated File", visible=False)
file_output = gr.File(label="Ready for Download", visible=False)
self._latest_file_path = None
def respond(message, chat_history):
# Run the agent
agent_response = self.agent.run(message)
chat_history.append((message, str(agent_response)))
# File detection logic
self._latest_file_path = None
show_download = False
match = re.search(r"(/tmp/[\w\d_-]+/generated_[\w-]+\.(docx|pdf|pptx))", str(agent_response))
if match:
self._latest_file_path = match.group(1)
show_download = True
return chat_history, gr.update(visible=show_download), gr.update(visible=False)
def prepare_download():
if self._latest_file_path and os.path.exists(self._latest_file_path):
return gr.update(value=self._latest_file_path, visible=True)
return gr.update(visible=False)
msg.submit(respond, [msg, chatbot], [chatbot, download_btn, file_output])
submit.click(respond, [msg, chatbot], [chatbot, download_btn, file_output])
download_btn.click(prepare_download, [], [file_output])
return interface
if __name__ == "__main__":
CustomGradioUI(agent).launch()