kalavai-client 0.6.0__py3-none-any.whl → 0.6.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.
@@ -1,2 +1,2 @@
1
1
 
2
- __version__ = "0.6.0"
2
+ __version__ = "0.6.2"
@@ -2,7 +2,6 @@ services:
2
2
  kalavai_gui:
3
3
  container_name: kalavai_gui
4
4
  image: bundenth/kalavai-gui:latest
5
- #network_mode: host
6
5
  extra_hosts:
7
6
  - "host.docker.internal:host-gateway"
8
7
  networks:
@@ -3,38 +3,58 @@ services:
3
3
  {{vpn_name}}:
4
4
  image: gravitl/netclient:v0.90.0
5
5
  container_name: {{vpn_name}}
6
- #privileged: true
7
6
  cap_add:
8
7
  - NET_ADMIN
9
8
  - SYS_MODULE
10
9
  network_mode: host
11
- # networks:
12
- # - custom-network
13
- # ports:
14
- # # https://docs.k3s.io/installation/requirements#inbound-rules-for-k3s-nodes
15
- # - "6443:6443" # kube server
16
- # - "10250:10250" # worker balancer
17
- # - "8472:8472/udp" # flannel vxlan
18
- # - "51820-51830:51820-51830" # flannel wireguard
19
- # {% if command == "server" %}
20
- # - "30000-30500:30000-30500"
21
- # {% endif %}
22
10
  environment:
23
11
  - HOST_NAME={{node_name}}
24
- - IFACE_NAME={{flannel_iface}}
25
12
  - TOKEN={{vpn_token}}
26
13
  volumes:
27
14
  - /dev/net/tun:/dev/net/tun
28
15
  restart: unless-stopped
29
- # nginx:
30
- # image: nginx:latest
31
- # ports:
32
- # - "{{redirect_source_port}}:{{redirect_source_port}}"
33
- # restart: unless-stopped
34
- # networks:
35
- # - custom-network
36
- # volumes:
37
- # - {{nginx_path}}/nginx.conf:/etc/nginx/nginx.conf
16
+ {% endif %}
17
+ {% if backend %}
18
+ backend:
19
+ image: docker.io/bundenth/kalavai-backend:latest
20
+ container_name: backend
21
+ networks:
22
+ - kalavai-net
23
+ ports:
24
+ - "{{bridge_port | default(8001)}}:{{bridge_port | default(8001)}}"
25
+ command: >
26
+ backend
27
+ start
28
+ --bridge-port {{bridge_port | default(8001)}}
29
+ environment:
30
+ - KALAVAI_PATH=/root/.cache/kalavai
31
+ volumes:
32
+ - "{{user_path}}:/root/.cache/kalavai"
33
+ restart: unless-stopped
34
+ {% endif %}
35
+ {% if frontend %}
36
+ frontend:
37
+ container_name: frontend
38
+ image: bundenth/kalavai-gui:latest
39
+ networks:
40
+ - kalavai-net
41
+ environment:
42
+ - KALAVAI_BRIDGE_URL=http://backend
43
+ - KALAVAI_BRIDGE_PORT={{bridge_port | default(8001)}}
44
+ {% if protected_access %}
45
+ - ACCESS_KEY={{protected_access}}
46
+ {% endif %}
47
+ entrypoint: ["reflex"]
48
+ command: >
49
+ run
50
+ --backend-port {{gui_backend_port | default(8002)}}
51
+ --frontend-port {{gui_frontend_port | default(3000)}}
52
+ ports:
53
+ - "{{gui_backend_port | default(8002)}}:{{gui_backend_port | default(8002)}}"
54
+ - "{{gui_frontend_port | default(3000)}}:{{gui_frontend_port | default(3000)}}"
55
+ volumes:
56
+ - "{{user_path}}:/root/.cache/kalavai"
57
+ restart: unless-stopped
38
58
  {% endif %}
39
59
 
40
60
  # run worker only if command is set
@@ -48,21 +68,6 @@ services:
48
68
  network_mode: "service:{{vpn_name}}"
