lyceum-cli 1.0.30__py3-none-any.whl → 1.0.32__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.
@@ -59,6 +59,22 @@ GPU_VRAM_GB = {
59
59
  "gpu.rtx6000pro": 48,
60
60
  }
61
61
 
62
+ # Fallback pricing per hour (used when API doesn't return prices)
63
+ GPU_PRICE_PER_HOUR = {
64
+ "cpu": 0.20,
65
+ "gpu": 0.39,
66
+ "gpu.t4": 0.39,
67
+ "gpu.t4.64gb": 1.50,
68
+ "gpu.a100": 2.00,
69
+ "gpu.a100.40gb": 1.95,
70
+ "gpu.a100.80gb": 1.99,
71
+ "gpu.h100": 3.29,
72
+ "gpu.h200": 3.69,
73
+ "gpu.l40s": 1.49,
74
+ "gpu.b200": 5.69,
75
+ "gpu.rtx6000pro": 1.95,
76
+ }
77
+
62
78
 
63
79
  def format_gpu_name(profile: str) -> str:
64
80
  """Format GPU profile name for display."""
@@ -95,6 +111,9 @@ def fetch_gpu_pricing() -> dict[str, float]:
95
111
  def calculate_cost(execution_time_s: float, hardware_profile: str, pricing: dict[str, float]) -> float | None:
96
112
  """Calculate cost based on execution time and GPU pricing."""
97
113
  price_per_hour = pricing.get(hardware_profile)
114
+ # Fallback to hardcoded pricing if API doesn't have this profile
115
+ if price_per_hour is None or price_per_hour == 0:
116
+ price_per_hour = GPU_PRICE_PER_HOUR.get(hardware_profile)
98
117
  if price_per_hour is None or price_per_hour == 0:
99
118
  return None
100
119
  return execution_time_s * (price_per_hour / 3600)
@@ -399,18 +418,19 @@ def display_results(data: dict, file_path: str | None = None) -> None:
399
418
  if vram and util:
400
419
  total_mem_gb = vram * (util / 100)
401
420
 
402
- # Find GPUs that were excluded
403
- excluded_gpus = []
421
+ # Find GPUs that were excluded (deduplicate by display name)
422
+ excluded_gpus = {}
404
423
  for profile, vram in GPU_VRAM_GB.items():
405
424
  if profile not in compatible_gpu_types and profile in ("gpu", "gpu.t4"):
406
- # Only show common GPUs that users expect to see
407
- excluded_gpus.append((profile, vram))
425
+ gpu_name = format_gpu_name(profile)
426
+ # Only keep one entry per display name (e.g., "T4")
427
+ if gpu_name not in excluded_gpus:
428
+ excluded_gpus[gpu_name] = vram
408
429
 
409
430
  if excluded_gpus and total_mem_gb:
410
431
  console.print()
411
432
  console.print("[dim]Excluded GPUs (insufficient VRAM):[/dim]")
412
- for profile, vram in sorted(excluded_gpus, key=lambda x: x[1]):
413
- gpu_name = format_gpu_name(profile)
433
+ for gpu_name, vram in sorted(excluded_gpus.items(), key=lambda x: x[1]):
414
434
  console.print(f"[dim] • {gpu_name}: {vram} GB available, ~{total_mem_gb:.1f} GB required[/dim]")
415
435
 
416
436
  # Show run command hint if we have a best GPU and file path
lyceum/shared/config.py CHANGED
@@ -129,7 +129,7 @@ class _Config:
129
129
  if self.is_token_expired():
130
130
  console.print("[dim]Token expired, attempting refresh...[/dim]")
131
131
  if not self.refresh_access_token():
132
- console.print("[red]Token refresh failed. Please run 'lyceum login' again.[/red]")
132
+ console.print("[red]Token refresh failed. Please run 'lyceum auth login' again.[/red]")
133
133
  raise typer.Exit(1)
134
134
 
135
135
  # Return config instance - commands use httpx directly
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lyceum-cli
3
- Version: 1.0.30
3
+ Version: 1.0.32
4
4
  Summary: Command-line interface for Lyceum Cloud Execution API
5
5
  Home-page: https://lyceum.technology
6
6
  Author: Lyceum Team
@@ -8,7 +8,7 @@ lyceum/external/compute/execution/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZ
8
8
  lyceum/external/compute/execution/config.py,sha256=6JJgLJnDPTwevEaNdB1nEICih_qbBmws5u5_S9gj7k0,8866
