pbesa 2.1__py3-none-any.whl → 4.0.0__py3-none-any.whl

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 (75) hide show
  1. pbesa/__init__.py +4 -3
  2. pbesa/cognitive.py +475 -0
  3. pbesa/kernel/__init__.py +4 -6
  4. pbesa/kernel/adapter.py +165 -0
  5. pbesa/kernel/agent.py +558 -0
  6. pbesa/kernel/io/__init__.py +2 -2
  7. pbesa/kernel/io/system_file.py +38 -0
  8. pbesa/kernel/io/tcp_server.py +23 -0
  9. pbesa/kernel/util.py +217 -0
  10. pbesa/kernel/world.py +43 -0
  11. pbesa/mas.py +565 -0
  12. pbesa/remote/__init__.py +5 -0
  13. pbesa/remote/adm_listener.py +44 -0
  14. pbesa/{middleware/remote/AdmListenerHandler.py → remote/adm_listener_handler.py} +74 -57
  15. pbesa/remote/exceptions.py +18 -0
  16. pbesa/remote/remote_adm.py +42 -0
  17. pbesa/{middleware/remote/RemoteAdmHandler.py → remote/remote_adm_handler.py} +109 -83
  18. pbesa/social/__init__.py +4 -0
  19. pbesa/social/collaborative_team.py +299 -0
  20. pbesa/social/delegator.py +81 -0
  21. pbesa/social/delegator_team.py +334 -0
  22. pbesa/social/dialog.py +153 -0
  23. pbesa/social/dispatcher_team.py +319 -0
  24. pbesa/social/templates.py +18 -0
  25. pbesa/social/worker.py +188 -0
  26. {pbesa-2.1.dist-info → pbesa-4.0.0.dist-info}/LICENSE +21 -21
  27. {pbesa-2.1.dist-info → pbesa-4.0.0.dist-info}/LICENSE.txt +21 -21
  28. pbesa-4.0.0.dist-info/METADATA +8 -0
  29. pbesa-4.0.0.dist-info/RECORD +32 -0
  30. {pbesa-2.1.dist-info → pbesa-4.0.0.dist-info}/WHEEL +5 -5
  31. {pbesa-2.1.dist-info → pbesa-4.0.0.dist-info}/top_level.txt +0 -0
  32. pbesa/engine/__init__.py +0 -2
  33. pbesa/engine/bdi/BDIAg.py +0 -42
  34. pbesa/engine/bdi/BDILevel.py +0 -10
  35. pbesa/engine/bdi/BDIMachine.py +0 -116
  36. pbesa/engine/bdi/Goal.py +0 -28
  37. pbesa/engine/bdi/GoalExe.py +0 -36
  38. pbesa/engine/bdi/__init__.py +0 -5
  39. pbesa/engine/rational/ActionExe.py +0 -35
  40. pbesa/engine/rational/Brain.py +0 -10
  41. pbesa/engine/rational/RationalAg.py +0 -43
  42. pbesa/engine/rational/__init__.py +0 -3
  43. pbesa/kernel/adapter/Adapter.py +0 -26
  44. pbesa/kernel/adapter/FileAdapter.py +0 -23
  45. pbesa/kernel/adapter/__init__.py +0 -2
  46. pbesa/kernel/agent/Action.py +0 -19
  47. pbesa/kernel/agent/Agent.py +0 -91
  48. pbesa/kernel/agent/BehaviorExe.py +0 -33
  49. pbesa/kernel/agent/Channel.py +0 -10
  50. pbesa/kernel/agent/World.py +0 -15
  51. pbesa/kernel/agent/__init__.py +0 -5
  52. pbesa/kernel/io/SystemFile.py +0 -13
  53. pbesa/kernel/io/TCPServer.py +0 -4
  54. pbesa/kernel/system/Adm.py +0 -189
  55. pbesa/kernel/system/Directory.py +0 -36
  56. pbesa/kernel/system/__init__.py +0 -2
  57. pbesa/kernel/util/HashTable.py +0 -62
  58. pbesa/kernel/util/Queue.py +0 -231
  59. pbesa/kernel/util/__init__.py +0 -2
  60. pbesa/middleware/__init__.py +0 -3
  61. pbesa/middleware/adapter/GameAdapter.py +0 -64
  62. pbesa/middleware/adapter/MongoAdapter.py +0 -47
  63. pbesa/middleware/adapter/RESTAdapter.py +0 -52
  64. pbesa/middleware/adapter/SubProcessAdapter.py +0 -30
  65. pbesa/middleware/adapter/WSSAdapter.py +0 -89
  66. pbesa/middleware/adapter/WSSNJAdapter.py +0 -51
  67. pbesa/middleware/adapter/WSSNJHandler.py +0 -23
  68. pbesa/middleware/adapter/__init__.py +0 -7
  69. pbesa/middleware/remote/AdmListener.py +0 -17
  70. pbesa/middleware/remote/RemoteAdm.py +0 -17
  71. pbesa/middleware/remote/__init__.py +0 -4
  72. pbesa/middleware/web/WebAgTK.py +0 -15
  73. pbesa/middleware/web/__init__.py +0 -0
  74. pbesa-2.1.dist-info/METADATA +0 -25
  75. pbesa-2.1.dist-info/RECORD +0 -54
