import io
from contextlib import redirect_stdout
import gradio as gr
from smolagents import (
load_tool,
CodeAgent,
ToolCallingAgent,
VLLMModel,
DuckDuckGoSearchTool,
VisitWebpageTool,
HfApiModel,
GradioUI,
AgentLogger,
LogLevel
)
import re
import html
import datetime
def save_conversation_to_file(conversation, filename="~/data/final_negotiation.txt"):
os.makedirs(os.path.expanduser("~/data"), exist_ok=True)
full_path = os.path.expanduser(filename)
with open(full_path, "w") as f:
for msg in conversation:
f.write(f"{msg['role']}: {msg['content']}\n")
return full_path
import subprocess
def run_terminal_command(file_path):
command = [
"recall",
"bucket",
"add",
"--address", "0xff00000000000000000000000000000000000109",
"--key", "hello/world",
file_path
]
result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
return result.stdout.decode(), result.stderr.decode()
def save_and_run(chat_history):
file_path = save_conversation_to_file(chat_history)
stdout, stderr = run_terminal_command(file_path)
print("Recall Output:", stdout)
if stderr:
print("Recall Error:", stderr)
return chat_history
# Set up your model and logger
model = HfApiModel()
logger = AgentLogger(level=LogLevel.INFO)
agent_party_b = CodeAgent(
tools=[],
model=model,
name="agent_party_b",
description="You are Dr. Daniel Faraday's negotiation agent seeking favorable research terms for a physicist specializing in time-space anomalies; require research autonomy, equipment access, publication pathways, safety protocols, and return guarantees; prioritize unique research access over compensation; authorized to accept agreements meeting all non-negotiables and addressing 60 percent of key questions satisfactorily.",
max_steps=12,
verbosity_level=1,
planning_interval=4
)
# Create a manager agent that can create more agents
agent_party_a = CodeAgent(
tools=[],
managed_agents=[agent_party_b],
model=model,
name="agent_party_a",
description="Work with Dr. Daniel Faraday's Agent. You are Dr. Juliet Burke's negotiation agent seeking qualified researchers (PhD required, 6-month commitment, top-secret clearance) for confidential island medical research; prioritize security and minimal information disclosure while offering unique research opportunities, competitive compensation, and publication rights (with review); authorized to finalize agreements meeting all non-negotiables and 70 percent of strategic goals.",
max_steps=12,
verbosity_level=1,
planning_interval=4
)
# Capture agent visualization
def clean_ansi_codes(text):
"""Remove ANSI color codes for clean display"""
ansi_escape = re.compile(r'\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])')
return ansi_escape.sub('', text)
# Create a custom Gradio UI that extends the GradioUI class
class MonitoringGradioUI(GradioUI):
def __init__(self, agent, file_upload_folder=None):
super().__init__(agent, file_upload_folder)
self.name = "Agent Interface with Monitoring"
def launch(self, share=True, **kwargs):
with gr.Blocks(theme="ocean", fill_height=True) as demo:
# Add session state to store session-specific data
session_state = gr.State({})
stored_messages = gr.State([])
file_uploads_log = gr.State([])
with gr.Tab("Chat"):
with gr.Sidebar():
gr.Markdown(
f"# {self.name.replace('_', ' ').capitalize()}"
"\n> This web UI allows you to interact with a `smolagents` agent that can use tools and execute steps to complete tasks."
+ (f"\n\n**Agent description:**\n{self.description}" if self.description else "")
)
with gr.Group():
gr.Markdown("**Your request**", container=True)
text_input = gr.Textbox(
lines=3,
label="Chat Message",
container=False,
placeholder="Enter your prompt here and press Shift+Enter or press the button",
)
submit_btn = gr.Button("Submit", variant="primary")
# If an upload folder is provided, enable the upload feature
if self.file_upload_folder is not None:
upload_file = gr.File(label="Upload a file")
upload_status = gr.Textbox(label="Upload Status", interactive=False, visible=False)
upload_file.change(
self.upload_file,
[upload_file, file_uploads_log],
[upload_status, file_uploads_log],
)
gr.HTML("
{html_viz}" # viz_html = gr.HTML(value=html_viz) # # Add a refresh button # refresh_btn = gr.Button("Refresh Agent Tree") # def refresh_viz(): # new_viz = get_agent_visualization() # new_viz_clean = clean_ansi_codes(new_viz) # html_viz = new_viz_clean.replace("├──", "├─ ").replace("└──", "└─ ").replace("│", "│ ") # html_viz = html.escape(html_viz) # html_viz = f"
{html_viz}" # return html_viz # refresh_btn.click(refresh_viz, None, viz_html) # Add some explanatory text gr.Markdown(""" ### Monitoring Information This tab shows the structure of your agent, including: - Hierarchical organization of agents - Available tools for each agent - Agent configurations Use the refresh button to update the visualization if you modify your agent structure. """) demo.launch(debug=True, share=share, **kwargs) # Create and launch your UI # Make sure uploads directory exists import os os.makedirs("./uploads", exist_ok=True) ui = MonitoringGradioUI(agent_party_a, file_upload_folder="./uploads") ui.launch(share=True) # Set share=False if you don't want to create a public link