9
9
  lyceum/external/compute/execution/docker.py,sha256=0Y6lxJAm56Jrl0HxeNz1mX6DGs556i2iMN9_U1JQP0c,9635
10
10
  lyceum/external/compute/execution/docker_compose.py,sha256=YsWPnw5nB1ZpqjU9X8o_klT78I5m46PapVwVEeWra_8,9189
11
- lyceum/external/compute/execution/gpu_selection.py,sha256=1rLFUAxqY6TiRcEfeduNnScGw0QbxSSMbgTAQ3QWMhQ,39020
11
+ lyceum/external/compute/execution/gpu_selection.py,sha256=9Xx5mmk1Zv5lzXccLi4_jEQ0DOUySng_gHNypkgUOAg,39661
12
12
  lyceum/external/compute/execution/notebook.py,sha256=Gw9UhJ-UjYhpjdIYQ4IMYhVjhSkAFpOQ9aFYj1qOeww,7542
13
13
  lyceum/external/compute/execution/python.py,sha256=8Y9ElWs9RdauQbhECKcBPSoT0XZeGhXZ_pkEpr3sGro,12878
14
14
  lyceum/external/compute/execution/workloads.py,sha256=4fsRWbYGmsQMGPPIN1jUG8cG5NPG9yV26ANJ-DtaXqc,5844
@@ -22,15 +22,15 @@ lyceum/external/vms/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSu
22
22
  lyceum/external/vms/instances.py,sha256=8DKpI8PbyZFzk5RT-IPgoMDjkf_-HC-2pJKuSFs-5BA,11007
23
23
  lyceum/external/vms/management.py,sha256=dYEkN5Qiur-SG4G5CLOk2Rbr0HW3rK1BROSp0K6KxC8,15405
24
24
  lyceum/shared/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
25
- lyceum/shared/config.py,sha256=gEXf_hEmgUq3rSxU2SY75qg32mFS6qsruox7uvQlf3I,5334
25
+ lyceum/shared/config.py,sha256=vgmspvId3D60ESJs2LLhZ5WUglIaJ7kaehNnWB7HEuA,5339
26
26
  lyceum/shared/display.py,sha256=-VSAfoa0yivTvxRrN2RYr2Sq1x_msZqENjnkSedmbhQ,4444
27
27
  lyceum/shared/imports.py,sha256=wEG4wfVTIqJ6MBWDRAN96iGmVCb9ST2aOqSjkbvajug,11768
28
28
  lyceum/shared/streaming.py,sha256=wFb7w7fra63y8WWaIA8_E1Z6Sx_6G-0J53Zh010eZgk,9355
29
29
  lyceum_cloud_execution_api_client/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
30
30
  lyceum_cloud_execution_api_client/api/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
31
31
  lyceum_cloud_execution_api_client/models/__init__.py,sha256=AMlb9R9O9aNC9hvKz_8TFpEfOolYC3VtFS5JX17kYks,4888
32
- lyceum_cli-1.0.30.dist-info/METADATA,sha256=pdV-mL-39UWQJfpEd91DK88AWhgCO-KD2GV5tWaJtLs,1482
33
- lyceum_cli-1.0.30.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
34
- lyceum_cli-1.0.30.dist-info/entry_points.txt,sha256=Oq-9wDkxVd6MHgNiUTYwXI9SGhvR3VkD7Mvk0xhiUZo,43
35
- lyceum_cli-1.0.30.dist-info/top_level.txt,sha256=CR7FEMloAXgLsHUR6ti3mWNcpgje27HRHSfq8doIils,41
36
- lyceum_cli-1.0.30.dist-info/RECORD,,
32
+ lyceum_cli-1.0.32.dist-info/METADATA,sha256=0EZXP3LeTAcdpO0btSCLTEoZbps27M93vD71gQz7FSU,1482
33
+ lyceum_cli-1.0.32.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
34
+ lyceum_cli-1.0.32.dist-info/entry_points.txt,sha256=Oq-9wDkxVd6MHgNiUTYwXI9SGhvR3VkD7Mvk0xhiUZo,43
35
+ lyceum_cli-1.0.32.dist-info/top_level.txt,sha256=CR7FEMloAXgLsHUR6ti3mWNcpgje27HRHSfq8doIils,41
36
+ lyceum_cli-1.0.32.dist-info/RECORD,,