naeural-client 2.0.1__py3-none-any.whl → 2.0.3__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.
naeural_client/_ver.py CHANGED
@@ -1,4 +1,4 @@
1
- __VER__ = "2.0.1"
1
+ __VER__ = "2.0.3"
2
2
 
3
3
  if __name__ == "__main__":
4
4
  with open("pyproject.toml", "rt") as fd:
@@ -23,7 +23,7 @@ from .transaction import Transaction
23
23
 
24
24
  class GenericSession(BaseDecentrAIObject):
25
25
  """
26
- A Session is a connection to a communication server which provides the channel to interact with nodes from the Naeural network.
26
+ A Session is a connection to a communication server which provides the channel to interact with nodes from the Naeural Edge Protocol network.
27
27
  A Session manages `Pipelines` and handles all messages received from the communication server.
28
28
  The Session handles all callbacks that are user-defined and passed as arguments in the API calls.
29
29
  """
@@ -74,7 +74,7 @@ class GenericSession(BaseDecentrAIObject):
74
74
  root_topic="naeural",
75
75
  **kwargs) -> None:
76
76
  """
77
- A Session is a connection to a communication server which provides the channel to interact with nodes from the Naeural network.
77
+ A Session is a connection to a communication server which provides the channel to interact with nodes from the Naeural Edge Protocol network.
78
78
  A Session manages `Pipelines` and handles all messages received from the communication server.
79
79
  The Session handles all callbacks that are user-defined and passed as arguments in the API calls.
80
80
 
@@ -91,8 +91,8 @@ class GenericSession(BaseDecentrAIObject):
91
91
  secured: bool, optional
92
92
  True if connection is secured, by default None
93
93
  name : str, optional
94
- The name of this connection, used to identify owned pipelines on a specific Naeural edge node.
95
- The name will be used as `INITIATOR_ID` and `SESSION_ID` when communicating with Naeural edge nodes, by default 'pySDK'
94
+ The name of this connection, used to identify owned pipelines on a specific Naeural Edge Protocol edge node.
95
+ The name will be used as `INITIATOR_ID` and `SESSION_ID` when communicating with Naeural Edge Protocol edge nodes, by default 'pySDK'
96
96
  config : dict, optional
97
97
  Configures the names of the channels this session will connect to.
98
98
  If using a Mqtt server, these channels are in fact topics.
@@ -102,7 +102,7 @@ class GenericSession(BaseDecentrAIObject):
102
102
  If set, process the messages that come only from the nodes from this list.
103
103
  Defaults to None
104
104
  show_commands : bool
105
- If True, will print the commands that are being sent to the Naeural edge nodes.
105
+ If True, will print the commands that are being sent to the Naeural Edge Protocol edge nodes.
106
106
  Defaults to False
107
107
  log : Logger, optional
108
108
  A logger object which implements basic logging functionality and some other utils stuff. Can be ignored for now.
@@ -335,7 +335,7 @@ class GenericSession(BaseDecentrAIObject):
335
335
  Parameters
336
336
  ----------
337
337
  node_addr : str
338
- The address of the Naeural edge node that sent the message.
338
+ The address of the Naeural Edge Protocol edge node that sent the message.
339
339
 
340
340
  Returns
341
341
  -------
@@ -351,7 +351,7 @@ class GenericSession(BaseDecentrAIObject):
351
351
  Parameters
352
352
  ----------
353
353
  node_addr : str
354
- The address of the Naeural edge node that sent the message.
354
+ The address of the Naeural Edge Protocol edge node that sent the message.
355
355
  """
356
356
  self._dct_node_last_seen_time[node_addr] = tm()
357
357
  self._dct_node_addr_name[node_addr] = node_id
@@ -364,7 +364,7 @@ class GenericSession(BaseDecentrAIObject):
364
364
  Parameters
365
365
  ----------
366
366
  node_addr : str
367
- The address of the Naeural edge node that sent the message.
367
+ The address of the Naeural Edge Protocol edge node that sent the message.
368
368
  dict_msg : dict
369
369
  The message received from the communication server.
370
370
  """
@@ -383,7 +383,7 @@ class GenericSession(BaseDecentrAIObject):
383
383
  dict_msg : dict
384
384
  The message received from the communication server
385
385
  msg_node_addr : str
386
- The address of the Naeural edge node that sent the message.
386
+ The address of the Naeural Edge Protocol edge node that sent the message.
387
387
  msg_pipeline : str
388
388
  The name of the pipeline that sent the message.
389
389
  msg_signature : str
@@ -449,7 +449,7 @@ class GenericSession(BaseDecentrAIObject):
449
449
  dict_msg : dict
450
450
  The message received from the communication server
451
451
  msg_node_addr : str
452
- The address of the Naeural edge node that sent the message.
452
+ The address of the Naeural Edge Protocol edge node that sent the message.
453
453
  msg_pipeline : str
454
454
  The name of the pipeline that sent the message.
455
455
  msg_signature : str
@@ -509,7 +509,7 @@ class GenericSession(BaseDecentrAIObject):
509
509
  dict_msg : dict
510
510
  The message received from the communication server
511
511
  msg_node_addr : str
512
- The address of the Naeural edge node that sent the message.
512
+ The address of the Naeural Edge Protocol edge node that sent the message.
513
513
  msg_pipeline : str
514
514
  The name of the pipeline that sent the message.
515
515
  msg_signature : str
@@ -538,7 +538,14 @@ class GenericSession(BaseDecentrAIObject):
538
538
  for transaction in open_transactions_copy:
539
539
  transaction.handle_payload(dict_msg)
540
540
  if self.custom_on_payload is not None:
541
- self.custom_on_payload(self, msg_node_addr, msg_pipeline, msg_signature, msg_instance, Payload(msg_data))
541
+ self.custom_on_payload(
542
+ self, # session
543
+ msg_node_addr, # node_addr
544
+ msg_pipeline, # pipeline
545
+ msg_signature, # plugin signature
546
+ msg_instance, # plugin instance name
547
+ Payload(msg_data) # the actual payload
548
+ )
542
549
 
543
550
  return
544
551
 
@@ -662,7 +669,7 @@ class GenericSession(BaseDecentrAIObject):
662
669
  Parameters
663
670
  ----------
664
671
  to : str
665
- The name of the Naeural edge node that will receive the payload.
672
+ The name of the Naeural Edge Protocol edge node that will receive the payload.
666
673
  payload : dict
667
674
  The payload to send.
668
675
  """
