hypercli-cli 2026.3.18__tar.gz → 2026.3.22__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 (29) hide show
  1. {hypercli_cli-2026.3.18 → hypercli_cli-2026.3.22}/.gitignore +3 -0
  2. {hypercli_cli-2026.3.18 → hypercli_cli-2026.3.22}/PKG-INFO +4 -4
  3. hypercli_cli-2026.3.22/hypercli_cli/__init__.py +1 -0
  4. {hypercli_cli-2026.3.18 → hypercli_cli-2026.3.22}/hypercli_cli/agent.py +4 -4
  5. {hypercli_cli-2026.3.18 → hypercli_cli-2026.3.22}/hypercli_cli/agents.py +13 -9
  6. {hypercli_cli-2026.3.18 → hypercli_cli-2026.3.22}/hypercli_cli/embed.py +3 -3
  7. {hypercli_cli-2026.3.18 → hypercli_cli-2026.3.22}/hypercli_cli/instances.py +28 -1
  8. {hypercli_cli-2026.3.18 → hypercli_cli-2026.3.22}/hypercli_cli/voice.py +11 -5
  9. {hypercli_cli-2026.3.18 → hypercli_cli-2026.3.22}/pyproject.toml +4 -4
  10. hypercli_cli-2026.3.22/tests/test_agent_env_resolution.py +39 -0
  11. {hypercli_cli-2026.3.18 → hypercli_cli-2026.3.22}/tests/test_exec_shell_dryrun.py +46 -0
  12. {hypercli_cli-2026.3.18 → hypercli_cli-2026.3.22}/tests/test_openclaw_config.py +4 -4
  13. hypercli_cli-2026.3.18/hypercli_cli/__init__.py +0 -1
  14. {hypercli_cli-2026.3.18 → hypercli_cli-2026.3.22}/README.md +0 -0
  15. {hypercli_cli-2026.3.18 → hypercli_cli-2026.3.22}/hypercli_cli/billing.py +0 -0
  16. {hypercli_cli-2026.3.18 → hypercli_cli-2026.3.22}/hypercli_cli/cli.py +0 -0
  17. {hypercli_cli-2026.3.18 → hypercli_cli-2026.3.22}/hypercli_cli/comfyui.py +0 -0
  18. {hypercli_cli-2026.3.18 → hypercli_cli-2026.3.22}/hypercli_cli/flow.py +0 -0
  19. {hypercli_cli-2026.3.18 → hypercli_cli-2026.3.22}/hypercli_cli/jobs.py +0 -0
  20. {hypercli_cli-2026.3.18 → hypercli_cli-2026.3.22}/hypercli_cli/keys.py +0 -0
  21. {hypercli_cli-2026.3.18 → hypercli_cli-2026.3.22}/hypercli_cli/onboard.py +0 -0
  22. {hypercli_cli-2026.3.18 → hypercli_cli-2026.3.22}/hypercli_cli/output.py +0 -0
  23. {hypercli_cli-2026.3.18 → hypercli_cli-2026.3.22}/hypercli_cli/renders.py +0 -0
  24. {hypercli_cli-2026.3.18 → hypercli_cli-2026.3.22}/hypercli_cli/stt.py +0 -0
  25. {hypercli_cli-2026.3.18 → hypercli_cli-2026.3.22}/hypercli_cli/tui/__init__.py +0 -0
  26. {hypercli_cli-2026.3.18 → hypercli_cli-2026.3.22}/hypercli_cli/tui/job_monitor.py +0 -0
  27. {hypercli_cli-2026.3.18 → hypercli_cli-2026.3.22}/hypercli_cli/user.py +0 -0
  28. {hypercli_cli-2026.3.18 → hypercli_cli-2026.3.22}/hypercli_cli/wallet.py +0 -0
  29. {hypercli_cli-2026.3.18 → hypercli_cli-2026.3.22}/tests/test_jobs_list_tags.py +0 -0
@@ -28,6 +28,9 @@ coverage
28
28
  .DS_Store
29
29
  *.pem
30
30
 
31
+ # IDE
32
+ .idea/
33
+
31
34
  # Debug
32
35
  npm-debug.log*
33
36
  yarn-debug.log*
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hypercli-cli
3
- Version: 2026.3.18
3
+ Version: 2026.3.22
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,7 @@ Author-email: HyperCLI <support@hypercli.com>
9
9
  License: MIT
10
10
  Requires-Python: >=3.10
