django_spaces / recipes /engine.py
sachin
add nim inference
8243283
raw
history blame
7.41 kB
import pandas as pd
import numpy as np
import requests
import json
from inference.mistral_inference import text_llm
from django.core.files.storage import default_storage
def execute_prompt(prompt, local=True):
if local:
#url = "http://10.211.137.191:11434/api/generate"
url = "http://localhost:11434/api/generate"
headers = {"Content-Type": "application/json"}
data = {
"model": "mistral",
#"model": "mistral-nemo",
"prompt": prompt,
"stream": False
}
response = requests.post(url, headers=headers, data=json.dumps(data))
output = ""
if response.status_code == 200:
responses = response.text.strip().split('\n')
for resp in responses:
try:
result = json.loads(resp)
print(result.get('response', ''))
output += result.get('response', '') + '\n'
except json.JSONDecodeError:
print(f"Error decoding JSON: {resp}")
else:
print(f"Error: {response.status_code}")
return output.strip()
else:
response = text_llm(prompt)
#print(response)
return response
from datetime import datetime
def bundle_function(articles):
current_date = datetime.now()
bundle_articles = []
for article in articles:
demand = article.get('demand')*100-100
stock = article.get('stock')*100+15
expires_at_str = article.get('expiresAt')
try:
expires_at = datetime.strptime(expires_at_str, '%Y-%m-%d')
days_to_expire = (expires_at - current_date).days
#TODO change days to expire to e.g. 3 / 10
if days_to_expire<3 or (stock > 15 and demand < 10 and days_to_expire<300):
bundle_articles.append(article)
except (ValueError, TypeError):
print(f"Fehler beim Verarbeiten des Ablaufdatums für Artikel: {article.get('name', 'Unbekannt')} in bundle_function")
return bundle_articles
def propose_recipes(bundle_articles):
if bundle_articles:
bundle_article_names = ', '.join([article.get('name') for article in bundle_articles])
prompt = (
f"Give me some recipes where the Bundle articles could be used. My goal is that all items in Bundle articles "
f"are used in a recipe. Seperate the response in three parts. 1. Name of the recipe, 2. Ingredients for the recipe, 3. Steps in the recipe. Answer in a JSON Format"
f"Bundle articles: {bundle_article_names}"
)
return prompt
else:
return "Tell me a joke."
def price_reduction(time_to_expiration, product_type, demand, stock):
""" Calculate the price reduction percentage based on normalized values
(between 0 and 1) for time to expiration, product type, demand, and stock.
Args:
time_to_expiration (float):
Normalized time to expiration, 0 means expiring today, 1 means maximum time.
product_type (float):
Normalized product type (0 = non-perishable, 0.5 = semi-perishable, 1 = highly perishable).
demand (float):
Normalized demand (0 to 1), where 1 is high demand and 0 is no demand.
stock (float):
Normalized stock level (0 to 1), where 0 is low stock and 1 is high stock.
Returns:
reduction_percentage (float): Percentage of price reduction.
"""
# Maximum discouts
MAX_EXPIRATION = 0.05
MAX_STOCK_DEMAND = 0.05
if time_to_expiration > 0.5:
return 0
# Time to expiration: Closer to expiration means higher discount (inverted)
# Maximum factor when time_to_expiration is 0
expiration_factor = (1 - time_to_expiration) * MAX_EXPIRATION
# Stock: Higher stock means higher discount
# Demand: Lower demand should increase discount
# Maximum factor when stock is 1 (high stock) and demand is 0 (low demand)
stock_demand_factor = (stock - demand) * MAX_STOCK_DEMAND
# Product type: Non-perishable (0), semi-perishable (0.5), perishable (1) impact
# Factor ranges from 1.0 (non-perishable) to 1.4 (highly perishable)
product_factor = 1 + (product_type * 6.0)
# Combine all factors to calculate total reduction
reduction_percentage = ((expiration_factor + stock_demand_factor) * product_factor)
# Cap the discount between 0% and 80%
return min(max(reduction_percentage * 100, 0), 80)
def compute_reduced_prices(as_json=True):
#df = pd.read_json('articles.json')
file = default_storage.open('data/articles.json', 'r')
data = json.load(file)
file.close()
df = pd.DataFrame(data)
df["product_type"] = 1
df["time_to_expiration"] = np.random.rand(len(df.index))
df["demand"] = np.random.rand(len(df.index))
df["stock"] = np.random.rand(len(df.index))
df["discount"] = df.apply(lambda row: price_reduction(row['time_to_expiration'], row['product_type'], row['demand'], row['stock']), axis=1)
df["discounted_price"] = df["price"] * (1 - df["discount"] / 100)
df = df.drop(columns=['weight', 'packagingUnit', 'available'])
return df.to_json(orient="records") if as_json is True else df
def json_parser(api_json):
explicit_prompt = """
1. State the name of the food item.
2. Mention the expiration date to raise awareness about freshness.
3. Describe the best storage practices to prolong shelf life.
4. List creative ways to use the food item to encourage consumption before it spoils.
5. Provide actionable tips for minimizing waste, such as recipes or preservation methods.
JSON DATA = {}
""".format(api_json)
implicit_prompt = """
Analyse the data about food items, Lets think step by step
JSON DATA = {}
""".format(api_json)
few_shot_cots = """
JSON DATA = {}
""".format(api_json)
categorize_articles= """
Put the food into 3 categories. Long living food with the criteria: time to expiration greater than 3 months, middle living food with the criteria: time to expiration greater than 2 weeks and less than 3 months, short living food with the criteria: time to expiration less than 2 weeks.
JSON DATA = {}
""".format(api_json)
return categorize_articles
def get_json_objects():
try:
with open('../data/articles.json', 'r') as openfile:
# Reading from json file
json_object = json.load(openfile)
except Exception as e:
print(f"An error occurred: {e}")
# debug -
first_ten_objects = json_object[:10]
return first_ten_objects
#return json_object
def main():
try:
json_objs = compute_reduced_prices()
obj= json.loads(json_objs)
print(obj)
#chunk_size = 100
#for i in range(0,len(obj), chunk_size):
#chunk = obj[i: i+chunk_size]
#level_1_prompt = json_parser(obj[:10])
#execute_prompt(level_1_prompt)
bundle_articles = bundle_function(obj[:10])
execute_prompt(propose_recipes(bundle_articles))
except FileNotFoundError:
print("The file 'articles.json' was not found.")
except json.JSONDecodeError:
print("The file 'articles.json' is not a valid JSON file.")
except Exception as e:
print(f"An error occurred: {e}")
if __name__ == "__main__":
main()