@@ -808,13 +815,14 @@ class GenericSession(BaseDecentrAIObject):
808
815
  os.getenv(ENVIRONMENT.AIXP_USER),
809
816
  os.getenv(ENVIRONMENT.EE_USERNAME),
810
817
  os.getenv(ENVIRONMENT.EE_USER),
818
+ os.getenv(ENVIRONMENT.EE_MQTT_USER),
811
819
  self._config.get(comm_ct.USER),
812
820
  ]
813
821
 
814
822
  user = next((x for x in possible_user_values if x is not None), None)
815
823
 
816
824
  if user is None:
817
- env_error = "Error: No user specified for Naeural network connection. Please make sure you have the correct credentials in the environment variables within the .env file or provide them as params in code (not recommended due to potential security issue)."
825
+ env_error = "Error: No user specified for Naeural Edge Protocol network connection. Please make sure you have the correct credentials in the environment variables within the .env file or provide them as params in code (not recommended due to potential security issue)."
818
826
  raise ValueError(env_error)
819
827
  if self._config.get(comm_ct.USER, None) is None:
820
828
  self._config[comm_ct.USER] = user
@@ -827,13 +835,14 @@ class GenericSession(BaseDecentrAIObject):
827
835
  os.getenv(ENVIRONMENT.EE_PASSWORD),
828
836
  os.getenv(ENVIRONMENT.EE_PASS),
829
837
  os.getenv(ENVIRONMENT.EE_PWD),
838
+ os.getenv(ENVIRONMENT.EE_MQTT),
830
839
  self._config.get(comm_ct.PASS),
831
840
  ]
832
841
 
833
842
  pwd = next((x for x in possible_password_values if x is not None), None)
834
843
 
835
844
  if pwd is None:
836
- raise ValueError("Error: No password specified for Naeural network connection")
845
+ raise ValueError("Error: No password specified for Naeural Edge Protocol network connection")
837
846
  if self._config.get(comm_ct.PASS, None) is None:
838
847
  self._config[comm_ct.PASS] = pwd
839
848
 
@@ -843,6 +852,7 @@ class GenericSession(BaseDecentrAIObject):
843
852
  os.getenv(ENVIRONMENT.AIXP_HOST),
844
853
  os.getenv(ENVIRONMENT.EE_HOSTNAME),
845
854
  os.getenv(ENVIRONMENT.EE_HOST),
855
+ os.getenv(ENVIRONMENT.EE_MQTT_HOST),
846
856
  self._config.get(comm_ct.HOST),
847
857
  "r9092118.ala.eu-central-1.emqxsl.com",
848
858
  ]
@@ -850,7 +860,7 @@ class GenericSession(BaseDecentrAIObject):
850
860
  host = next((x for x in possible_host_values if x is not None), None)
851
861
 
852
862
  if host is None:
853
- raise ValueError("Error: No host specified for Naeural network connection")
863
+ raise ValueError("Error: No host specified for Naeural Edge Protocol network connection")
854
864
  if self._config.get(comm_ct.HOST, None) is None:
855
865
  self._config[comm_ct.HOST] = host
856
866
 
@@ -858,6 +868,7 @@ class GenericSession(BaseDecentrAIObject):
858
868
  port,
859
869
  os.getenv(ENVIRONMENT.AIXP_PORT),
860
870
  os.getenv(ENVIRONMENT.EE_PORT),
871
+ os.getenv(ENVIRONMENT.EE_MQTT_PORT),
861
872
  self._config.get(comm_ct.PORT),
862
873
  8883,
863
874
  ]
@@ -865,7 +876,7 @@ class GenericSession(BaseDecentrAIObject):
865
876
  port = next((x for x in possible_port_values if x is not None), None)
866
877
 
867
878
  if port is None:
868
- raise ValueError("Error: No port specified for Naeural network connection")
879
+ raise ValueError("Error: No port specified for Naeural Edge Protocol network connection")
869
880
  if self._config.get(comm_ct.PORT, None) is None:
870
881
  self._config[comm_ct.PORT] = int(port)
871
882
 
@@ -920,7 +931,7 @@ class GenericSession(BaseDecentrAIObject):
920
931
  command : str
921
932
  The command to send.
922
933
  worker : str
923
- The name of the Naeural edge node that will receive the command.
934
+ The name of the Naeural Edge Protocol edge node that will receive the command.
924
935
  payload : dict
925
936
  The payload to send.
926
937
  show_command : bool, optional
@@ -1134,7 +1145,7 @@ class GenericSession(BaseDecentrAIObject):
1134
1145
  max_wait_time=0,
1135
1146
  **kwargs) -> Pipeline:
1136
1147
  """
1137
- Create a new pipeline on a node. A pipeline is the equivalent of the "config file" used by the Naeural edge node team internally.
1148
+ Create a new pipeline on a node. A pipeline is the equivalent of the "config file" used by the Naeural Edge Protocol edge node team internally.
1138
1149
 
1139
1150
  A `Pipeline` is a an object that encapsulates a one-to-many, data acquisition to data processing, flow of data.
1140
1151
 
@@ -1150,14 +1161,14 @@ class GenericSession(BaseDecentrAIObject):
1150
1161
 
1151
1162
  `Plugin` == `Signature`
1152
1163
 
1153
- This call can busy-wait for a number of seconds to listen to heartbeats, in order to check if an Naeural edge node is online or not.
1164
+ This call can busy-wait for a number of seconds to listen to heartbeats, in order to check if an Naeural Edge Protocol edge node is online or not.
1154
1165
  If the node does not appear online, a warning will be displayed at the stdout, telling the user that the message that handles the
1155
1166
  creation of the pipeline will be sent, but it is not guaranteed that the specific node will receive it.
1156
1167
 
1157
1168
  Parameters
1158
1169
  ----------
1159
1170
  node : str
1160
- Address or Name of the Naeural edge node that will handle this pipeline.
1171
+ Address or Name of the Naeural Edge Protocol edge node that will handle this pipeline.
1161
1172
  name : str
1162
1173
  Name of the pipeline. This is good to be kept unique, as it allows multiple parties to overwrite each others configurations.
1163
1174
  data_source : str, optional
@@ -1233,36 +1244,36 @@ class GenericSession(BaseDecentrAIObject):
1233
1244
 
1234
1245
  def get_active_nodes(self):
1235
1246
  """
1236
- Get the list of all Naeural edge nodes that sent a message since this session was created, and that are considered online
1247
+ Get the list of all Naeural Edge Protocol edge nodes that sent a message since this session was created, and that are considered online
1237
1248
 
