neuronum 5.4.1__py3-none-any.whl → 5.4.2__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.
Potentially problematic release.
This version of neuronum might be problematic. Click here for more details.
- cli/main.py +0 -37
- {neuronum-5.4.1.dist-info → neuronum-5.4.2.dist-info}/METADATA +25 -15
- neuronum-5.4.2.dist-info/RECORD +10 -0
- {neuronum-5.4.1.dist-info → neuronum-5.4.2.dist-info}/top_level.txt +0 -1
- cellai/__init__.py +0 -0
- cellai/cellai.py +0 -118
- neuronum-5.4.1.dist-info/RECORD +0 -12
- {neuronum-5.4.1.dist-info → neuronum-5.4.2.dist-info}/WHEEL +0 -0
- {neuronum-5.4.1.dist-info → neuronum-5.4.2.dist-info}/entry_points.txt +0 -0
- {neuronum-5.4.1.dist-info → neuronum-5.4.2.dist-info}/licenses/LICENSE +0 -0
cli/main.py
CHANGED
|
@@ -872,42 +872,6 @@ async def async_delete_node():
|
|
|
872
872
|
click.echo(f"Neuronum Node '{nodeID}' deleted!")
|
|
873
873
|
|
|
874
874
|
|
|
875
|
-
@click.command()
|
|
876
|
-
def call_cellai():
|
|
877
|
-
try:
|
|
878
|
-
credentials_folder_path = Path.home() / ".neuronum"
|
|
879
|
-
env_path = credentials_folder_path / ".env"
|
|
880
|
-
|
|
881
|
-
env_data = {}
|
|
882
|
-
|
|
883
|
-
try:
|
|
884
|
-
with open(env_path, "r") as f:
|
|
885
|
-
for line in f:
|
|
886
|
-
key, value = line.strip().split("=")
|
|
887
|
-
env_data[key] = value
|
|
888
|
-
|
|
889
|
-
host = env_data.get("HOST", "")
|
|
890
|
-
password = env_data.get("PASSWORD", "")
|
|
891
|
-
network = env_data.get("NETWORK", "")
|
|
892
|
-
synapse = env_data.get("SYNAPSE", "")
|
|
893
|
-
except FileNotFoundError:
|
|
894
|
-
click.echo("No cell connected. Connect your cell with command neuronum connect-cell")
|
|
895
|
-
return
|
|
896
|
-
except Exception as e:
|
|
897
|
-
click.echo(f"Error reading .env file: {e}")
|
|
898
|
-
return
|
|
899
|
-
|
|
900
|
-
from cellai import cellai
|
|
901
|
-
asyncio.run(cellai.main(host, password, network, synapse))
|
|
902
|
-
|
|
903
|
-
except FileNotFoundError:
|
|
904
|
-
click.echo("Error: .env with credentials not found")
|
|
905
|
-
except ImportError:
|
|
906
|
-
click.echo("Cellai not found. Please check the necessary dependencies.")
|
|
907
|
-
except Exception as e:
|
|
908
|
-
click.echo(f"Unexpected error: {e}")
|
|
909
|
-
|
|
910
|
-
|
|
911
875
|
cli.add_command(create_cell)
|
|
912
876
|
cli.add_command(connect_cell)
|
|
913
877
|
cli.add_command(view_cell)
|
|
@@ -920,7 +884,6 @@ cli.add_command(connect_node)
|
|
|
920
884
|
cli.add_command(update_node)
|
|
921
885
|
cli.add_command(disconnect_node)
|
|
922
886
|
cli.add_command(delete_node)
|
|
923
|
-
cli.add_command(call_cellai)
|
|
924
887
|
|
|
925
888
|
|
|
926
889
|
if __name__ == "__main__":
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: neuronum
|
|
3
|
-
Version: 5.4.
|
|
3
|
+
Version: 5.4.2
|
|
4
4
|
Summary: Official client library to interact with the Neuronum Network
|
|
5
5
|
Home-page: https://neuronum.net
|
|
6
6
|
Author: Neuronum Cybernetics
|
|
@@ -18,7 +18,6 @@ Requires-Dist: click
|
|
|
18
18
|
Requires-Dist: questionary
|
|
19
19
|
Requires-Dist: python-dotenv
|
|
20
20
|
Requires-Dist: requests
|
|
21
|
-
Requires-Dist: rapidfuzz
|
|
22
21
|
Dynamic: author
|
|
23
22
|
Dynamic: author-email
|
|
24
23
|
Dynamic: classifier
|
|
@@ -70,12 +69,8 @@ Neuronum is a framework to build serverless connected app & data gateways automa
|
|
|
70
69
|
- Circuits (CTX): Store data in cloud-based key-value-label databases
|
|
71
70
|
- Streams (STX): Stream, synchronize, and control data in real time
|
|
72
71
|
|
|
73
|
-
**Cellai**
|
|
74
|
-
- Cellai is a CLI-based assistant that helps you interact with Neuronum
|
|
75
|
-
|
|
76
|
-
|
|
77
72
|
#### Requirements
|
|
78
|
-
- Python >= 3.
|
|
73
|
+
- Python >= 3.8 -> https://www.python.org/downloads/
|
|
79
74
|
- neuronum >= 5.4.0 -> https://pypi.org/project/neuronum/
|
|
80
75
|
|
|
81
76
|
|
|
@@ -127,18 +122,33 @@ Visit: https://github.com/neuronumcybernetics/neuronum/tree/main/how_tos/nodes
|
|
|
127
122
|
|
|
128
123
|
|
|
129
124
|
### **Interact with Neuronum**
|
|
130
|
-
Web-based
|
|
125
|
+
**Web-based**
|
|
131
126
|
1. Visit: https://neuronum.net
|
|
132
127
|
2. Connect your Cell
|
|
133
128
|
3. Explore Transmitters
|
|
134
129
|
4. Activate Transmitters
|
|
135
130
|
|
|
136
|
-
Code-based
|
|
131
|
+
**Code-based**
|
|
137
132
|
```python
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
133
|
+
import asyncio
|
|
134
|
+
import neuronum
|
|
135
|
+
|
|
136
|
+
cell = neuronum.Cell( # set Cell connection
|
|
137
|
+
host="host", # Cell host
|
|
138
|
+
password="password", # Cell password
|
|
139
|
+
network="neuronum.net", # Cell network -> neuronum.net
|
|
140
|
+
synapse="synapse" # Cell synapse
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
async def main():
|
|
144
|
+
|
|
145
|
+
TX = txID # select the Transmitter TX
|
|
146
|
+
data = {
|
|
147
|
+
"say": "hello",
|
|
148
|
+
}
|
|
149
|
+
tx_response = await cell.activate_tx(TX, data) # activate TX - > get response back
|
|
150
|
+
print(tx_response) # print Cell list
|
|
151
|
+
|
|
152
|
+
asyncio.run(main())
|
|
144
153
|
```
|
|
154
|
+
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
+
cli/main.py,sha256=v16Fmnv6z3lTv0rn5NUXAOIrYIHTdiLa9Pky71TsaIA,27217
|
|
3
|
+
neuronum/__init__.py,sha256=Drsm263_w3_VWgl1YsKLUr8WwVodqV3TSjqpxLjyq_M,46
|
|
4
|
+
neuronum/neuronum.py,sha256=gaQTvv8llmc36yBG8UwijCOoi6_uvifJyJ4z3KuiQqQ,17382
|
|
5
|
+
neuronum-5.4.2.dist-info/licenses/LICENSE,sha256=UiZjNHiCyRP6WoZfbYQh9cv4JW96wIofKXmzBJrYSUk,1125
|
|
6
|
+
neuronum-5.4.2.dist-info/METADATA,sha256=EIxdXRjiEcH9yGwYSWIuIV6aHKNDvoW09X9Q8Yjlm9A,4364
|
|
7
|
+
neuronum-5.4.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
8
|
+
neuronum-5.4.2.dist-info/entry_points.txt,sha256=XKYBcRNxGeJpZZkDPsa8HA_RaJ7Km_R_JaUq5T9Nk2U,42
|
|
9
|
+
neuronum-5.4.2.dist-info/top_level.txt,sha256=ru8Fr84cHm6oHr_DcJ8-uaq3RTiuCRFIr6AC8V0zPu4,13
|
|
10
|
+
neuronum-5.4.2.dist-info/RECORD,,
|
cellai/__init__.py
DELETED
|
File without changes
|
cellai/cellai.py
DELETED
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
import asyncio
|
|
2
|
-
from rapidfuzz import process
|
|
3
|
-
import neuronum
|
|
4
|
-
import datetime
|
|
5
|
-
from pathlib import Path
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
def log_interaction(user_input, output, log_path=Path("cellai.log")):
|
|
9
|
-
log_path = Path(log_path)
|
|
10
|
-
|
|
11
|
-
timestamp = datetime.datetime.now().isoformat()
|
|
12
|
-
with open(log_path, "a", encoding="utf-8") as log_file:
|
|
13
|
-
log_file.write(f"[{timestamp}]\n")
|
|
14
|
-
log_file.write(f"USER: {user_input}")
|
|
15
|
-
log_file.write(f"{output}\n\n")
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
async def main(host, password, network, synapse):
|
|
19
|
-
cell = neuronum.Cell(
|
|
20
|
-
host=host,
|
|
21
|
-
password=password,
|
|
22
|
-
network=network,
|
|
23
|
-
synapse=synapse
|
|
24
|
-
)
|
|
25
|
-
|
|
26
|
-
tx = await cell.list_tx()
|
|
27
|
-
nodes = await cell.list_nodes()
|
|
28
|
-
|
|
29
|
-
transmitters = tx
|
|
30
|
-
transmitters_by_id = {t["txID"]: t for t in transmitters}
|
|
31
|
-
|
|
32
|
-
info_to_gateway = []
|
|
33
|
-
for node in nodes:
|
|
34
|
-
for g in node["Node.md"]["gateways"]:
|
|
35
|
-
info_to_gateway.append({
|
|
36
|
-
"nodeID": node["nodeID"],
|
|
37
|
-
"gateway": g,
|
|
38
|
-
"info": g["info"],
|
|
39
|
-
"descr": node["descr"]
|
|
40
|
-
})
|
|
41
|
-
|
|
42
|
-
print("Cellai: Ready for your instruction!")
|
|
43
|
-
loop = asyncio.get_event_loop()
|
|
44
|
-
|
|
45
|
-
while True:
|
|
46
|
-
try:
|
|
47
|
-
user_input = await loop.run_in_executor(None, input, ">> ")
|
|
48
|
-
user_input = user_input.strip()
|
|
49
|
-
if user_input.lower() in {"exit", "quit"}:
|
|
50
|
-
log_interaction(user_input, "Session ended by user.")
|
|
51
|
-
break
|
|
52
|
-
|
|
53
|
-
match, score, idx = process.extractOne(user_input, [x["info"] for x in info_to_gateway])
|
|
54
|
-
best = info_to_gateway[idx]
|
|
55
|
-
|
|
56
|
-
output_log = (
|
|
57
|
-
f"\nMatched: {match} ({score:.1f}%)\n"
|
|
58
|
-
f"Node: {best['descr']} [{best['nodeID']}]\n"
|
|
59
|
-
f"Gateway: {best['gateway']['id']} ({best['gateway']['type']})"
|
|
60
|
-
)
|
|
61
|
-
print(output_log)
|
|
62
|
-
|
|
63
|
-
if best['gateway']['type'] == "transmitter":
|
|
64
|
-
tx_id = best['gateway']['id']
|
|
65
|
-
tx_data = transmitters_by_id.get(tx_id)
|
|
66
|
-
if tx_data:
|
|
67
|
-
print(f"Executing transmitter: {tx_data['descr']}")
|
|
68
|
-
|
|
69
|
-
dynamic_payload = {}
|
|
70
|
-
for key in tx_data["data"].keys():
|
|
71
|
-
prompt = f"Enter value for '{key}': "
|
|
72
|
-
value = await loop.run_in_executor(None, input, prompt)
|
|
73
|
-
dynamic_payload[key] = value
|
|
74
|
-
|
|
75
|
-
print(f"Payload: {dynamic_payload}")
|
|
76
|
-
TX = tx_id
|
|
77
|
-
tx_response = await cell.activate_tx(TX, dynamic_payload)
|
|
78
|
-
print(tx_response["json"])
|
|
79
|
-
output_log += f"\nTransmitter executed: {tx_data['descr']}\nPayload: {dynamic_payload}\nResponse: {tx_response['json']}"
|
|
80
|
-
else:
|
|
81
|
-
warning = "Transmitter not found."
|
|
82
|
-
print(warning)
|
|
83
|
-
output_log += f"{warning}"
|
|
84
|
-
|
|
85
|
-
elif best['gateway']['type'] == "stream":
|
|
86
|
-
STX = best['gateway']['id']
|
|
87
|
-
print(f"Starting stream sync for STX: {STX}")
|
|
88
|
-
async for operation in cell.sync(STX):
|
|
89
|
-
label = operation.get("label")
|
|
90
|
-
data = operation.get("data")
|
|
91
|
-
ts = operation.get("time")
|
|
92
|
-
stxID = operation.get("stxID")
|
|
93
|
-
operator = operation.get("operator")
|
|
94
|
-
line = f"[{ts}] {label} | Operator: {operator} | STX: {stxID}\nData: {data}"
|
|
95
|
-
print(line)
|
|
96
|
-
output_log += f"\n{line}"
|
|
97
|
-
elif best['gateway']['type'] == "circuit":
|
|
98
|
-
CTX = best['gateway']['id']
|
|
99
|
-
label = await loop.run_in_executor(None, input, "Enter label to load from circuit: ")
|
|
100
|
-
label = label.strip()
|
|
101
|
-
data = await cell.load(label, CTX)
|
|
102
|
-
print(data)
|
|
103
|
-
output_log += f"\nCircuit loaded from CTX: {CTX} with label '{label}'\nData: {data}"
|
|
104
|
-
else:
|
|
105
|
-
msg = "Unknown gateway type."
|
|
106
|
-
print(msg)
|
|
107
|
-
output_log += f"{msg}"
|
|
108
|
-
|
|
109
|
-
log_interaction(user_input, output_log)
|
|
110
|
-
|
|
111
|
-
except KeyboardInterrupt:
|
|
112
|
-
print("\nExiting.")
|
|
113
|
-
log_interaction("KeyboardInterrupt", "Session exited with Ctrl+C")
|
|
114
|
-
break
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
if __name__ == "__main__":
|
|
118
|
-
asyncio.run(main(host, password, network, synapse))
|
neuronum-5.4.1.dist-info/RECORD
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
cellai/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
-
cellai/cellai.py,sha256=LjJqF0dpk1Vjq-QLiGdzUi6IIDZwPcgvsn4Cjjp4JJ8,4559
|
|
3
|
-
cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
4
|
-
cli/main.py,sha256=wu0oggPk-VzONIzcyPKibyWhiT4kbI_6SZUsSrOkVYo,28479
|
|
5
|
-
neuronum/__init__.py,sha256=Drsm263_w3_VWgl1YsKLUr8WwVodqV3TSjqpxLjyq_M,46
|
|
6
|
-
neuronum/neuronum.py,sha256=gaQTvv8llmc36yBG8UwijCOoi6_uvifJyJ4z3KuiQqQ,17382
|
|
7
|
-
neuronum-5.4.1.dist-info/licenses/LICENSE,sha256=UiZjNHiCyRP6WoZfbYQh9cv4JW96wIofKXmzBJrYSUk,1125
|
|
8
|
-
neuronum-5.4.1.dist-info/METADATA,sha256=vidSOj_xGdoGX6SkrujUDMePL5YvX7w7ZK-tlDbmR54,3831
|
|
9
|
-
neuronum-5.4.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
10
|
-
neuronum-5.4.1.dist-info/entry_points.txt,sha256=XKYBcRNxGeJpZZkDPsa8HA_RaJ7Km_R_JaUq5T9Nk2U,42
|
|
11
|
-
neuronum-5.4.1.dist-info/top_level.txt,sha256=gqN5tyGnBKMPSzvWQONO4rpTf4gQPMi77O3KAKx88LQ,20
|
|
12
|
-
neuronum-5.4.1.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|