diff --git a/README.md b/README.md index 6c42fe7..e20479e 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,17 @@ -pip install llama-index -pip install llama-index-llms-groq -pip install llama-index-embeddings-huggingface -pip install llama-parse -pip install chromadb -pip install llama-index-vector-stores-chroma -pip install llama-index-embeddings-huggingface -pip install python-fasthtml -pip install grok -pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu +El sistema funciona en un docker +para generar: + +docker build -t supertutor-app . + +para ejecutar: + +docker run -it -p 7884:7884 --rm fastapi-app + + + +si tienes problemas con permisos: + +sudo chmod 666 /var/run/docker.sock + diff --git a/main.py b/main.py index f433c60..42f42b7 100644 --- a/main.py +++ b/main.py @@ -12,7 +12,7 @@ from llama_index.core import Settings #from llama_index.embeddings.huggingface_api import ( # HuggingFaceInferenceAPIEmbedding, #) - +import shutil import chromadb import os import threading @@ -22,6 +22,9 @@ import json #from llama_index.llms.ollama import Ollama from llama_index.core.base.response.schema import Response from groq import Groq +from fastapi import File as FileFast +from fastapi import UploadFile as UploadFileFast +from fastapi import Form as FormFast #import shutil pwd = os.getcwd() def extractConfig(nameModel="SystemData",relPath=os.path.join(pwd,"conf/experiment_config.json"),dataOut="keyantrophics"): @@ -78,9 +81,9 @@ def checkInfoSources(user:str): subdir = [Option(file.name,value="static/"+user+"/"+file.name) for file in files if (file.is_dir() and file.name!="chroma_db") ] userdata=user - print("Cambio",userdata) + return Form( - H3("Grupos de archivos",cls="col-xs-3"), + H3("Grupo de archivos",cls="col-xs-3"), Select( *subdir,name="data",cls="col-xs-3"), Input(id="name-db", name="collection", placeholder="Enter a collection name",cls="col-xs-4"), @@ -163,7 +166,7 @@ def loadCollection(data:str): def queryPrompt(question:str): #index=load_create_db(collection="my_collection") - query_engine = index.as_query_engine(similarity_top_k=15,vector_store_query_mode="default",response_mode="tree_summarize") + query_engine = index.as_query_engine(similarity_top_k=5,vector_store_query_mode="default",response_mode="tree_summarize") summary_prompt = ( "Por favor, genera un resumen completo y detallado del material dado. " "Incluye los principales temas, argumentos y conclusiones. " @@ -191,7 +194,7 @@ def queryPrompt(question:str): response2 = query_engine.query(tematic_prompt) response3 = query_engine.query(issues_prompt) response4 = query_engine.query(Question_prompt) - Output="

Summary

"+str(response)+"

Tematic

"+str(response2)+"

Issues

"+str(response3)+"

Questions

"+str(response4) + Output="

Resumen

"+str(response)+"

Tematica

"+str(response2)+"

Problemas

"+str(response3)+"

Preguntas