1238
1249
  Returns
1239
1250
  -------
1240
1251
  list
1241
- List of names of all the Naeural edge nodes that are considered online
1252
+ List of names of all the Naeural Edge Protocol edge nodes that are considered online
1242
1253
 
1243
1254
  """
1244
1255
  return [k for k, v in self._dct_node_last_seen_time.items() if tm() - v < self.online_timeout]
1245
1256
 
1246
1257
  def get_allowed_nodes(self):
1247
1258
  """
1248
- Get the list of all active Naeural edge nodes to whom this session can send messages
1259
+ Get the list of all active Naeural Edge Protocol edge nodes to whom this session can send messages
1249
1260
 
1250
1261
  Returns
1251
1262
  -------
1252
1263
  list[str]
1253
- List of names of all the active Naeural edge nodes to whom this session can send messages
1264
+ List of names of all the active Naeural Edge Protocol edge nodes to whom this session can send messages
1254
1265
  """
1255
1266
  active_nodes = self.get_active_nodes()
1256
1267
  return [node for node in self._dct_can_send_to_node if self._dct_can_send_to_node[node] and node in active_nodes]
1257
1268
 
1258
1269
  def get_active_pipelines(self, node):
1259
1270
  """
1260
- Get a dictionary with all the pipelines that are active on this Naeural edge node
1271
+ Get a dictionary with all the pipelines that are active on this Naeural Edge Protocol edge node
1261
1272
 
1262
1273
  Parameters
1263
1274
  ----------
1264
1275
  node : str
1265
- Address or Name of the Naeural edge node
1276
+ Address or Name of the Naeural Edge Protocol edge node
1266
1277
 
1267
1278
  Returns
1268
1279
  -------
@@ -1302,7 +1313,7 @@ class GenericSession(BaseDecentrAIObject):
1302
1313
  on_notification=None,
1303
1314
  max_wait_time=0) -> Pipeline:
1304
1315
  """
1305
- Create a Pipeline object and attach to an existing pipeline on an Naeural edge node.
1316
+ Create a Pipeline object and attach to an existing pipeline on an Naeural Edge Protocol edge node.
1306
1317
  Useful when one wants to treat an existing pipeline as one of his own,
1307
1318
  or when one wants to attach callbacks to various events (on_data, on_notification).
1308
1319
 
@@ -1320,7 +1331,7 @@ class GenericSession(BaseDecentrAIObject):
1320
1331
 
1321
1332
  `Plugin` == `Signature`
1322
1333
 
1323
- This call can busy-wait for a number of seconds to listen to heartbeats, in order to check if an Naeural edge node is online or not.
1334
+ This call can busy-wait for a number of seconds to listen to heartbeats, in order to check if an Naeural Edge Protocol edge node is online or not.
1324
1335
  If the node does not appear online, a warning will be displayed at the stdout, telling the user that the message that handles the
1325
1336
  creation of the pipeline will be sent, but it is not guaranteed that the specific node will receive it.
1326
1337
 
@@ -1328,7 +1339,7 @@ class GenericSession(BaseDecentrAIObject):
1328
1339
  Parameters
1329
1340
  ----------
1330
1341
  node : str
1331
- Address or Name of the Naeural edge node that handles this pipeline.
1342
+ Address or Name of the Naeural Edge Protocol edge node that handles this pipeline.
1332
1343
  name : str
1333
1344
  Name of the existing pipeline.
1334
1345
  on_data : Callable[[Pipeline, str, str, dict], None], optional
@@ -1393,12 +1404,12 @@ class GenericSession(BaseDecentrAIObject):
1393
1404
  max_wait_time=0,
1394
1405
  **kwargs) -> Pipeline:
1395
1406
  """
1396
- Create a new pipeline on a node, or attach to an existing pipeline on an Naeural edge node.
1407
+ Create a new pipeline on a node, or attach to an existing pipeline on an Naeural Edge Protocol edge node.
1397
1408
 
1398
1409
  Parameters
1399
1410
  ----------
1400
1411
  node : str
1401
- Address or Name of the Naeural edge node that will handle this pipeline.
1412
+ Address or Name of the Naeural Edge Protocol edge node that will handle this pipeline.
1402
1413
  name : str
1403
1414
  Name of the pipeline. This is good to be kept unique, as it allows multiple parties to overwrite each others configurations.
1404
1415
  data_source : str
@@ -1552,7 +1563,7 @@ class GenericSession(BaseDecentrAIObject):
1552
1563
  Parameters
1553
1564
  ----------
1554
1565
  node : str
1555
- The address or name of the Naeural edge node.
1566
+ The address or name of the Naeural Edge Protocol edge node.
1556
1567
  timeout : int, optional
1557
1568
  The timeout, by default 15
1558
1569
 
@@ -1586,7 +1597,7 @@ class GenericSession(BaseDecentrAIObject):
1586
1597
  Parameters
1587
1598
  ----------
1588
1599
  node : str
1589
- The address or name of the Naeural edge node.
1600
+ The address or name of the Naeural Edge Protocol edge node.
1590
1601
 
1591
1602
  Returns
1592
1603
  -------
@@ -1640,7 +1651,9 @@ class GenericSession(BaseDecentrAIObject):
1640
1651
  *,
1641
1652
  node,
1642
1653
  name,
1643
- signature,
1654
+ signature="CUSTOM_CODE_FASTAPI_01",
1655
+ endpoints=None,
1656
+ use_ngrok=True,
1644
1657
  **kwargs
1645
1658
  ):
1646
1659
 
@@ -1652,8 +1665,16 @@ class GenericSession(BaseDecentrAIObject):
1652
1665
  instance = pipeline.create_plugin_instance(
1653
1666
  signature=signature,
1654
1667
  instance_id=self.log.get_unique_id(),
1668
+ use_ngrok=use_ngrok,
1655
1669
  **kwargs
1656
1670
  )
1671
+
1672
+ if endpoints is not None:
1673
+ for endpoint in endpoints:
1674
+ assert isinstance(endpoint, dict), "Each endpoint must be a dictionary defining the endpoint configuration."
1675
+ instance.add_new_endpoint(**endpoint)
1676
+ # end for
1677
+ # end if we have endpoints defined in the call
1657
1678
 
1658
1679
  return pipeline, instance
1659
1680
 
@@ -310,7 +310,7 @@ class Instance():
310
310
  def __register_transaction_for_instance_command(self, session_id: str = None, timeout: float = 0) -> list[Transaction]:
