Spaces:
Sleeping
Sleeping
| import os | |
| import gradio as gr | |
| from langchain import OpenAI, ConversationChain, LLMChain, PromptTemplate | |
| from langchain.memory import ConversationBufferWindowMemory | |
| from langchain.prompts import PromptTemplate | |
| from langchain.chains import LLMChain | |
| from langchain.llms import OpenAI | |
| from langchain.agents import load_tools | |
| from langchain.agents import initialize_agent | |
| from langchain.chat_models import ChatOpenAI | |
| import openai | |
| import requests | |
| OPENAI_API_KEY = os.environ['OPENAI_API_KEY'] | |
| GOOGLE_MAPS_API = os.environ['GOOGLE_MAPS_API'] | |
| def get_location_data(search_term, location): | |
| # First, we get the latitude and longitude coordinates of the location | |
| url = "https://maps.googleapis.com/maps/api/geocode/json" | |
| params = { | |
| "address": location, | |
| "key": GOOGLE_MAPS_API | |
| } | |
| response = requests.get(url, params=params) | |
| location_data = response.json()["results"][0]["geometry"]["location"] | |
| # Next, we use the Places API nearbysearch endpoint to find places matching the search term | |
| url = "https://maps.googleapis.com/maps/api/place/nearbysearch/json" | |
| params = { | |
| "location": f"{location_data['lat']},{location_data['lng']}", | |
| "radius": "10000", # 5km radius | |
| #"type": search_term, | |
| "keyword" : search_term, | |
| "key": GOOGLE_MAPS_API | |
| } | |
| response = requests.get(url, params=params) | |
| results = response.json()["results"] | |
| # We only want the first 5 results | |
| results = results[:5] | |
| # For each result, we get the place details to retrieve the description and top reviews | |
| locations = [] | |
| for result in results: | |
| place_id = result["place_id"] | |
| url = "https://maps.googleapis.com/maps/api/place/details/json" | |
| params = { | |
| "place_id": place_id, | |
| "fields": "name,formatted_address,formatted_phone_number,rating,review", | |
| "key": GOOGLE_MAPS_API | |
| } | |
| response = requests.get(url, params=params) | |
| place_details = response.json()["result"] | |
| # Create a dictionary representing the location and add it to the list | |
| location_dict = { | |
| "name": place_details["name"], | |
| "address": place_details["formatted_address"], | |
| #"phone_number": place_details.get("formatted_phone_number", "N/A"), | |
| #"rating": place_details.get("rating", "N/A"), | |
| "reviews": [] | |
| } | |
| # Add the top 3 reviews to the dictionary | |
| reviews = place_details.get("reviews", []) | |
| for review in reviews[:3]: | |
| review_dict = { | |
| #"author": review["author_name"], | |
| #"rating": review["rating"], | |
| "text": review["text"], | |
| #"time": review["relative_time_description"] | |
| } | |
| location_dict["reviews"].append(review_dict) | |
| locations.append(location_dict) | |
| return locations | |
| # Define the function to be used in the Gradio app | |
| def find_competitors(product, location): | |
| locations = get_location_data(product, location) | |
| if len(locations) == 0: | |
| return f"No competitors found for {product} in {location}." | |
| output_str = f"Top competitors for {product} in {location}:" | |
| for i, loc in enumerate(locations): | |
| output_str += f"\n{i+1}. {loc['name']}" | |
| output_str += f"\nAddress: {loc['address']}" | |
| #output_str += f"\nPhone number: {loc['phone_number']}" | |
| #output_str += f"\nRating: {loc['rating']}" | |
| output_str += f"\nTop 3 reviews:" | |
| for review in loc['reviews']: | |
| output_str += f"\n- {review['text']}" | |
| #output_str += f"\n Author: {review['author']}" | |
| #output_str += f"\n Rating: {review['rating']}" | |
| #output_str += f"\n Time: {review['time']}" | |
| output_str2 = f"Top competitors for {product} in {location}:" | |
| for i, loc in enumerate(locations): | |
| output_str2 += f"\n{i+1}. {loc['name']}" | |
| output_str2 += f"\nAddress: {loc['address']}" | |
| #return output_str | |
| prompt_input = ''' | |
| You are an expert management consultant that rivals the best of Mckinsey, Bain, BCG. | |
| The client wants to sell {} in {}. | |
| {} | |
| Provide an analysis of the following: | |
| - From the competition and reviews about its products and come up with creative insights to recommend the client execute as part of a differentiating business strategy. | |
| - From there, think step by step, explain 5 strategies in bullet points of a creative and effective business plan. | |
| - Suggest a location for the client and explain the rationale of this location step by step. | |
| '''.format(product, location, output_str) | |
| template = ''' | |
| {history} | |
| {human_input} | |
| ''' | |
| prompt = PromptTemplate( | |
| input_variables=["history", "human_input"], | |
| template=template | |
| ) | |
| chatgpt_chain = LLMChain( | |
| llm=ChatOpenAI(model="gpt-3.5-turbo", temperature=0.5,openai_api_key=OPENAI_API_KEY), | |
| prompt=prompt, | |
| verbose=True, | |
| memory=ConversationBufferWindowMemory(k=10), | |
| ) | |
| output = output_str2 + "\n\n" + chatgpt_chain.predict(human_input=prompt_input) | |
| return(output) | |
| # Create the Gradio app interface | |
| inputs = [ | |
| gr.inputs.Textbox(label="Product to sell"), | |
| gr.inputs.Textbox(label="Location") | |
| ] | |
| output = gr.outputs.Textbox(label="Business Plan") | |
| interface = gr.Interface(fn=find_competitors, inputs=inputs, outputs=output, title="Auto Consultant", | |
| description="Enter a product and a location to find competitors.") | |
| interface.launch() | |