49
69
  {% else %}
50
70
  network_mode: host
51
- # hostname: {{node_name}}
52
- # networks:
53
- # - custom-network
54
- # ports:
55
- # - "6443:6443" # kube server
56
- # - "2379-2380:2379-2380" # etcd server
57
- # - "10259:10259" # kube scheduler
58
- # - "10257:10257" # kube controller manager
59
- # - "10250:10250" # worker balancer
60
- # - "8285:8285" # flannel
61
- # - "8472:8472" # flannel vxlan
62
- # - "51820:51820" # flannel wireguard
63
- # {% if command == "server" %}
64
- # - "30000-32767:30000-32767"
65
- # {% endif %}
66
71
  {% endif %}
67
72
  privileged: true
68
73
  restart: unless-stopped
@@ -103,7 +108,6 @@ services:
103
108
  {% endif %}
104
109
  {% endif %}
105
110
 
106
- # networks:
107
- # custom-network:
108
- # driver: bridge
109
-
111
+ networks:
112
+ kalavai-net:
113
+ driver: bridge
@@ -75,7 +75,8 @@ def pool_create(request: CreatePoolRequest, api_key: str = Depends(verify_api_ke
75
75
  only_registered_users=request.only_registered_users,
76
76
  location=request.location,
77
77
  description=request.description,
78
- token_mode=request.token_mode
78
+ token_mode=request.token_mode,
79
+ frontend=request.frontend
79
80
  )
80
81
  return result
81
82
 
@@ -85,7 +86,8 @@ def pool_join(request: JoinPoolRequest, api_key: str = Depends(verify_api_key)):
85
86
  token=request.token,
86
87
  num_gpus=request.num_gpus,
87
88
  node_name=request.node_name,
88
- ip_address=request.ip_address
89
+ ip_address=request.ip_address,
90
+ frontend=request.frontend
89
91
  )
90
92
  return result
91
93
 
@@ -93,7 +95,8 @@ def pool_join(request: JoinPoolRequest, api_key: str = Depends(verify_api_key)):
93
95
  def pool_attach(request: JoinPoolRequest, api_key: str = Depends(verify_api_key)):
94
96
  result = attach_to_pool(
95
97
  token=request.token,
96
- node_name=request.node_name
98
+ node_name=request.node_name,
99
+ frontend=request.frontend
97
100
  )
98
101
  return result
99
102
 
@@ -16,6 +16,7 @@ class CreatePoolRequest(BaseModel):
16
16
  location: str = None
17
17
  token_mode: TokenType = TokenType.USER
18
18
  description: str = ""
19
+ frontend: bool = False
19
20
 
20
21
  class NodesActionRequest(BaseModel):
21
22
  nodes: list[str]
@@ -25,7 +26,7 @@ class JoinPoolRequest(BaseModel):
25
26
  ip_address: str = None
26
27
  node_name: str = None
27
28
  num_gpus: int = None
28
-
29
+ frontend: bool = False
29
30
  class JobDetailsRequest(BaseModel):
30
31
  jobs: list[Job]
31
32
 
kalavai_client/cli.py CHANGED
@@ -6,13 +6,10 @@ import uuid
6
6
  import time
7
7
  import socket
8
8
  from pathlib import Path
9
- from getpass import getpass
10
- from sys import exit
11
9
 
12
10
  import yaml
13
11
 
14
12
  import arguably
15
- from kalavai_client.auth import KalavaiAuth
16
13
  from rich.console import Console
17
14
 
18
15
  from kalavai_client.cluster import CLUSTER
@@ -208,7 +205,6 @@ def input_gpus(non_interactive=False):
208
205
  @arguably.command
