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.
- {hypercli_cli-1.0.8 → hypercli_cli-1.0.9}/PKG-INFO +1 -1
- {hypercli_cli-1.0.8 → hypercli_cli-1.0.9}/hypercli_cli/claw.py +7 -17
- {hypercli_cli-1.0.8 → hypercli_cli-1.0.9}/hypercli_cli/instances.py +26 -0
- {hypercli_cli-1.0.8 → hypercli_cli-1.0.9}/hypercli_cli/voice.py +22 -13
- {hypercli_cli-1.0.8 → hypercli_cli-1.0.9}/pyproject.toml +1 -1
- {hypercli_cli-1.0.8 → hypercli_cli-1.0.9}/.gitignore +0 -0
- {hypercli_cli-1.0.8 → hypercli_cli-1.0.9}/README.md +0 -0
- {hypercli_cli-1.0.8 → hypercli_cli-1.0.9}/hypercli_cli/__init__.py +0 -0
- {hypercli_cli-1.0.8 → hypercli_cli-1.0.9}/hypercli_cli/agents.py +0 -0
- {hypercli_cli-1.0.8 → hypercli_cli-1.0.9}/hypercli_cli/billing.py +0 -0
- {hypercli_cli-1.0.8 → hypercli_cli-1.0.9}/hypercli_cli/cli.py +0 -0
- {hypercli_cli-1.0.8 → hypercli_cli-1.0.9}/hypercli_cli/comfyui.py +0 -0
- {hypercli_cli-1.0.8 → hypercli_cli-1.0.9}/hypercli_cli/embed.py +0 -0
- {hypercli_cli-1.0.8 → hypercli_cli-1.0.9}/hypercli_cli/flow.py +0 -0
- {hypercli_cli-1.0.8 → hypercli_cli-1.0.9}/hypercli_cli/jobs.py +0 -0
- {hypercli_cli-1.0.8 → hypercli_cli-1.0.9}/hypercli_cli/keys.py +0 -0
- {hypercli_cli-1.0.8 → hypercli_cli-1.0.9}/hypercli_cli/onboard.py +0 -0
- {hypercli_cli-1.0.8 → hypercli_cli-1.0.9}/hypercli_cli/output.py +0 -0
- {hypercli_cli-1.0.8 → hypercli_cli-1.0.9}/hypercli_cli/renders.py +0 -0
- {hypercli_cli-1.0.8 → hypercli_cli-1.0.9}/hypercli_cli/stt.py +0 -0
- {hypercli_cli-1.0.8 → hypercli_cli-1.0.9}/hypercli_cli/tui/__init__.py +0 -0
- {hypercli_cli-1.0.8 → hypercli_cli-1.0.9}/hypercli_cli/tui/job_monitor.py +0 -0
- {hypercli_cli-1.0.8 → hypercli_cli-1.0.9}/hypercli_cli/user.py +0 -0
- {hypercli_cli-1.0.8 → hypercli_cli-1.0.9}/hypercli_cli/wallet.py +0 -0
|
@@ -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
|
|
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
|
-
"""
|
|
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
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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
|
-
|
|
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
|
-
|
|
52
|
+
base_url: str | None = None,
|
|
44
53
|
):
|
|
45
54
|
"""POST to voice endpoint and save audio output."""
|
|
46
|
-
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
|
-
|
|
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,
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
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,
|
|
180
|
+
_post_voice("design", payload, api_key, output, base_url)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|