pbesa/__init__.py CHANGED
@@ -1,3 +1,4 @@
1
- from .engine import *
2
- from .kernel import *
3
- from .middleware import *
1
+ from .kernel import *
2
+ from .social import *
3
+ from .remote import *
4
+ from .cognitive import *
pbesa/cognitive.py ADDED
@@ -0,0 +1,475 @@
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+ ----------------------------------------------------------
4
+ -------------------------- PBESA -------------------------
5
+ ----------------------------------------------------------
6
+
7
+ @autor AKEN
8
+ @version 4.0.0
9
+ @date 08/08/24
10
+ """
11
+
12
+ # --------------------------------------------------------
13
+ # Define resources
14
+ # --------------------------------------------------------
15
+
16
+ import traceback
17
+ from abc import ABC, abstractmethod
18
+ from pbesa.social.dialog import DialogState, ActionNode, DeclarativeNode, TerminalNode
19
+
20
+ # --------------------------------------------------------
21
+ # Define OpenAI Adapter component
22
+ # --------------------------------------------------------
23
+
24
+ class OpenAIAdapter():
25
+
26
+ def __init__(self, model:any, model_conf:dict, work_memory:list) -> None:
27
+ """ Constructor method
28
+ :param model: model
29
+ :param model_conf: model_conf
30
+ :param work_memory: work_memory
31
+ """
32
+ self.model:any = model
33
+ self.model_conf:dict = model_conf
34
+ self.__work_memory:list = work_memory
35
+
36
+ def generate(self) -> str:
37
+ """ Generate method
38
+ :return: str
39
+ """
40
+ try:
41
+ # Genera texto con OpenAI.
42
+ self.model.api_key = self.model_conf['API_KEY']
43
+ engine = self.model_conf['OPENAI_ENGINE']
44
+ response = self.model.ChatCompletion.create(
45
+ model = engine,
46
+ messages = self.__work_memory
47
+ )
48
+ # Verifica si se obtuvo respuesta.
49
+ if response['choices'][0]['finish_reason'] == 'completed' or response['choices'][0]['finish_reason'] == 'stop':
50
+ res = response['choices'][0]['message']['content']
51
+ try:
52
+ if not res or res == 'null' or res == 'N/A' or 'N/A' in res:
53
+ #self.log.warning("OpenAI response not completed", extra={'log_data': {'gpt_response': response}})
54
+ print("OpenAI response not completed")
55
+ return None
56
+ #self.log.info("OpenAI response completed", extra={'log_data': {'gpt_response': response}})
57
+ print("OpenAI response completed")
58
+ self.__work_memory.append({"role": "assistant", "content": res})
59
+ return res
60
+ except:
61
+ #self.log.warning("OpenAI response not completed", extra={'log_data': {'gpt_response': response}})
62
+ print("OpenAI response not completed")
63
+ return None
64
+ else:
65
+ #self.log.warning("OpenAI response not completed", extra={'log_data': {'gpt_response': response}})
66
+ print("OpenAI response not completed")
67
+ return None
68
+ except Exception as e:
69
+ trace_err = traceback.format_exc()
70
+ err = str(e) + " - " + trace_err
71
+ #self.log.error(err)
72
+ print(err)
73
+ return None
74
+
75
+ # --------------------------------------------------------
76
+ # Define Model component
77
+ # --------------------------------------------------------
78
+
79
+ class Model(ABC):
80
+ """ Model class """
81
+
82
+ def __init__(self) -> None:
83
+ """ Constructor method """
84
+ self.model:any = None
85
+
86
+ def get_model(self) -> any:
87
+ """ Get model method
88
+ :return: model
89
+ """
90
+ return self.model
91
+
92
+ @abstractmethod
93
+ def load_model(self, config:dict) -> None:
94
+ """ Load model method
95
+ :param config: config
96
+ """
97
+ pass
98
+
99
+ @abstractmethod
100
+ def train_model(self, model_config:dict, data:any) -> any:
101
+ """ Train model method
102
+ :param model_config: model_config
103
+ :param data: data
104
+ :return: any
105
+ """
106
+ pass
107
+
108
+ @abstractmethod
109
+ def evaluate_model(self, data:any) -> any:
110
+ """ Validate model method
111
+ :param data: data
112
+ :return: any
113
+ """
114
+ pass
115
+
116
+ @abstractmethod
117
+ def fit_model(self, model_config:dict, data:any) -> any:
118
+ """ Fit model method
119
+ :param model_config: model_config
120
+ :param data: data
121
+ :return: any
122
+ """
123
+ pass
124
+
125
+ @abstractmethod
126
+ def predict(self, data:any) -> any:
127
+ """ Predict method
128
+ :param data: data
129
+ :return: any
130
+ """
131
+ pass
132
+
133
+ # --------------------------------------------------------
134
+ # Define Generative component
135
+ # --------------------------------------------------------
136
+
137
+ class Generative(ABC):
138
+ """ Generative class """
139
+
140
+ def __init__(self) -> None:
141
+ """ Constructor method """
142
+ self.model:any = None
143
+
144
+ def get_model(self) -> any:
145
+ """ Get model method
146
+ :return: model
147
+ """
148
+ return self.model
149
+
150
+ def set_model(self, model:any) -> None:
151
+ """ Set model method
152
+ :param model: model
153
+ """
154
+ self.model = model
155
+
156
+ def generate(self, data:any, config:dict) -> any:
157
+ """ Generate method
158
+ :param data: data
159
+ :param config: config
160
+ :return: any
161
+ """
162
+ pass
163
+
164
+ # --------------------------------------------------------
165
+ # Define Augmented Generation component
166
+ # --------------------------------------------------------
167
+
168
+ class AugmentedGeneration(ABC):
169
+ """ Augmented Generation """
170
+
171
+ def __init__(self) -> None:
172
+ """ Constructor method """
173
+ self.model:any = None
174
+ self.model_conf:dict = None
175
+ self.__work_memory:list = []
176
+ # Define role
177
+ role = self.define_role()
178
+ self.__role = role.strip() if role else "Undefined"
179
+ # Define model adapter
180
+ self.__model_adapter = None
181
+ # Set up model
182
+ self.set_up_model()
183
+
184
+ def set_up_model(self):
185
+ """ Set up model method """
186
+ # Define role
187
+ self.__work_memory.append({"role": "system", "content": self.__role})
188
+
189
+ def get_model(self) -> any:
190
+ """ Get model method
191
+ :return: model
192
+ """
193
+ return self.model
194
+
195
+ def load_model(self, model:any, model_conf:dict) -> None:
196
+ """ Set model method
197
+ :param model: model
198
+ :param model_conf: Configuration
199
+ """
200
+ self.model = model
201
+ self.model_conf = model_conf
202
+ self.__model_adapter = OpenAIAdapter(self.model, self.model_conf, self.__work_memory)
203
+
204
+ def update_world_model(self, fact:str) -> None:
205
+ """ Update world model method
206
+ :param fact: fact
207
+ :return: str
208
+ """
209
+ self.__work_memory.append({"role": "user", "content": fact})
210
+
211
+ def reset(self) -> None:
212
+ """ Reset method """
213
+ self.__work_memory = []
214
+ # Set up model
215
+ self.set_up_model()
216
+
217
+ def derive(self, query) -> str:
218
+ """ Generate method
219
+ :return: str
220
+ """
221
+ content = self.retrieval(query)
222
+ self.__work_memory.append({"role": "system", "content": f"A partir de la siguiente información: {content} responde a la siguiente consulta:"})
223
+ self.__work_memory.append({"role": "user", "content": query})
224
+ return self.__model_adapter.generate()
225
+
226
+ @abstractmethod
227
+ def define_role(self) -> str:
228
+ """ Set role set method """
229
+ pass
230
+
231
+ @abstractmethod
232
+ def retrieval(self, query) -> str:
233
+ """ Set retrieval method
234
+ :param query: query
235
+ :return: str
236
+ """
237
+ pass
238
+
239
+ # --------------------------------------------------------
240
+ # Define Rational component
241
+ # --------------------------------------------------------
242
+
243
+ class Rational(ABC):
244
+ """ Rational class """
245
+
246
+ def __init__(self) -> None:
247
+ """ Constructor method """
248
+ self.model:any = None
249
+ self.__work_memory:list = []
250
+
251
+ def get_model(self) -> any:
252
+ """ Get model method
253
+ :return: model
254
+ """
255
+ return self.model
256
+
257
+ def set_model(self, model:any) -> None:
258
+ """ Set model method
259
+ :param model: model
260
+ """
261
+ self.model = model
262
+
263
+ def derive(self, data:any, config:dict) -> any:
264
+ """ Generate method
265
+ :param data: data
266
+ :param config: config
267
+ :return: any
268
+ """
269
+ pass
270
+
271
+ # --------------------------------------------------------
272
+ # Define Production component
273
+ # --------------------------------------------------------
274
+
275
+ class Production(ABC):
276
+ """ Rational class """
277
+
278
+ def __init__(self) -> None:
279
+ """ Constructor method """
280
+ self.model:any = None
281
+ self.model_conf:dict = None
282
+ self.__work_memory:list = []
283
+ # Define role
284
+ role = self.define_role()
285
+ self.__role = role.strip() if role else "Undefined"
286
+ # Define rule set
287
+ self.__rule_set = self.define_rule_set()
288
+ # Define example
289
+ self.__example = self.define_example()
290
+ # Define model adapter
291
+ self.__model_adapter = None
292
+ # Set up model
293
+ self.set_up_model()
294
+
295
+ def set_up_model(self):
296
+ """ Set up model method """
297
+ # Define role
298
+ self.__work_memory.append({"role": "system", "content": self.__role})
299
+ # Iterate over the rule set
300
+ self.__work_memory.append({"role": "system", "content": "Sigue estrictamente las siguientes reglas:"})
301
+ for rule in self.__rule_set:
302
+ self.__work_memory.append({"role": "system", "content": rule})
303
+ self.__work_memory.append({"role": "system", "content": "Ejemplo:"})
304
+ # Define example
305
+ self.__work_memory.append({"role": "system", "content": self.__example})
306
+
307
+ def get_model(self) -> any:
308
+ """ Get model method
309
+ :return: model
310
+ """
311
+ return self.model
312
+
313
+ def load_model(self, model:any, model_conf:dict) -> None:
314
+ """ Set model method
315
+ :param model: model
316
+ :param model_conf: Configuration
317
+ """
318
+ self.model = model
319
+ self.model_conf = model_conf
320
+ self.__model_adapter = OpenAIAdapter(self.model, self.model_conf, self.__work_memory)
321
+
322
+ def get_rule_set(self) -> list:
323
+ """ Get rule set method
324
+ :return: list
325
+ """
326
+ return self.__rule_set
327
+
328
+ def update_world_model(self, fact:str) -> None:
329
+ """ Update world model method
330
+ :param fact: fact
331
+ :return: str
332
+ """
333
+ self.__work_memory.append({"role": "user", "content": fact})
334
+
335
+ def reset(self) -> None:
336
+ """ Reset method """
337
+ self.__work_memory = []
338
+ # Set up model
339
+ self.set_up_model()
340
+
341
+ def derive(self) -> str:
342
+ """ Generate method
343
+ :return: str
344
+ """
345
+ return self.__model_adapter.generate()
346
+
347
+ @abstractmethod
348
+ def define_role(self) -> str:
349
+ """ Set role set method """
350
+ pass
351
+
352
+ @abstractmethod
353
+ def define_rule_set(self) -> tuple:
354
+ """ Set rule set method """
355
+ pass
356
+
357
+ @abstractmethod
358
+ def define_example(self) -> str:
359
+ """ Set example set method """
360
+ pass
361
+
362
+ # --------------------------------------------------------
363
+ # Define Dialog component
364
+ # --------------------------------------------------------
365
+
366
+ class Dialog(ABC):
367
+ """ Dialog """
368
+
369
+ def __init__(self) -> None:
370
+ """ Constructor method """
371
+ self.model:any = None
372
+ self.model_conf:dict = None
373
+ self.__work_memory:list = []
374
+ # Define role
375
+ role = self.define_role()
376
+ self.__role = role.strip() if role else "Undefined"
377
+ # Define DFA
378
+ dfa = self.define_dfa()
379
+ self.__dfa = dfa if dfa else "Undefined"
380
+ # Set dialog state
381
+ self.__dialog_state = DialogState.START
382
+ # Define model adapter
383
+ self.__model_adapter = None
384
+ # Set up model
385
+ self.set_up_model()
386
+
387
+
388
+ def set_up_model(self):
389
+ """ Set up model method """
390
+ # Define role
391
+ self.__work_memory.append({"role": "system", "content": self.__role})
392
+
393
+ def get_model(self) -> any:
394
+ """ Get model method
395
+ :return: model
396
+ """
397
+ return self.model
398
+
399
+ def set_dialog_state(self, dialog_state) -> None:
400
+ """ Set dialog state method
401
+ :param dialog_state: dialog_state
402
+ """
403
+ self.__dialog_state = dialog_state
404
+
405
+ def get_dialog_state(self) -> DialogState:
406
+ """ Get dialog state method
407
+ :return: DialogState
408
+ """
409
+ return self.__dialog_state
410
+
411
+ def load_model(self, model:any, model_conf:dict) -> None:
412
+ """ Set model method
413
+ :param model: model
414
+ :param model_conf: Configuration
415
+ """
416
+ self.model = model
417
+ self.model_conf = model_conf
418
+ self.__model_adapter = OpenAIAdapter(self.model, self.model_conf, self.__work_memory)
419
+
420
+ def update_world_model(self, fact:str) -> None:
421
+ """ Update world model method
422
+ :param fact: fact
423
+ :return: str
424
+ """
425
+ self.__work_memory.append({"role": "user", "content": fact})
426
+
427
+ def reset(self) -> None:
428
+ """ Reset method """
429
+ self.__work_memory = []
430
+ # Set up model
431
+ self.set_up_model()
432
+
433
+ def transition(self, dialog_state, query) -> str:
434
+ """ Generate method
435
+ :return: str
436
+ """
437
+ text = ""
438
+ path_tag = None
439
+ node = self.__dfa[dialog_state]
440
+ if isinstance(node, DeclarativeNode):
441
+ text = node.text
442
+ self.__work_memory.append({"role": "system", "content": text})
443
+ self.__work_memory.append({"role": "user", "content": query})
444
+ elif isinstance(node, ActionNode):
445
+ node, text = node.action(node, query)
446
+ print("-> node:", node.performative)
447
+ print("-> text:", text)
448
+ self.__work_memory.append({"role": "user", "content": query})
449
+ self.__work_memory.append({"role": "system", "content": text})
450
+ self.__work_memory.append({"role": "system", "content": text})
451
+ new_owner = node.owner
452
+ new_dialog_state = node.performative
453
+ return new_owner, new_dialog_state, self.__model_adapter.generate()
454
+ path_tag = next((tag for tag in ['do', 'yes', 'no'] if tag in node.children), None)
455
+ print("path_tag", path_tag)
456
+ if path_tag:
457
+ new_owner = node.children[path_tag].owner
458
+ new_dialog_state = node.children[path_tag].performative
459
+ if not isinstance(node, TerminalNode):
460
+ print("=> new_owner:", new_owner, "new_dialog_state:", new_dialog_state)
461
+ return new_owner, new_dialog_state, self.__model_adapter.generate()
462
+ print("=> new_owner:", new_owner, "new_dialog_state:", new_dialog_state)
463
+ return new_owner, new_dialog_state, None
464
+ else:
465
+ raise Exception("No path found")
466
+
467
+ @abstractmethod
468
+ def define_role(self) -> str:
469
+ """ Set role set method """
470
+ pass
471
+
472
+ @abstractmethod
473
+ def define_dfa(self) -> dict:
474
+ """ Set role set method """
475
+ pass
pbesa/kernel/__init__.py CHANGED
@@ -1,6 +1,4 @@
1
- from .adapter import *
2
- from .agent import *
3
- from .io import *
4
- from .res import *
5
- from .system import *
6
- from .util import *
1
+ from .adapter import *
2
+ from .agent import *
3
+ from .io import *
4
+ from .res import *
@@ -0,0 +1,165 @@
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+ ----------------------------------------------------------
4
+ -------------------------- PBESA -------------------------
5
+ ----------------------------------------------------------
6
+
7
+ @autor AKEN
8
+ @version 4.0.0
9
+ @date 08/08/24
10
+ """
11
+
12
+ # --------------------------------------------------------
13
+ # Define resources
14
+ # --------------------------------------------------------
15
+
16
+ from pymongo import MongoClient
17
+ from pymongo.cursor import Cursor
18
+ from abc import ABC, abstractmethod
19
+ from .io.system_file import SystemFile
20
+
21
+ # --------------------------------------------------------
22
+ # Define Adapter component
23
+ # --------------------------------------------------------
24
+
25
+ class Adapter(ABC):
26
+ """ Base adapter class """
27
+
28
+ # Adapter data
29
+ data = None
30
+ # Adapter configuration
31
+ config = None
32
+
33
+ def __init__(self) -> None:
34
+ """ Constructor """
35
+ super().__init__()
36
+
37
+ @abstractmethod
38
+ def setup(self) -> None:
39
+ """ Set up adapter """
40
+ pass
41
+
42
+ @abstractmethod
43
+ def response(self) -> None:
44
+ """ Response adapter """
45
+ pass
46
+
47
+ @abstractmethod
48
+ def request(self) -> None:
49
+ """ Request adapter """
50
+ pass
51
+
52
+ @abstractmethod
53
+ def finalize(self) -> None:
54
+ """ Finalize adapter """
55
+ pass
56
+
57
+ # --------------------------------------------------------
58
+ # Define FileAdapter component
59
+ # --------------------------------------------------------
60
+
61
+ class FileAdapter(Adapter):
62
+ """ File adapter class """
63
+
64
+ def __init__(self, config) -> None:
65
+ """ Constructor
66
+ :param config: Configuration
67
+ """
68
+ self.config = config
69
+ super().__init__()
70
+
71
+ def setup(self) -> None:
72
+ """ Set up adapter """
73
+ if self.config['type'] == 'JSON':
74
+ sf = SystemFile(self.config['path'])
75
+ self.data = sf.read_json_file()
76
+
77
+ def response(self) -> None:
78
+ """ Response adapter """
79
+ pass
80
+
81
+ def request(self):
82
+ """ Request adapter """
83
+ return self.data
84
+
85
+ def finalize(self):
86
+ """ Finalize adapter """
87
+ pass
88
+
89
+ # --------------------------------------------------------
90
+ # Define MongoAdapter component
91
+ # --------------------------------------------------------
92
+
93
+ class MongoAdapter(Adapter):
94
+ """ Mongo adapter class """
95
+
96
+ # Database
97
+ db = None
98
+ # Configuration
99
+ conf = None
100
+ # Client
101
+ client = None
102
+
103
+ def __init__(self, conf:dict) -> None:
104
+ """ Constructor
105
+ :param conf: Configuration
106
+ """
107
+ self.conf = conf
108
+ super().__init__()
109
+
110
+ def setup(self) -> None:
111
+ """ Set up adapter """
112
+ self.client = MongoClient()
113
+ self.db = self.client[self.conf['database']]
114
+
115
+ def response(self, response:str) -> None:
116
+ """ Response adapter """
117
+ pass
118
+
119
+ def request(self) -> None:
120
+ """ Request adapter """
121
+ pass
122
+
123
+ def finalize(self) -> None:
124
+ """ Finalize adapter """
125
+ pass
126
+
127
+ def get_all(self, collection:str) -> Cursor:
128
+ """ Get all objects from collection
129
+ :param collection: Collection
130
+ """
131
+ coll = self.db[collection]
132
+ return coll.find()
133
+
134
+ def get_object(self, collection:str, query:dict) -> any:
135
+ """ Get object from collection
136
+ :param collection: Collection
137
+ :param query: Query
138
+ """
139
+ coll = self.db[collection]
140
+ return coll.find_one(query)
141
+
142
+ def get_object_by_id(self, collection:str, id:str) -> any:
143
+ """ Get object from collection by ID
144
+ :param collection: Collection
145
+ :param id: ID
146
+ """
147
+ coll = self.db[collection]
148
+ return coll.find_one({"_id": id})
149
+
150
+ def insert_object(self, collection:str, dto:dict) -> None:
151
+ """ Insert object in collection
152
+ :param collection: Collection
153
+ :param dto: Data transfer object
154
+ """
155
+ coll = self.db[collection]
156
+ return coll.insert_one(dto).inserted_id
157
+
158
+ def update_object(self, collection:str, id:str, dto:dict) -> None:
159
+ """ Update object in collection
160
+ :param collection: Collection
161
+ :param id: ID
162
+ :param dto: Data transfer object
163
+ """
164
+ coll = self.db[collection]
165
+ return coll.replace_one({"_id": id}, dto, True)