311
311
  """
312
312
  Register a new transaction for the instance command.
313
- This method is called before sending an instance command to the Naeural edge node.
313
+ This method is called before sending an instance command to the Naeural Edge Protocol edge node.
314
314
 
315
315
  Parameters
316
316
  ----------
@@ -441,7 +441,7 @@ class Instance():
441
441
  def send_instance_command(self, command, payload=None, command_params=None, wait_confirmation=True, session_id=None, timeout=10):
442
442
  """
443
443
  Send a command to the instance.
444
- This command can block until the command is confirmed by the Naeural edge node.
444
+ This command can block until the command is confirmed by the Naeural Edge Protocol edge node.
445
445
 
446
446
  Example:
447
447
  --------
@@ -8,7 +8,7 @@ import numpy as np
8
8
  class Payload(UserDict):
9
9
  """
10
10
  This class enriches the default python dict, providing
11
- helpful methods to process the payloads received from Naeural edge nodes.
11
+ helpful methods to process the payloads received from Naeural Edge Protocol edge nodes.
12
12
  """
13
13
 
14
14
  def get_images_as_np(self, key='IMG') -> list:
@@ -64,3 +64,16 @@ class Payload(UserDict):
64
64
  except ModuleNotFoundError:
65
65
  raise "This functionality requires the PIL library. To use this feature, please install it using 'pip install pillow'"
66
66
  return image
67
+
68
+
69
+ if __name__ == "__main__":
70
+ import json
71
+ payload = Payload()
72
+ payload.data = {
73
+ "IMG": "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAABKklEQVR42mNkAAwOyKg",
74
+ "TEST" : "TEST"
75
+ }
76
+
77
+ print(type(payload), payload)
78
+ print(type(payload.data), payload.data)
79
+ print(json.dumps(payload.data, indent=2))
@@ -54,7 +54,7 @@ class Pipeline(BaseCodeChecker):
54
54
  In the future, the documentation for the Logger base class will be available and developers will be able to use
55
55
  custom-made Loggers.
56
56
  node_addr : str
57
- Address of the Naeural edge node that will handle this pipeline.
57
+ Address of the Naeural Edge Protocol edge node that will handle this pipeline.
58
58
  name : str
59
59
  The name of this pipeline.
60
60
  data_source : str
@@ -91,7 +91,7 @@ class Pipeline(BaseCodeChecker):
91
91
  plugins = config.pop('PLUGINS', plugins)
92
92
 
93
93
  if is_attached:
94
- assert existing_config is not None, "When attaching to a pipeline, the existing configuration should be found in the heartbeat of the Naeural edge node."
94
+ assert existing_config is not None, "When attaching to a pipeline, the existing configuration should be found in the heartbeat of the Naeural Edge Protocol edge node."
95
95
  assert config == {}, "Cannot provide a configuration when attaching to a pipeline."
96
96
  assert len(kwargs) == 0, "Cannot provide a configuration when attaching to a pipeline."
97
97
  self.config = {k.upper(): v for k, v in existing_config.items()}
@@ -201,7 +201,7 @@ class Pipeline(BaseCodeChecker):
201
201
  def __register_transactions_for_update(self, session_id: str = None, timeout: float = 0) -> list[Transaction]:
202
202
  """
203
203
  Register transactions for updating the pipeline and instances configuration.
204
- This method is called before sending an update pipeline configuration command to the Naeural edge node.
204
+ This method is called before sending an update pipeline configuration command to the Naeural Edge Protocol edge node.
205
205
 
206
206
  Parameters
207
207
  ----------
@@ -261,7 +261,7 @@ class Pipeline(BaseCodeChecker):
261
261
  def __register_transactions_for_delete(self, session_id: str = None, timeout: float = 0) -> list[Transaction]:
262
262
  """
263
263
  Register transactions for deleting the pipeline.
264
- This method is called before sending a delete pipeline command to the Naeural edge node.
264
+ This method is called before sending a delete pipeline command to the Naeural Edge Protocol edge node.
265
265
 
266
266
  Parameters
267
267
  ----------
@@ -294,7 +294,7 @@ class Pipeline(BaseCodeChecker):
294
294
  def __register_transaction_for_pipeline_command(self, session_id: str = None, timeout: float = 0) -> list[Transaction]:
295
295
  """
296
296
  Register a transaction for a pipeline command.
297
- This method is called before sending a pipeline command to the Naeural edge node.
297
+ This method is called before sending a pipeline command to the Naeural Edge Protocol edge node.
298
298
 
299
299
  Parameters
300
300
  ----------
@@ -366,7 +366,7 @@ class Pipeline(BaseCodeChecker):
366
366
 
367
367
  def __send_update_config_to_box(self, session_id=None):
368
368
  """
369
- Send an update pipeline configuration command to the Naeural edge node.
369
+ Send an update pipeline configuration command to the Naeural Edge Protocol edge node.
370
370
  """
371
371
  self.session._send_command_update_pipeline_config(
372
372
  worker=self.node_addr,
@@ -668,7 +668,7 @@ class Pipeline(BaseCodeChecker):
668
668
  if True:
669
669
  def _on_data(self, signature, instance_id, data):
670
670
  """
671
- Handle the data received from the Naeural edge node. This method is called by the Session object when a message is received from the Naeural edge node.
671
+ Handle the data received from the Naeural Edge Protocol edge node. This method is called by the Session object when a message is received from the Naeural Edge Protocol edge node.
672
672
  This method will call all the `on_data` callbacks of the pipeline and the instance that received the message.
673
673
 
674
674
  Parameters
@@ -690,7 +690,7 @@ class Pipeline(BaseCodeChecker):
690
690
 
691
691
  def _on_notification(self, signature, instance_id, data):
692
692
  """
693
- Handle the notification received from the Naeural edge node. This method is called by the Session object when a notification is received from the Naeural edge node.
693
+ Handle the notification received from the Naeural Edge Protocol edge node. This method is called by the Session object when a notification is received from the Naeural Edge Protocol edge node.
694
694
 
695
695
  Parameters
696
696
  ----------
@@ -893,7 +893,7 @@ class Pipeline(BaseCodeChecker):
893
893
  The name of the instance. There can be multiple instances of the same plugin, mostly with different parameters
894
894
  custom_code : Callable[[CustomPluginTemplate], Any], optional
895
895
  A string containing the entire code, a path to a file containing the code as a string or a function with the code.
896
- This code will be executed remotely on an Naeural edge node. Defaults to None.
896
+ This code will be executed remotely on an Naeural Edge Protocol edge node. Defaults to None.
897
897
  config : dict, optional
898
898
  parameters used to customize the functionality. One can change the AI engine used for object detection,
899
899
  or finetune alerter parameters to better fit a camera located in a low light environment.
@@ -989,8 +989,8 @@ class Pipeline(BaseCodeChecker):
989
989
 
990
990
  def deploy(self, with_confirmation=True, wait_confirmation=True, timeout=10, verbose=False):
991
991
  """