209
206
  def gui__start(
210
207
  *others,
211
- backend_only=False,
212
208
  gui_frontend_port=3000,
213
209
  gui_backend_port=8000,
214
210
  bridge_port=8001,
@@ -227,32 +223,36 @@ def gui__start(
227
223
  console.log("[red]Error: user key not found (required for protected access)")
228
224
  return
229
225
 
230
- if not backend_only:
231
- values = {
232
- "gui_frontend_port": gui_frontend_port,
233
- "gui_backend_port": gui_backend_port,
234
- "bridge_port": bridge_port,
235
- "path": user_path(""),
236
- "protected_access": user_key
237
- }
238
- compose_yaml = load_template(
239
- template_path=DOCKER_COMPOSE_GUI,
240
- values=values)
241
- with open(USER_GUI_COMPOSE_FILE, "w") as f:
242
- f.write(compose_yaml)
243
-
244
- run_cmd(f"docker compose --file {USER_GUI_COMPOSE_FILE} up -d")
226
+ values = {
227
+ "gui_frontend_port": gui_frontend_port,
228
+ "gui_backend_port": gui_backend_port,
229
+ "bridge_port": bridge_port,
230
+ "path": user_path("", create_path=True),
231
+ "protected_access": user_key
232
+ }
233
+ compose_yaml = load_template(
234
+ template_path=DOCKER_COMPOSE_GUI,
235
+ values=values)
236
+ with open(USER_GUI_COMPOSE_FILE, "w") as f:
237
+ f.write(compose_yaml)
238
+
239
+ run_cmd(f"docker compose --file {USER_GUI_COMPOSE_FILE} up -d")
245
240
 
246
- console.log(f"[green]Loading GUI, may take a few minutes. It will be available at http://localhost:{gui_frontend_port}")
241
+ console.log(f"[green]Loading GUI, may take a few minutes. It will be available at http://localhost:{gui_frontend_port}")
247
242
  print(
248
243
  "Deploying bridge API"
249
244
  )
250
245
  run_api(port=bridge_port, log_level=log_level)
251
-
252
- if not backend_only:
253
- run_cmd(f"docker compose --file {USER_GUI_COMPOSE_FILE} down")
246
+ run_cmd(f"docker compose --file {USER_GUI_COMPOSE_FILE} down")
254
247
  console.log("[green]Kalavai GUI has been stopped")
255
248
 
249
+ @arguably.command
250
+ def backend__start(*others, bridge_port=8001, log_level="critical"):
251
+ """
252
+ Start the Kalavai backend
253
+ """
254
+ run_api(port=bridge_port, log_level=log_level)
255
+ console.log("[green]Kalavai backend has been stopped")
256
256
 
257
257
  @arguably.command
258
258
  def auth(user_key, *others):
kalavai_client/core.py CHANGED
@@ -573,7 +573,9 @@ def attach_to_pool(token, node_name=None):
573
573
  generate_compose_config(
574
574
  role="",
575
575
  vpn_token=public_location,
576
- node_name=node_name)
576
+ node_name=node_name,
577
+ backend=True,
578
+ frontend=True)
577
579
 
578
580
  store_server_info(
579
581
  server_ip=kalavai_seed_ip,
@@ -637,7 +639,9 @@ def generate_worker_package(num_gpus=0, node_name=None, ip_address="0.0.0.0", st
637
639
  num_gpus=num_gpus,
638
640
  vpn_token=public_location,
639
641
  node_name=node_name,
640
- node_labels=node_labels)
642
+ node_labels=node_labels,
643
+ backend=False,
644
+ frontend=False)
641
645
 
642
646
  return compose
643
647
 
@@ -684,7 +688,9 @@ def join_pool(token, num_gpus=None, node_name=None, ip_address=None):
684
688
  num_gpus=num_gpus,
685
689
  vpn_token=public_location,
686
690
  node_name=node_name,
687
- node_labels=node_labels)
691
+ node_labels=node_labels,
692
+ backend=True,
693
+ frontend=True)
688
694
 
