from db import fetch_db_rows_as_dicts import google.generativeai as genai import json import os import pandas as pd GOOGLE_API_KEY= os.getenv('GEMINI_API_KEY') genai.configure(api_key=GOOGLE_API_KEY) model = genai.GenerativeModel(model_name = "gemini-pro") def load_json_from_string(json_string): try: data = json.loads(json_string) return data except json.JSONDecodeError as e: print(f"Error decoding JSON: {e}") except Exception as e: print(f"An error occurred: {e}") def concatenate_keys(keys): concatenated_string = "" for i, d in enumerate(keys, start=1): concatenated_string += f"{i}. {d}" print('##########################') print(concatenated_string.strip()) return concatenated_string.strip() def transform_to_dict_of_dicts(columns, rows): # Initialize the result dictionary result = {} # Iterate over each row for row in rows: #print(dict(row)) # The first element of the row is the key for the outer dictionary outer_key = row[0].strip() # Initialize the inner dictionary inner_dict = {} # Iterate over the rest of the elements in the row for i, value in enumerate(row[1:], start=1): # The corresponding column name is the key for the inner dictionary inner_key = columns[i].strip() # Add the key-value pair to the inner dictionary inner_dict[inner_key] = value # Add the inner dictionary to the result dictionary with the outer key result[outer_key] = inner_dict return result def transform_topologies_to_dict(columns, rows): # Initialize the result dictionary result = {} # Iterate over each row for row in rows: #print(dict(row)) # The first element of the row is the key for the outer dictionary outer_key = row[0].strip() # Initialize the inner dictionary inner_dict = {} # Iterate over the rest of the elements in the row for i, value in enumerate(row[1:], start=1): # The corresponding column name is the key for the inner dictionary inner_key = columns[i].strip() # Add the key-value pair to the inner dictionary inner_dict[inner_key] = value # Add the inner dictionary to the result dictionary with the outer key result[outer_key] = inner_dict return result def listNeeds(tableName, dbName='data.sqlite'): needs, rows = fetch_db_rows_as_dicts(dbName, tableName) needsDict = transform_to_dict_of_dicts(needs, rows) return list(needsDict.keys()), needsDict def findTop3MoneyNeeds(proposition): moneyNeeds, rows = fetch_db_rows_as_dicts('data.sqlite', 'money_needs') moneyNeedsDict = transform_to_dict_of_dicts(moneyNeeds, rows) #print(list(moneyNeedsDict.keys())) needs = findTop3Needs(proposition, list(moneyNeedsDict.keys())) needDictIndexes = [] for need in needs: needDictIndexes.append(moneyNeedsDict[need]) #print(needDictIndexes) return needs, needDictIndexes def findTop3CustomerExperienceNeeds(proposition): moneyNeeds, rows = fetch_db_rows_as_dicts('data.sqlite', 'customer_exp') moneyNeedsDict = transform_to_dict_of_dicts(moneyNeeds, rows) #print(list(moneyNeedsDict.keys())) needs = findTop3Needs(proposition, list(moneyNeedsDict.keys())) needDictIndexes = [] for need in needs: needDictIndexes.append(moneyNeedsDict[need]) #print(needDictIndexes) return needs, needDictIndexes def findTop3SustainabilityNeeds(proposition): print(" Proposition sustain = {}".format(proposition)) allNeeds, rows = fetch_db_rows_as_dicts('data.sqlite', 'sustainability') needsDict = transform_to_dict_of_dicts(allNeeds, rows) needs = findTop3Needs(proposition, list(needsDict.keys())) needDictIndexes = [] print(list(needsDict.keys())) for need in needs: needDictIndexes.append(needsDict[need]) print(needDictIndexes) return needs, needDictIndexes def findTop3Needs(proposition, needs): needsString = concatenate_keys(needs) prompt = '''You have this comma separated listed needs of customers {} Now given a proposition "{}" Find the best 3 strings out of the above numbered list which best matches this proposition. Return in output only the number next to the matching string strictly only in json under a list called matches ''' needsPrompt = prompt.format(needsString, proposition) print(needsPrompt) response = model.generate_content([needsPrompt]) output = response.text output = output.replace('```json', '') output = output.replace('```', '') obj = load_json_from_string(output) print(obj) needsIndexes = [needs[int(idx)-1] for idx in obj['matches']] return needsIndexes #obj['matches'] def findTop3Topologies(proposition, demographic): topologies = pd.read_csv('topologies_desc.csv', encoding = "ISO-8859-1") topologies = topologies.dropna(axis=1, how='all') topologyAttributes = topologies['Column1'] topologyNames = list(topologies.columns) topologyNames.remove('Column1') #print(" topologyNames = {} ", topologyNames) topologyDetails = {} for name in topologyNames: topologyDetails[name] = {} for attribute in topologyAttributes: topologyDetails[name][attribute] = topologies[name][pd.Index(topologies['Column1']).get_loc(attribute)] prompt = '''You have these listed topology names of a demographic in comma separated values below {} Now for each of these above topologies here are the details {} Now given a proposition details below {} and given a demographic details below {} Find the best 3 common strings out of the topology names which matches the proposition and the demographic the most. Return output strictly only in json under a list called matches ''' topologyPrompt = prompt.format(", ".join(topologyNames), str(topologyDetails), proposition, demographic) response = model.generate_content([topologyPrompt]) output = response.text output = output.replace('```json', '') output = output.replace('```', '') obj = load_json_from_string(output) print(obj) return obj['matches'], topologyDetails def generatePropositionExample(productName, selectedProduct, moneyNeeds, customerExperience, sutainabilityNeeds): proposal = '''You are a business sales professional who can form propostion summary of 100 words based upon the details. Please take the below details and summarize a propostion in less than 100 words. product name = {} product type = {} money needs of customer which this product is supposed to target = {} Customer experience needs which our company will provide = {} Sustainability needs which our product takes care of = {} ''' proposal = proposal.format(productName, selectedProduct, moneyNeeds, customerExperience, sutainabilityNeeds) response = model.generate_content([proposal]) return response.text # def findTop3Needs(proposition, moneyNeeds): # moneyNeedsString = concatenate_keys(moneyNeeds) # print(moneyNeedsString) # prompt = '''You have these listed needs of customers # {} # Now given a proposition # "{}" # Find the best 3 strings out of the list which matches this proposition. Return output strictly only in json under a list called matches # ''' # moneyNeedsPrompt = prompt.format(moneyNeedsString, proposition) # response = model.generate_content([moneyNeedsPrompt]) # output = response.text # output = output.replace('```json', '') # output = output.replace('```', '') # obj = load_json_from_string(output) # print(obj) # return obj['matches'] # findTop3Topologies('We have a product for family people giving them discounts and low interest loans for home appliances. They can pay us back in small instalments over the course of 4 years', # 'CharlesTown city people are young families people mostly with a population of 20000. Out of this 65% are between the age of 30-45. Most of them have kids aged between 0-15') #findTop3SustainabilityNeeds('We support Home appliances are all electric and use no fuel based energy') #We provide a credit card which gives 10% discount on purchasing home appliances and also provides low interest rates based loans #customer need - We provide our customer with utmost comfort and at home service # subscriber take out # 250 and below with a negative factor of 2.0 # 260 with a negative factor of 1.8 # 270 with a negative factor of 1.6 # 280 with a negative factor of 1.0 # 300 with a factor of 1 # 310 with a factor of 1.2 # 320 with a factor of 1.4 # 340 with a factor or 1.5 # 360+ with a factor of 2.0