Spaces:
Sleeping
Sleeping
Update src/streamlit_app.py
Browse files- src/streamlit_app.py +50 -40
src/streamlit_app.py
CHANGED
@@ -1,40 +1,50 @@
|
|
1 |
-
import
|
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 |
-
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import os, asyncio, time, logging, streamlit as st
|
2 |
+
from google.adk.agents import Agent
|
3 |
+
from google.adk.sessions import InMemorySessionService
|
4 |
+
from google.adk.runners import Runner
|
5 |
+
from google.adk.tools import google_search
|
6 |
+
from google.genai import types
|
7 |
+
from dotenv import load_dotenv
|
8 |
+
|
9 |
+
load_dotenv(); logging.basicConfig(level=logging.ERROR)
|
10 |
+
MODEL,APP_NAME,USER_ID = "gemini-2.0-flash-exp", "search_assistant_app", "streamlit_user_search"
|
11 |
+
agent = Agent(name="search_assistant", model=MODEL, instruction="You are a helpful assistant Answer user questions using Google Search when needed.", description="An assistant that can search the web.", tools=[google_search])
|
12 |
+
|
13 |
+
@st.cache_resource
|
14 |
+
def init_adk():
|
15 |
+
ss = InMemorySessionService(); r = Runner(agent=agent, app_name=APP_NAME, session_service=ss)
|
16 |
+
sid = st.session_state.get("adk_session_id") or f"session_{int(time.time())}_{os.urandom(4).hex()}"; st.session_state["adk_session_id"] = sid
|
17 |
+
try: ss.create_session(app_name=APP_NAME, user_id=USER_ID, session_id=sid, state={})
|
18 |
+
except: ss.create_session(app_name=APP_NAME, user_id=USER_ID, session_id=sid, state={})
|
19 |
+
return r, sid
|
20 |
+
|
21 |
+
async def run_adk(r, sid, q):
|
22 |
+
try:
|
23 |
+
async for e in r.run_async(user_id=USER_ID, session_id=sid, new_message=types.Content(role="user", parts=[types.Part(text=q)])):
|
24 |
+
if e.is_final_response() and e.content and e.content.parts: return e.content.parts[0].text
|
25 |
+
except Exception as err: return f"Error: {err}"
|
26 |
+
return "[No response]"
|
27 |
+
|
28 |
+
def main():
|
29 |
+
st.set_page_config(page_title="Search", page_icon="π", layout="wide");
|
30 |
+
st.markdown(
|
31 |
+
f'<h1><img src="https://cdn-images-1.medium.com/v2/resize:fill:1600:480/gravity:fp:0.5:0.4/1*A4-k_sI5kmrphjS4tJ_rpA.png" width="60"/> Agent Development Kit <img src="https://images.seeklogo.com/logo-png/44/2/streamlit-logo-png_seeklogo-441815.png" width="60"/></h1>',
|
32 |
+
unsafe_allow_html=True
|
33 |
+
)
|
34 |
+
if not os.environ.get("GOOGLE_API_KEY"): st.error("API Key missing!"); st.stop()
|
35 |
+
try: r, sid = init_adk(); # st.sidebar.success(f"ADK Connected (Session: ...{sid[-8:]})", icon="β
")
|
36 |
+
except Exception as e: st.error(f"ADK failed: {e}", icon="β"); st.stop()
|
37 |
+
if "msgs" not in st.session_state: st.session_state.msgs = []
|
38 |
+
for msg in st.session_state.msgs:
|
39 |
+
with st.chat_message(msg["role"]): st.markdown(msg["content"])
|
40 |
+
if prompt := st.chat_input("Ask..."):
|
41 |
+
st.session_state.msgs.append({"role": "user", "content": prompt});
|
42 |
+
with st.chat_message("user"): st.markdown(prompt)
|
43 |
+
with st.chat_message("assistant"):
|
44 |
+
placeholder = st.empty()
|
45 |
+
with st.spinner("Searching..."): response = asyncio.run(run_adk(r, sid, prompt)); placeholder.markdown(response)
|
46 |
+
st.session_state.msgs.append({"role": "assistant", "content": response})
|
47 |
+
st.sidebar.image("https://cdn-images-1.medium.com/v2/resize:fill:1600:480/gravity:fp:0.5:0.4/1*A4-k_sI5kmrphjS4tJ_rpA.png", use_container_width=True)
|
48 |
+
st.sidebar.caption(f"**Model**: **{MODEL}**")
|
49 |
+
|
50 |
+
if __name__ == "__main__": main()
|