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()