11
11
  Requires-Dist: httpx>=0.27.0
12
- Requires-Dist: hypercli-sdk>=2026.3.18
12
+ Requires-Dist: hypercli-sdk>=2026.3.22
13
13
  Requires-Dist: mutagen>=1.47.0
14
14
  Requires-Dist: pyyaml>=6.0
15
15
  Requires-Dist: rich>=14.2.0
@@ -19,11 +19,11 @@ Provides-Extra: all
19
19
  Requires-Dist: argon2-cffi>=25.0.0; extra == 'all'
20
20
  Requires-Dist: eth-account>=0.13.0; extra == 'all'
21
21
  Requires-Dist: faster-whisper>=1.1.0; extra == 'all'
22
- Requires-Dist: hypercli-sdk[comfyui]>=2026.3.18; extra == 'all'
22
+ Requires-Dist: hypercli-sdk[comfyui]>=2026.3.22; extra == 'all'
23
23
  Requires-Dist: web3>=7.0.0; extra == 'all'
24
24
  Requires-Dist: x402[evm,httpx]>=2.0.0; extra == 'all'
25
25
  Provides-Extra: comfyui
26
- Requires-Dist: hypercli-sdk[comfyui]>=2026.3.18; extra == 'comfyui'
26
+ Requires-Dist: hypercli-sdk[comfyui]>=2026.3.22; extra == 'comfyui'
27
27
  Provides-Extra: dev
28
28
  Requires-Dist: pytest>=8.0.0; extra == 'dev'
29
29
  Requires-Dist: ruff>=0.3.0; extra == 'dev'
