Spaces:
Sleeping
Sleeping
| import os | |
| import time | |
| from typing import TypedDict | |
| from langgraph.graph import StateGraph, START, END | |
| from langchain_groq import ChatGroq | |
| from langchain_community.tools import DuckDuckGoSearchRun | |
| import gradio as gr | |
| # βββββββββββββββββββββββββββββββββββββββββ | |
| # 1. Config β set your key here or via HF Secrets | |
| # βββββββββββββββββββββββββββββββββββββββββ | |
| os.environ["GROQ_API_KEY"] = os.getenv("GROQ_API_KEY") | |
| llm = ChatGroq(model="llama-3.1-8b-instant") | |
| search = DuckDuckGoSearchRun() | |
| # βββββββββββββββββββββββββββββββββββββββββ | |
| # 2. State + Graph (same as research_agent.py) | |
| # βββββββββββββββββββββββββββββββββββββββββ | |
| class ResearchState(TypedDict): | |
| query: str | |
| search_results: str | |
| summary: str | |
| def search_node(state: ResearchState): | |
| return {"search_results": search.run(state["query"])} | |
| def summarize_node(state: ResearchState): | |
| prompt = f"""You are a research assistant. Answer the user's question clearly | |
| based on the search results below. Be factual and concise (3-5 sentences). | |
| Question: {state["query"]} | |
| Search Results: | |
| {state["search_results"]}""" | |
| response = llm.invoke(prompt) | |
| return {"summary": response.content} | |
| graph = StateGraph(ResearchState) | |
| graph.add_node("search", search_node) | |
| graph.add_node("summarize", summarize_node) | |
| graph.add_edge(START, "search") | |
| graph.add_edge("search", "summarize") | |
| graph.add_edge("summarize", END) | |
| agent = graph.compile() | |
| # βββββββββββββββββββββββββββββββββββββββββ | |
| # 3. Gradio handler | |
| # βββββββββββββββββββββββββββββββββββββββββ | |
| def run_agent(query): | |
| if not query.strip(): | |
| return "", "β οΈ Please enter a question." | |
| start = time.time() | |
| result = agent.invoke({"query": query}) | |
| elapsed = round(time.time() - start, 1) | |
| answer = result["summary"] | |
| status = f"β Done in {elapsed}s Β· LangGraph β DuckDuckGo β ChatGroq" | |
| return answer, status | |
| def clear_all(): | |
| return "", "", "Ready." | |
| # βββββββββββββββββββββββββββββββββββββββββ | |
| # 4. UI | |
| # βββββββββββββββββββββββββββββββββββββββββ | |
| EXAMPLES = [ | |
| "What is LangGraph and how does it work?", | |
| "Latest AI language models released in 2025?", | |
| "How does Retrieval-Augmented Generation (RAG) work?", | |
| "What is the difference between LangChain and LangGraph?", | |
| ] | |
| with gr.Blocks(theme=gr.themes.Soft(), title="AI Research Agent") as demo: | |
| gr.Markdown(""" | |
| ## π AI Research Agent | |
| Ask any question. The agent searches the web and returns a clear, summarized answer. | |
| """) | |
| with gr.Row(): | |
| # ββ Left panel: Input ββ | |
| with gr.Column(scale=2): | |
| query_input = gr.Textbox( | |
| label="Your Question", | |
| placeholder="e.g. What is LangGraph?", | |
| lines=3, | |
| ) | |
| with gr.Row(): | |
| submit_btn = gr.Button("π Search", variant="primary", scale=3) | |
| clear_btn = gr.Button("Clear", scale=1) | |
| gr.Markdown("**Try an example:**") | |
| for example in EXAMPLES: | |
| gr.Button(example, size="sm").click( | |
| fn=lambda e=example: e, | |
| outputs=query_input | |
| ) | |
| # ββ Right panel: Output ββ | |
| with gr.Column(scale=3): | |
| output_box = gr.Textbox( | |
| label="π Answer", | |
| lines=12, | |
| interactive=False, | |
| ) | |
| status_md = gr.Markdown("Ready.") | |
| # ββ Wire up events ββ | |
| submit_btn.click( | |
| fn=run_agent, | |
| inputs=query_input, | |
| outputs=[output_box, status_md], | |
| ) | |
| query_input.submit( # also fires on Enter key | |
| fn=run_agent, | |
| inputs=query_input, | |
| outputs=[output_box, status_md], | |
| ) | |
| clear_btn.click( | |
| fn=clear_all, | |
| outputs=[query_input, output_box, status_md], | |
| ) | |
| demo.launch()# app.py | |
| import os | |
| import time | |
| from typing import TypedDict | |
| from langgraph.graph import StateGraph, START, END | |
| from langchain_groq import ChatGroq | |
| from langchain_community.tools import DuckDuckGoSearchRun | |
| import gradio as gr | |
| # βββββββββββββββββββββββββββββββββββββββββ | |
| # 1. Config β set your key here or via HF Secrets | |
| # βββββββββββββββββββββββββββββββββββββββββ | |
| os.environ["GROQ_API_KEY"] = "your_groq_api_key_here" | |
| llm = ChatGroq(model="llama3-8b-8192", temperature=0.3) | |
| search = DuckDuckGoSearchRun() | |
| # βββββββββββββββββββββββββββββββββββββββββ | |
| # 2. State + Graph (same as research_agent.py) | |
| # βββββββββββββββββββββββββββββββββββββββββ | |
| class ResearchState(TypedDict): | |
| query: str | |
| search_results: str | |
| summary: str | |
| def search_node(state: ResearchState): | |
| return {"search_results": search.run(state["query"])} | |
| def summarize_node(state: ResearchState): | |
| prompt = f"""You are a research assistant. Answer the user's question clearly | |
| based on the search results below. Be factual and concise (3-5 sentences). | |
| Question: {state["query"]} | |
| Search Results: | |
| {state["search_results"]}""" | |
| response = llm.invoke(prompt) | |
| return {"summary": response.content} | |
| graph = StateGraph(ResearchState) | |
| graph.add_node("search", search_node) | |
| graph.add_node("summarize", summarize_node) | |
| graph.add_edge(START, "search") | |
| graph.add_edge("search", "summarize") | |
| graph.add_edge("summarize", END) | |
| agent = graph.compile() | |
| # βββββββββββββββββββββββββββββββββββββββββ | |
| # 3. Gradio handler | |
| # βββββββββββββββββββββββββββββββββββββββββ | |
| def run_agent(query): | |
| if not query.strip(): | |
| return "", "β οΈ Please enter a question." | |
| start = time.time() | |
| result = agent.invoke({"query": query}) | |
| elapsed = round(time.time() - start, 1) | |
| answer = result["summary"] | |
| status = f"β Done in {elapsed}s Β· LangGraph β DuckDuckGo β ChatGroq" | |
| return answer, status | |
| def clear_all(): | |
| return "", "", "Ready." | |
| # βββββββββββββββββββββββββββββββββββββββββ | |
| # 4. UI | |
| # βββββββββββββββββββββββββββββββββββββββββ | |
| EXAMPLES = [ | |
| "What is LangGraph and how does it work?", | |
| "Latest AI language models released in 2025?", | |
| "How does Retrieval-Augmented Generation (RAG) work?", | |
| "What is the difference between LangChain and LangGraph?", | |
| ] | |
| with gr.Blocks(theme=gr.themes.Soft(), title="AI Research Agent") as demo: | |
| gr.Markdown(""" | |
| ## π AI Research Agent | |
| Ask any question. The agent searches the web and returns a clear, summarized answer. | |
| """) | |
| with gr.Row(): | |
| # ββ Left panel: Input ββ | |
| with gr.Column(scale=2): | |
| query_input = gr.Textbox( | |
| label="Your Question", | |
| placeholder="e.g. What is LangGraph?", | |
| lines=3, | |
| ) | |
| with gr.Row(): | |
| submit_btn = gr.Button("π Search", variant="primary", scale=3) | |
| clear_btn = gr.Button("Clear", scale=1) | |
| gr.Markdown("**Try an example:**") | |
| for example in EXAMPLES: | |
| gr.Button(example, size="sm").click( | |
| fn=lambda e=example: e, | |
| outputs=query_input | |
| ) | |
| # ββ Right panel: Output ββ | |
| with gr.Column(scale=3): | |
| output_box = gr.Textbox( | |
| label="π Answer", | |
| lines=12, | |
| interactive=False, | |
| ) | |
| status_md = gr.Markdown("Ready.") | |
| # ββ Wire up events ββ | |
| submit_btn.click( | |
| fn=run_agent, | |
| inputs=query_input, | |
| outputs=[output_box, status_md], | |
| ) | |
| query_input.submit( # also fires on Enter key | |
| fn=run_agent, | |
| inputs=query_input, | |
| outputs=[output_box, status_md], | |
| ) | |
| clear_btn.click( | |
| fn=clear_all, | |
| outputs=[query_input, output_box, status_md], | |
| ) | |
| demo.launch() |