Spaces:
Sleeping
Sleeping
JairoDanielMT
commited on
Commit
•
6b21de4
1
Parent(s):
6138f4a
API completada
Browse files- .gitattributes +1 -0
- Dockerfile +15 -0
- anhelados.db +3 -0
- main.py +124 -0
- requirements.txt +4 -0
.gitattributes
CHANGED
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
|
33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
|
|
|
33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
36 |
+
anhelados.db filter=lfs diff=lfs merge=lfs -text
|
Dockerfile
ADDED
@@ -0,0 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Usa una imagen base de Python
|
2 |
+
FROM python:3.11-slim
|
3 |
+
# Establece el directorio de trabajo
|
4 |
+
WORKDIR /code
|
5 |
+
|
6 |
+
# Copia los archivos necesarios al contenedor
|
7 |
+
COPY ./requirements.txt /code/requirements.txt
|
8 |
+
RUN pip install --no-cache-dir -r /code/requirements.txt
|
9 |
+
|
10 |
+
COPY . .
|
11 |
+
|
12 |
+
RUN chmod -R 777 /code
|
13 |
+
|
14 |
+
# Comando para ejecutar la aplicación
|
15 |
+
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "7860"]
|
anhelados.db
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:201772d7fc1f716aeb890fdb6e926c21ed8dba8f10fd90f95e0ab297c0f0ca46
|
3 |
+
size 3162112
|
main.py
ADDED
@@ -0,0 +1,124 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import os
|
2 |
+
import openai
|
3 |
+
import sqlite3
|
4 |
+
from fastapi import FastAPI
|
5 |
+
from dotenv import load_dotenv
|
6 |
+
from pydantic import BaseModel
|
7 |
+
from llama_index.llms.openai import OpenAI
|
8 |
+
from llama_cloud import ChatMessage, MessageRole
|
9 |
+
from llama_index.core.tools import FunctionTool
|
10 |
+
from llama_index.agent.openai import OpenAIAgent
|
11 |
+
from fastapi.middleware.cors import CORSMiddleware
|
12 |
+
|
13 |
+
load_dotenv()
|
14 |
+
|
15 |
+
# Configuración de la API Key de OpenAI y base_url
|
16 |
+
API_KEY = os.getenv("OPENAI_API_KEY")
|
17 |
+
MODEL = os.getenv("OPENAI_MODEL")
|
18 |
+
BASE_URL = os.getenv("OPENAI_BASE_URL")
|
19 |
+
DB_PATH = "./anhelados.db"
|
20 |
+
|
21 |
+
# Crear una instancia de cliente ajustada para usar OpenAI
|
22 |
+
openai.api_key = API_KEY
|
23 |
+
client = openai.OpenAI(api_key=API_KEY, base_url=BASE_URL)
|
24 |
+
|
25 |
+
|
26 |
+
class ArithmeticOperations:
|
27 |
+
@staticmethod
|
28 |
+
def multiply(a: int, b: int) -> int:
|
29 |
+
return a * b
|
30 |
+
|
31 |
+
@staticmethod
|
32 |
+
def add(a: int, b: int) -> int:
|
33 |
+
return a + b
|
34 |
+
|
35 |
+
@staticmethod
|
36 |
+
def subtract(a: int, b: int) -> int:
|
37 |
+
return a - b
|
38 |
+
|
39 |
+
@staticmethod
|
40 |
+
def divide(a: int, b: int) -> int:
|
41 |
+
return a / b
|
42 |
+
|
43 |
+
|
44 |
+
class SQLExecutor:
|
45 |
+
|
46 |
+
@staticmethod
|
47 |
+
def query(sql_query: str):
|
48 |
+
"""
|
49 |
+
Ejecuta una consulta SQL y devuelve los resultados.
|
50 |
+
# Cualquier consulta SQL que generes debe resumir tu solicitud en una sola consulta, ejemplo, si deseas saber la cantidad de insumos que tienes en tu almacén debes hacer un conteo de los insumos, en el caso de produccion de las maquinas debes resumir de igual manera la consulta todo con el fin de que la respuesta sea precisa.
|
51 |
+
|
52 |
+
"""
|
53 |
+
with sqlite3.connect(DB_PATH) as conn:
|
54 |
+
cursor = conn.cursor()
|
55 |
+
cursor.execute(sql_query)
|
56 |
+
return cursor.fetchall()
|
57 |
+
|
58 |
+
|
59 |
+
# Creación del Agente utilizando la API de OpenAI
|
60 |
+
multiply_tool = FunctionTool.from_defaults(fn=ArithmeticOperations.multiply)
|
61 |
+
add_tool = FunctionTool.from_defaults(fn=ArithmeticOperations.add)
|
62 |
+
subtract_tool = FunctionTool.from_defaults(fn=ArithmeticOperations.subtract)
|
63 |
+
divide_tool = FunctionTool.from_defaults(fn=ArithmeticOperations.divide)
|
64 |
+
sql_tool = FunctionTool.from_defaults(fn=SQLExecutor.query)
|
65 |
+
|
66 |
+
estructura_base_de_datos = ChatMessage(
|
67 |
+
role=MessageRole.USER,
|
68 |
+
content="La base de datos tiene esta estructura SQLite: 1. almacen: ID_Almacen, ID_Insumo, Cantidad_Actual, Cantidad_Minima, Referencia: insumos (ID_Insumo), 2. clientes: ID_Proveedor, Nombre, Contacto, Direccion, 3. detalle_pedidos: ID_Pedido, ID_Insumo, Cantidad, Costo_Unitario, Referencias: pedidos_proveedor (ID_Pedido), insumos (ID_Insumo), 4. detalle_ventas: ID_Venta, ID_Producto, Cantidad, Precio_Unitario, Referencias: ventas (ID_Venta), productos (ID_Producto), 5. empleados: ID_Empleado, Nombre, Apellido, Sueldo, Fecha_Inicio, 6. gastos: ID_Gasto, Tipo, Monto, Fecha, 7. gastos_imprevistos: ID_Gasto_Imprevisto, Descripcion, Monto, Fecha,8. insumos: ID_Insumo, Descripcion, Tipo, Costo, Cantidad, 9. maquinas: ID_Maquina, Tipo, Capacidad, Consumo_Energetico, 10. pedidos_proveedor: ID_Pedido, ID_Proveedor, Fecha, Total, Referencia: clientes (ID_Proveedor), 11. produccion: ID_Produccion, ID_Maquina, Fecha, Cantidad_Producida, Referencia: maquinas (ID_Maquina), 12. productos: ID_Producto, Nombre, Precio, 13. registro_energetico: ID_Registro, ID_Maquina, Fecha, Consumo, Referencia: maquinas (ID_Maquina), 14. ventas: ID_Venta, Fecha, ID_Empleado, Total, Referencia: empleados (ID_Empleado)",
|
69 |
+
additional_kwargs={"tool": "sql_tool"},
|
70 |
+
)
|
71 |
+
|
72 |
+
|
73 |
+
llm = OpenAI(model=MODEL, api_client=client)
|
74 |
+
agent = OpenAIAgent.from_tools(
|
75 |
+
[sql_tool, multiply_tool, add_tool, subtract_tool, divide_tool],
|
76 |
+
llm=llm,
|
77 |
+
verbose=True,
|
78 |
+
chat_history=[estructura_base_de_datos],
|
79 |
+
system_prompt="Eres un asistente super amable te llamas Chispitas y asistes a la empresa Anhelados, siempre saludas, brindas información puntual y aqui te brindo datos para solucionar consultas del usuario, Ubicaciones en Lima, Perú: San Isidro, Miraflores, Surco y La Molina con horarios de Atencion de 9 AM a 10 PM. Ofrece helados artesanales, milkshakes, postres y bebidas. Promociones regulares y servicio de delivery disponible. Locales Específicos: San Isidro: Av. Javier Prado Este 1234, Tel: (01) 123-4567. Miraflores: Calle Alcanfores 567, Tel: (01) 234-5678. Surco: Av. Caminos del Inca 890, Tel: (01) 345-6789. La Molina: Av. La Molina 345, Tel: (01) 456-7890. Productos Destacados: Helados clásicos como vainilla, chocolate y fresa. Especialidades como lúcuma, maracuyá y chirimoya. Opciones veganas y gourmet. Promociones: 2x1 en helados clásicos los martes. Descuentos en helados gourmet al comprar 3 litros. Servicios Adicionales: Delivery y pedidos personalizados para eventos. Reservas para cumpleaños y reuniones. Siempre termina con un mensaje de agradecimiento por la preferencia.",
|
80 |
+
)
|
81 |
+
|
82 |
+
|
83 |
+
def ask_agent(question):
|
84 |
+
response = agent.chat(question)
|
85 |
+
print(response)
|
86 |
+
return str(response)
|
87 |
+
|
88 |
+
|
89 |
+
app = FastAPI(
|
90 |
+
title="API de la heladería Anhelados",
|
91 |
+
description="Esta es la API de ChatBot de la microempresa Anhelados, que ofrece helados artesanales, milkshakes, postres y bebidas.",
|
92 |
+
version="3.2.8",
|
93 |
+
openapi_url="/anhelados-openapi.json",
|
94 |
+
docs_url="/anhelados-docs",
|
95 |
+
redoc_url="/anhelados-redoc",
|
96 |
+
contact={
|
97 |
+
"name": "Anhelados",
|
98 |
+
"url": "https://www.anhelados.com",
|
99 |
+
"email": "contacto@anhelados.com",
|
100 |
+
},
|
101 |
+
license_info={"name": "MIT", "url": "https://opensource.org/licenses/MIT"},
|
102 |
+
)
|
103 |
+
|
104 |
+
# CORS
|
105 |
+
app.add_middleware(
|
106 |
+
CORSMiddleware,
|
107 |
+
allow_origins=["*"],
|
108 |
+
allow_credentials=True,
|
109 |
+
allow_methods=["*"],
|
110 |
+
allow_headers=["*"],
|
111 |
+
)
|
112 |
+
|
113 |
+
|
114 |
+
class Item(BaseModel):
|
115 |
+
question: str
|
116 |
+
|
117 |
+
|
118 |
+
@app.post("/chat/")
|
119 |
+
async def chat(item: Item):
|
120 |
+
response = ask_agent(item.question)
|
121 |
+
return {"response": response}
|
122 |
+
|
123 |
+
|
124 |
+
# uvicorn main:app --host localhost --port 7860 --reload
|
requirements.txt
ADDED
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
1 |
+
llama-index
|
2 |
+
openai
|
3 |
+
python-dotenv
|
4 |
+
fastapi
|