universalsoftware/uchat
2
1import gradio as gr2# from transformers import pipeline3# from transformers.utils import logging4from huggingface_hub import InferenceClient5from llama_index.core import VectorStoreIndex, SimpleDirectoryReader6from llama_index.vector_stores.chroma import ChromaVectorStore7from llama_index.core.vector_stores import (MetadataFilters, ExactMatchFilter, )8from llama_index.embeddings.huggingface import HuggingFaceEmbedding9import torch10from llama_index.core import (11 VectorStoreIndex,12 Document,13 Settings,14)15import requests16import json17from llama_index.llms.huggingface import (HuggingFaceLLM, )18from llama_index.llms.huggingface_api import (HuggingFaceInferenceAPI, )19from llama_index.core.base.llms.types import ChatMessage20from huggingface_hub import login21import chromadb as chromadb22from chromadb.utils import embedding_functions23import shutil24import os25from io import StringIO26from llama_index.core.memory import ChatMemoryBuffer27 28memory = ChatMemoryBuffer.from_defaults(token_limit=3072)29#30 31last = 032CHROMA_DATA_PATH = "chroma_data/"33EMBED_MODEL = "sentence-transformers/all-MiniLM-L6-v2" # "BAAI/bge-m3"34#LLM_NAME = "mistralai/Mistral-Nemo-Instruct-2407"35#LLM_NAME = "sswiss-ai/apertus-70b-instruct" # provider: publicai36#LLM_NAME = "openai/gpt-oss-20b"37LLM_NAME = "swiss-ai/apertus-8b-instruct"38#LLM_NAME = "aisingapore/Gemma-SEA-LION-v4-27B-IT"39#LLM_NAME = "W4D/YugoGPT-7B-Instruct-GGUF"40CHUNK_SIZE = 80041CHUNK_OVERLAP = 5042max_results = 343min_len = 4044min_distance = 0.3545max_distance = 0.646temperature = 0.747max_tokens=510048top_p=0.8549top_k=100050frequency_penalty=0.051repetition_penalty=1.1252presence_penalty=0.1553cs = "s0"54sp_flag = True55 56system_sr = "Zoveš se U-Chat AI asistent i pomažeš odgovorima korisniku usluga kompanije United Group. Korisnik postavlja pitanje ili problem na koji očekuje rešenje. "57# " Ako ne znaš odgovor, reci da ne znaš, ne izmišljaj ga."58system_sr += "Usluge kompanije United Group uključuju i kablovsku mrežu za digitalnu televiziju, pristup internetu, uređaj EON SMART BOX za TV sadržaj, kao i fiksnu telefoniju. "59 60chroma_client = chromadb.PersistentClient(CHROMA_DATA_PATH)61embedding_func = embedding_functions.SentenceTransformerEmbeddingFunction(62 model_name=EMBED_MODEL63 )64 65collection = chroma_client.get_or_create_collection(66 name="chroma_data",67 embedding_function=embedding_func,68 metadata={"hnsw:space": "cosine"},69 )70last = collection.count()71 72#73HF_TOKEN = os.getenv("HF_TOKEN")74API_SECRET = os.getenv("api_secret")75#76login(token=(HF_TOKEN))77 78#system_prompt = system_sr79 80client = InferenceClient(LLM_NAME)81 82# "facebook/blenderbot-400M-distill", facebook/blenderbot-400M-distill, stabilityai/stablelm-zephyr-3b, BAAI/bge-small-en-v1.583Settings.llm = HuggingFaceInferenceAPI(model_name=LLM_NAME,84# device_map="auto",85# system_prompt = system_prompt,86 context_window=6144,87 max_new_tokens=3072,88# stopping_ids=[50278, 50279, 50277, 1, 0],89 generate_kwargs={"temperature": temperature, "top_p":top_p, "repetition_penalty": repetition_penalty,90 "presence_penalty": presence_penalty, "frequency_penalty": frequency_penalty,91 "top_k": top_k, "do_sample": False },92# tokenizer_kwargs={"max_length": 4096},93 tokenizer_name=LLM_NAME,94 hf_token = HF_TOKEN,95 src = "models",96 provider="publicai",97 )98# "BAAI/bge-m3"99Settings.embed_model = HuggingFaceEmbedding(model_name=EMBED_MODEL)100#documents = [Document(text="Content ..."),101# ]102#index = VectorStoreIndex.from_documents(103# documents,104#)105vector_store = ChromaVectorStore(chroma_collection=collection)106index = VectorStoreIndex.from_vector_store(vector_store, embed_model=Settings.embed_model)107chat_engine = index.as_chat_engine(chat_mode="condense_plus_context", memory=memory, verbose=True)108# best condense_question context condense_plus_context109#query_engine = index.as_query_engine(verbose=True)110 111def upload_file(filepath):112 documents = SimpleDirectoryReader(filepath).load_data()113 index = VectorStoreIndex.from_documents(documents)114 #query_engine = index.as_query_engine()115 #condense_question condense_plus_context116 chat_engine = index.as_chat_engine(verbose=True)117 return filepath118 119def resetChat():120 chat_engine.reset()121 print("Restarted!!!")122 return True123 124def rag(input_text, history, jezik, request: gr.Request): # , file):125 global sp_flag126# if (btn):127# resetChat()128# print(history, input_text)129## if (file):130 documents = []131#!!! for f in file:132#!!! documents += SimpleDirectoryReader(f).load_data()133# f = file + "*.pdf"134## pathname = os.path.dirname135# shutil.copyfile(file.name, path)136## print("pathname=", pathname)137## print("basename=", os.path.basename(file))138## print("filename=", file.name) 139## documents = SimpleDirectoryReader(file).load_data()140#!!! index2 = VectorStoreIndex.from_documents(documents)141## query_engine = index2.as_query_engine()142# return query_engine.query(input_text)143# return history.append({"role": "assistant", "content": query_engine.query(input_text)})144## return history + [[input_text, query_engine.query(input_text)]]145# collection.add(146# documents=documents,147# ids=[f"id{last+i}" for i in range(len(documents))],148# metadatas=[{"state": "s0", "next": "s0", "used": False, "source": 'None', "page": -1, "lang": jezik } for i in range(len(documents)) ]149# )150## else:151### query_results = collection.query(152 #query_engine = index.as_query_engine(153 # similarity_top_k=3,154 # vector_store_query_mode="default",155 # filters=MetadataFilters(156 # filters=[157 # ExactMatchFilter(key="lang", value=jezik),158 # ]159 # ),160 # alpha=None,161 # doc_ids=None,162 #)163 #query_results = index.query(164 # query_texts = [ input_text ],165 # n_results = max_results,166 # where = { "lang": jezik },167 # #where = { "$and": [ {"lang": jezik}, {"page": { "$nin": [ -1 ]}}]},168 # #where = { "$and": [ {"$and": [ { "$or": [ {"state": self.cs }, { "page": { "$nin": [ -1 ] } } ] } , { "used": False } ] } ,169 # # {"lang": jezik } ] },170 #)171 #jezik = "N/A"172 system_prompt = ""173 match jezik:174 case 'hrvatski':175 o_jezik = 'na hrvatskom jeziku, gramatički točno.'176 system_prompt = system_sr + "Call centar telefon je 095 1000 444 za privatne i 095 1000 500 za poslovne korisnike. Stranica podrške je <https://tele mach.hr/podrska>." + "Odgovaraj isključivo " + o_jezik177 case 'slovenski':178 o_jezik = 'v slovenščini, slovnično pravilen.'179 system_prompt = system_sr + "Call centar i pomoč za fizične uporabnike: 070 700 700.stran za podporo je <https://telemach.si/pomoc>. " + "Odgovor isključivo " + o_jezik180 case 'srpski':181 o_jezik = 'na srpskom jeziku, gramatički ispravno.'182 system_prompt = system_sr + "Call centar telefon je 19900 za sve korisnike. Stranica podrške je <https://sbb.rs/podrska/>. " + "Odgovaraj isključivo " + o_jezik183 case 'makedonski':184 o_jezik = 'на македонски јазикот граматички точно.'185 system_prompt = system_sr + "Stranica podrške je https://mn.nettvplus.com/me/podrska/ za NetTV. " + "Oдговори исклучиво " + o_jezik186 case 'Eksperimentalna opcija':187 o_jezik = 'N/A'188 system_prompt = system_sr + "Call centar telefon je 12755 za Crnu Goru, 0800 31111 za BIH, 070 700 700 u Sloveniji, 19900 u Srbiji, 095 1000 444 za hrvatske korisnike. Odgovori na jeziku istom kao i u postavljenom pitanju ili problemu korisnika."189 print("jezik: "+o_jezik)190 system_prompt = system_prompt + " Sledi pitanje ili problem korisnika, sa kojim dalje komuniciraš: "191 if sp_flag:192 sp_flag = False193 else:194 system_prompt = ""195# if (o_jezik!='N/A'):196# input_text += " - odgovori " + o_jezik + "."197# Settings.llm.system_prompt = system_prompt198 response = chat_engine.chat(str({"role": "user", "content": system_prompt + input_text})).response199# response = query_engine.query(input_text)200 session_hash = request.session_hash201 url = "https://houseofplaying.com/FBMod/public/api.php" # An example public API202 payload = {203 "session_hash": session_hash,204 "input_query": input_text,205 "response": response206 }207 headers = {208 "Authorization": "Bearer " + API_SECRET,209 "Content-Type": "application/json"210 }211 try:212 api_response = requests.post(url, json=payload, headers=headers)213 except:214 print("POST error for "+session_hash)215 return response216# gr.Textbox(label="Pitanje:", lines=6),217# outputs=[gr.Textbox(label="Odgovor:", lines=6)], 218# ChatMessage(role="assistant", content="Kako Vam mogu pomoći?")219 220with gr.Blocks() as iface:221 ichat = gr.ChatInterface(fn=rag, 222 title="UChat",223 description="Postavite pitanje ili opišite problem koji imate - nakon promene jezika ili pre početka nove sesije sa agentom pritisnite dugme 'Briši sve - razgovor ispočetka'",224 chatbot=gr.Chatbot(placeholder="Kako Vam mogu pomoći?", type="tuples", label="Agent podrške", height=350),225 textbox=gr.Textbox(placeholder="Pitanje ili opis problema", container=False, scale=7),226 autofocus = True,227 theme="soft",228 examples = [229 ["Ne radi mi internet", "srpski", ],230 ["Možete li mi popraviti kompjuter koji koristi internet?", "srpski", ],231 ["Ne radi mi daljinski upravljač, šta da radim?", "srpski", ],232 ["EON daljinski upravljalnik mi ne deluje, kaj naj naredim?", "slovenski", ],233 ["Мојот кабелски прием не работи, што треба да направам?", "makedonski", ],234 ],235 cache_examples=False,236 retry_btn=None,237 undo_btn=None,238 clear_btn="Briši sve - razgovor ispočetka",239 additional_inputs = [gr.Dropdown(["slovenski", "hrvatski", "srpski", "makedonski", "Eksperimentalna opcija"], value="srpski", label="Jezik", info="komunikacije"),240# gr.File()241 ],242 additional_inputs_accordion="Jezik i ostale opcije",243 )244# login_button = gr.LoginButton("Hugging Face login", size="lg")245 ichat.clear_btn.click(resetChat)246 247#with gr.Blocks() as iface:248# gr.Markdown("Uchat")249# file_out = gr.File()250# with gr.Row():251# with gr.Column(scale=1):252# inp = gr.Textbox(label="Pitanje:", lines=6)253# u = gr.UploadButton("Upload a file", file_count="single")254# with gr.Column(scale=1):255# out = gr.Textbox(label="Odgovor:", lines=6)256# sub = gr.Button("Pokreni")257#258# u.upload(upload_file, u, file_out)259# sub.click(rag, inp, out)260 261iface.launch(share=True)