ideapoke / app.py
karthigrj's picture
Update app.py
0a4491c verified
import streamlit as st
from langchain.agents import initialize_agent, Tool, AgentType
from langchain_groq import ChatGroq
from typing import TypedDict, Dict, List
from langchain_community.tools import TavilySearchResults
from dotenv import load_dotenv
import os
load_dotenv()
GROQ_API_KEY = os.getenv("GROQ_API_KEY")
TAVILY_API_KEY = os.getenv("TAVILY_API_KEY")
llm = ChatGroq(
name="chat_groq",
model="llama3-groq-70b-8192-tool-use-preview",
max_tokens=8000,
temperature=0.5,
api_key=GROQ_API_KEY,
)
def web_search_tool(query: str) -> str:
"""This tool performs web search to gather relevant data."""
# client = TavilyClient(api_key="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")
websearch = TavilySearchResults(max_results=5, search_depth="advanced",api_key=TAVILY_API_KEY )
response = websearch.invoke({"query": query})
return response
tools = [
Tool(
name="WebSearchTool",
func=web_search_tool,
description="Use this tool to perform a web search for the given query."
)
]
agent = initialize_agent(
tools,
llm,
agent_type=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
verbose=True
)
class ResearchState(TypedDict):
company: str
company_keywords: str
exclude_keywords: str
documents: Dict[str, str]
RAG_docs: List[str]
def research_model(state: ResearchState) -> ResearchState:
query = state['company_keywords']
search_result = web_search_tool(query)
state['documents'][query] = search_result
return state
def process_documents(state: ResearchState) -> ResearchState:
relevant_docs = []
for query, doc in state['documents'].items():
if state['exclude_keywords'] not in doc:
relevant_docs.append(doc)
state['RAG_docs'] = relevant_docs
return state
def write_report(state: ResearchState) -> str:
top_companies = f"""Top Companies in {state['company']} Domain: list down all the companies that are being a top player in this domain\n"""
ecosystems = f"Related Ecosystems or Domains:\n{state['company_keywords']} list down other subdomains are industries that are hugely impacted because of this\n"
future_trends = f"""list down the interesting future trends of {state['company']} adoption across industries mentioned in the NEWS articles"""
prompt = f"""Based on the documents gathered for the domain '{state['company']}', summarize the key companies, trends, and ecosystem.
- Key Companies:
{top_companies}
- Ecosystems:
{ecosystems}
- Future Trends:
{future_trends}
Documents considered: {str(state['RAG_docs'])}.
Ensure that the output is structured into sections like Top Companies, Related Ecosystems, and Future Trends.
"""
messages = [
{"role": "system", "content": "You are an assistant that helps with research."},
{"role": "user", "content": prompt}
]
try:
# Pass the messages to the LLM and get the result
result = llm.invoke(messages)
st.header("Research Report:")
st.write(result.content)
st.write(result.response_metadata)
st.subheader("References:")
st.write(state)
return result
except Exception as e:
return f"An error occurred: {str(e)}"
# Streamlit UI layout
st.set_page_config(page_title="Domain Research", layout="wide")
st.title("Research on Domains and Ecosystems")
# Left panel for user input
with st.sidebar:
st.header("Input Section")
company = st.text_input("Company Name:", "Electric Vehicles")
company_keywords = st.text_area("Company Keywords:",
"electric vehicle industry, top EV brands, EV trends, EV ecosystem")
exclude_keywords = st.text_area("Exclude Keywords:", "obsolete, outdated")
# Run the research workflow when the user submits the form
if st.button("Generate Report"):
state = ResearchState(
company=company, # User input company
company_keywords=company_keywords, # User input keywords
exclude_keywords=exclude_keywords, # User input exclude keywords
documents={},
RAG_docs=[]
)
state = research_model(state)
state = process_documents(state)
report = write_report(state)