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.
- pbesa/__init__.py +4 -3
- pbesa/cognitive.py +475 -0
- pbesa/kernel/__init__.py +4 -6
- pbesa/kernel/adapter.py +165 -0
- pbesa/kernel/agent.py +558 -0
- pbesa/kernel/io/__init__.py +2 -2
- pbesa/kernel/io/system_file.py +38 -0
- pbesa/kernel/io/tcp_server.py +23 -0
- pbesa/kernel/util.py +217 -0
- pbesa/kernel/world.py +43 -0
- pbesa/mas.py +565 -0
- pbesa/remote/__init__.py +5 -0
- pbesa/remote/adm_listener.py +44 -0
- pbesa/{middleware/remote/AdmListenerHandler.py → remote/adm_listener_handler.py} +74 -57
- pbesa/remote/exceptions.py +18 -0
- pbesa/remote/remote_adm.py +42 -0
- pbesa/{middleware/remote/RemoteAdmHandler.py → remote/remote_adm_handler.py} +109 -83
- pbesa/social/__init__.py +4 -0
- pbesa/social/collaborative_team.py +299 -0
- pbesa/social/delegator.py +81 -0
- pbesa/social/delegator_team.py +334 -0
- pbesa/social/dialog.py +153 -0
- pbesa/social/dispatcher_team.py +319 -0
- pbesa/social/templates.py +18 -0
- pbesa/social/worker.py +188 -0
- {pbesa-2.1.dist-info → pbesa-4.0.0.dist-info}/LICENSE +21 -21
- {pbesa-2.1.dist-info → pbesa-4.0.0.dist-info}/LICENSE.txt +21 -21
- pbesa-4.0.0.dist-info/METADATA +8 -0
- pbesa-4.0.0.dist-info/RECORD +32 -0
- {pbesa-2.1.dist-info → pbesa-4.0.0.dist-info}/WHEEL +5 -5
- {pbesa-2.1.dist-info → pbesa-4.0.0.dist-info}/top_level.txt +0 -0
- pbesa/engine/__init__.py +0 -2
- pbesa/engine/bdi/BDIAg.py +0 -42
- pbesa/engine/bdi/BDILevel.py +0 -10
- pbesa/engine/bdi/BDIMachine.py +0 -116
- pbesa/engine/bdi/Goal.py +0 -28
- pbesa/engine/bdi/GoalExe.py +0 -36
- pbesa/engine/bdi/__init__.py +0 -5
- pbesa/engine/rational/ActionExe.py +0 -35
- pbesa/engine/rational/Brain.py +0 -10
- pbesa/engine/rational/RationalAg.py +0 -43
- pbesa/engine/rational/__init__.py +0 -3
- pbesa/kernel/adapter/Adapter.py +0 -26
- pbesa/kernel/adapter/FileAdapter.py +0 -23
- pbesa/kernel/adapter/__init__.py +0 -2
- pbesa/kernel/agent/Action.py +0 -19
- pbesa/kernel/agent/Agent.py +0 -91
- pbesa/kernel/agent/BehaviorExe.py +0 -33
- pbesa/kernel/agent/Channel.py +0 -10
- pbesa/kernel/agent/World.py +0 -15
- pbesa/kernel/agent/__init__.py +0 -5
- pbesa/kernel/io/SystemFile.py +0 -13
- pbesa/kernel/io/TCPServer.py +0 -4
- pbesa/kernel/system/Adm.py +0 -189
- pbesa/kernel/system/Directory.py +0 -36
- pbesa/kernel/system/__init__.py +0 -2
- pbesa/kernel/util/HashTable.py +0 -62
- pbesa/kernel/util/Queue.py +0 -231
- pbesa/kernel/util/__init__.py +0 -2
- pbesa/middleware/__init__.py +0 -3
- pbesa/middleware/adapter/GameAdapter.py +0 -64
- pbesa/middleware/adapter/MongoAdapter.py +0 -47
- pbesa/middleware/adapter/RESTAdapter.py +0 -52
- pbesa/middleware/adapter/SubProcessAdapter.py +0 -30
- pbesa/middleware/adapter/WSSAdapter.py +0 -89
- pbesa/middleware/adapter/WSSNJAdapter.py +0 -51
- pbesa/middleware/adapter/WSSNJHandler.py +0 -23
- pbesa/middleware/adapter/__init__.py +0 -7
- pbesa/middleware/remote/AdmListener.py +0 -17
- pbesa/middleware/remote/RemoteAdm.py +0 -17
- pbesa/middleware/remote/__init__.py +0 -4
- pbesa/middleware/web/WebAgTK.py +0 -15
- pbesa/middleware/web/__init__.py +0 -0
- pbesa-2.1.dist-info/METADATA +0 -25
- pbesa-2.1.dist-info/RECORD +0 -54
pbesa/__init__.py
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
-
from .
|
2
|
-
from .
|
3
|
-
from .
|
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
pbesa/kernel/adapter.py
ADDED
@@ -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)
|