@@ -0,0 +1 @@
1
+ __version__ = "2026.3.22"
@@ -353,7 +353,7 @@ def models(
353
353
  import httpx
354
354
 
355
355
  api_base = DEV_API_BASE if dev else PROD_API_BASE
356
- key = os.getenv("HYPERCLAW_API_KEY")
356
+ key = os.getenv("HYPER_API_KEY")
357
357
  headers = {"Authorization": f"Bearer {key}"} if key else {}
358
358
 
359
359
  # Prefer OpenAI-compatible endpoint, then fallback to legacy.
@@ -374,7 +374,7 @@ def models(
374
374
  if payload is None:
375
375
  console.print(
376
376
  f"[red]❌ Failed to fetch models from {urls[0]} or {urls[1]} "
377
- "(set HYPERCLAW_API_KEY if endpoint requires auth)[/red]"
377
+ "(set HYPER_API_KEY if endpoint requires auth)[/red]"
378
378
  )
379
379
  raise typer.Exit(1)
380
380
 
@@ -548,7 +548,7 @@ def _resolve_api_base(base_url: str | None = None, dev: bool = False) -> str:
548
548
  """Resolve API base from flag/env, then fall back to dev/prod defaults."""
549
549
  return (
550
550
  base_url
551
- or os.environ.get("HYPERCLAW_API_BASE")
551
+ or os.environ.get("HYPER_API_BASE")
552
552
  or (DEV_INFERENCE_API_BASE if dev else PROD_INFERENCE_API_BASE)
553
553
  ).rstrip("/")
554
554
 
@@ -881,7 +881,7 @@ def config_cmd(
881
881
  help=f"Output format: {', '.join(FORMAT_CHOICES)}. Omit to show all.",
882
882
  ),
883
883
  key: str = typer.Option(None, "--key", "-k", help="API key (sk-...). Falls back to ~/.hypercli/agent-key.json"),
884
- base_url: str = typer.Option(None, "--base-url", help="HyperClaw API base URL. Falls back to HYPERCLAW_API_BASE, then --dev/prod defaults"),
884
+ base_url: str = typer.Option(None, "--base-url", help="HyperClaw API base URL. Falls back to HYPER_API_BASE, then --dev/prod defaults"),
885
885
  placeholder_env: str = typer.Option(None, "--placeholder-env", help="Write ${ENV_VAR} placeholders into generated config instead of literal API keys"),
886
886
  apply: bool = typer.Option(False, "--apply", help="Write config to the appropriate file (openclaw/opencode only)"),
887
887
  dev: bool = typer.Option(False, "--dev", help="Use dev API"),
@@ -18,8 +18,6 @@ app = typer.Typer(help="Manage OpenClaw agent pods")
18
18
  console = Console()
19
19
  PROD_API_BASE = "https://api.hypercli.com"
20
20
  DEV_API_BASE = "https://api.dev.hypercli.com"
21
- PROD_AGENTS_WS_URL = "wss://api.agents.hypercli.com/ws"
22
- DEV_AGENTS_WS_URL = "wss://api.agents.dev.hypercli.com/ws"
23
21
  _GLOBAL_DEV = False
24
22
  _GLOBAL_AGENTS_WS_URL: str | None = None
25
23
 
@@ -49,7 +47,10 @@ def agents_root(
49
47
 
50
48
  def _get_agent_api_key() -> str:
51
49
  """Resolve HyperClaw API key from env or saved key file."""
52
- key = os.environ.get("HYPERCLAW_API_KEY", "")
50
+ key = os.environ.get("HYPER_AGENTS_API_KEY", "").strip()
51
+ if key:
52
+ return key
53
+ key = os.environ.get("HYPER_API_KEY", "").strip()
53
54
  if key:
54
55
  return key
55
56
  if AGENT_KEY_PATH.exists():
@@ -59,7 +60,7 @@ def _get_agent_api_key() -> str:
59
60
  if key:
60
61
  return key
61
62
  console.print("[red]❌ No HyperClaw API key found.[/red]")
62
- console.print("Set HYPERCLAW_API_KEY or subscribe: [bold]hyper agent subscribe 1aiu[/bold]")
63
+ console.print("Set HYPER_AGENTS_API_KEY or HYPER_API_KEY, or subscribe: [bold]hyper agent subscribe 1aiu[/bold]")
63
64
  raise typer.Exit(1)
64
65
 
65
66
 
@@ -67,12 +68,13 @@ def _get_deployments_client(agents_ws_url: str | None = None) -> Deployments:
67
68
  """Create a Deployments client using the HyperClaw API key."""
68
69
  from hypercli.http import HTTPClient
69
70
  api_key = _get_agent_api_key()
70
- api_base = os.environ.get("HYPERCLI_API_URL") or (DEV_API_BASE if _GLOBAL_DEV else PROD_API_BASE)
71
+ api_base = (
72
+ os.environ.get("AGENTS_API_BASE_URL")
73
+ or os.environ.get("HYPER_API_BASE")
74
+ or os.environ.get("HYPERCLI_API_URL")
75
+ or (DEV_API_BASE if _GLOBAL_DEV else PROD_API_BASE)
76
+ )
71
77
  resolved_agents_ws_url = agents_ws_url or _GLOBAL_AGENTS_WS_URL or os.environ.get("AGENTS_WS_URL")
72
- if _GLOBAL_DEV and not resolved_agents_ws_url:
73
- resolved_agents_ws_url = DEV_AGENTS_WS_URL
74
- if not _GLOBAL_DEV and not resolved_agents_ws_url and os.environ.get("HYPERCLI_API_URL", "").strip() == "":
75
- resolved_agents_ws_url = PROD_AGENTS_WS_URL
76
78
  http = HTTPClient(api_base, api_key)
77
79
  return Deployments(http, api_key=api_key, api_base=api_base, agents_ws_url=resolved_agents_ws_url)
78
80
 
@@ -1015,6 +1017,8 @@ def gateway_chat(
1015
1017
  console.print(f"[dim]{event.text}[/dim]", end="")
1016
1018
  elif event.type == "tool_call":
1017
1019
  console.print(f"\n[yellow]🔧 {event.data}[/yellow]")
1020
+ elif event.type == "tool_result":
1021
+ console.print(f"\n[cyan]📤 {event.data}[/cyan]")
1018
1022
  elif event.type == "error":
1019
1023
  console.print(f"\n[red]❌ {event.text}[/red]")
1020
1024
  elif event.type == "done":
@@ -17,10 +17,10 @@ DEV_API_BASE = "https://api.dev.hypercli.com"
17
17
 
18
18
 
19
19
  def _get_api_key(key: str | None) -> str:
20
- """Resolve API key: --key flag > env HYPERCLAW_API_KEY > agent-key.json."""
20
+ """Resolve API key: --key flag > env HYPER_API_KEY > agent-key.json."""
21
21
  if key:
22
22
  return key
23
- env_key = os.environ.get("HYPERCLAW_API_KEY", "").strip()
23
+ env_key = os.environ.get("HYPER_API_KEY", "").strip()
24
24
  if env_key:
25
25
  return env_key
26
26
  if AGENT_KEY_PATH.exists():
@@ -29,7 +29,7 @@ def _get_api_key(key: str | None) -> str:
29
29
  if k:
30
30
  return k
31
31
  console.print("[red]❌ No API key found.[/red]")
32
- console.print("Pass [bold]--key sk-...[/bold], set [bold]HYPERCLAW_API_KEY[/bold], or run [bold]hyper agent subscribe[/bold]")
32
+ console.print("Pass [bold]--key sk-...[/bold], set [bold]HYPER_API_KEY[/bold], or run [bold]hyper agent subscribe[/bold]")
33
33
  raise typer.Exit(1)
34
34
 
35
35
 
@@ -11,6 +11,21 @@ def get_client() -> HyperCLI:
11
11
  return HyperCLI()
12
12
 
13
13
 
14
+ def _parse_constraints(
15
+ constraints: Optional[list[str]],
16
+ cpu_vendor: Optional[str],
17
+ ) -> dict[str, str] | None:
18
+ parsed: dict[str, str] = {}
19
+ for item in constraints or []:
20
+ key, sep, value = item.partition("=")
21
+ if not sep or not key or not value:
22
+ raise typer.BadParameter(f"Invalid constraint '{item}', expected KEY=VALUE")
23
+ parsed[key.strip()] = value.strip()
24
+ if cpu_vendor:
25
+ parsed.setdefault("cpu_vendor", cpu_vendor.strip())
26
+ return parsed or None
27
+
28
+
14
29
  @app.command("list")
15
30
  def list_instances(
16
31
  gpu: Optional[str] = typer.Option(None, "--gpu", "-g", help="Filter by GPU type"),
@@ -64,7 +79,13 @@ def list_gpus(
64
79
 
65
80
  if fmt == "json":
66
81
  output({k: {"name": v.name, "description": v.description, "configs": [
67
- {"gpu_count": c.gpu_count, "cpu_cores": c.cpu_cores, "memory_gb": c.memory_gb, "regions": c.regions}
82
+ {
83
+ "gpu_count": c.gpu_count,
84
+ "cpu_cores": c.cpu_cores,
85
+ "memory_gb": c.memory_gb,
86
+ "regions": c.regions,
87
+ "constraints": c.constraints,
88
+ }
68
89
  for c in v.configs
69
90
  ]} for k, v in types.items()}, "json")
70
91
  else:
@@ -187,6 +208,8 @@ def launch(
187
208
  gpu: str = typer.Option("l40s", "--gpu", "-g", help="GPU type"),
188
209
  count: int = typer.Option(1, "--count", "-n", help="Number of GPUs"),
189
210
  region: Optional[str] = typer.Option(None, "--region", "-r", help="Region code"),
211
+ constraint: Optional[list[str]] = typer.Option(None, "--constraint", help="Placement constraint KEY=VALUE (repeatable)"),
212
+ cpu_vendor: Optional[str] = typer.Option(None, "--cpu-vendor", help="CPU vendor constraint (e.g. intel, amd)"),
190
213
  runtime: Optional[int] = typer.Option(None, "--runtime", "-t", help="Runtime in seconds"),
191
214
  interruptible: bool = typer.Option(True, "--interruptible/--on-demand", help="Use interruptible instances"),
192
215
  env: Optional[list[str]] = typer.Option(None, "--env", "-e", help="Env vars (KEY=VALUE)"),
@@ -256,6 +279,8 @@ def launch(
256
279
  if command and any(op in command for op in ["&&", "||", "|", ";", ">", "<", "$"]):
257
280
  command = f'sh -c "{command}"'
258
281
 
282
+ constraints = _parse_constraints(constraint, cpu_vendor)
283
+
259
284
  follow_api_key = None
260
285
 
261
286
  if x402:
@@ -281,6 +306,7 @@ def launch(
281
306
  gpu_type=gpu,
282
307
  gpu_count=count,
283
308
  region=region,
309
+ constraints=constraints,
284
310
  interruptible=interruptible,
285
311
  env=env_dict,
286
312
  ports=ports_dict,
@@ -330,6 +356,7 @@ def launch(
330
356
  gpu_type=gpu,
331
357
  gpu_count=count,
332
358
  region=region,
359
+ constraints=constraints,
333
360
  runtime=runtime,
334
361
  interruptible=interruptible,
335
362
  env=env_dict,
@@ -18,10 +18,13 @@ DEFAULT_API_BASE = "https://api.hypercli.com"
18
18
 
19
19
 
20
20
  def _get_api_key(key: str | None) -> str:
21
- """Resolve API key: --key flag > env HYPERCLAW_API_KEY > agent-key.json."""
21
+ """Resolve API key: --key > HYPER_API_KEY > HYPER_AGENTS_API_KEY > agent-key.json."""
22
22
  if key:
23
23
  return key
24
- env_key = os.environ.get("HYPERCLAW_API_KEY", "").strip()
24
+ env_key = os.environ.get("HYPER_API_KEY", "").strip()
25
+ if env_key:
26
+ return env_key
27
+ env_key = os.environ.get("HYPER_AGENTS_API_KEY", "").strip()
25
28
  if env_key:
26
29
  return env_key
27
30
  if AGENT_KEY_PATH.exists():
@@ -30,15 +33,18 @@ def _get_api_key(key: str | None) -> str:
30
33
  if k:
31
34
  return k
32
35
  console.print("[red]❌ No API key found.[/red]")
33
- console.print("Pass [bold]--key sk-...[/bold], set [bold]HYPERCLAW_API_KEY[/bold], or run [bold]hyper agent subscribe[/bold]")
36
+ console.print("Pass [bold]--key sk-...[/bold], set [bold]HYPER_API_KEY[/bold] or [bold]HYPER_AGENTS_API_KEY[/bold], or run [bold]hyper agent subscribe[/bold]")
34
37
  raise typer.Exit(1)
35
38
 
36
39
 
37
40
  def _resolve_api_base(base_url: str | None) -> str:
38
- """Resolve API base: --base-url > HYPERCLAW_API_BASE env > default."""
41
+ """Resolve API base: --base-url > HYPER_API_BASE > HYPERCLI_API_URL > default."""
39
42
  if base_url:
40
43
  return base_url.rstrip("/")
41
- env_base = os.environ.get("HYPERCLAW_API_BASE", "").strip()
44
+ env_base = os.environ.get("HYPER_API_BASE", "").strip()
45
+ if env_base:
46
+ return env_base.rstrip("/")
47
+ env_base = os.environ.get("HYPERCLI_API_URL", "").strip()
42
48
  if env_base:
43
49
  return env_base.rstrip("/")
44
50
  return DEFAULT_API_BASE
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "hypercli-cli"
7
- version = "2026.3.18"
7
+ version = "2026.3.22"
8
8
  description = "CLI for HyperCLI - GPU orchestration and LLM API"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -13,7 +13,7 @@ authors = [
13
13
  { name = "HyperCLI", email = "support@hypercli.com" }
14
14
  ]
15
15
  dependencies = [
16
- "hypercli-sdk>=2026.3.18",
16
+ "hypercli-sdk>=2026.3.22",
17
17
  "typer>=0.20.0",
18
18
  "rich>=14.2.0",
19
19
  "websocket-client>=1.6.0",
@@ -24,7 +24,7 @@ dependencies = [
24
24
 
25
25
  [project.optional-dependencies]
26
26
  comfyui = [
27
- "hypercli-sdk[comfyui]>=2026.3.18",
27
+ "hypercli-sdk[comfyui]>=2026.3.22",
28
28
  ]
29
29
  wallet = [
30
30
  "x402[httpx,evm]>=2.0.0",
@@ -37,7 +37,7 @@ stt = [
37
37
  "faster-whisper>=1.1.0",
38
38
  ]
39
39
  all = [
40
- "hypercli-sdk[comfyui]>=2026.3.18",
40
+ "hypercli-sdk[comfyui]>=2026.3.22",
41
41
  "x402[httpx,evm]>=2.0.0",
42
42
  "eth-account>=0.13.0",
43
43
  "web3>=7.0.0",
@@ -0,0 +1,39 @@
1
+ import importlib
2
+
3
+
4
+ def test_agents_cli_prefers_agent_key_env(monkeypatch):
5
+ monkeypatch.setenv("HYPER_API_KEY", "sk-product")
6
+ monkeypatch.setenv("HYPER_AGENTS_API_KEY", "sk-agent")
7
+
8
+ import hypercli_cli.agents as agents
9
+
10
+ importlib.reload(agents)
11
+
12
+ assert agents._get_agent_api_key() == "sk-agent"
13
+
14
+
15
+ def test_agents_cli_prefers_agent_base_env(monkeypatch):
16
+ monkeypatch.setenv("AGENTS_API_BASE_URL", "https://api.agents.dev.hypercli.com")
17
+ monkeypatch.setenv("AGENTS_WS_URL", "wss://api.agents.dev.hypercli.com/ws")
18
+ monkeypatch.setenv("HYPER_AGENTS_API_KEY", "sk-agent")
19
+
20
+ import hypercli_cli.agents as agents
21
+
22
+ importlib.reload(agents)
23
+
24
+ client = agents._get_deployments_client()
25
+ assert client._api_base == "https://api.dev.hypercli.com/agents"
26
+
27
+
28
+ def test_voice_cli_prefers_product_envs(monkeypatch):
29
+ monkeypatch.setenv("HYPER_API_KEY", "sk-product")
30
+ monkeypatch.setenv("HYPER_AGENTS_API_KEY", "sk-agent")
31
+ monkeypatch.setenv("HYPER_API_BASE", "https://api.hypercli.com")
32
+ monkeypatch.setenv("HYPERCLI_API_URL", "https://api.dev.hypercli.com")
33
+
34
+ import hypercli_cli.voice as voice
35
+
36
+ importlib.reload(voice)
37
+
38
+ assert voice._get_api_key(None) == "sk-product"
39
+ assert voice._resolve_api_base(None) == "https://api.hypercli.com"
@@ -98,6 +98,52 @@ def test_instances_launch_dry_run_mock(monkeypatch):
98
98
  assert "job-dryrun" in result.stdout
99
99
 
100
100
 
101
+ def test_instances_launch_dry_run_includes_constraints(monkeypatch):
102
+ captured = {}
103
+
104
+ class FakeJobs:
105
+ def create(self, **kwargs):
106
+ captured.update(kwargs)
107
+ return SimpleNamespace(
108
+ job_id="job-dryrun",
109
+ state="validated",
110
+ gpu_type="h200",
111
+ gpu_count=8,
112
+ region="br",
113
+ constraints={"cpu_vendor": "amd"},
114
+ price_per_hour=12.34,
115
+ runtime=300,
116
+ cold_boot=False,
117
+ hostname=None,
118
+ )
119
+
120
+ fake_client = SimpleNamespace(jobs=FakeJobs())
121
+ monkeypatch.setattr("hypercli_cli.instances.get_client", lambda: fake_client)
122
+
123
+ result = runner.invoke(
124
+ app,
125
+ [
126
+ "instances",
127
+ "launch",
128
+ "nvidia/cuda:12.0-base-ubuntu22.04",
129
+ "--dry-run",
130
+ "--gpu",
131
+ "h200",
132
+ "--count",
133
+ "8",
134
+ "--cpu-vendor",
135
+ "amd",
136
+ "--constraint",
137
+ "stack=prod",
138
+ "--output",
139
+ "json",
140
+ ],
141
+ )
142
+
143
+ assert result.exit_code == 0
144
+ assert captured["constraints"] == {"cpu_vendor": "amd", "stack": "prod"}
145
+
146
+
101
147
  def test_agent_exec_command(monkeypatch):
102
148
  called = {}
103
149
 
@@ -54,10 +54,10 @@ def test_config_openclaw_supports_placeholder_api_key_env():
54
54
  {"id": "qwen3-embedding-4b", "name": "Qwen3 Embedding 4B", "mode": "embedding"},
55
55
  ],
56
56
  "https://api.agents.hypercli.com",
57
- placeholder_env="HYPER_AGENTS_API_KEY",
57
+ placeholder_env="HYPER_API_KEY",
58
58
  )
59
59
 
60
60
  providers = config["models"]["providers"]
61
- assert providers["hyperclaw"]["apiKey"] == "${HYPER_AGENTS_API_KEY}"
62
- assert providers["kimi-coding"]["apiKey"] == "${HYPER_AGENTS_API_KEY}"
63
- assert config["agents"]["defaults"]["memorySearch"]["remote"]["apiKey"] == "${HYPER_AGENTS_API_KEY}"
61
+ assert providers["hyperclaw"]["apiKey"] == "${HYPER_API_KEY}"
62
+ assert providers["kimi-coding"]["apiKey"] == "${HYPER_API_KEY}"
63
+ assert config["agents"]["defaults"]["memorySearch"]["remote"]["apiKey"] == "${HYPER_API_KEY}"
@@ -1 +0,0 @@
1
- __version__ = "2026.3.18"