Spaces:
Running
Running
File size: 2,904 Bytes
0856f30 784f767 0856f30 9fd9f34 0856f30 9fd9f34 0856f30 9fd9f34 0856f30 784f767 8f5dd56 0856f30 331248c 0856f30 784f767 726f9a0 ea456d9 0856f30 331248c ea456d9 726f9a0 784f767 c7c85fb c448162 8f5dd56 c7c85fb 784f767 8f5dd56 ea456d9 c7c85fb 784f767 ea456d9 c7c85fb ea456d9 c7c85fb 784f767 8f5dd56 ea456d9 784f767 726f9a0 ea456d9 726f9a0 bec5920 bc8d5c4 bec5920 df47e17 bec5920 0f40482 e8fa056 bec5920 726f9a0 784f767 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 | from typing import TypedDict
from tavily import TavilyClient
from langchain_google_genai import ChatGoogleGenerativeAI
from langgraph.graph import StateGraph, START, END
import gradio as gr
from langgraph.checkpoint.memory import InMemorySaver
import os
class GraphState(TypedDict):
query: str
search_results1: str
search_results2: str
summary1: str
summary2: str
tavily_client = TavilyClient(api_key=os.getenv("TAVILY_API_KEY"))
def tavily_search(state: GraphState):
response = tavily_client.search(
query=state["query"],
max_results=2
)
return {
"search_results1": response["results"][0]['content'][:500],
"search_results2": response["results"][1]['content'][:500]
}
llm = ChatGoogleGenerativeAI(
model="gemini-2.5-flash",
google_api_key=os.getenv("GOOGLE_API_KEY"),
)
def summarize1(state: GraphState):
prompt = f"""
Simply summarize following:
{state['search_results1']}
"""
response = llm.invoke(prompt)
return {"summary1": response.content}
def summarize2(state: GraphState):
prompt = f"""
Simply summarize following:
{state['search_results2']}
"""
response = llm.invoke(prompt)
return {"summary2": response.content}
builder = StateGraph(GraphState)
builder.add_node("search", tavily_search)
builder.add_node("summarize", summarize1)
builder.add_node("revise", summarize2)
builder.set_entry_point("search")
builder.add_edge("search", "summarize")
builder.add_edge("summarize", "revise")
builder.add_edge("revise", END)
checkpointer = InMemorySaver()
thread = {"configurable": {"thread_id": "1"}}
graph = builder.compile(
checkpointer=checkpointer,
interrupt_after=["summarize"]
)
def describe_topic(topic):
result = graph.invoke(
{"query": topic},
config=thread
)
print(result["search_results1"])
return result["summary1"]
def notgood(topic):
result = graph.invoke(
None,
config=thread
)
print(result["search_results2"])
return result["summary2"]
with gr.Blocks() as demo:
gr.Markdown("""# Ask anything and press Enter""")
topic_input = gr.Textbox(
label="Ask here"
)
output1 = gr.Textbox(
label="AI description"
)
output2 = gr.Textbox(
label="AI revised description"
)
no_btn = gr.Button("Click here to revise description")
topic_input.submit(
describe_topic,
inputs=topic_input,
outputs=output1
)
no_btn.click(
notgood,
inputs=topic_input,
outputs=output2
)
gr.Markdown("""
**Note:**
I'm using Google Gemini **free API tier**.
I sacrificed some **quality** by limiting **LLM input output** to not exceed free tier.
If "error" shows up, it means free tier exceeded.
""")
gr.Image(
value="graph.png"
)
demo.launch() |