File size: 9,790 Bytes
070c576
 
 
 
 
 
6449689
f9c03d9
4425add
c8197d4
5b23034
7d204ba
 
92d0a3c
4d5131c
6449689
d6d1995
6449689
410e03d
 
 
 
4011ea8
 
327828d
4011ea8
 
410e03d
 
 
 
 
 
327828d
410e03d
 
6449689
7d204ba
031a5a3
7d204ba
 
 
 
 
 
 
 
 
 
 
8cfa293
7d204ba
 
8cfa293
7d204ba
8cfa293
7d204ba
 
 
 
d6d1995
7d204ba
 
 
 
 
 
 
1b13e5d
7d204ba
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
abb77ac
410e03d
 
 
6449689
 
 
 
 
 
 
 
 
 
 
 
 
070c576
69bb9c0
d6d1995
fcf5842
d6d1995
2acbe1f
d6d1995
ac2abcc
6449689
070c576
 
a747dde
ac2abcc
378fa83
 
 
 
 
6449689
070c576
6449689
070c576
7e62d93
8aa833d
6449689
 
4011ea8
d32c258
 
 
f0fabc9
071f32f
d32c258
 
7e62d93
4011ea8
071f32f
30eb7f0
 
c68dc56
8aa833d
c68dc56
4e2a30f
c68dc56
071f32f
7e62d93
30eb7f0
070c576
6449689
071f32f
13ff5b8
 
 
 
 
4e04d72
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
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

#users = ['maksG', 'AlmaA', 'YchK']

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 the response, handling the structure specific to Groq and Mistral clients.
        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:

        #if model_user in keys:
            #Swap those keys
        #    return f()

        #else:
            #get eepy
        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):
    # API Keys for Groq :
    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
    checkpoint = 50
    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):

            try:
                llm_answer,gloabal_keys = ask_llm(prompt[0], concatenated_content, client, user, gloabal_keys)
            except Exception:
                print("Catched a error : Global exception for ask_llm")
                llm_answer = "unhandled global error"
            
            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

            try:
                if cpt == checkpoint:
                    df.to_excel("checkpointfile.xlsx", index=False)
                    checkpoint += 50
                    
            except Exception as e:
                print(f"no checkpoint : {e}")
            
            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()