992
- This method is used to deploy the pipeline on the Naeural edge node.
993
- Here we collect all the proposed configurations and send them to the Naeural edge node.
992
+ This method is used to deploy the pipeline on the Naeural Edge Protocol edge node.
993
+ Here we collect all the proposed configurations and send them to the Naeural Edge Protocol edge node.
994
994
  All proposed configs become staged configs.
995
995
  After all responses, apply the staged configs to finish the transaction.
996
996
  """
@@ -1050,7 +1050,7 @@ class Pipeline(BaseCodeChecker):
1050
1050
  ----------
1051
1051
  custom_code : Callable[[CustomPluginTemplate], Any], optional
1052
1052
  A string containing the entire code, a path to a file containing the code as a string or a function with the code.
1053
- This code will be executed remotely on an Naeural edge node. Defaults to None.
1053
+ This code will be executed remotely on an Naeural Edge Protocol edge node. Defaults to None.
1054
1054
  config : dict, optional
1055
1055
  parameters used to customize the functionality, by default {}
1056
1056
 
@@ -1281,8 +1281,8 @@ class Pipeline(BaseCodeChecker):
1281
1281
 
1282
1282
  def send_pipeline_command(self, command, payload=None, command_params=None, wait_confirmation=True, timeout=10) -> list[Transaction]:
1283
1283
  """
1284
- Send a pipeline command to the Naeural edge node.
1285
- This command can block until the command is confirmed by the Naeural edge node.
1284
+ Send a pipeline command to the Naeural Edge Protocol edge node.
1285
+ This command can block until the command is confirmed by the Naeural Edge Protocol edge node.
1286
1286
 
1287
1287
  Example:
1288
1288
  --------
@@ -1,3 +1,34 @@
1
+ """
2
+ CustomPluginTemplate
3
+ ====================
4
+
5
+ The `CustomPluginTemplate` class provides an interface to the on-edge `BasePluginExecutor`, facilitating the creation of custom plugins within the Neural Edge Protocol framework system.
6
+ It exposes all methods and properties defined on the target edge nodes, allowing developers to access any functionality needed for their custom plugins.
7
+ This interface supports code completion and documentation features, enhancing the development experience.
8
+
9
+ Note that code using this class will be executed in a dedicated thread on the edge node during the plugin execution cycle.
10
+
11
+ **Example Usage:**
12
+
13
+ ```python
14
+ def some_custom_code(plugin: CustomPluginTemplate):
15
+ plugin.P("Hello World") # Log a message on the edge node
16
+ obj = plugin.obj_cache.get('MyDict')
17
+ if obj is None:
18
+ obj = {
19
+ 'counter': 0,
20
+ 'some_data': 'some_value'
21
+ }
22
+ plugin.obj_cache['MyDict'] = obj
23
+
24
+ obj['counter'] += 1
25
+ plugin.P(f"Counter: {obj['counter']}") # Log the counter value
26
+ # Finally, send a payload from the edge node to the client
27
+ return obj
28
+ ```
29
+ """
30
+
31
+
1
32
  class CustomPluginTemplate:
2
33
  @property
3
34
  def BytesIO(self):
@@ -32,7 +32,7 @@ class BaseDecentrAIObject(object):
32
32
  if not create_logger:
33
33
  raise ValueError("Logger object is invalid: {}".format(log))
34
34
  else:
35
- log = Logger(DEBUG=DEBUG, base_folder='.', app_folder='_local_cache')
35
+ log = Logger("DEF", DEBUG=DEBUG, base_folder='.', app_folder='_local_cache')
36
36
  # endif
37
37
 
38
38
  self.log = log
@@ -9,7 +9,10 @@ import ctypes
9
9
  import threading
10
10
  import queue
11
11
 
12
- from .checker import ASTChecker, CheckerConstants
12
+ try:
13
+ from .checker import ASTChecker, CheckerConstants
14
+ except:
15
+ from naeural_client.code_cheker.checker import ASTChecker, CheckerConstants
13
16
 
14
17
  __VER__ = '0.6.1'
15
18
 
@@ -496,7 +499,7 @@ class BaseCodeChecker:
496
499
 
497
500
  def get_function_source_code(self, func):
