featt: database complete
This commit is contained in:
		
							parent
							
								
									a1858f5106
								
							
						
					
					
						commit
						522d8cad8c
					
				| 
						 | 
					@ -0,0 +1,20 @@
 | 
				
			||||||
 | 
					from pydal import DAL, Field
 | 
				
			||||||
 | 
					db = DAL(uri="sqlite://storage.db",
 | 
				
			||||||
 | 
					        pool_size=0,
 | 
				
			||||||
 | 
					        folder="databases",
 | 
				
			||||||
 | 
					        migrate_enabled=True,
 | 
				
			||||||
 | 
					        migrate=True)
 | 
				
			||||||
 | 
					db.define_table(
 | 
				
			||||||
 | 
					    "datacoll",
 | 
				
			||||||
 | 
					    Field("user"),
 | 
				
			||||||
 | 
					    Field("collection"),
 | 
				
			||||||
 | 
					    Field("totalchr",type="integer",default=0),
 | 
				
			||||||
 | 
					    Field('last_modified', 'datetime'),
 | 
				
			||||||
 | 
					    Field("summary",type="text"),
 | 
				
			||||||
 | 
					    Field("tematic",type="text"),
 | 
				
			||||||
 | 
					    Field("issues",type="text"),
 | 
				
			||||||
 | 
					    Field("question",type="text")
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					db.commit()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										215
									
								
								main.py
								
								
								
								
							
							
						
						
									
										215
									
								
								main.py
								
								
								
								
							| 
						 | 
					@ -25,6 +25,10 @@ from groq import Groq
 | 
				
			||||||
from fastapi import  File as FileFast
 | 
					from fastapi import  File as FileFast
 | 
				
			||||||
from fastapi import UploadFile as UploadFileFast
 | 
					from fastapi import UploadFile as UploadFileFast
 | 
				
			||||||
from fastapi import Form as FormFast
 | 
					from fastapi import Form as FormFast
 | 
				
			||||||
 | 
					from anthropic import Anthropic, HUMAN_PROMPT, AI_PROMPT
 | 
				
			||||||
 | 
					from databases import db
 | 
				
			||||||
 | 
					maxletters=30000
 | 
				
			||||||
 | 
					maxtokens=int(maxletters/4)
 | 
				
			||||||
#import shutil
 | 
					#import shutil
 | 
				
			||||||
pwd = os.getcwd()
 | 
					pwd = os.getcwd()
 | 
				
			||||||
def extractConfig(nameModel="SystemData",relPath=os.path.join(pwd,"conf/experiment_config.json"),dataOut="keyantrophics"):
 | 
					def extractConfig(nameModel="SystemData",relPath=os.path.join(pwd,"conf/experiment_config.json"),dataOut="keyantrophics"):
 | 
				
			||||||
| 
						 | 
					@ -33,7 +37,7 @@ def extractConfig(nameModel="SystemData",relPath=os.path.join(pwd,"conf/experime
 | 
				
			||||||
        config = json.load(file)[nameModel]
 | 
					        config = json.load(file)[nameModel]
 | 
				
			||||||
    Output= config[dataOut]
 | 
					    Output= config[dataOut]
 | 
				
			||||||
    return Output
 | 
					    return Output
 | 
				
			||||||
 | 
					keyanthropic=extractConfig(nameModel="SystemData",dataOut="keyantrophics")
 | 
				
			||||||
keygroq=extractConfig(nameModel="SystemData",dataOut="keygroq")
 | 
					keygroq=extractConfig(nameModel="SystemData",dataOut="keygroq")
 | 
				
			||||||
client = Groq(api_key=keygroq)
 | 
					client = Groq(api_key=keygroq)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -161,6 +165,8 @@ def listmodelactives():
 | 
				
			||||||
@app.post("/loadCollection")
 | 
					@app.post("/loadCollection")
 | 
				
			||||||
def loadCollection(data:str):
 | 
					def loadCollection(data:str):
 | 
				
			||||||
    global index
 | 
					    global index
 | 
				
			||||||
 | 
					    global collectionloaded
 | 
				
			||||||
 | 
					    collectionloaded=data
 | 
				
			||||||
    index=create_or_load_db(path="static/"+userdata+"/chroma_db",collection=data,modelT=model_emb)
 | 
					    index=create_or_load_db(path="static/"+userdata+"/chroma_db",collection=data,modelT=model_emb)
 | 
				
			||||||
    return P("El usuario %s colleccion %s"%(userdata,data))
 | 
					    return P("El usuario %s colleccion %s"%(userdata,data))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -323,6 +329,183 @@ def SummaryMake(data:str,query:str):
 | 
				
			||||||
    print("p4")
 | 
					    print("p4")
 | 
				
			||||||
    return P(response)
 | 
					    return P(response)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def getTextCustom(system="",content="",max_tokens=maxtokens,model="claude-3-5-sonnet-20240620"):
 | 
				
			||||||
 | 
					    t=time.time()
 | 
				
			||||||
 | 
					    client = Anthropic(api_key=keyanthropic)
 | 
				
			||||||
 | 
					    message=[{"role": "user", "content":content},{"role": "assistant", "content":""} ]
 | 
				
			||||||
 | 
					    if system!="":
 | 
				
			||||||
 | 
					        completionv2 = client.messages.create(
 | 
				
			||||||
 | 
					                    model=model,
 | 
				
			||||||
 | 
					                    system=system,
 | 
				
			||||||
 | 
					                    max_tokens=max_tokens,
 | 
				
			||||||
 | 
					                    messages=message,
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					    else:
 | 
				
			||||||
 | 
					        completionv2 = client.messages.create(
 | 
				
			||||||
 | 
					                    model=model,
 | 
				
			||||||
 | 
					                    max_tokens=max_tokens,
 | 
				
			||||||
 | 
					                    messages=message,
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					    return {"content":completionv2.content[0].text,"time":time.time()-t}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def processAllDocs(docs,type="summary"):
 | 
				
			||||||
 | 
					    summary_prompt = """Por favor, genera un resumen completo y detallado del material dado. 
 | 
				
			||||||
 | 
					Incluye los principales temas, argumentos y conclusiones. 
 | 
				
			||||||
 | 
					Estructura el resumen de manera coherente y organizada.
 | 
				
			||||||
 | 
					Texto a  resumir:
 | 
				
			||||||
 | 
					%s
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					    tematic_prompt =""" Por favor, genera un texto donde se menciones la tematica que trata el material dado.
 | 
				
			||||||
 | 
					Incluye una tematica general y un indice por temas tratados
 | 
				
			||||||
 | 
					Estructura el texto de manera coherente y organizada.
 | 
				
			||||||
 | 
					Texto a  usar:
 | 
				
			||||||
 | 
					%s
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					    issues_prompt ="""Por favor, genera un texto donde se menciones tomando en cuenta el material y el contenido de manera detallada que mejoras  podrias realizar al material incluyendo nuevos datos o corrigiendo la informacion proporcionada
 | 
				
			||||||
 | 
					Esta mejora hazla pensado paso a paso y de manera muy cuidadosa, tienes que dar ejemplos del materiar o referenciar directamante el texto a mejorar mencioando la causa de la mejora
 | 
				
			||||||
 | 
					Estructura el texto de manera coherente y organizada.
 | 
				
			||||||
 | 
					Texto a  usar:
 | 
				
			||||||
 | 
					%s
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    question_prompt ="""Por favor, genera un texto donde indiques preguntas sobre el material que cuando sean respondidas capturen el punto central y puntos importantes del texto
 | 
				
			||||||
 | 
					Estas preguntas hazla pensado paso a paso y de manera muy cuidadosa.
 | 
				
			||||||
 | 
					Estructura el texto de manera coherente y organizada.
 | 
				
			||||||
 | 
					Texto a  usar:
 | 
				
			||||||
 | 
					%s
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					    temp=""
 | 
				
			||||||
 | 
					    AllChunks=[]
 | 
				
			||||||
 | 
					    AllOut=[]
 | 
				
			||||||
 | 
					    for doc in docs:
 | 
				
			||||||
 | 
					        temp=temp+doc.get_text()
 | 
				
			||||||
 | 
					        if len(temp)>maxtokens:
 | 
				
			||||||
 | 
					            AllChunks.append(temp)
 | 
				
			||||||
 | 
					            if type=="summary":
 | 
				
			||||||
 | 
					                procesedInfo=getTextCustom(content= summary_prompt%temp)
 | 
				
			||||||
 | 
					            elif type=="tematic":
 | 
				
			||||||
 | 
					                procesedInfo=getTextCustom(content= tematic_prompt%temp)
 | 
				
			||||||
 | 
					            elif type=="issues":
 | 
				
			||||||
 | 
					                procesedInfo=getTextCustom(content= issues_prompt%temp)
 | 
				
			||||||
 | 
					            elif type=="question":
 | 
				
			||||||
 | 
					                procesedInfo=getTextCustom(content= question_prompt%temp)
 | 
				
			||||||
 | 
					            AllOut.append(procesedInfo)
 | 
				
			||||||
 | 
					            temp=""
 | 
				
			||||||
 | 
					    if temp!="":
 | 
				
			||||||
 | 
					        AllChunks.append(temp)
 | 
				
			||||||
 | 
					        if type=="summary":
 | 
				
			||||||
 | 
					            procesedInfo=getTextCustom(content= summary_prompt%temp)
 | 
				
			||||||
 | 
					        elif type=="tematic":
 | 
				
			||||||
 | 
					            procesedInfo=getTextCustom(content= tematic_prompt%temp)
 | 
				
			||||||
 | 
					        elif type=="issues":
 | 
				
			||||||
 | 
					            procesedInfo=getTextCustom(content= issues_prompt%temp)
 | 
				
			||||||
 | 
					        elif type=="question":
 | 
				
			||||||
 | 
					            procesedInfo=getTextCustom(content= question_prompt%temp)
 | 
				
			||||||
 | 
					        AllOut.append(procesedInfo)
 | 
				
			||||||
 | 
					        temp=""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    return AllOut
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def reduceDocs(AllOut,type="summary"):
 | 
				
			||||||
 | 
					    if len(AllOut)==1:
 | 
				
			||||||
 | 
					        return AllOut[0]["content"]
 | 
				
			||||||
 | 
					    if len(AllOut)==0:
 | 
				
			||||||
 | 
					        return "Hay un problema en este campo"    
 | 
				
			||||||
 | 
					    summary_prompt = """Por favor, de los siguientes resumenes genera un resumen general 
 | 
				
			||||||
 | 
					Incluye los principales temas, argumentos y conclusiones. 
 | 
				
			||||||
 | 
					Estructura el resumen de manera coherente y organizada.
 | 
				
			||||||
 | 
					Textos a  resumir:
 | 
				
			||||||
 | 
					%s
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					    tematic_prompt =""" Por favor, de los siguientes textos genera un texto general sobre la tematica.
 | 
				
			||||||
 | 
					Incluye una tematica general y un indice por temas tratados
 | 
				
			||||||
 | 
					Estructura el texto de manera coherente y organizada.
 | 
				
			||||||
 | 
					Textos a  usar:
 | 
				
			||||||
 | 
					%s
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					    issues_prompt ="""Por favor, genera un texto donde se incluyan todas las mejoras o correcciones presentadas
 | 
				
			||||||
 | 
					Estas mejoras hazla pensado paso a paso y de manera muy cuidadosasi hay ejemplos incluyelos o referenciar directamante el texto a mejorar mencioando la causa de la mejora
 | 
				
			||||||
 | 
					Estructura el texto de manera coherente y organizada.
 | 
				
			||||||
 | 
					Textos a  usar:
 | 
				
			||||||
 | 
					%s
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    question_prompt ="""Por favor, genera un texto donde indiques preguntas sobre el material que cuando sean respondidas capturen el punto central y puntos importantes del texto
 | 
				
			||||||
 | 
					Estas preguntas hazla pensado paso a paso y de manera muy cuidadosa.
 | 
				
			||||||
 | 
					Estructura el texto de manera coherente y organizada.
 | 
				
			||||||
 | 
					Texto a  usar:
 | 
				
			||||||
 | 
					%s
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					    sep="""________________________________________________
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					    temp=""
 | 
				
			||||||
 | 
					    Allreduce=[]
 | 
				
			||||||
 | 
					    if len(AllOut)>1:
 | 
				
			||||||
 | 
					        for reduce in AllOut:
 | 
				
			||||||
 | 
					            temp=temp+reduce+sep
 | 
				
			||||||
 | 
					            if len(temp)>maxtokens:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if type=="summary":
 | 
				
			||||||
 | 
					                    procesedInfo=getTextCustom(content= summary_prompt%temp)
 | 
				
			||||||
 | 
					                elif type=="tematic":
 | 
				
			||||||
 | 
					                    procesedInfo=getTextCustom(content= tematic_prompt%temp)
 | 
				
			||||||
 | 
					                elif type=="issues":
 | 
				
			||||||
 | 
					                    procesedInfo=getTextCustom(content= issues_prompt%temp)
 | 
				
			||||||
 | 
					                elif type=="question":
 | 
				
			||||||
 | 
					                    procesedInfo=getTextCustom(content= question_prompt%temp)
 | 
				
			||||||
 | 
					                Allreduce.append(procesedInfo)
 | 
				
			||||||
 | 
					                temp=""
 | 
				
			||||||
 | 
					        if temp!="":
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if type=="summary":
 | 
				
			||||||
 | 
					                procesedInfo=getTextCustom(content= summary_prompt%temp)
 | 
				
			||||||
 | 
					            elif type=="tematic":
 | 
				
			||||||
 | 
					                procesedInfo=getTextCustom(content= tematic_prompt%temp)
 | 
				
			||||||
 | 
					            elif type=="issues":
 | 
				
			||||||
 | 
					                procesedInfo=getTextCustom(content= issues_prompt%temp)
 | 
				
			||||||
 | 
					            elif type=="question":
 | 
				
			||||||
 | 
					                procesedInfo=getTextCustom(content= question_prompt%temp)
 | 
				
			||||||
 | 
					            Allreduce.append(procesedInfo)
 | 
				
			||||||
 | 
					            temp=""
 | 
				
			||||||
 | 
					    print(Allreduce)
 | 
				
			||||||
 | 
					    # while len(Allreduce)>1:
 | 
				
			||||||
 | 
					    #     print(Allreduce)
 | 
				
			||||||
 | 
					    #     Allreduce=reduceDocs(Allreduce)
 | 
				
			||||||
 | 
					    #     print("P2",Allreduce)
 | 
				
			||||||
 | 
					    # if len(Allreduce)==1:
 | 
				
			||||||
 | 
					    #     return Allreduce
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def savedb(docs,userdata,collection):
 | 
				
			||||||
 | 
					    Output={}
 | 
				
			||||||
 | 
					    for procs in ["summary","tematic","issues","question"]:
 | 
				
			||||||
 | 
					        AllOut=processAllDocs(docs,type=procs)
 | 
				
			||||||
 | 
					        Allreduce=reduceDocs(AllOut,type=procs)
 | 
				
			||||||
 | 
					        Output[procs]=Allreduce
 | 
				
			||||||
 | 
					    if db((db.datacoll.user == userdata)&(db.datacoll.collection == collection)).count()==0:
 | 
				
			||||||
 | 
					        Output["user"] = userdata
 | 
				
			||||||
 | 
					        Output["collection"] = collection
 | 
				
			||||||
 | 
					        db.datacoll.insert(**Output)
 | 
				
			||||||
 | 
					        db.commit()
 | 
				
			||||||
 | 
					    else:
 | 
				
			||||||
 | 
					        db((db.datacoll.user == userdata)&(db.datacoll.collection == collection)).update(**Output)
 | 
				
			||||||
 | 
					        db.commit()
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					@app.get("/showdata")
 | 
				
			||||||
 | 
					def showData():
 | 
				
			||||||
 | 
					    userdata,collectionloaded
 | 
				
			||||||
 | 
					    rows=db((db.datacoll.user == userdata)&(db.datacoll.collection == collectionloaded)).select()
 | 
				
			||||||
 | 
					    first_row = rows.first()
 | 
				
			||||||
 | 
					    return P(first_row.summary),P(first_row.tematic),P(first_row.issues),P(first_row.question)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@app.post("/createCollection")
 | 
					@app.post("/createCollection")
 | 
				
			||||||
| 
						 | 
					@ -332,19 +515,22 @@ def createCollection(data:str,collection:str):
 | 
				
			||||||
        input_dir=data
 | 
					        input_dir=data
 | 
				
			||||||
    ).load_data()
 | 
					    ).load_data()
 | 
				
			||||||
    print("Process Documents")
 | 
					    print("Process Documents")
 | 
				
			||||||
 | 
					    savedb(docs,userdata,collection)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Nodes=post_process_documents(docs)
 | 
					    Nodes=post_process_documents(docs)
 | 
				
			||||||
    print("create DB")
 | 
					    print("create DB")
 | 
				
			||||||
    class MyThread(threading.Thread):
 | 
					 | 
				
			||||||
        def run(self):
 | 
					 | 
				
			||||||
             print("Hilo")
 | 
					 | 
				
			||||||
             create_or_load_db(path="static/"+data.split("/")[1]+"/chroma_db",collection=collection,Nodes=Nodes,modelT=model_emb)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # create and start the thread
 | 
					    # class MyThread(threading.Thread):
 | 
				
			||||||
    global t
 | 
					    #     def run(self):
 | 
				
			||||||
    t = MyThread()
 | 
					    #          print("Hilo")
 | 
				
			||||||
    t.start()
 | 
					    #          create_or_load_db(path="static/"+data.split("/")[1]+"/chroma_db",collection=collection,Nodes=Nodes,modelT=model_emb)
 | 
				
			||||||
    global t_time
 | 
					
 | 
				
			||||||
    t_time=time.time()
 | 
					    # # create and start the thread
 | 
				
			||||||
 | 
					    # global t
 | 
				
			||||||
 | 
					    # t = MyThread()
 | 
				
			||||||
 | 
					    # t.start()
 | 
				
			||||||
 | 
					    # global t_time
 | 
				
			||||||
 | 
					    # t_time=time.time()
 | 
				
			||||||
    return Div("Iniciando carga de datos")
 | 
					    return Div("Iniciando carga de datos")
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@app.get("/is_busy")
 | 
					@app.get("/is_busy")
 | 
				
			||||||
| 
						 | 
					@ -384,12 +570,7 @@ def home():
 | 
				
			||||||
                        ,id="questions"),
 | 
					                        ,id="questions"),
 | 
				
			||||||
                    cls="col-xs-6"),
 | 
					                    cls="col-xs-6"),
 | 
				
			||||||
                    Div(H3("Este genera información general del material, pero es intensivo en uso del api, aunque ahora esta restingido a solo 5 solicitudes el objeitvo original era enviar todo el material."),
 | 
					                    Div(H3("Este genera información general del material, pero es intensivo en uso del api, aunque ahora esta restingido a solo 5 solicitudes el objeitvo original era enviar todo el material."),
 | 
				
			||||||
                        Div(
 | 
					                        Div(hx_target="this",hx_swap="innerHTML",hx_get="/showdata",hx_trigger="every 60000ms",id="query"),
 | 
				
			||||||
                            Form(
 | 
					 | 
				
			||||||
                                Input(id="query", name="question", placeholder="Dar una pregunta"),
 | 
					 | 
				
			||||||
                                Button("Submit",type="submit"), hx_post="/queryprompt",hx_swap="innerHTML",hx_target="#queryR" ),
 | 
					 | 
				
			||||||
                            Div(id="queryR"),
 | 
					 | 
				
			||||||
                            id="query"),
 | 
					 | 
				
			||||||
                        id="chatbot",cls="col-xs-6"),
 | 
					                        id="chatbot",cls="col-xs-6"),
 | 
				
			||||||
                    cls="row", style="color: #fff;")
 | 
					                    cls="row", style="color: #fff;")
 | 
				
			||||||
                ))
 | 
					                ))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue