pbesa 4.0.20__tar.gz → 4.0.22__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. {pbesa-4.0.20 → pbesa-4.0.22}/PKG-INFO +1 -1
  2. {pbesa-4.0.20 → pbesa-4.0.22}/pbesa/cognitive.py +161 -42
  3. {pbesa-4.0.20 → pbesa-4.0.22}/pbesa.egg-info/PKG-INFO +1 -1
  4. {pbesa-4.0.20 → pbesa-4.0.22}/setup.py +1 -1
  5. {pbesa-4.0.20 → pbesa-4.0.22}/.gitignore +0 -0
  6. {pbesa-4.0.20 → pbesa-4.0.22}/LICENSE +0 -0
  7. {pbesa-4.0.20 → pbesa-4.0.22}/LICENSE.txt +0 -0
  8. {pbesa-4.0.20 → pbesa-4.0.22}/MANIFEST +0 -0
  9. {pbesa-4.0.20 → pbesa-4.0.22}/README.md +0 -0
  10. {pbesa-4.0.20 → pbesa-4.0.22}/examples/django/helloworld/db.sqlite3 +0 -0
  11. {pbesa-4.0.20 → pbesa-4.0.22}/examples/django/helloworld/helloworld/__init__.py +0 -0
  12. {pbesa-4.0.20 → pbesa-4.0.22}/examples/django/helloworld/helloworld/__pycache__/__init__.cpython-36.pyc +0 -0
  13. {pbesa-4.0.20 → pbesa-4.0.22}/examples/django/helloworld/helloworld/__pycache__/pbesa.cpython-36.pyc +0 -0
  14. {pbesa-4.0.20 → pbesa-4.0.22}/examples/django/helloworld/helloworld/__pycache__/settings.cpython-36.pyc +0 -0
  15. {pbesa-4.0.20 → pbesa-4.0.22}/examples/django/helloworld/helloworld/__pycache__/urls.cpython-36.pyc +0 -0
  16. {pbesa-4.0.20 → pbesa-4.0.22}/examples/django/helloworld/helloworld/__pycache__/wsgi.cpython-36.pyc +0 -0
  17. {pbesa-4.0.20 → pbesa-4.0.22}/examples/django/helloworld/helloworld/asgi.py +0 -0
  18. {pbesa-4.0.20 → pbesa-4.0.22}/examples/django/helloworld/helloworld/pbesa.py +0 -0
  19. {pbesa-4.0.20 → pbesa-4.0.22}/examples/django/helloworld/helloworld/settings.py +0 -0
  20. {pbesa-4.0.20 → pbesa-4.0.22}/examples/django/helloworld/helloworld/urls.py +0 -0
  21. {pbesa-4.0.20 → pbesa-4.0.22}/examples/django/helloworld/helloworld/wsgi.py +0 -0
  22. {pbesa-4.0.20 → pbesa-4.0.22}/examples/django/helloworld/manage.py +0 -0
  23. {pbesa-4.0.20 → pbesa-4.0.22}/examples/django/helloworld/translate/__init__.py +0 -0
  24. {pbesa-4.0.20 → pbesa-4.0.22}/examples/django/helloworld/translate/__pycache__/__init__.cpython-36.pyc +0 -0
  25. {pbesa-4.0.20 → pbesa-4.0.22}/examples/django/helloworld/translate/__pycache__/admin.cpython-36.pyc +0 -0
  26. {pbesa-4.0.20 → pbesa-4.0.22}/examples/django/helloworld/translate/__pycache__/apps.cpython-36.pyc +0 -0
  27. {pbesa-4.0.20 → pbesa-4.0.22}/examples/django/helloworld/translate/__pycache__/models.cpython-36.pyc +0 -0
  28. {pbesa-4.0.20 → pbesa-4.0.22}/examples/django/helloworld/translate/__pycache__/urls.cpython-36.pyc +0 -0
  29. {pbesa-4.0.20 → pbesa-4.0.22}/examples/django/helloworld/translate/__pycache__/views.cpython-36.pyc +0 -0
  30. {pbesa-4.0.20 → pbesa-4.0.22}/examples/django/helloworld/translate/admin.py +0 -0
  31. {pbesa-4.0.20 → pbesa-4.0.22}/examples/django/helloworld/translate/apps.py +0 -0
  32. {pbesa-4.0.20 → pbesa-4.0.22}/examples/django/helloworld/translate/mas/controller/__pycache__/translatecontroller.cpython-36.pyc +0 -0
  33. {pbesa-4.0.20 → pbesa-4.0.22}/examples/django/helloworld/translate/mas/controller/__pycache__/translatedelegate.cpython-36.pyc +0 -0
  34. {pbesa-4.0.20 → pbesa-4.0.22}/examples/django/helloworld/translate/mas/controller/__pycache__/translateresponse.cpython-36.pyc +0 -0
  35. {pbesa-4.0.20 → pbesa-4.0.22}/examples/django/helloworld/translate/mas/controller/translatecontroller.py +0 -0
  36. {pbesa-4.0.20 → pbesa-4.0.22}/examples/django/helloworld/translate/mas/controller/translatedelegate.py +0 -0
  37. {pbesa-4.0.20 → pbesa-4.0.22}/examples/django/helloworld/translate/mas/controller/translateresponse.py +0 -0
  38. {pbesa-4.0.20 → pbesa-4.0.22}/examples/django/helloworld/translate/mas/worker/__pycache__/translatetask.cpython-36.pyc +0 -0
  39. {pbesa-4.0.20 → pbesa-4.0.22}/examples/django/helloworld/translate/mas/worker/__pycache__/workeragent.cpython-36.pyc +0 -0
  40. {pbesa-4.0.20 → pbesa-4.0.22}/examples/django/helloworld/translate/mas/worker/translatetask.py +0 -0
  41. {pbesa-4.0.20 → pbesa-4.0.22}/examples/django/helloworld/translate/mas/worker/workeragent.py +0 -0
  42. {pbesa-4.0.20 → pbesa-4.0.22}/examples/django/helloworld/translate/migrations/__init__.py +0 -0
  43. {pbesa-4.0.20 → pbesa-4.0.22}/examples/django/helloworld/translate/migrations/__pycache__/__init__.cpython-36.pyc +0 -0
  44. {pbesa-4.0.20 → pbesa-4.0.22}/examples/django/helloworld/translate/models.py +0 -0
  45. {pbesa-4.0.20 → pbesa-4.0.22}/examples/django/helloworld/translate/tests.py +0 -0
  46. {pbesa-4.0.20 → pbesa-4.0.22}/examples/django/helloworld/translate/urls.py +0 -0
  47. {pbesa-4.0.20 → pbesa-4.0.22}/examples/django/helloworld/translate/views.py +0 -0
  48. {pbesa-4.0.20 → pbesa-4.0.22}/examples/remote/mas/controller/__pycache__/countercontroller.cpython-36.pyc +0 -0
  49. {pbesa-4.0.20 → pbesa-4.0.22}/examples/remote/mas/controller/__pycache__/counterdelegate.cpython-36.pyc +0 -0
  50. {pbesa-4.0.20 → pbesa-4.0.22}/examples/remote/mas/controller/__pycache__/counterresponse.cpython-36.pyc +0 -0
  51. {pbesa-4.0.20 → pbesa-4.0.22}/examples/remote/mas/controller/__pycache__/translatecontroller.cpython-36.pyc +0 -0
  52. {pbesa-4.0.20 → pbesa-4.0.22}/examples/remote/mas/controller/__pycache__/translatedelegate.cpython-36.pyc +0 -0
  53. {pbesa-4.0.20 → pbesa-4.0.22}/examples/remote/mas/controller/__pycache__/translateresponse.cpython-36.pyc +0 -0
  54. {pbesa-4.0.20 → pbesa-4.0.22}/examples/remote/mas/controller/countercontroller.py +0 -0
  55. {pbesa-4.0.20 → pbesa-4.0.22}/examples/remote/mas/controller/counterdelegate.py +0 -0
  56. {pbesa-4.0.20 → pbesa-4.0.22}/examples/remote/mas/controller/counterresponse.py +0 -0
  57. {pbesa-4.0.20 → pbesa-4.0.22}/examples/remote/mas/worker/__pycache__/counteragent.cpython-36.pyc +0 -0
  58. {pbesa-4.0.20 → pbesa-4.0.22}/examples/remote/mas/worker/__pycache__/countertask.cpython-36.pyc +0 -0
  59. {pbesa-4.0.20 → pbesa-4.0.22}/examples/remote/mas/worker/__pycache__/translatetask.cpython-36.pyc +0 -0
  60. {pbesa-4.0.20 → pbesa-4.0.22}/examples/remote/mas/worker/__pycache__/workeragent.cpython-36.pyc +0 -0
  61. {pbesa-4.0.20 → pbesa-4.0.22}/examples/remote/mas/worker/counteragent.py +0 -0
  62. {pbesa-4.0.20 → pbesa-4.0.22}/examples/remote/mas/worker/countertask.py +0 -0
  63. {pbesa-4.0.20 → pbesa-4.0.22}/examples/remote/remote_a.py +0 -0
  64. {pbesa-4.0.20 → pbesa-4.0.22}/examples/remote/remote_b.py +0 -0
  65. {pbesa-4.0.20 → pbesa-4.0.22}/examples/remote/remote_c.py +0 -0
  66. {pbesa-4.0.20 → pbesa-4.0.22}/pbesa/__init__.py +0 -0
  67. {pbesa-4.0.20 → pbesa-4.0.22}/pbesa/celulas/__init__.py +0 -0
  68. {pbesa-4.0.20 → pbesa-4.0.22}/pbesa/celulas/celula_casos.py +0 -0
  69. {pbesa-4.0.20 → pbesa-4.0.22}/pbesa/celulas/celula_consultas.py +0 -0
  70. {pbesa-4.0.20 → pbesa-4.0.22}/pbesa/celulas/celula_datos_identificables.py +0 -0
  71. {pbesa-4.0.20 → pbesa-4.0.22}/pbesa/celulas/celula_expertos.py +0 -0
  72. {pbesa-4.0.20 → pbesa-4.0.22}/pbesa/celulas/celula_generar_documento.py +0 -0
  73. {pbesa-4.0.20 → pbesa-4.0.22}/pbesa/celulas/celula_preguntas.py +0 -0
  74. {pbesa-4.0.20 → pbesa-4.0.22}/pbesa/celulas/celula_saludos.py +0 -0
  75. {pbesa-4.0.20 → pbesa-4.0.22}/pbesa/celulas/celula_simulador_ciudadano.py +0 -0
  76. {pbesa-4.0.20 → pbesa-4.0.22}/pbesa/celulas/data_extraction_cel.py +0 -0
  77. {pbesa-4.0.20 → pbesa-4.0.22}/pbesa/celulas/web.py +0 -0
  78. {pbesa-4.0.20 → pbesa-4.0.22}/pbesa/kernel/__init__.py +0 -0
  79. {pbesa-4.0.20 → pbesa-4.0.22}/pbesa/kernel/adapter.py +0 -0
  80. {pbesa-4.0.20 → pbesa-4.0.22}/pbesa/kernel/agent.py +0 -0
  81. {pbesa-4.0.20 → pbesa-4.0.22}/pbesa/kernel/io/__init__.py +0 -0
  82. {pbesa-4.0.20 → pbesa-4.0.22}/pbesa/kernel/io/system_file.py +0 -0
  83. {pbesa-4.0.20 → pbesa-4.0.22}/pbesa/kernel/io/tcp_server.py +0 -0
  84. {pbesa-4.0.20 → pbesa-4.0.22}/pbesa/kernel/res/__init__.py +0 -0
  85. {pbesa-4.0.20 → pbesa-4.0.22}/pbesa/kernel/res/__pycache__/__init__.cpython-36.pyc +0 -0
  86. {pbesa-4.0.20 → pbesa-4.0.22}/pbesa/kernel/res/__pycache__/__init__.cpython-37.pyc +0 -0
  87. {pbesa-4.0.20 → pbesa-4.0.22}/pbesa/kernel/res/__pycache__/__init__.cpython-38.pyc +0 -0
  88. {pbesa-4.0.20 → pbesa-4.0.22}/pbesa/kernel/res/__pycache__/__init__.cpython-39.pyc +0 -0
  89. {pbesa-4.0.20 → pbesa-4.0.22}/pbesa/kernel/res/conf.json +0 -0
  90. {pbesa-4.0.20 → pbesa-4.0.22}/pbesa/kernel/util.py +0 -0
  91. {pbesa-4.0.20 → pbesa-4.0.22}/pbesa/kernel/world.py +0 -0
  92. {pbesa-4.0.20 → pbesa-4.0.22}/pbesa/mas.py +0 -0
  93. {pbesa-4.0.20 → pbesa-4.0.22}/pbesa/models.py +0 -0
  94. {pbesa-4.0.20 → pbesa-4.0.22}/pbesa/remote/__init__.py +0 -0
  95. {pbesa-4.0.20 → pbesa-4.0.22}/pbesa/remote/adm_listener.py +0 -0
  96. {pbesa-4.0.20 → pbesa-4.0.22}/pbesa/remote/adm_listener_handler.py +0 -0
  97. {pbesa-4.0.20 → pbesa-4.0.22}/pbesa/remote/exceptions.py +0 -0
  98. {pbesa-4.0.20 → pbesa-4.0.22}/pbesa/remote/remote_adm.py +0 -0
  99. {pbesa-4.0.20 → pbesa-4.0.22}/pbesa/remote/remote_adm_handler.py +0 -0
  100. {pbesa-4.0.20 → pbesa-4.0.22}/pbesa/social/__init__.py +0 -0
  101. {pbesa-4.0.20 → pbesa-4.0.22}/pbesa/social/collaborative_team.py +0 -0
  102. {pbesa-4.0.20 → pbesa-4.0.22}/pbesa/social/delegator.py +0 -0
  103. {pbesa-4.0.20 → pbesa-4.0.22}/pbesa/social/delegator_team.py +0 -0
  104. {pbesa-4.0.20 → pbesa-4.0.22}/pbesa/social/dialog.py +0 -0
  105. {pbesa-4.0.20 → pbesa-4.0.22}/pbesa/social/dispatcher_team.py +0 -0
  106. {pbesa-4.0.20 → pbesa-4.0.22}/pbesa/social/prompts.py +0 -0
  107. {pbesa-4.0.20 → pbesa-4.0.22}/pbesa/social/selected_dispatcher_team.py +0 -0
  108. {pbesa-4.0.20 → pbesa-4.0.22}/pbesa/social/templates.py +0 -0
  109. {pbesa-4.0.20 → pbesa-4.0.22}/pbesa/social/worker.py +0 -0
  110. {pbesa-4.0.20 → pbesa-4.0.22}/pbesa.egg-info/SOURCES.txt +0 -0
  111. {pbesa-4.0.20 → pbesa-4.0.22}/pbesa.egg-info/dependency_links.txt +0 -0
  112. {pbesa-4.0.20 → pbesa-4.0.22}/pbesa.egg-info/requires.txt +0 -0
  113. {pbesa-4.0.20 → pbesa-4.0.22}/pbesa.egg-info/top_level.txt +0 -0
  114. {pbesa-4.0.20 → pbesa-4.0.22}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: pbesa
3
- Version: 4.0.20
3
+ Version: 4.0.22
4
4
  License-File: LICENSE
5
5
  License-File: LICENSE.txt
6
6
  Requires-Dist: pymongo>=4.6.3
@@ -927,7 +927,7 @@ class Dialog(ABC):
927
927
 
928
928
  if dicriminador:
929
929
  self.notify(session_id, f"primera fase se identifica: {dicriminador}.")
930
- #res = query
930
+ res = query
931
931
  else:
932
932
  ambiguedad = True
933
933
 
@@ -1457,53 +1457,172 @@ class SpecialDispatch():
1457
1457
  return mensaje_limpio.strip()
1458
1458
  else:
1459
1459
  return ""
1460
+
1461
+ @abstractmethod
1462
+ def retrieval(self, query) -> str:
1463
+ """ Set retrieval method
1464
+ :param query: query
1465
+ :return: str
1466
+ """
1467
+ pass
1468
+
1469
+ @abstractmethod
1470
+ def kusto_connection(self):
1471
+ pass
1472
+
1473
+ @abstractmethod
1474
+ def kusto_open(self) -> bool:
1475
+ pass
1460
1476
 
1461
1477
  def special_dispatch(self, data: any) -> None:
1462
1478
  """
1463
1479
  Response.
1464
1480
  @param data Event data
1465
1481
  """