498
501
  """
499
- Get the source code of a function and remove the indentation.
502
+ Get the source code of a function including the docstring and remove the indentation.
500
503
 
501
504
  Parameters
502
505
  ----------
@@ -518,3 +521,27 @@ class BaseCodeChecker:
518
521
  plain_code = '\n'.join([line.rstrip()[indent:] for line in plain_code])
519
522
 
520
523
  return plain_code
524
+
525
+
526
+ if __name__ == '__main__':
527
+
528
+ def some_function(x):
529
+ """
530
+ A simple function that adds 1 to the input.
531
+
532
+ Parameters
533
+ ----------
534
+ x : _type_
535
+ _description_
536
+
537
+ Returns
538
+ -------
539
+ _type_
540
+ _description_
541
+ """
542
+ return x + 1
543
+
544
+ checker = BaseCodeChecker()
545
+ source_code = checker.get_function_source_code(some_function)
546
+ print("some_function:\n" + source_code)
547
+
@@ -3,6 +3,7 @@ class ENVIRONMENT:
3
3
  AIXP_USER = 'AIXP_USER'
4
4
  EE_USERNAME = 'EE_USERNAME'
5
5
  EE_USER = 'EE_USER'
6
+ EE_MQTT_USER = 'EE_MQTT_USER'
6
7
 
7
8
  AIXP_PASSWORD = 'AIXP_PASSWORD'
8
9
  AIXP_PASS = 'AIXP_PASS'
@@ -10,14 +11,17 @@ class ENVIRONMENT:
10
11
  EE_PASSWORD = 'EE_PASSWORD'
11
12
  EE_PASS = 'EE_PASS'
12
13
  EE_PWD = 'EE_PWD'
14
+ EE_MQTT = 'EE_MQTT'
13
15
 
14
16
  AIXP_HOSTNAME = 'AIXP_HOSTNAME'
15
17
  AIXP_HOST = 'AIXP_HOST'
16
18
  EE_HOSTNAME = 'EE_HOSTNAME'
17
19
  EE_HOST = 'EE_HOST'
20
+ EE_MQTT_HOST = 'EE_MQTT_HOST'
18
21
 
19
22
  AIXP_PORT = 'AIXP_PORT'
20
23
  EE_PORT = 'EE_PORT'
24
+ EE_MQTT_PORT = 'EE_MQTT_PORT'
21
25
 
22
26
  AIXP_CERT_PATH = 'AIXP_CERT_PATH'
23
27
  EE_CERT_PATH = 'EE_CERT_PATH'
@@ -20,7 +20,54 @@ class CustomWebApp01(Instance):
20
20
 
21
21
  return name, args, base64_code
22
22
 
23
- def add_new_endpoint(self, function, method="get"):
23
+
24
+ def get_proposed_assets(self):
25
+ from copy import deepcopy
26
+ proposed_config = self._get_proposed_config_dictionary(full=True)
27
+ if "ASSETS" in proposed_config:
28
+ return deepcopy(proposed_config["ASSETS"])
29
+ return deepcopy(self.config.get("ASSETS", {}))
30
+
31
+
32
+ def get_proposed_jinja_args(self):
33
+ from copy import deepcopy
34
+ proposed_config = self._get_proposed_config_dictionary(full=True)
35
+ if "JINJA_ARGS" in proposed_config:
36
+ return deepcopy(proposed_config["JINJA_ARGS"])
37
+ return deepcopy(self.config.get("JINJA_ARGS", {}))
38
+
39
+
40
+ def add_new_endpoint(self, endpoint_type="default", **kwargs):
41
+ """
42
+ Add a new endpoint to a existing web app instance.
43
+
44
+ Parameters
45
+ ----------
46
+ endpoint_type : str, optional
47
+ The type of the endpoint. Can be "default", "file" or "html". The default is "default".
48
+
49
+ Raises
50
+ ------
51
+ ValueError
52
+ If the endpoint_type is invalid.
53
+ """
54
+ self.P("Attempting to add a new `{}` endpoint: {}".format(endpoint_type, kwargs))
55
+ if endpoint_type == "default":
56
+ self.add_new_function_endpoint(**kwargs)
57
+ elif endpoint_type == "file":
58
+ self.add_new_file_endpoint(**kwargs)
59
+ elif endpoint_type == "html":
60
+ self.add_new_html_endpoint(**kwargs)
61
+ else:
62
+ raise ValueError("Invalid endpoint type.")
63
+ return
64
+
65
+
66
+ def add_new_file_endpoint(self, str_code, file_name, endpoint_name):
67
+ raise NotImplementedError("This method is not implemented yet.")
68
+
69
+
70
+ def add_new_function_endpoint(self, function, method="get"):
24
71
  name, args, base64_code = self.get_endpoint_fields(function)
25
72
  dct_endpoint = {
26
73
  "NAME": name
@@ -40,23 +87,8 @@ class CustomWebApp01(Instance):
40
87
  dct_endpoint["ARGS"] = args
41
88
 
42
89
  self.update_instance_config(config={"ENDPOINTS": proposed_endpoints})
90
+ return
43
91
 
44
- def get_proposed_assets(self):
45
- from copy import deepcopy
46
- proposed_config = self._get_proposed_config_dictionary(full=True)
47
- if "ASSETS" in proposed_config:
48
- return deepcopy(proposed_config["ASSETS"])
49
- return deepcopy(self.config.get("ASSETS", {}))
50
-
51
- def get_proposed_jinja_args(self):
52
- from copy import deepcopy
53
- proposed_config = self._get_proposed_config_dictionary(full=True)
54
- if "JINJA_ARGS" in proposed_config:
55
- return deepcopy(proposed_config["JINJA_ARGS"])
56
- return deepcopy(self.config.get("JINJA_ARGS", {}))
57
-
58
- def add_new_file_endpoint(self, str_code, file_name, endpoint_name):
59
- raise NotImplementedError("This method is not implemented yet.")
60
92
 
61
93
  def add_new_html_endpoint(self, html_path, web_app_file_name, endpoint_route):
62
94
  str_code = None
@@ -116,3 +148,4 @@ class CustomWebApp01(Instance):
116
148
  dict_name_route_method["route"] = endpoint_route
117
149
 
118
150
  self.update_instance_config(config={"ASSETS": proposed_assets, "JINJA_ARGS": proposed_jinja_args})
151
+ return
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: naeural_client
3
- Version: 2.0.1
4
- Summary: `naeural_client` is the Python SDK required for client app development for the Naeural Edge Protocol framework
5
- Project-URL: Homepage, https://github.com/NaeuralEdgeProtocol/naeural_client
6
- Project-URL: Bug Tracker, https://github.com/NaeuralEdgeProtocol/naeural_client/issues
3
+ Version: 2.0.3
4
+ Summary: `naeural_client` is the Python SDK required for client app development for the Naeural Edge Protocol Edge Protocol framework
5
+ Project-URL: Homepage, https://github.com/Naeural Edge ProtocolEdgeProtocol/naeural_client
6
+ Project-URL: Bug Tracker, https://github.com/Naeural Edge ProtocolEdgeProtocol/naeural_client/issues
7
7
  Author-email: Stefan Saraev <saraevstefan@gmail.com>, Andrei Ionut Damian <andrei.damian@me.com>, Cristan Bleotiu <cristibleotiu@gmail.com>
8
8
  License-File: LICENSE
9
9
  Classifier: License :: OSI Approved :: MIT License
@@ -21,7 +21,7 @@ Description-Content-Type: text/markdown
21
21
 
22
22
  # naeural_client SDK
23
23
 
24
- This is the Python SDK package that allows interactions, development and deployment of jobs in Naeural network. The SDK enables low-code development and deployment of end-to-end AI (and not only) cooperative application pipelines within the Naeural Execution Engine processing nodes ecosystem. For further information please see [Naeural AI OS - Decentralized ubiquitous computing MLOps execution engine](https://arxiv.org/pdf/2306.08708).
24
+ This is the Python SDK package that allows interactions, development and deployment of jobs in Naeural Edge Protocol network. The SDK enables low-code development and deployment of end-to-end AI (and not only) cooperative application pipelines within the Naeural Edge Protocol Execution Engine processing nodes ecosystem. For further information please see [Naeural Edge Protocol AI OS - Decentralized ubiquitous computing MLOps execution engine](https://arxiv.org/pdf/2306.08708).
25
25
 
26
26
  ## Dependencies
27
27
 
@@ -337,9 +337,9 @@ For any inquiries related to the funding and its impact on this project, please
337
337
  ```bibtex
338
338
  @misc{naeural_client,
339
339
  author = {Stefan Saraev, Andrei Damian},
340
- title = {naeural_client: Python SDK for Naeural Edge Protocol},
340
+ title = {naeural_client: Python SDK for Naeural Edge Protocol Edge Protocol},
341
341
  year = {2024},
342
- howpublished = {\url{https://github.com/NaeuralEdgeProtocol/naeural_client}},
342
+ howpublished = {\url{https://github.com/Naeural Edge ProtocolEdgeProtocol/naeural_client}},
343
343
  }
344
344
  ```
345
345
 
@@ -348,7 +348,7 @@ For any inquiries related to the funding and its impact on this project, please
348
348
  author = {Damian, Bleotiu, Saraev, Constantinescu},
349
349
  title = {SOLIS – Sistem Omogen multi-Locație cu funcționalități Inteligente și Sustenabile”
350
350
  SMIS 143488},
351
- howpublished = {\url{https://github.com/NaeuralEdgeProtocol/}},
351
+ howpublished = {\url{https://github.com/Naeural Edge ProtocolEdgeProtocol/}},
352
352
  note = {This project includes open-source components developed with support from the Romanian Competitiveness Operational Programme under grants SMIS 143488. The content is solely the responsibility of the authors and does not necessarily reflect the views of the funding agencies.},
353
353
  year = {2021-2022}
354
354
  }
@@ -358,7 +358,7 @@ SMIS 143488},
358
358
  @misc{project_funding_acknowledgment2,
359
359
  author = {Damian, Bleotiu, Saraev, Constantinescu, Milik, Lupaescu},
360
360
  title = {ReDeN – Rețea Descentralizată Neurală SMIS 156084},
361
- howpublished = {\url{https://github.com/NaeuralEdgeProtocol/}},
361
+ howpublished = {\url{https://github.com/Naeural Edge ProtocolEdgeProtocol/}},
362
362
  note = {This project includes open-source components developed with support from the Romanian Competitiveness Operational Programme under grants SMIS 143488. The content is solely the responsibility of the authors and does not necessarily reflect the views of the funding agencies.},
363
363
  year = {2023-2024}
364
364
  }
@@ -1,17 +1,17 @@
1
1
  naeural_client/__init__.py,sha256=ZNoadMrxrd1EZqxni0zpoqjFIBrS8Jg-vfZrr7xwe9I,498
2
- naeural_client/_ver.py,sha256=fIub_Shqx2sNADxzGW-jCCOKc15lrptdhn9y12jgzfM,330
3
- naeural_client/base_decentra_object.py,sha256=TBBnShUybWhjcbEIT8_27FGzxcQUVh23jm-HlaD9Qbw,4173
2
+ naeural_client/_ver.py,sha256=22NfIkgjJksCD3HVuCZFvbFPyAMVCrB4W2uIX0hfSRw,330
3
+ naeural_client/base_decentra_object.py,sha256=qDBpitcyhr1eEXPD8cGFtcNPNf71fqNRsmOEcCpx4sM,4180
4
4
  naeural_client/plugins_manager_mixin.py,sha256=X1JdGLDz0gN1rPnTN_5mJXR8JmqoBFQISJXmPR9yvCo,11106
5
5
  naeural_client/base/__init__.py,sha256=hACh83_cIv7-PwYMM3bQm2IBmNqiHw-3PAfDfAEKz9A,259
6
6
  naeural_client/base/distributed_custom_code_presets.py,sha256=cvz5R88P6Z5V61Ce1vHVVh8bOkgXd6gve_vdESDNAsg,2544
7
- naeural_client/base/generic_session.py,sha256=Dop4vI8mjB30OUFuMZ3gEDwvzDOXGqCrWsENtS-PRnI,65979
8
- naeural_client/base/instance.py,sha256=pZSYC_WQNa5YqU2cVN9vbDyCg8ums8EQCd5Cx95a_VQ,19942
9
- naeural_client/base/pipeline.py,sha256=21V9SN1v86iMm80jOikZIkooyBF9FMs_3_0Q9-Qp4sc,57288
10
- naeural_client/base/plugin_template.py,sha256=CzIMJIh36pDAtUIddlAPJ9OmHbmcFmph_F00rEKUp_0,136987
7
+ naeural_client/base/generic_session.py,sha256=QEuXQVB3bCPk4CfrFVOwUHER1S6RzxH332GNgXvV3J4,67207
8
+ naeural_client/base/instance.py,sha256=m6IKOWuT5GsZVSdFNdcR-ImJTpTdHqNoMe8KQlEK3Gc,19970
9
+ naeural_client/base/pipeline.py,sha256=fWwSNUvvrVvJYzxRBCKTt1f9_pci1hCBiG2LtoyOpMU,57512
10
+ naeural_client/base/plugin_template.py,sha256=qGaXByd_JZFpjvH9GXNbT7KaitRxIJB6-1IhbKrZjq4,138123
11
11
  naeural_client/base/responses.py,sha256=ZKBZmRhYDv8M8mQ5C_ahGsQvtWH4b9ImRcuerQdZmNw,6937
12
12
  naeural_client/base/transaction.py,sha256=bfs6td5M0fINgPQNxhrl_AUjb1YiilLDQ-Cd_o3OR_E,5146
13
13
  naeural_client/base/payload/__init__.py,sha256=y8fBI8tG2ObNfaXFWjyWZXwu878FRYj_I8GIbHT4GKE,29
14
- naeural_client/base/payload/payload.py,sha256=wejtDRg-hZZAzJD4Ud-AEW67gEbs1kNriimul95lyj4,1951
14
+ naeural_client/base/payload/payload.py,sha256=v50D7mBBD2WwWzvpbRGMSr-X6vv5ie21IY1aDxTqe1c,2275
15
15
  naeural_client/bc/__init__.py,sha256=FQj23D1PrY06NUOARiKQi4cdj0-VxnoYgYDEht8lpr8,158
16
16
  naeural_client/bc/base.py,sha256=QK6QdONTpT9N--H7CHk8pwRxwJUGK4nvhNTfKxQeztQ,28328
17
17
  naeural_client/bc/chain.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -19,7 +19,7 @@ naeural_client/bc/ec.py,sha256=8ryEvc3__lVXSoYxd1WoTy9c8uC5Q_8R1uME7CeloIg,8578
19
19
  naeural_client/certs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
20
  naeural_client/certs/r9092118.ala.eu-central-1.emqxsl.com.crt,sha256=y-6io0tseyx9-a4Pmde1z1gPULtJNSYUpG_YFkYaMKU,1337
21
21
  naeural_client/code_cheker/__init__.py,sha256=pwkdeZGVL16ZA4Qf2mRahEhoOvKhL7FyuQbMFLr1E5M,33
22
- naeural_client/code_cheker/base.py,sha256=cJzQD_Y-Z7lkiiQY65oJQAVABOmYez7TZB8xYSiuRl8,16669
22
+ naeural_client/code_cheker/base.py,sha256=WIHP8LICypTBt7HR0FeC1KtIQ-PASTPaeFmCKvT5vuU,17190
23
23
  naeural_client/code_cheker/checker.py,sha256=QWupeM7ToancVIq1tRUxRNUrI8B5l5eoY0kDU4-O5aE,7365
24
24
  naeural_client/comm/__init__.py,sha256=za3B2HUKNXzYtjElMgGM9xbxNsdQfFY4JB_YzdyFkVU,76
25
25
  naeural_client/comm/amqp_wrapper.py,sha256=hzj6ih07DnLQy2VSfA88giDIFHaCp9uSdGLTA-IFE4s,8535
@@ -28,7 +28,7 @@ naeural_client/const/README.md,sha256=6OHesr-f5NBuuJGryEoi_TCu2XdlhfQYlDKx_IJoXe
28
28
  naeural_client/const/__init__.py,sha256=nm0maDn_l44UQkJy4XLHnOcpHMypkVvYYDFkezi6_rk,380
29
29
  naeural_client/const/base.py,sha256=V94oaT7xYrrTGxmLJlynxmbFujVX0G9wIfC8TilH5MU,2548
30
30
  naeural_client/const/comms.py,sha256=La6JXWHexH8CfcBCKyT4fCIoeaoZlcm7KtZ57ab4ZgU,2201
31
- naeural_client/const/environment.py,sha256=RygVb5l6oCYTt45Mupw0Gi44NbhpsnIpiiVu5TpCijg,580
31
+ naeural_client/const/environment.py,sha256=Aj_AyelP_Y97CgEM6pvIv2T9TLbe7sT2mrkg6OtGShg,698
32
32
  naeural_client/const/formatter.py,sha256=AW3bWlqf39uaqV4BBUuW95qKYfF2OkkU4f9hy3kSVhM,200
33
33
  naeural_client/const/heartbeat.py,sha256=jGHmKfeHTFOXJaKUT3o_ocnQyF-EpcLeunW-ifkYKfU,2534
34
34
  naeural_client/const/misc.py,sha256=1ypROmZsOyp_8zG2LARwPeo-YfXuyYqZnml0elTP4kw,211
@@ -36,7 +36,7 @@ naeural_client/const/payload.py,sha256=k24vH9iJIBBPnCXx7HAEuli2fNAETK7h8ZuVKyKLg
36
36
  naeural_client/default/__init__.py,sha256=ozU6CMMuWl0LhG8Ae3LrZ65a6tLrptfscVYGf83zjxM,46
37
37
  naeural_client/default/instance/__init__.py,sha256=k1YZhbhLh7-Q7avnvwuQ2Ij-BhGbTlgwiWsOj9cS9xU,205
38
38
  naeural_client/default/instance/chain_dist_custom_job_01_plugin.py,sha256=-YO26dH3774wkMbj0Z0GACpVeVYblkxV4KhidtPEqcI,1891
39
- naeural_client/default/instance/custom_web_app_01_plugin.py,sha256=gjckmyp0yoN24ouxelgc2Eb2p7YxrrAoSRQpshPZFDY,3991
39
+ naeural_client/default/instance/custom_web_app_01_plugin.py,sha256=9swEcfEzpL_P29WDkP9kTZ8oHNS0s9TXwd5BfIGiDZI,4805
40
40
  naeural_client/default/instance/net_mon_01_plugin.py,sha256=1k1Ul6pKyhSfAYbcfj38t404Z3KyMVvfhlMJdzIgV-c,1154
41
41
  naeural_client/default/instance/view_scene_01_plugin.py,sha256=bQtkQKrZRvzenlH3JYVvBXe2Tow5qdKYlmuvjpBLYn4,666
42
42
  naeural_client/default/session/mqtt_session.py,sha256=dpQcBhhVZDo458v0IqJMZb1CsTn-TxXhYjNlyJp9Rp8,2414
@@ -72,7 +72,7 @@ naeural_client/logging/tzlocal/windows_tz.py,sha256=Sv9okktjZJfRGGUOOppsvQuX_eXy
72
72
  naeural_client/utils/__init__.py,sha256=mAnke3-MeRzz3nhQvhuHqLnpaaCSmDxicd7Ck9uwpmI,77
73
73
  naeural_client/utils/comm_utils.py,sha256=4cS9llRr_pK_3rNgDcRMCQwYPO0kcNU7AdWy_LtMyCY,1072
74
74
  naeural_client/utils/dotenv.py,sha256=_AgSo35n7EnQv5yDyu7C7i0kHragLJoCGydHjvOkrYY,2008
75
- naeural_client-2.0.1.dist-info/METADATA,sha256=zmbnuRiXoI-A0Xhuy_Xqiyw9z9tjyJ3Qf5NY9B7oiHw,14339
76
- naeural_client-2.0.1.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
77
- naeural_client-2.0.1.dist-info/licenses/LICENSE,sha256=7P07j9ez3_ovbZ8L_ZJuPXVOgqTS19-ECkezwOtFqOI,11340
78
- naeural_client-2.0.1.dist-info/RECORD,,
75
+ naeural_client-2.0.3.dist-info/METADATA,sha256=5ONsD3fdCiVEh4Z3_h8bOkcbwz0RqBwCi0gP6YKzU5M,14479
76
+ naeural_client-2.0.3.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
77
+ naeural_client-2.0.3.dist-info/licenses/LICENSE,sha256=cvOsJVslde4oIaTCadabXnPqZmzcBO2f2zwXZRmJEbE,11311
78
+ naeural_client-2.0.3.dist-info/RECORD,,
@@ -186,7 +186,6 @@
186
186
  same "printed page" as the copyright notice for easier
187
187
  identification within third-party archives.
188
188
 
189
- Copyright 2024 Naeural.AI
190
189
 
191
190
  Licensed under the Apache License, Version 2.0 (the "License");
192
191
  you may not use this file except in compliance with the License.