hypercli-cli 1.0.8__tar.gz → 1.0.9__tar.gz

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.
Files changed (24) hide show
  1. {hypercli_cli-1.0.8 → hypercli_cli-1.0.9}/PKG-INFO +1 -1
  2. {hypercli_cli-1.0.8 → hypercli_cli-1.0.9}/hypercli_cli/claw.py +7 -17
  3. {hypercli_cli-1.0.8 → hypercli_cli-1.0.9}/hypercli_cli/instances.py +26 -0
  4. {hypercli_cli-1.0.8 → hypercli_cli-1.0.9}/hypercli_cli/voice.py +22 -13
  5. {hypercli_cli-1.0.8 → hypercli_cli-1.0.9}/pyproject.toml +1 -1
  6. {hypercli_cli-1.0.8 → hypercli_cli-1.0.9}/.gitignore +0 -0
  7. {hypercli_cli-1.0.8 → hypercli_cli-1.0.9}/README.md +0 -0
  8. {hypercli_cli-1.0.8 → hypercli_cli-1.0.9}/hypercli_cli/__init__.py +0 -0
  9. {hypercli_cli-1.0.8 → hypercli_cli-1.0.9}/hypercli_cli/agents.py +0 -0
  10. {hypercli_cli-1.0.8 → hypercli_cli-1.0.9}/hypercli_cli/billing.py +0 -0
  11. {hypercli_cli-1.0.8 → hypercli_cli-1.0.9}/hypercli_cli/cli.py +0 -0
  12. {hypercli_cli-1.0.8 → hypercli_cli-1.0.9}/hypercli_cli/comfyui.py +0 -0
  13. {hypercli_cli-1.0.8 → hypercli_cli-1.0.9}/hypercli_cli/embed.py +0 -0
  14. {hypercli_cli-1.0.8 → hypercli_cli-1.0.9}/hypercli_cli/flow.py +0 -0
  15. {hypercli_cli-1.0.8 → hypercli_cli-1.0.9}/hypercli_cli/jobs.py +0 -0
  16. {hypercli_cli-1.0.8 → hypercli_cli-1.0.9}/hypercli_cli/keys.py +0 -0
  17. {hypercli_cli-1.0.8 → hypercli_cli-1.0.9}/hypercli_cli/onboard.py +0 -0
  18. {hypercli_cli-1.0.8 → hypercli_cli-1.0.9}/hypercli_cli/output.py +0 -0
  19. {hypercli_cli-1.0.8 → hypercli_cli-1.0.9}/hypercli_cli/renders.py +0 -0
  20. {hypercli_cli-1.0.8 → hypercli_cli-1.0.9}/hypercli_cli/stt.py +0 -0
  21. {hypercli_cli-1.0.8 → hypercli_cli-1.0.9}/hypercli_cli/tui/__init__.py +0 -0
  22. {hypercli_cli-1.0.8 → hypercli_cli-1.0.9}/hypercli_cli/tui/job_monitor.py +0 -0
  23. {hypercli_cli-1.0.8 → hypercli_cli-1.0.9}/hypercli_cli/user.py +0 -0
  24. {hypercli_cli-1.0.8 → hypercli_cli-1.0.9}/hypercli_cli/wallet.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hypercli-cli
3
- Version: 1.0.8
3
+ Version: 1.0.9
4
4
  Summary: CLI for HyperCLI - GPU orchestration and LLM API
5
5
  Project-URL: Homepage, https://hypercli.com
6
6
  Project-URL: Documentation, https://docs.hypercli.com
@@ -9,7 +9,6 @@ from rich.table import Table
9
9
 
10
10
  from .onboard import onboard as _onboard_fn
11
11
  from .voice import app as voice_app
12
- from .stt import app as stt_app
13
12
  from .stt import transcribe as _stt_transcribe
14
13
  from .embed import app as embed_app
15
14
 
@@ -19,12 +18,11 @@ console = Console()
19
18
  # Register subcommands
20
19
  app.command("onboard")(_onboard_fn)
21
20
  app.add_typer(voice_app, name="voice")
22
- app.add_typer(stt_app, name="stt")
23
21
  app.add_typer(embed_app, name="embed")
24
22
 
25
23
 
26
24
  @app.command("transcribe")
27
- def transcribe_alias(
25
+ def transcribe(
28
26
  audio_file: Path = typer.Argument(..., help="Audio file to transcribe (wav, mp3, ogg, m4a, etc.)"),
29
27
  model: str = typer.Option("turbo", "--model", "-m", help="Whisper model: tiny, base, small, medium, large-v3, turbo"),
30
28
  language: str = typer.Option(None, "--language", "-l", help="Language code (e.g. en, de, fr). Auto-detect if omitted."),
@@ -33,21 +31,13 @@ def transcribe_alias(
33
31
  json_output: bool = typer.Option(False, "--json", help="Output as JSON with timestamps"),
34
32
  output: Path = typer.Option(None, "--output", "-o", help="Write transcript to file"),
35
33
  ):
36
- """Alias for `hyper claw stt transcribe` (local faster-whisper)."""
37
- _stt_transcribe(audio_file, model, language, device, compute_type, json_output, output)
38
-
34
+ """Transcribe audio to text using faster-whisper (runs locally).
39
35
 
40
- @app.command("trascribe", hidden=True)
41
- def trascribe_alias(
42
- audio_file: Path = typer.Argument(..., help="Audio file to transcribe (wav, mp3, ogg, m4a, etc.)"),
43
- model: str = typer.Option("turbo", "--model", "-m", help="Whisper model: tiny, base, small, medium, large-v3, turbo"),
44
- language: str = typer.Option(None, "--language", "-l", help="Language code (e.g. en, de, fr). Auto-detect if omitted."),
45
- device: str = typer.Option("auto", "--device", "-d", help="Device: auto, cpu, cuda"),
46
- compute_type: str = typer.Option("auto", "--compute", help="Compute type: auto, int8, float16, float32"),
47
- json_output: bool = typer.Option(False, "--json", help="Output as JSON with timestamps"),
48
- output: Path = typer.Option(None, "--output", "-o", help="Write transcript to file"),
49
- ):
50
- """Backward-compatible typo alias for transcribe."""
36
+ Examples:
37
+ hyper claw transcribe voice.ogg
38
+ hyper claw transcribe meeting.mp3 --model large-v3 --language en
39
+ hyper claw transcribe audio.wav --json -o transcript.json
40
+ """
51
41
  _stt_transcribe(audio_file, model, language, device, compute_type, json_output, output)
52
42
 
53
43
  # Check if wallet dependencies are available
@@ -231,6 +231,12 @@ def launch(
231
231
  if lb:
232
232
  ports_dict["lb"] = lb
233
233
 
234
+ raw_tcp_ports = []
235
+ if ports_dict:
236
+ raw_tcp_ports = sorted(
237
+ int(p.split("/")[0]) for p in ports_dict.keys() if p.endswith("/tcp")
238
+ )
239
+
234
240
  # Build registry auth if provided
235
241
  registry_auth = None
236
242
  if registry_user and registry_password:
@@ -302,6 +308,13 @@ def launch(
302
308
  console.print(f" Price: ${job.price_per_hour:.2f}/hr")
303
309
  if job.hostname:
304
310
  console.print(f" Hostname: {job.hostname}")
311
+ if lb:
312
+ console.print(f" HTTPS LB: Traefik TLS on https://{job.hostname}")
313
+ console.print(f" LB Target: container port {lb}")
314
+ if lb_auth:
315
+ console.print(" LB Auth: enabled (Bearer token required)")
316
+ if raw_tcp_ports:
317
+ console.print(f" TCP Ports: raw TCP exposed: {', '.join(map(str, raw_tcp_ports))}")
305
318
  console.print(f" Access Key: {x402_job.access_key}")
306
319
  console.print(f" Status URL: {x402_job.status_url}")
307
320
  console.print(f" Logs URL: {x402_job.logs_url}")
@@ -336,6 +349,12 @@ def launch(
336
349
  console.print(f" Region: {job.region}")
337
350
  console.print(f" Price: ${job.price_per_hour:.2f}/hr")
338
351
  console.print(f" Runtime: {job.runtime}s")
352
+ if lb:
353
+ console.print(f" HTTPS LB: Traefik TLS will be provisioned for container port {lb}")
354
+ if lb_auth:
355
+ console.print(" LB Auth: enabled (Bearer token required)")
356
+ if raw_tcp_ports:
357
+ console.print(f" TCP: raw TCP ports: {', '.join(map(str, raw_tcp_ports))}")
339
358
  # Display cold boot status
340
359
  import sys
341
360
  if job.cold_boot:
@@ -350,6 +369,13 @@ def launch(
350
369
  console.print(f" Price: ${job.price_per_hour:.2f}/hr")
351
370
  if job.hostname:
352
371
  console.print(f" Hostname: {job.hostname}")
372
+ if lb and job.hostname:
373
+ console.print(f" HTTPS LB: Traefik TLS endpoint https://{job.hostname}")
374
+ console.print(f" LB Target: container port {lb}")
375
+ if lb_auth:
376
+ console.print(" LB Auth: enabled (Bearer token required)")
377
+ if raw_tcp_ports:
378
+ console.print(f" TCP: raw TCP ports: {', '.join(map(str, raw_tcp_ports))}")
353
379
  # Display cold boot status for real launches too
354
380
  if job.cold_boot:
355
381
  console.print("[yellow]⏳ Cold boot — instance provisioning may take up to 15 minutes[/]")
@@ -14,8 +14,7 @@ console = Console()
14
14
 
15
15
  HYPERCLI_DIR = Path.home() / ".hypercli"
16
16
  CLAW_KEY_PATH = HYPERCLI_DIR / "claw-key.json"
17
- PROD_API_BASE = "https://api.hyperclaw.app"
18
- DEV_API_BASE = "https://dev-api.hyperclaw.app"
17
+ DEFAULT_API_BASE = "https://api.hyperclaw.app"
19
18
 
20
19
 
21
20
  def _get_api_key(key: str | None) -> str:
@@ -35,15 +34,25 @@ def _get_api_key(key: str | None) -> str:
35
34
  raise typer.Exit(1)
36
35
 
37
36
 
37
+ def _resolve_api_base(base_url: str | None) -> str:
38
+ """Resolve API base: --base-url > HYPERCLAW_API_BASE env > default."""
39
+ if base_url:
40
+ return base_url.rstrip("/")
41
+ env_base = os.environ.get("HYPERCLAW_API_BASE", "").strip()
42
+ if env_base:
43
+ return env_base.rstrip("/")
44
+ return DEFAULT_API_BASE
45
+
46
+
38
47
  def _post_voice(
39
48
  endpoint: str,
40
49
  payload: dict,
41
50
  api_key: str,
42
51
  output: Path,
43
- dev: bool = False,
52
+ base_url: str | None = None,
44
53
  ):
45
54
  """POST to voice endpoint and save audio output."""
46
- api_base = DEV_API_BASE if dev else PROD_API_BASE
55
+ api_base = _resolve_api_base(base_url)
47
56
  url = f"{api_base}/voice/{endpoint}"
48
57
 
49
58
  console.print(f"[dim]→ POST {url}[/dim]")
@@ -83,10 +92,10 @@ def tts(
83
92
  format: str = typer.Option("mp3", "--format", "-f", help="Output format: wav, mp3, opus, ogg, flac"),
84
93
  output: Path = typer.Option(None, "--output", "-o", help="Output audio file (default: output.<format>)"),
85
94
  key: str = typer.Option(None, "--key", "-k", help="API key (sk-...)"),
86
- dev: bool = typer.Option(False, "--dev", help="Use dev API"),
95
+ base_url: str = typer.Option(None, "--base-url", "-b", help="API base URL (default: api.hyperclaw.app)"),
87
96
  ):
88
97
  """Generate speech from text using a preset voice.
89
-
98
+
90
99
  Examples:
91
100
  hyper claw voice tts "Hello world"
92
101
  hyper claw voice tts "Bonjour" -v Etienne -l french -f opus -o hello.opus
@@ -100,7 +109,7 @@ def tts(
100
109
  "language": language,
101
110
  "response_format": format,
102
111
  }
103
- _post_voice("tts", payload, api_key, output, dev)
112
+ _post_voice("tts", payload, api_key, output, base_url)
104
113
 
105
114
 
106
115
  @app.command("clone")
@@ -112,10 +121,10 @@ def clone(
112
121
  format: str = typer.Option("mp3", "--format", "-f", help="Output format: wav, mp3, opus, ogg, flac"),
113
122
  output: Path = typer.Option(None, "--output", "-o", help="Output audio file (default: output.<format>)"),
114
123
  key: str = typer.Option(None, "--key", "-k", help="API key (sk-...)"),
115
- dev: bool = typer.Option(False, "--dev", help="Use dev API"),
124
+ base_url: str = typer.Option(None, "--base-url", "-b", help="API base URL (default: api.hyperclaw.app)"),
116
125
  ):
117
126
  """Clone a voice from reference audio.
118
-
127
+
119
128
  Examples:
120
129
  hyper claw voice clone "Hello" --ref voice.wav
121
130
  hyper claw voice clone "Test" -r ref.wav -l english -f mp3 -o cloned.mp3
@@ -140,7 +149,7 @@ def clone(
140
149
  "x_vector_only": x_vector_only,
141
150
  "response_format": format,
142
151
  }
143
- _post_voice("clone", payload, api_key, output, dev)
152
+ _post_voice("clone", payload, api_key, output, base_url)
144
153
 
145
154
 
146
155
  @app.command("design")
@@ -151,10 +160,10 @@ def design(
151
160
  format: str = typer.Option("mp3", "--format", "-f", help="Output format: wav, mp3, opus, ogg, flac"),
152
161
  output: Path = typer.Option(None, "--output", "-o", help="Output audio file (default: output.<format>)"),
153
162
  key: str = typer.Option(None, "--key", "-k", help="API key (sk-...)"),
154
- dev: bool = typer.Option(False, "--dev", help="Use dev API"),
163
+ base_url: str = typer.Option(None, "--base-url", "-b", help="API base URL (default: api.hyperclaw.app)"),
155
164
  ):
156
165
  """Design a voice from a text description.
157
-
166
+
158
167
  Examples:
159
168
  hyper claw voice design "Hello" --desc "deep male voice, British accent"
160
169
  hyper claw voice design "Test" -d "young woman, cheerful" -f mp3 -o designed.mp3
@@ -168,4 +177,4 @@ def design(
168
177
  "language": language,
169
178
  "response_format": format,
170
179
  }
171
- _post_voice("design", payload, api_key, output, dev)
180
+ _post_voice("design", payload, api_key, output, base_url)
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "hypercli-cli"
7
- version = "1.0.8"
7
+ version = "1.0.9"
8
8
  description = "CLI for HyperCLI - GPU orchestration and LLM API"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
File without changes
File without changes