import streamlit as st import os from langchain_community.tools.tavily_search import TavilySearchResults from langchain_google_community import GoogleSearchAPIWrapper from langchain_community.utilities import GoogleSerperAPIWrapper from langchain.tools import DuckDuckGoSearchRun, Tool from langchain.chat_models import ChatOpenAI from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder from langchain.agents import create_openai_tools_agent, AgentExecutor from langgraph.graph import StateGraph, END from langchain_core.messages import HumanMessage from typing_extensions import TypedDict from typing import Annotated, Sequence import functools import operator # Initialize tools llm = ChatOpenAI() tavily_tool = TavilySearchResults(max_results=5) search_google_tool = Tool( name="GoogleSearch", func=GoogleSearchAPIWrapper().run, description="Search information using Google Search API." ) duckduck_search_tool = Tool( name="DuckDuckGoSearch", func=DuckDuckGoSearchRun().run, description="Search information using DuckDuckGo." ) serper_tool = Tool( name="GoogleSerperSearch", func=GoogleSerperAPIWrapper(max_results=5).run, description="Perform searches using Google Serper API." ) tavily_tool_wrapped = Tool( name="TavilySearch", func=tavily_tool.run, description="Retrieve search results from Tavily API." ) # Define reusable function for agent creation def create_agent(llm: ChatOpenAI, tools: list, system_prompt: str): prompt = ChatPromptTemplate.from_messages( [ ("system", system_prompt), MessagesPlaceholder(variable_name="messages"), MessagesPlaceholder(variable_name="agent_scratchpad"), ] ) agent = create_openai_tools_agent(llm, tools, prompt) executor = AgentExecutor(agent=agent, tools=tools) return executor # Define agents def get_agents(): cto_agent = create_agent( llm, [duckduck_search_tool], "You are a CTO name finder. Extract the CTO's name from the provided company data." ) glassdoor_agent = create_agent( llm, [tavily_tool_wrapped, serper_tool], "You are a Glassdoor review scraper. Retrieve reviews about the given company. " "Consider points like Overall Rating, Compensation, Senior Management, Career Opportunities." "Provide me number of stars against each point." "Always scrap the same data" ) competitor_agent = create_agent( llm, [tavily_tool_wrapped, serper_tool], "You are a competitor finder. Provide details such as a description of competitors and their primary differences." "Output the results in a table format." ) information_agent = create_agent( llm, [search_google_tool, tavily_tool_wrapped, serper_tool], "You are an information collector. Retrieve details such as Website, Sector, Industry, Location, Employees, Founding Year, and LinkedIn URL. Provide me all these detail in a tabular format." "Linkedin URL will be always like this https://www.linkedin.com/company/company_name" ) return cto_agent, glassdoor_agent, competitor_agent, information_agent # Streamlit App def main(): st.title("Company Insights API") st.write("Enter a company name to fetch details about its CTO, competitors, Glassdoor reviews, and general information.") # Input for company name company_name = st.text_input("Enter company name") run_queries = st.button("Run Queries") if run_queries: # Prepare agents cto_agent, glassdoor_agent, competitor_agent, information_agent = get_agents() # Queries queries = { "CTO": f"Who is the CTO of {company_name}?", "Glassdoor Reviews": f"What are the Glassdoor reviews of {company_name}?", "Competitors": f"What are the competitors of {company_name}?", "Information": f"Give me all information about {company_name}.", } results = {} for query_name, query in queries.items(): agent = { "CTO": cto_agent, "Glassdoor Reviews": glassdoor_agent, "Competitors": competitor_agent, "Information": information_agent, }[query_name] state = { "messages": [HumanMessage(content=query)] } try: response = agent.invoke(state) results[query_name] = response.get("output", "No response") except Exception as e: results[query_name] = f"Error: {e}" # Display results for query_name, result in results.items(): st.subheader(query_name) st.write(result) if __name__ == "__main__": main()