Spaces:
Running
Running
import gradio as gr | |
import os | |
from smolagents import CodeAgent, ToolCollection, Tool | |
from smolagents.models import HfApiModel, LiteLLMModel | |
# Default model to use | |
DEFAULT_MODEL = "Qwen/Qwen2.5-Coder-7B-Instruct" | |
# Tool descriptions for the UI | |
TOOL_DESCRIPTIONS = { | |
"Hub Collections": "Add tool collections from Hugging Face Hub.", | |
"Spaces": "Add tools from Hugging Face Spaces.", | |
} | |
# Function to create an agent with selected tools | |
def create_agent(model_name, hub_tool=None, space_tool=None): | |
tools = [] | |
# Add tool from Hub if provided | |
if hub_tool: | |
try: | |
hub_collection = ToolCollection.from_hub(collection_slug=hub_tool) | |
tools.extend(hub_collection.tools) | |
except Exception as e: | |
print(f"Error loading Hub tool: {e}") | |
# Add tool from Space if provided | |
if space_tool: | |
try: | |
space_tool_obj = Tool.from_space( | |
space_id=space_tool, | |
name=f"space_{space_tool.replace('/', '_')}", | |
description=f"Tool from Hugging Face Space: {space_tool}", | |
) | |
tools.append(space_tool_obj) | |
except Exception as e: | |
print(f"Error loading Space tool: {e}") | |
# Create and return the agent | |
try: | |
# Try to use HfApiModel first | |
model = HfApiModel(model_id=model_name) | |
return CodeAgent(tools=tools, model=model) | |
except Exception: | |
# Fall back to LiteLLMModel if HfApiModel fails | |
try: | |
model = LiteLLMModel(model_id=model_name) | |
return CodeAgent(tools=tools, model=model) | |
except Exception as e: | |
print(f"Error creating agent: {e}") | |
return None | |
# Main application | |
def main(): | |
with gr.Blocks(title="AI Agent Builder") as app: | |
gr.Markdown("# AI Agent Builder with SmolaGents") | |
gr.Markdown( | |
"Build your own AI agent by selecting tools from Hugging Face Hub and Spaces." | |
) | |
with gr.Tabs(): | |
with gr.TabItem("Build Agent"): | |
with gr.Row(): | |
with gr.Column(scale=1): | |
# Model selection | |
model_input = gr.Textbox( | |
label="Model Name", | |
placeholder="Enter model name or ID", | |
value=DEFAULT_MODEL, | |
) | |
# Hub tool input | |
hub_tool_input = gr.Textbox( | |
label="Add Tool Collection from Hub (collection slug)", | |
placeholder="e.g., huggingface-tools/diffusion-tools-...", | |
) | |
# Space tool input | |
space_tool_input = gr.Textbox( | |
label="Add Tool from Space (space ID)", | |
placeholder="e.g., black-forest-labs/FLUX.1-schnell", | |
) | |
# Create agent button | |
create_button = gr.Button("Create Agent") | |
# Status message | |
status_msg = gr.Markdown("") | |
with gr.Column(scale=2): | |
# Chat interface for the agent | |
chatbot = gr.Chatbot(label="Agent Chat") | |
msg = gr.Textbox(label="Your message") | |
with gr.Row(): | |
clear = gr.Button("Clear Chat") | |
regenerate = gr.Button("Regenerate Response") | |
with gr.TabItem("Tool Descriptions"): | |
tool_descriptions_md = """ | |
## Hugging Face Hub Tool Collections | |
You can add tool collections from Hugging Face Hub by providing the collection slug. | |
Example: `huggingface-tools/diffusion-tools-6630bb19a942c2306a2cdb6f` | |
## Hugging Face Spaces as Tools | |
You can add tools from Hugging Face Spaces by providing the space ID. | |
Example: `black-forest-labs/FLUX.1-schnell` | |
This allows you to use any Gradio app on Hugging Face Spaces as a tool for your agent. | |
""" | |
gr.Markdown(tool_descriptions_md) | |
# Agent state | |
agent_state = gr.State(None) | |
last_message = gr.State("") | |
# Event handlers | |
def on_create_agent(model, hub_tool, space_tool): | |
if not model: | |
return None, [], "", "⚠️ Please enter a model name." | |
if not hub_tool and not space_tool: | |
return None, [], "", "⚠️ Please add at least one tool from Hub or Space." | |
agent = create_agent(model, hub_tool, space_tool) | |
if agent is None: | |
return ( | |
None, | |
[], | |
"", | |
"❌ Failed to create agent. Check console for details.", | |
) | |
tools_info = [] | |
if hub_tool: | |
tools_info.append(f"Hub collection: {hub_tool}") | |
if space_tool: | |
tools_info.append(f"Space: {space_tool}") | |
tools_str = " | ".join(tools_info) | |
return ( | |
agent, | |
[], | |
"", | |
f"✅ Agent created successfully with {model}! ({tools_str})", | |
) | |
create_button.click( | |
on_create_agent, | |
inputs=[model_input, hub_tool_input, space_tool_input], | |
outputs=[agent_state, chatbot, msg, status_msg], | |
) | |
def on_message(message, chat_history, agent, last_msg): | |
if not message: | |
return "", chat_history, last_msg | |
if agent is None: | |
chat_history.append((message, "Please create an agent first.")) | |
return "", chat_history, last_msg | |
try: | |
response = agent.run(message, reset=False) | |
chat_history.append((message, response)) | |
return "", chat_history, message | |
except Exception as e: | |
error_msg = f"Error: {str(e)}" | |
chat_history.append((message, error_msg)) | |
return "", chat_history, message | |
msg.submit( | |
on_message, | |
inputs=[msg, chatbot, agent_state, last_message], | |
outputs=[msg, chatbot, last_message], | |
) | |
def on_regenerate(chat_history, agent, last_msg): | |
if not chat_history or not last_msg or agent is None: | |
return chat_history, last_msg | |
try: | |
# Remove the last exchange | |
if chat_history: | |
chat_history.pop() | |
# Regenerate the response | |
response = agent.run(last_msg, reset=False) | |
chat_history.append((last_msg, response)) | |
return chat_history, last_msg | |
except Exception as e: | |
error_msg = f"Error regenerating response: {str(e)}" | |
chat_history.append((last_msg, error_msg)) | |
return chat_history, last_msg | |
regenerate.click( | |
on_regenerate, | |
inputs=[chatbot, agent_state, last_message], | |
outputs=[chatbot, last_message], | |
) | |
def on_clear(): | |
return None, [], "", "Agent cleared. Create a new one to continue." | |
clear.click(on_clear, outputs=[agent_state, chatbot, last_message, status_msg]) | |
return app | |
if __name__ == "__main__": | |
app = main() | |
app.launch() | |