JairoDanielMT commited on
Commit
6b21de4
1 Parent(s): 6138f4a

API completada

Browse files
Files changed (5) hide show
  1. .gitattributes +1 -0
  2. Dockerfile +15 -0
  3. anhelados.db +3 -0
  4. main.py +124 -0
  5. 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