|
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 |
|
from openai import * |
|
import time |
|
|
|
|
|
|
|
def ask_llm(query, user_input, client_index, user, keys): |
|
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 |
|
}] |
|
}] |
|
|
|
try: |
|
|
|
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 "GPT 4o" in client_index: |
|
client = OpenAI(api_key=os.environ["OPENAI_YCHK"]) |
|
response = client.chat.completions.create( |
|
model="gpt-4o", |
|
messages=messageC |
|
) |
|
return response.choices[0][message][content].text |
|
|
|
elif "Perplexity" in client_index: |
|
client = OpenAI(api_key=os.environ["PERPLEXITY_ALMAA"], base_url="https://api.perplexity.ai") |
|
model_map = { |
|
"Perplexity Llama3 70b": "llama-3-70b-instruct", |
|
"Perplexity Llama3 8b": "llama-3-8b-instruct", |
|
"Perplexity Llama3 Sonar Small": "llama-3-sonar-small-32k-chat", |
|
"Perplexity Llama3 Sonar Large": "llama-3-sonar-large-32k-chat" |
|
} |
|
|
|
response = client.chat.completions.create( |
|
model=model_map[client_index], |
|
messages=messageC |
|
) |
|
|
|
responseContent = str(response.choices[0].message.content) |
|
print(responseContent) |
|
return responseContent,keys |
|
|
|
elif "Groq" in client_index: |
|
try: |
|
client = Groq(api_key= os.getenv(keys[0])) |
|
model_map = { |
|
"Groq Mixtral": "mixtral-8x7b-32768", |
|
"Groq Llama3 70b": "llama3-70b-8192", |
|
"Groq Llama3 8b": "llama3-8b-8192" |
|
} |
|
chat_completion = client.chat.completions.create( |
|
messages=messages, |
|
model=model_map[client_index], |
|
) |
|
response = chat_completion.choices[0].message.content |
|
except Exception as e: |
|
print("Change key") |
|
if keys[0] == keys[1][0]: |
|
keys[0] = keys[1][1] |
|
elif keys[0] == keys[1][1]: |
|
keys[0] = keys[1][2] |
|
else: |
|
keys[0] = keys[1][0] |
|
|
|
client = Groq(api_key= os.getenv(keys[0])) |
|
chat_completion = client.chat.completions.create( |
|
messages=messages, |
|
model='llama3-8b-8192', |
|
) |
|
response = chat_completion.choices[0].message.content |
|
else: |
|
raise ValueError("Unsupported client index provided") |
|
|
|
|
|
|
|
return chat_completion.choices[0].message.content,keys if client_index != "Claude" else chat_completion |
|
|
|
except (BadRequestError) as e: |
|
|
|
model_id = "meta-llama/Meta-Llama-3-70B-Instruct" |
|
access_token = os.getenv("HUGGINGFACE_SPLITFILES_API_KEY") |
|
|
|
tokenizer = AutoTokenizer.from_pretrained( |
|
model_id, |
|
padding_side="left", |
|
token = access_token |
|
) |
|
|
|
user_input_tokenized = tokenizer.encode(user_input) |
|
messages = [] |
|
|
|
while len(user_input_tokenized) > max_token: |
|
|
|
user_input_divided = tokenizer.decode(user_input_tokenized[:max_token]) |
|
messages.append([ |
|
{ |
|
"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_divided, |
|
}]) |
|
|
|
user_input_tokenized = user_input_tokenized[max_token:] |
|
|
|
responses = [] |
|
|
|
print(len(messages)) |
|
for msg in messages: |
|
|
|
responses.append(client.chat.completions.create( |
|
model=model_map["Perplexity Llama3 70b"], |
|
messages=msg |
|
)) |
|
|
|
response = "" |
|
for resp in responses: |
|
response += " " + resp.choices[0].message.content |
|
|
|
return response |
|
|
|
except (RateLimitError) as e: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
time.sleep(60) |
|
return ask_llm(query, user_input, client_index, user, keys) |
|
|
|
except Exception as e: |
|
print(e) |
|
return "unhandled error",keys 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): |
|
|
|
KEYS = ['GROQ_API_KEY1', 'GROQ_API_KEY2', 'GROQ_API_KEY3'] |
|
GroqKey = KEYS[0] |
|
gloabal_keys = [GroqKey, KEYS] |
|
|
|
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,gloabal_keys = ask_llm(prompt[0], concatenated_content, client, user, gloabal_keys) |
|
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 |
|
|
|
|
|
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: |
|
|
|
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() |