"+str(response4) return Output @@ -238,10 +241,6 @@ Evaluate the coherence and accuracy of previous response to respond %s in this e Verificate if previous context is related to the previous response, if not, say that you do not have information about that issue The format of output is a json with keys 'coherencia', 'exactitud', 'relacion_con_el_contexto' and 'comentario' . 'coherencia', 'exactitud', 'relacion_con_el_contexto' are numeric variables with max value is 10"""%(response,ContextNodes,message) - - - - print(chat_engine.__dict__) chat_completion = client.chat.completions.create( # @@ -302,7 +301,7 @@ def SummarySources(): return Form("Este es muy caro para documentos grandes y tarda mucho", Select( *subdir,name="data"), - Input( name="query", placeholder="Enter a query"), + Input( name="query", placeholder="Dar una pregunta"), Button("Submit",type="submit"), hx_post="/SummaryMake",hx_swap="innerHTML",hx_target="#summaryR" ) @app.post("/SummaryMake") @@ -374,18 +373,18 @@ def home(): Div(Div(id="options",hx_target="this",hx_swap="outerHTML",hx_get="/listmodelactives",hx_trigger="click from:#buttonMenuuser delay:3s"),cls="col-xs-12"), Div(Div(id="Infomodel"),cls="col-xs-12"), #Div("Resumen",Div(id="summary",hx_target="this",hx_swap="outerHTML",hx_get="/SummarySources",hx_trigger="click from:#buttonMenuuser"),Div(id="summaryR")), - Div( + Div(H3("Chat para preguntarle al material de estudios "), Div( Form( - Input(id="question", name="message", placeholder="Enter a message"), + Input(id="question", name="message", placeholder="Dar una pregunta"), Button("Submit",type="submit"), hx_post="/chatData",hx_swap="afterend",hx_target="#questionR" ), Div(id="questionR") ,id="questions"), cls="col-xs-6"), - Div( + Div(H3("Este genera informacion general del material, pero es intensivo en unso del api. No USAR."), Div( Form( - Input(id="query", name="question", placeholder="Enter a query"), + 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"), @@ -394,14 +393,71 @@ def home(): )) return page -# @app.post("/upload") -# def upload(data: UploadFile = File(...),user : str = Form(...), dir: str = Form(...)): -# filename="static/"+user+dir+data.filename +@app.get("/fileup") +def fileup(): + return Div( + P('Upload data Super tutor'), + Div(H2("Subir Archivos"),Form( + Input(type='file', name='file',cls="col-xs-3"), + Input( name='dir',placeholder="Enter a directory",cls="col-xs-2"), + Input( name='user',placeholder="Enter a user",cls="col-xs-2"), + Button('Upload', type='submit',cls="col-xs-4"), + hx_post="/upload", + hx_target="#info", + hx_swap="innerHTML", + enctype="multipart/form-data", + ),cls="col-xs-12"), + Div(H2("Crear Usuario"),Form( + Input( name='user',placeholder="Enter a user",cls="col-xs-7"), + Button('Upload', type='submit',cls="col-xs-5"), + hx_post="/createuser", + hx_target="#info", + hx_swap="innerHTML", + enctype="multipart/form-data", + ),cls="col-xs-12"), + Div(H2("Crear grupo de Archivos"),Form( + Input( name='dir',placeholder="Enter a directory",cls="col-xs-4"), + Input( name='user',placeholder="Enter a user",cls="col-xs-3"), + Button('Upload', type='submit',cls="col-xs-5"), + hx_post="/creategroup", + hx_target="#info", + hx_swap="innerHTML", + enctype="multipart/form-data", + ),cls="col-xs-12"), + Div(id="info") -# with open(f"{filename}", "wb") as buffer: -# shutil.copyfileobj(data.file, buffer) -# app.mount("/static", StaticFiles(directory="static"), name="static") + ) + + +@app.post("/upload") +def upload(file: UploadFile,dir : str = Form(...),user : str = Form(...)): + filenameB="static/"+user+"/"+dir+"/"+file.filename + pathB="static/"+user+"/"+dir + if not os.path.exists(pathB): + os.makedirs(pathB) + if not os.path.exists(filenameB): + with open(f"{filenameB}", "wb") as buffer: + shutil.copyfileobj(file.file, buffer) + return P("Se ha subido %s"%(filenameB)) + + +@app.post("/createuser") +def createuser(user : str = Form(...)): + pathB="static/"+user + if not os.path.exists(pathB): + os.makedirs(pathB) + return P("Se ha creado %s"%(pathB)) + +@app.post("/creategroup") +def createuser(user : str = Form(...),dir : str = Form(...)): + pathB="static/"+user+"/"+dir + if not os.path.exists(pathB): + os.makedirs(pathB) + return P("Se ha creado %s"%(pathB)) + + +app.mount("/static", StaticFiles(directory="static"), name="static") diff --git a/run.sh b/run.sh new file mode 100644 index 0000000..99bb188 --- /dev/null +++ b/run.sh @@ -0,0 +1 @@ +docker run -it -p 7884:7884 --rm fastapi-app \ No newline at end of file diff --git a/static/Ricardo/PCL/dockerfile b/static/Ricardo/PCL/dockerfile new file mode 100644 index 0000000..7731bf1 --- /dev/null +++ b/static/Ricardo/PCL/dockerfile @@ -0,0 +1,21 @@ +# Usar una imagen base de Python +FROM python:3.11.10-bookworm +# Establecer el directorio de trabajo en el contenedor +WORKDIR /app + +# Copiar el archivo requirements.txt y otros archivos necesarios +COPY requirements.txt ./ + +# Instalar las dependencias de Python +RUN pip install --no-cache-dir -r requirements.txt + +# Copiar todo el código de la aplicación al contenedor +COPY . . + +# Expone el puerto que usará Uvicorn +EXPOSE 7884 + +# Especificar el comando + +CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "7884", "--reload"] +