#import gradio as gr
from faiss import write_index, read_index
from langchain.vectorstores import FAISS
from typing import List
from pydantic import BaseModel
from typing import Optional
import re
from pathlib import Path
import time
from anthropic import Anthropic, HUMAN_PROMPT, AI_PROMPT
import json
import pandas as pd
import sqlite3
from sentence_transformers import SentenceTransformer
from fastapi import FastAPI
from unidecode import unidecode
from nltk.corpus import stopwords
from langchain.schema.embeddings import Embeddings
from langchain.document_loaders import DataFrameLoader
#from langchain import PromptTemplate
# from langchain.document_loaders import TextLoader
# from langchain.text_splitter import CharacterTextSplitter
# from langchain.text_splitter import RecursiveCharacterTextSplitter
# from langchain.document_loaders import UnstructuredFileLoader
# from langchain.document_loaders.recursive_url_loader import RecursiveUrlLoader
# from langchain.document_loaders import UnstructuredURLLoader
# from langchain.document_loaders.csv_loader import CSVLoader
# #from langchain import LLMChain
#
#
# from langchain.embeddings import HuggingFaceEmbeddings
#from cleantext import clean
from general import FinderDbs,loadCopysAndData,loadmodelEmb,makeFaissdb,extractConfig,Response,remove_unwanted
class CustomEmbedding(Embeddings, BaseModel):
"""embedding model with preprocessing"""
def _get_embedding(self,text) -> List[float]:
#print(text,"text")
text=remove_unwanted(text,punctuationOK=True,stopOK=True)
Sal=emb.encode(text)
return Sal
def embed_documents(self, texts: List[str]) -> List[List[float]]:
Sal=[]
for text in texts:
Sal.append(self._get_embedding(text))
return Sal
def embed_query(self, text: str) -> List[float]:
return self._get_embedding(text)
nameModel="Modelo_embedding_Mexico_Puebla_hiiamasid"
model=extractConfig(nameModel=nameModel,dataOut="path_model")+"/model"
entrenamiento="V1.3"
pathsqlite=extractConfig(nameModel=nameModel,dataOut="pathsqlite")
keyanthropic=extractConfig(nameModel="SystemData",dataOut="keyantrophics")
documents,documents2=loadCopysAndData(pathsqlite)
emb=loadmodelEmb(model_name = model)
emb2=CustomEmbedding()
db=makeFaissdb(documents,"Copies3",emb2)
db2=makeFaissdb(documents2,"Intentionality3",emb2)
app = FastAPI()
@app.get("/")
def read_main():
return {"message": "This is your main app"}
@app.post("/angela-api/")
def calculate_api(response: Response):
query = response.query
try:
filtred = response.filtred
except:
filtred = -9.0
AllData=FinderDbs(query,[db2,db],filtred)
#print(AllData)
versionL="_".join([model,entrenamiento])
#tt=time.time()
#if identifier.classify(query)[1]< 0.3:
#print(identifier.classify(query))
#print(time.time()-tt)
#return {"ids": [],"DC":[],"modelo":versionL}
#print(time.time()-tt)
if AllData:
AllData = list(AllData)
dis=[]
id=[]
for k,i in enumerate(AllData[0].items()):
dis.append(str(i[1]['d']))
id.append(i[0])
return {"ids": id,"DC":dis,"modelo":versionL}
@app.post("/angela-api-claude/")
def calculate_api_claude(response: Response):
anthropic = Anthropic(api_key=keyanthropic)
query = response.query
try:
filtred = response.filtred
except:
filtred = -9.0
AllData=FinderDbs(query,[db2,db],filtred)
versionL="_".join([model,entrenamiento])
if AllData:
AllData = list(AllData)
dis=[]
id=[]
for k,i in enumerate(AllData[0].items()):
dis.append(str(i[1]['d']))
id.append(i[0])
if len(id)<1:
return {"text": {"completion": "No tengo información sobre este tema",
"model": "claude-2.1",
"stop_reason": "stop_sequence",
"type": "completion",
"id": "1",
"stop": "\n\nHuman:",
"log_id": "1"
},"text2": {
"completion":"No tengo información sobre este tema",
"model": "claude-2.1",
"stop_reason": "stop_sequence",
"type": "completion",
"id": "1",
"stop": "\n\nHuman:",
"log_id": "1"
}
}
con = sqlite3.connect(pathsqlite)
copies_df = pd.read_sql_query("SELECT * from copies WHERE intentionality IS NOT NULL", con)
copie = copies_df[copies_df["id"]==id[0]]["copy_message"].values[0]
promptF=f"""{HUMAN_PROMPT} Tengo un contexto por favor generame un resumen, el resumen deben ser con lenguaje amable para un publico mexicano y como si fuera una conversacion con la persona.
"""
promptF3=promptF+f"""
%s
{AI_PROMPT}"""%(copie)
completion = anthropic.completions.create(
model="claude-2",
max_tokens_to_sample=600,
prompt=promptF3,
)
pregunta=query
promptFv2=f"""Tu eres un asistente de IA en chatbot llamado Angela, como asistente tu labor es ayudar a los usuarios de la pagina web de la alcaldia de puebla respondiendo sus preguntas.
Aqui te dare las reglas que debes seguir durante la conversacion:
- Siempre te mantendras en el personaje Angela.
- Si no estas seguro de la respuesta basada en el contexto responde el suigiente texto: "Lo siento, podrias formular la pregunta de nuevo es que no entendi tu pregunta por que soy un sistema que esta en mejora en este momento".
- No menciones el contexto si la pregunta no puede ser contestada con el.
- Siempres responderas de manera amable pero formal.
%s
{HUMAN_PROMPT} Tengo la siguiente pregunta entre la etiqueta y basandote en el contexto que esta en la etiqueta responde la pregunta entre la etiqueta :
%s
"""%(copie,pregunta)
promptF3v2=promptFv2+f"""
{AI_PROMPT}"""
completionv2 = anthropic.completions.create(
model="claude-2.1",
max_tokens_to_sample=600,
prompt=promptF3v2,
)
return {"text":completion,"text2":completionv2}