689
695
  store_server_info(
690
696
  server_ip=kalavai_seed_ip,
@@ -770,7 +776,10 @@ def create_pool(
770
776
  node_ip_address=ip_address,
771
777
  num_gpus=num_gpus,
772
778
  node_name=node_name,
773
- node_labels=node_labels
779
+ node_labels=node_labels,
780
+ backend=True,
781
+ frontend=True,
782
+ user_id=user_id
774
783
  )
775
784
 
776
785
  # start server
@@ -789,7 +798,6 @@ def create_pool(
789
798
  auth_key = user_id if user_id is not None else str(uuid.uuid4())
790
799
  write_auth_key = str(uuid.uuid4())
791
800
  readonly_auth_key = str(uuid.uuid4())
792
-
793
801
  watcher_service = f"{ip_address}:{DEFAULT_WATCHER_PORT}"
794
802
  values = {
795
803
  CLUSTER_NAME_KEY: cluster_name,
kalavai_client/env.py CHANGED
@@ -3,10 +3,15 @@ from pathlib import Path
3
3
  import importlib.resources
4
4
 
5
5
 
6
+ DEFAULT_KALAVAI_PATH = os.getenv("KALAVAI_PATH", "")
7
+
6
8
  def user_path(relative_path, create_path=False):
7
9
  """Transform a relative path into the user's cache folder path"""
8
- base = os.path.expanduser("~")
9
- kalavai_user_path = os.path.join(base, ".cache/kalavai")
10
+ if len(DEFAULT_KALAVAI_PATH.strip()) > 0:
11
+ kalavai_user_path = DEFAULT_KALAVAI_PATH
12
+ else:
13
+ base = os.path.expanduser("~")
14
+ kalavai_user_path = os.path.join(base, ".cache/kalavai")
10
15
  full_path = os.path.join(kalavai_user_path, relative_path)
11
16
  if create_path:
12
17
  Path(full_path).mkdir(parents=True, exist_ok=True)
@@ -34,7 +39,7 @@ KALAVAI_PLATFORM_ENDPOINT = "https://platform.kalavai.net/_/api"
34
39
  DEFAULT_CONTAINER_NAME = "kalavai"
35
40
  DEFAULT_VPN_CONTAINER_NAME = "kalavai-vpn"
36
41
  CONTAINER_HOST_PATH = user_path("pool/", create_path=True)
37
- DEFAULT_FLANNEL_IFACE = os.getenv("KALAVAI_FLANNEL_IFACE", "netmaker-1")
42
+ DEFAULT_FLANNEL_IFACE = os.getenv("KALAVAI_FLANNEL_IFACE", "netmaker")
38
43
  DEFAULT_WATCHER_PORT = 30001
39
44
  KUBE_VERSION = os.getenv("KALAVAI_KUBE_VERSION", "v1.31.1+k3s1")
40
45
  FORBIDEDEN_IPS = ["127.0.0.1"]
kalavai_client/utils.py CHANGED
@@ -100,7 +100,7 @@ def is_storage_compatible():
100
100
  return False
101
101
  ################
102
102
 
103
- def generate_compose_config(role, node_name, write_to_file=True, node_ip_address="0.0.0.0", num_gpus=0, node_labels=None, pool_ip=None, vpn_token=None, pool_token=None):
103
+ def generate_compose_config(role, node_name, write_to_file=True, node_ip_address="0.0.0.0", num_gpus=0, node_labels=None, pool_ip=None, vpn_token=None, pool_token=None, user_id=None, backend=True, frontend=True):
104
104
 
105
105
  if node_labels is not None:
106
106
  node_labels = " ".join([f"--node-label {key}={value}" for key, value in node_labels.items()])
@@ -121,7 +121,10 @@ def generate_compose_config(role, node_name, write_to_file=True, node_ip_address
121
121
  "k3s_path": f"{CONTAINER_HOST_PATH}/{rand_suffix}/k3s",
122
122
  "etc_path": f"{CONTAINER_HOST_PATH}/{rand_suffix}/etc",
123
123
  "node_labels": node_labels,
124
- "flannel_iface": DEFAULT_FLANNEL_IFACE if vpn_token is not None else ""
124
+ "flannel_iface": DEFAULT_FLANNEL_IFACE if vpn_token is not None else "",
125
+ "backend": backend,
126
+ "frontend": frontend,
127
+ "protected_access": user_id
125
128
  }
126
129
  # generate local config files
127
130
  compose_yaml = load_template(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: kalavai-client
3
- Version: 0.6.0
3
+ Version: 0.6.2
4
4
  Summary: Client app for kalavai platform
5
5
  License: Apache-2.0
6
6
  Keywords: LLM,platform
@@ -0,0 +1,25 @@
1
+ kalavai_client/__init__.py,sha256=KHdxFPVZ8ieY1b3JqZNDqsGezrCIPje_GQszyzGWEVw,22
2
+ kalavai_client/__main__.py,sha256=WQUfxvRsBJH5gsCJg8pLz95QnZIj7Ol8psTO77m0QE0,73
3
+ kalavai_client/assets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
+ kalavai_client/assets/apps.yaml,sha256=H2HZQ_oqdNz2qPDs5_NtHvJo4rblH1DRPugzQYq_t5Q,6366
5
+ kalavai_client/assets/apps_values.yaml,sha256=WRew3bS1MztjzcJfphuJcKn0n2T1ICRupPpr_Csjt_s,1644
6
+ kalavai_client/assets/docker-compose-gui.yaml,sha256=DGCyGYzz1kH6kkMbo62FJHe3F9vcAmA8DOHw-c_o0Kw,752
7
+ kalavai_client/assets/docker-compose-template.yaml,sha256=zJLk59DnoBkZscFJs50xgfwx9drmHArmivtQLevrHI8,2882
8
+ kalavai_client/assets/nginx.conf,sha256=drVVCg8GHucz7hmt_BI6giAhK92OV71257NTs3LthwM,225
9
+ kalavai_client/assets/pool_config_template.yaml,sha256=fFz4w2-fMKD5KvyzFdfcWD_jSneRlmnjLc8hCctweX0,576
10
+ kalavai_client/assets/pool_config_values.yaml,sha256=VrM3XHQfQo6QLZ68qvagooUptaYgl1pszniY_JUtemk,233
11
+ kalavai_client/assets/user_workspace.yaml,sha256=wDvlMYknOPABAEo0dsQwU7bac8iubjAG9tdkFbJZ5Go,476
12
+ kalavai_client/assets/user_workspace_values.yaml,sha256=G0HOzQUxrDMCwuW9kbWUZaKMzDDPVwDwzBHCL2Xi2ZM,542
13
+ kalavai_client/auth.py,sha256=EB3PMvKUn5_KAQkezkEHEt-OMZXyfkZguIQlUFkEHcA,3243
14
+ kalavai_client/bridge_api.py,sha256=KecIZvsGRiZgUQaDSgvRBLaqPDBhxFKS6FBH_w5ArCc,7015
15
+ kalavai_client/bridge_models.py,sha256=IGPLAYEZG4f5EUtBuoR2u_cYoyCCVkhx4H2rMeGuJ_Y,1030
16
+ kalavai_client/cli.py,sha256=YHC74zg5z3Hw4s101TsV-rmi4WYY1ZIdC2OavNeA1wc,47114
17
+ kalavai_client/cluster.py,sha256=gwjmdsd--YrffT0BmZDOEpbrdm3lPskUuN5jdgcrOR0,12947
18
+ kalavai_client/core.py,sha256=rPnKRvyORYP6hhPv_NyHEm8XtEy1DOY3VQ5ambvPZDY,32733
19
+ kalavai_client/env.py,sha256=wAd-P8XDlDB8Oau76f0bG2aHTkNA793xb_V0frbNeJE,2770
20
+ kalavai_client/utils.py,sha256=LqcG2fOJcvqEuC348ddwhStd6zqiXo7nuQ2VlU9v9Lg,12156
21
+ kalavai_client-0.6.2.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
22
+ kalavai_client-0.6.2.dist-info/METADATA,sha256=zaRbaISgFAHXJR8f1_2m_YynbeRrR2I5KUqTLcqABQ0,13353
23
+ kalavai_client-0.6.2.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
24
+ kalavai_client-0.6.2.dist-info/entry_points.txt,sha256=9T6D45gxwzfVbglMm1r6XPdXuuZdHfy_7fCeu2jUphc,50
25
+ kalavai_client-0.6.2.dist-info/RECORD,,
@@ -1,25 +0,0 @@
1
- kalavai_client/__init__.py,sha256=kdEPlDp6IaQ7VW5poiOUuYIU9_F2zMlsQ58FC7Mp1Bw,22
2
- kalavai_client/__main__.py,sha256=WQUfxvRsBJH5gsCJg8pLz95QnZIj7Ol8psTO77m0QE0,73
3
- kalavai_client/assets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
- kalavai_client/assets/apps.yaml,sha256=H2HZQ_oqdNz2qPDs5_NtHvJo4rblH1DRPugzQYq_t5Q,6366
5
- kalavai_client/assets/apps_values.yaml,sha256=WRew3bS1MztjzcJfphuJcKn0n2T1ICRupPpr_Csjt_s,1644
6
- kalavai_client/assets/docker-compose-gui.yaml,sha256=IHClIltiu8C4nHbgDgAscf3Ls6UFngbeQP07kj31kjM,776
7
- kalavai_client/assets/docker-compose-template.yaml,sha256=0ckkXC2OJTWnjyyjtwCIckUc22xhY_84aCQjz1WSlBk,2831
8
- kalavai_client/assets/nginx.conf,sha256=drVVCg8GHucz7hmt_BI6giAhK92OV71257NTs3LthwM,225
9
- kalavai_client/assets/pool_config_template.yaml,sha256=fFz4w2-fMKD5KvyzFdfcWD_jSneRlmnjLc8hCctweX0,576
10
- kalavai_client/assets/pool_config_values.yaml,sha256=VrM3XHQfQo6QLZ68qvagooUptaYgl1pszniY_JUtemk,233
11
- kalavai_client/assets/user_workspace.yaml,sha256=wDvlMYknOPABAEo0dsQwU7bac8iubjAG9tdkFbJZ5Go,476
12
- kalavai_client/assets/user_workspace_values.yaml,sha256=G0HOzQUxrDMCwuW9kbWUZaKMzDDPVwDwzBHCL2Xi2ZM,542
13
- kalavai_client/auth.py,sha256=EB3PMvKUn5_KAQkezkEHEt-OMZXyfkZguIQlUFkEHcA,3243
14
- kalavai_client/bridge_api.py,sha256=IkKq_CODA4p4UJkk6UqXKHkz5m2ESq2mL3tKqkQk6T0,6910
15
- kalavai_client/bridge_models.py,sha256=k4ILxa8jfAcfgIIBJqK1DunDzHh_oNUpuiEpmhAfTP0,977
16
- kalavai_client/cli.py,sha256=Cq0aC7L8kV1Ag2Olm3NGY51BMLBAjcsDH3mhmyfz6cA,47089
17
- kalavai_client/cluster.py,sha256=gwjmdsd--YrffT0BmZDOEpbrdm3lPskUuN5jdgcrOR0,12947
18
- kalavai_client/core.py,sha256=CWJQ38BZ2mLavfOCyR7wsDdy4fRTpjnYmggoXcR9Ji8,32531
19
- kalavai_client/env.py,sha256=_T3D0Hns5yAbFS3Hp1Vt73FZWLMtKSUJz2XXR9kJvEY,2605
20
- kalavai_client/utils.py,sha256=k2Bpvl16zDpWBXMIMsd_LbkinZtctPO6bygfB7DyiZ8,12018
21
- kalavai_client-0.6.0.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
22
- kalavai_client-0.6.0.dist-info/METADATA,sha256=NufPp5kOZHUqWASe0nHrecbPZPGMOUOPE91PYTA_Fpg,13353
23
- kalavai_client-0.6.0.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
24
- kalavai_client-0.6.0.dist-info/entry_points.txt,sha256=9T6D45gxwzfVbglMm1r6XPdXuuZdHfy_7fCeu2jUphc,50
25
- kalavai_client-0.6.0.dist-info/RECORD,,