import gradio as gr from tool import LinkupSearchTool def run_search(query, depth, api_key): if not query.strip() or not depth or not api_key.strip(): return "❌ All fields are required." try: tool = LinkupSearchTool(linkup_api_key=api_key) return tool.forward(query=query, depth=depth) except Exception as e: return f"❌ Error: {str(e)}" def enable_submit(q, d, k): return gr.Button.update(interactive=bool(q.strip() and d and k.strip())) with gr.Blocks(title="Linkup Web Search Tool") as demo: gr.Markdown( """ # 🔍 Linkup Web Search Tool Perform real-time web search using [Linkup API](https://linkup.so). 🧠 Supports `standard` and `deep` query depth. 🔐 Requires your personal Linkup API key. 💡 Ideal for facts, trends, research, and real-time data discovery. """, elem_id="header", ) with gr.Row(): query_input = gr.Textbox( label="Search Query", placeholder="e.g. AI trends in 2024", lines=1, ) depth_input = gr.Dropdown( label="Search Depth", choices=["standard", "deep"], value="standard", allow_custom_value=False, ) api_key_input = gr.Textbox( label="Linkup API Key", placeholder="Paste your Linkup API key here", type="password", ) search_btn = gr.Button("🔍 Search", interactive=False) output = gr.Markdown("💬 *Enter a query and click Search to begin.*", elem_id="output") # Loading spinner and search button connection search_btn.click( fn=run_search, inputs=[query_input, depth_input, api_key_input], outputs=output, show_progress=True, ) # Dynamic form validation query_input.input(enable_submit, [query_input, depth_input, api_key_input], [search_btn]) depth_input.input(enable_submit, [query_input, depth_input, api_key_input], [search_btn]) api_key_input.input(enable_submit, [query_input, depth_input, api_key_input], [search_btn]) # Footer gr.Markdown( """ --- ✅ Built with [SmolAgents](https://github.com/huggingface/smolagents) + [Gradio](https://gradio.app) 🔗 Powered by [Linkup](https://linkup.so) """, elem_id="footer", ) demo.launch()