1466
- logging.info("Despachando por descripcion...")
1467
- options = ""
1468
- cont = 1
1469
- agent_options = {}
1470
- for agent, item in self.__options_dict.items():
1471
- agent_options[cont] = agent
1472
- options += f"{cont}) {item}\n"
1473
- cont += 1
1474
- query = data['dto']['text'] if data and 'dto' in data and data['dto']['text'] is not None else ''
1475
- prompt = CLASSIFICATION_PROMPT % options
1476
- logging.info(f"Query: {query},\n Options:\n{options}")
1477
- self.__meta_work_memory.append({"role": "system", "content": prompt})
1478
-
1482
+ if data and not data['dto']['session']['team'] == "Funcionalidades":
1483
+ logging.info("Despachando por descripcion...")
1484
+ options = ""
1485
+ cont = 1
1486
+ agent_options = {}
1487
+ for agent, item in self.__options_dict.items():
1488
+ agent_options[cont] = agent
1489
+ options += f"{cont}) {item}\n"
1490
+ cont += 1
1491
+ query = data['dto']['text'] if data and 'dto' in data and data['dto']['text'] is not None else ''
1492
+ prompt = CLASSIFICATION_PROMPT % options
1493
+ logging.info(f"Query: {query},\n Options:\n{options}")
1494
+ self.__meta_work_memory.append({"role": "system", "content": prompt})
1495
+
1479
1496
 
1480
- user_prompt = f"""
1481
- Texto: "%s"
1497
+ user_prompt = f"""
1498
+ Texto: "%s"
1482
1499
 
1483
- Respuesta:
1484
- """ % query
1485
- self.__meta_work_memory.append({"role": "user", "content": user_prompt})
1486
-
1487
- res = self.__ai_service.generate(self.__meta_work_memory, max_tokens=10)
1488
- logging.info(f"Thought: {res}")
1489
- self.__meta_work_memory = []
1490
- res = self.get_text(res)
1491
- select_agent = None
1492
- compare = re.findall(r'\d+', res)
1493
- print(f"Compare: {compare}")
1494
- if len(compare) > 0:
1495
- compare = compare[0]
1500
+ Respuesta:
1501
+ """ % query
1502
+ self.__meta_work_memory.append({"role": "user", "content": user_prompt})
1503
+
1504
+ res = self.__ai_service.generate(self.__meta_work_memory, max_tokens=10)
1505
+ logging.info(f"Thought: {res}")
1506
+ self.__meta_work_memory = []
1507
+ res = self.get_text(res)
1508
+ select_agent = None
1509
+ compare = re.findall(r'\d+', res)
1510
+ print(f"Compare: {compare}")
1511
+ if len(compare) > 0:
1512
+ compare = compare[0]
1513
+ else:
1514
+ compare = res
1515
+ compare = compare.strip()
1516
+ print(f"Compare: {compare}")
1517
+ for option in range(1, cont+1):
1518
+ print(f"Option: {option} - Compare: {compare}")
1519
+ if str(option) == compare:
1520
+ select_agent = agent_options[option]
1521
+ logging.info(f"Descripcion del agente seleccionado: {select_agent}")
1522
+ break
1523
+ if not select_agent:
1524
+ logging.info("=> No se seleccionó ningun agente")
1525
+ return select_agent
1496
1526
  else:
1497
- compare = res
1498
- compare = compare.strip()
1499
- print(f"Compare: {compare}")
1500
- for option in range(1, cont+1):
1501
- print(f"Option: {option} - Compare: {compare}")
1502
- if str(option) == compare:
1503
- select_agent = agent_options[option]
1504
- logging.info(f"Descripcion del agente seleccionado: {select_agent}")
1505
- break
1506
- if not select_agent:
1507
- logging.info("=> No se seleccionó ningun agente")
1508
- return select_agent
1509
-
1527
+ logging.info("Despachando por descripcion...")
1528
+ options = ""
1529
+ cont = 1
1530
+
1531
+ selection_options = {}
1532
+
1533
+ agent_options = {}
1534
+ for agent, item in self.__options_dict.items():
1535
+ agent_options[cont] = agent
1536
+ options += f"{cont}) {item}\n"
1537
+ cont += 1
1538
+ selection_options[agent] = 0
1539
+
1540
+ query = data['dto']['text'] if data and 'dto' in data and data['dto']['text'] is not None else ''
1541
+ prompt = CLASSIFICATION_PROMPT % options
1542
+ logging.info(f"Query: {query},\n Options:\n{options}")
1543
+ self.__meta_work_memory.append({"role": "system", "content": prompt})
1544
+
1545
+
1546
+ user_prompt = f"""
1547
+ Texto: "%s"
1548
+
1549
+ Respuesta:
1550
+ """ % query
1551
+ self.__meta_work_memory.append({"role": "user", "content": user_prompt})
1552
+
1553
+ self.kusto_open()
1554
+
1555
+ attemps = 1
1556
+ while attemps <= 3:
1557
+ logging.info(f"Intento de selección de agente: {attemps}")
1558
+
1559
+ res = self.__ai_service.generate(self.__meta_work_memory, max_tokens=10)
1560
+ logging.info(f"Thought: {res}")
1561
+
1562
+ res = self.get_text(res)
1563
+ select_agent = None
1564
+ compare = re.findall(r'\d+', res)
1565
+ print(f"Compare: {compare}")
1566
+ if len(compare) > 0:
1567
+ compare = compare[0]
1568
+ else:
1569
+ compare = res
1570
+ compare = compare.strip()
1571
+ print(f"Compare: {compare}")
1572
+ for option in range(1, cont+1):
1573
+ print(f"Option: {option} - Compare: {compare}")
1574
+ if str(option) == compare:
1575
+ select_agent = agent_options[option]
1576
+ logging.info(f"Descripcion del agente seleccionado: {select_agent}")
1577
+ break
1578
+ if not select_agent:
1579
+ logging.info("=> No se seleccionó ningun agente")
1580
+
1581
+ major_id, response, score = self.retrieval(query)
1582
+ major_id_split = major_id.split("_")
1583
+ major_id = major_id_split[0] if len(major_id_split) > 0 else major_id
1584
+ major_id_split = major_id.split("-")
1585
+ major_id = major_id_split[0] if len(major_id_split) > 0 else major_id
1586
+
1587
+ compare_llm = 0
1588
+ compare_index = 0
1589
+ idex_result = None
1590
+
1591
+ # Check if the selected agent is in the retrieval response
1592
+ if major_id and major_id in select_agent:
1593
+ logging.info(f"Se seleccionó el agente: {select_agent} con score: {score}")
1594
+ exit = True
1595
+ continue
1596
+ else:
1597
+ for ag in selection_options:
1598
+ if select_agent and select_agent in ag:
1599
+ selection_options[ag] += 1
1600
+ compare_llm += 1
1601
+ if major_id and major_id in ag:
1602
+ selection_options[ag] += 1
1603
+ compare_index += 1
1604
+ idex_result = ag
1605
+
1606
+ attemps += 1
1607
+
1608
+ if attemps > 3:
1609
+ logging.info("No se pudo seleccionar un agente, identificando el agente con mayor score...")
1610
+
1611
+ if compare_llm == compare_index:
1612
+ logging.warning("Dando prioridad al resultado del indice")
1613
+ select_agent = idex_result
1614
+ else:
1615
+ logging.info("Evaluando los scores de los agentes...")
1616
+ major_id = ""
1617
+ max_score = 0
1618
+ for ag, score in selection_options.items():
1619
+ if score > max_score:
1620
+ max_score = score
1621
+ major_id = ag
1622
+ if major_id:
1623
+ select_agent = major_id
1624
+ logging.info(f"Se seleccionó el agente: {select_agent} con score: {max_score}")
1625
+
1626
+ self.kusto_close()
1627
+ self.__meta_work_memory = []
1628
+ return select_agent
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: pbesa
3
- Version: 4.0.20
3
+ Version: 4.0.22
4
4
  License-File: LICENSE
5
5
  License-File: LICENSE.txt
6
6
  Requires-Dist: pymongo>=4.6.3
@@ -4,7 +4,7 @@ from setuptools import setup, find_packages
4
4
 
5
5
  setup(
6
6
  name='pbesa',
7
- version='4.0.20',
7
+ version='4.0.22',
8
8
  packages=find_packages(),
9
9
  install_requires=[
10
10
  'pymongo>=4.6.3',
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes