Spaces:
Runtime error
Runtime error
| 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() | |