File size: 5,093 Bytes
070c576 6449689 f9c03d9 4425add c8197d4 5b23034 92d0a3c 4d5131c 6449689 327828d 6449689 410e03d 4011ea8 327828d 4011ea8 410e03d 327828d 410e03d 6449689 410e03d 327828d 410e03d 327828d 410e03d e949ec2 410e03d 327828d 410e03d 4011ea8 410e03d 6449689 070c576 69bb9c0 ac2abcc 6449689 070c576 a747dde ac2abcc 378fa83 6449689 070c576 6449689 070c576 7e62d93 6449689 4011ea8 4d5131c 7e62d93 4011ea8 7e62d93 69bb9c0 070c576 6449689 13ff5b8 070c576 4011ea8 070c576 c8197d4 853deb7 c8197d4 070c576 c8197d4 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 |
import gradio as gr
from mistralai.client import MistralClient
from mistralai.models.chat_completion import ChatMessage
import os
import pandas as pd
import numpy as np
from groq import Groq
import anthropic
from users_management import update_json, users
from code_df_custom import load_excel
import zipfile
#users = ['maksG', 'AlmaA', 'YchK']
def ask_llm(query, user_input, client_index, user):
messages = [
{
"role": "system",
"content": f"You are a helpful assistant. Only show your final response to the **User Query**! Do not provide any explanations or details: \n# User Query:\n{query}."
},
{
"role": "user",
"content": user_input,
}
]
systemC = messages[0]["content"]
messageC = [{
"role": "user",
"content": [{
"type": "text",
"text": user_input
}]
}]
if "Mistral" in client_index:
client = MistralClient(api_key=os.environ[user['api_keys']['mistral']])
model_map = {
"Mistral Tiny": "mistral-tiny",
"Mistral Small": "mistral-small-latest",
"Mistral Medium": "mistral-medium",
}
chat_completion = client.chat(messages=messages, model=model_map[client_index])
elif "Claude" in client_index:
client = anthropic.Anthropic(api_key=os.environ[user['api_keys']['claude']])
model_map = {
"Claude Sonnet": "claude-3-sonnet-20240229",
"Claude Opus": "claude-3-opus-20240229",
}
response = client.messages.create(
model=model_map[client_index],
max_tokens=350,
temperature=0,
system=systemC,
messages=messageC
)
return response.content[0].text
elif client_index == "Groq (mixtral)":
client = Groq(api_key=os.environ[user['api_keys']['groq']])
chat_completion = client.chat.completions.create(
messages=messages,
model='mixtral-8x7b-32768',
)
else:
raise ValueError("Unsupported client index provided")
# Return the response, handling the structure specific to Groq and Mistral clients.
return chat_completion.choices[0].message.content if client_index != "Claude" else chat_completion
def filter_df(df, column_name, keywords):
if len(keywords)>0:
if column_name in df.columns:
contains_keyword = lambda x: any(keyword.lower() in (x.lower() if type(x)==str else '') for keyword in keywords)
filtered_df = df[df[column_name].apply(contains_keyword)]
else:
contains_keyword = lambda row: any(keyword.lower() in (str(cell).lower() if isinstance(cell, str) else '') for keyword in keywords for cell in row)
filtered_df = df[df.apply(contains_keyword, axis=1)]
else:
filtered_df = df
return filtered_df
def chat_with_mistral(source_cols, dest_col, prompt, excel_file, url, search_col, keywords, client, user):
new_prompts, new_keywords, new_user, conf_file_path = update_json(user, prompt, keywords)
print(f'xlsxfile = {excel_file}')
df = pd.read_excel(excel_file)
df[dest_col] = ""
if excel_file:
file_name = excel_file.split('.xlsx')[0] + "_with_" + dest_col.replace(' ', '_') + ".xlsx"
elif url.endswith('Docs/', 'Docs'):
file_name = url.split("/Docs")[0].split("/")[-1] + ".xlsx"
else:
file_name = "meeting_recap_grid.xlsx"
print(f"Keywords: {keywords}")
filtred_df = filter_df(df, search_col, keywords)
cpt = 1
for index, row in filtred_df.iterrows():
concatenated_content = "\n\n".join(f"{column_name}: {str(row[column_name])}" for column_name in source_cols)
if not concatenated_content == "\n\n".join(f"{column_name}: nan" for column_name in source_cols):
llm_answer = ask_llm(prompt[0], concatenated_content, client, user)
print(f"{cpt}/{len(filtred_df)}\nQUERY:\n{prompt[0]}\nCONTENT:\n{concatenated_content[:200]}...\n\nANSWER:\n{llm_answer}")
df.at[index, dest_col] = llm_answer
cpt += 1
# progress((index+1)/len(df),desc=f'Request {index+1}/{len(df)}')
df.to_excel(file_name, index=False)
zip_file_path = 'config_file.zip'
with zipfile.ZipFile(zip_file_path, 'w') as zipf:
zipf.write(conf_file_path, os.path.basename(conf_file_path))
return file_name, df.head(5), new_prompts, new_keywords, new_user, zip_file_path
def get_columns(file,progress=gr.Progress()):
if file is not None:
#df = pd.read_excel(file)
filename, df = load_excel(file)
columns = list(df.columns)
return gr.update(choices=columns), gr.update(choices=columns), gr.update(choices=columns), gr.update(choices=columns + [""]), gr.update(choices=columns + ['[ALL]']), df.head(5), filename, df
else:
return gr.update(choices=[]), gr.update(choices=[]), gr.update(choices=[]), gr.update(choices=[]), gr.update(choices=[]), pd.DataFrame(), '', pd.DataFrame() |