@oneciel-ai/claude-any 0.1.33 → 0.1.34

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.
package/README.md CHANGED
@@ -48,7 +48,7 @@ arguments through unchanged.
48
48
 
49
49
  Credits: One Ciel LLC
50
50
 
51
- Current version: `0.1.33`
51
+ Current version: `0.1.34`
52
52
 
53
53
  ## Why This Exists
54
54
 
@@ -121,14 +121,57 @@ Run one non-interactive Claude Code prompt:
121
121
  claude-any --ca-provider nvidia-hosted --ca-model z-ai/glm-4.7 --ca-no-update-check -p "Reply with OK only." --output-format text
122
122
  ```
123
123
 
124
- Use the saved provider/model and only skip the menu:
125
-
126
- ```sh
127
- CLAUDE_ANY_SKIP_MENU=1 claude-any -p "Summarize this repository." --output-format text
128
- ```
129
-
130
- More examples are in [Headless Examples](#headless-examples) and
131
- [the full manual](docs/manual.md#headless-usage).
124
+ Use the saved provider/model and only skip the menu:
125
+
126
+ ```sh
127
+ CLAUDE_ANY_SKIP_MENU=1 claude-any -p "Summarize this repository." --output-format text
128
+ ```
129
+
130
+ Configure every launch option with flags:
131
+
132
+ ```sh
133
+ claude-any --ca-provider nvidia-hosted --ca-base-url https://integrate.api.nvidia.com/v1 --ca-model z-ai/glm-4.7 --ca-advisor-model deepseek-ai/deepseek-v4-pro --ca-api-key-env NVIDIA_API_KEY --ca-max-output-tokens 4096 --ca-context-window 65536 --ca-request-timeout-ms 300000 --ca-rate-limit-rpm 40 --ca-rate-limit-status on --ca-no-update-check -p "Reply with OK only." --output-format text
134
+ ```
135
+
136
+ Or put the same values in environment variables:
137
+
138
+ ```sh
139
+ export CLAUDE_ANY_SKIP_MENU=1
140
+ export CLAUDE_ANY_PROVIDER=nvidia-hosted
141
+ export CLAUDE_ANY_BASE_URL=https://integrate.api.nvidia.com/v1
142
+ export CLAUDE_ANY_MODEL=z-ai/glm-4.7
143
+ export CLAUDE_ANY_ADVISOR_MODEL=deepseek-ai/deepseek-v4-pro
144
+ export CLAUDE_ANY_API_KEY_ENV=NVIDIA_API_KEY
145
+ export CLAUDE_ANY_MAX_OUTPUT_TOKENS=4096
146
+ export CLAUDE_ANY_CONTEXT_WINDOW=65536
147
+ export CLAUDE_ANY_REQUEST_TIMEOUT_MS=300000
148
+ export CLAUDE_ANY_RATE_LIMIT_RPM=40
149
+ export CLAUDE_ANY_RATE_LIMIT_STATUS=on
150
+ claude-any -p "Reply with OK only." --output-format text
151
+ ```
152
+
153
+ For `.env` driven runs, save the same `CLAUDE_ANY_*` values in a file and pass
154
+ it explicitly:
155
+
156
+ ```sh
157
+ claude-any --ca-env-file .env.claude-any -p "Reply with OK only." --output-format text
158
+ ```
159
+
160
+ Override order is deterministic: saved user choices from the menu are the
161
+ baseline, OS environment variables override them, `--ca-env-file` values
162
+ override the OS environment, CLI `--ca-*` parameters override the env file, and
163
+ `--ca-menu` lets the final interactive menu choice override everything.
164
+
165
+ Headless coverage checklist: provider, base URL, model, Advisor model, API key
166
+ or API-key environment variable, max output, context window, request timeout,
167
+ RPM limit, RPM status display, streaming, web search, web fetch, Claude skills,
168
+ update check, language, Ollama context/options, and normal Claude Code
169
+ passthrough arguments are all configurable without opening the menu. API keys
170
+ can be passed directly with `--ca-api-key`, but `--ca-api-key-env` is safer for
171
+ scripts because the secret does not appear in shell history.
172
+
173
+ More examples are in [Headless Examples](#headless-examples) and
174
+ [the full manual](docs/manual.md#headless-usage).
132
175
 
133
176
  **Upgrade:**
134
177
 
@@ -338,6 +381,14 @@ steps under that larger model's supervision.
338
381
 
339
382
  ## Changelog
340
383
 
384
+ ### 0.1.34
385
+
386
+ - **Complete headless configuration path**: add `--ca-env-file`,
387
+ environment-variable mapping, Advisor model, rate-limit, streaming, language,
388
+ and web-fetch headless controls.
389
+ - **Documented override order**: saved menu choices < OS environment <
390
+ `.env` file < CLI parameters < final interactive menu choice via `--ca-menu`.
391
+
341
392
  ### 0.1.33
342
393
 
343
394
  - **Logo branding in every README**: add the Claude Any logo at the top of the
package/claude_any.py CHANGED
@@ -31,9 +31,9 @@ try:
31
31
  except Exception:
32
32
  pass
33
33
 
34
- HOME = Path.home()
35
- CONFIG_DIR = HOME / ".config" / "claude-any"
36
- CONFIG_PATH = CONFIG_DIR / "config.json"
34
+ HOME = Path.home()
35
+ CONFIG_DIR = Path(os.environ.get("CLAUDE_ANY_CONFIG_DIR") or (HOME / ".config" / "claude-any"))
36
+ CONFIG_PATH = CONFIG_DIR / "config.json"
37
37
  LOG_PATH = CONFIG_DIR / "router.log"
38
38
  LOG_LEVEL_PATH = CONFIG_DIR / "log-level"
39
39
  REQUEST_DUMP_PATH = CONFIG_DIR / "requests.jsonl"
@@ -84,7 +84,7 @@ PROVIDER_LABELS = {
84
84
  "self-hosted-nim": "Self Hosted NIM",
85
85
  }
86
86
  APP_NAME = "Claude Any"
87
- VERSION = "0.1.33"
87
+ VERSION = "0.1.34"
88
88
  CREDITS = "Credits: One Ciel LLC"
89
89
 
90
90
  LOG_LEVELS = {"SILENT": 0, "ERROR": 1, "WARN": 2, "INFO": 3, "DEBUG": 4, "TRACE": 5}
@@ -955,11 +955,28 @@ def read_env_file(path: Path) -> dict[str, str]:
955
955
  return env
956
956
 
957
957
 
958
- def meaningful_key_value(value: Any) -> bool:
959
- if value is None:
960
- return False
961
- text = str(value).strip()
962
- return bool(text and text not in ("dummy", "not-used", "ollama"))
958
+ def meaningful_key_value(value: Any) -> bool:
959
+ if value is None:
960
+ return False
961
+ text = str(value).strip()
962
+ return bool(text and text not in ("dummy", "not-used", "ollama"))
963
+
964
+
965
+ def env_bool(value: str | None, default: bool | None = None) -> bool | None:
966
+ if value is None:
967
+ return default
968
+ text = value.strip().lower()
969
+ if text in ("1", "true", "yes", "on", "y"):
970
+ return True
971
+ if text in ("0", "false", "no", "off", "n"):
972
+ return False
973
+ return default
974
+
975
+
976
+ def load_dotenv_into_environ(path: Path, *, override: bool = True) -> None:
977
+ for key, value in read_env_file(path).items():
978
+ if override or key not in os.environ:
979
+ os.environ[key] = value
963
980
 
964
981
 
965
982
  def executable_candidates(name: str) -> list[str]:
@@ -7900,9 +7917,11 @@ def has_noninteractive_claude_args(passthrough: list[str]) -> bool:
7900
7917
  return any(arg == "-p" or arg == "--print" or arg.startswith("--print=") for arg in passthrough)
7901
7918
 
7902
7919
 
7903
- def run_prelaunch_menu(passthrough: list[str], skip_menu: bool = False) -> int:
7904
- if skip_menu or has_noninteractive_claude_args(passthrough) or os.environ.get("CLAUDE_ANY_SKIP_MENU") == "1":
7905
- return 0
7920
+ def run_prelaunch_menu(passthrough: list[str], skip_menu: bool = False, force_menu: bool = False) -> int:
7921
+ if not force_menu and (
7922
+ skip_menu or has_noninteractive_claude_args(passthrough) or os.environ.get("CLAUDE_ANY_SKIP_MENU") == "1"
7923
+ ):
7924
+ return 0
7906
7925
  if not (sys.stdin.isatty() and sys.stdout.isatty()):
7907
7926
  return 0
7908
7927
  if os.environ.get("CLAUDE_ANY_USE_LEGACY_MENU") == "1":
@@ -8037,14 +8056,15 @@ def run_claude_update_check(claude: str, enabled: bool = True) -> None:
8037
8056
  print(f"Claude Code update check exited with {p.returncode}; continuing.", flush=True)
8038
8057
 
8039
8058
 
8040
- def launch_claude(
8041
- passthrough: list[str],
8042
- skip_menu: bool = False,
8043
- web_search_override: bool | None = None,
8044
- disable_skills_override: bool | None = None,
8045
- update_check: bool = True,
8046
- ) -> int:
8047
- rc = run_prelaunch_menu(passthrough, skip_menu=skip_menu)
8059
+ def launch_claude(
8060
+ passthrough: list[str],
8061
+ skip_menu: bool = False,
8062
+ force_menu: bool = False,
8063
+ web_search_override: bool | None = None,
8064
+ disable_skills_override: bool | None = None,
8065
+ update_check: bool = True,
8066
+ ) -> int:
8067
+ rc = run_prelaunch_menu(passthrough, skip_menu=skip_menu, force_menu=force_menu)
8048
8068
  if rc == 10:
8049
8069
  return 0
8050
8070
  if rc != 0:
@@ -8121,8 +8141,8 @@ def launch_claude(
8121
8141
  return subprocess.call(cmd, env=env)
8122
8142
 
8123
8143
 
8124
- def cli_usage() -> str:
8125
- return """Usage:
8144
+ def cli_usage() -> str:
8145
+ return """Usage:
8126
8146
  claude-any Launch Claude Code through claude-any router
8127
8147
 
8128
8148
  Control plane, runs before Claude Code and does not require LLM connectivity:
@@ -8148,21 +8168,31 @@ Control plane, runs before Claude Code and does not require LLM connectivity:
8148
8168
  claude-any stop Stop router/proxy
8149
8169
 
8150
8170
  Headless setup flags, namespaced to avoid Claude CLI collisions:
8151
- claude-any --ca-provider PROVIDER Set provider, then launch
8152
- claude-any --ca-base-url URL Set current provider base URL, then launch
8153
- claude-any --ca-model MODEL_ID Set provider model, then launch
8154
- claude-any --ca-api-key KEY Set current provider API key, then launch
8155
- claude-any --ca-api-key-env ENVVAR Set current provider API key from env, then launch
8156
- claude-any --ca-set-api-key PROVIDER KEY
8157
- claude-any --ca-set-api-key-env PROVIDER ENVVAR
8171
+ claude-any --ca-provider PROVIDER Set provider, then launch
8172
+ claude-any --ca-env-file PATH Load CLAUDE_ANY_* values from a .env file
8173
+ claude-any --ca-menu Apply setup values, then open the menu
8174
+ claude-any --ca-language en|ko|ja|zh
8175
+ claude-any --ca-base-url URL Set current provider base URL, then launch
8176
+ claude-any --ca-model MODEL_ID Set provider model, then launch
8177
+ claude-any --ca-advisor-model MODEL_ID
8178
+ claude-any --ca-api-key KEY Set current provider API key, then launch
8179
+ claude-any --ca-api-key-env ENVVAR Set current provider API key from env, then launch
8180
+ claude-any --ca-set-api-key PROVIDER KEY
8181
+ claude-any --ca-set-api-key-env PROVIDER ENVVAR
8158
8182
  claude-any --ca-ollama-num-ctx VALUE
8159
8183
  claude-any --ca-ollama-ctx-range MIN MAX
8160
8184
  claude-any --ca-ollama-option KEY=VALUE
8161
8185
  claude-any --ca-max-output-tokens VALUE
8162
- claude-any --ca-context-window VALUE
8163
- claude-any --ca-request-timeout-ms VALUE
8164
- claude-any --ca-web-search Force DuckDuckGo MCP for this launch
8165
- claude-any --ca-no-web-search Disable DuckDuckGo MCP for this launch
8186
+ claude-any --ca-context-window VALUE
8187
+ claude-any --ca-request-timeout-ms VALUE
8188
+ claude-any --ca-rate-limit-rpm VALUE
8189
+ claude-any --ca-rate-limit-status on|off
8190
+ claude-any --ca-stream on|off
8191
+ claude-any --ca-stream-word-chunking on|off
8192
+ claude-any --ca-web-search Force DuckDuckGo MCP for this launch
8193
+ claude-any --ca-no-web-search Disable DuckDuckGo MCP for this launch
8194
+ claude-any --ca-web-fetch Enable fetch MCP
8195
+ claude-any --ca-no-web-fetch Disable fetch MCP
8166
8196
  claude-any --ca-disable-skills Disable Claude Code skills for this launch
8167
8197
  claude-any --ca-enable-skills Keep Claude Code skills enabled for this launch
8168
8198
  claude-any --ca-no-update-check Skip Claude Code update check for this launch
@@ -8171,15 +8201,112 @@ Headless setup flags, namespaced to avoid Claude CLI collisions:
8171
8201
 
8172
8202
  Provider names: anthropic, ollama, ollama-cloud, vllm, nvidia-hosted, self-hosted-nim
8173
8203
  Any other arguments are passed through to claude. Use -- before Claude flags that
8174
- collide with claude-any setup flags."""
8175
-
8176
-
8177
- def run_cli(argv: list[str]) -> int:
8178
- if argv and argv[0] in ("help", "--help", "-h"):
8179
- print(cli_usage())
8180
- return 0
8181
- if argv:
8182
- head, rest = argv[0], argv[1:]
8204
+ collide with claude-any setup flags."""
8205
+
8206
+
8207
+ def pop_headless_env_file_args(argv: list[str]) -> list[str]:
8208
+ cleaned: list[str] = []
8209
+ i = 0
8210
+ while i < len(argv):
8211
+ arg = argv[i]
8212
+ if arg == "--ca-env-file" or arg.startswith("--ca-env-file="):
8213
+ value = arg.split("=", 1)[1] if "=" in arg else None
8214
+ if value is None:
8215
+ if i + 1 >= len(argv):
8216
+ raise SystemExit("Missing path for --ca-env-file")
8217
+ value = argv[i + 1]
8218
+ i += 2
8219
+ else:
8220
+ i += 1
8221
+ path = Path(value).expanduser()
8222
+ if not path.exists():
8223
+ raise SystemExit(f"--ca-env-file not found: {path}")
8224
+ load_dotenv_into_environ(path, override=True)
8225
+ else:
8226
+ cleaned.append(arg)
8227
+ i += 1
8228
+ return cleaned
8229
+
8230
+
8231
+ def apply_headless_env_config() -> tuple[bool, bool | None, bool | None, bool | None, bool]:
8232
+ skip_menu = os.environ.get("CLAUDE_ANY_SKIP_MENU") == "1"
8233
+ force_menu = bool(env_bool(os.environ.get("CLAUDE_ANY_FORCE_MENU"), False))
8234
+ web_search_override = env_bool(os.environ.get("CLAUDE_ANY_WEB_SEARCH"))
8235
+ disable_skills_override = env_bool(os.environ.get("CLAUDE_ANY_DISABLE_SKILLS"))
8236
+ update_check_override = env_bool(os.environ.get("CLAUDE_ANY_UPDATE_CHECK"))
8237
+ language = os.environ.get("CLAUDE_ANY_LANGUAGE", "").strip()
8238
+ if language:
8239
+ cmd_language(argparse.Namespace(value=language))
8240
+ skip_menu = True
8241
+ web_fetch = env_bool(os.environ.get("CLAUDE_ANY_WEB_FETCH"))
8242
+ if web_fetch is not None:
8243
+ cmd_web_fetch(argparse.Namespace(value="on" if web_fetch else "off"))
8244
+ skip_menu = True
8245
+ provider = os.environ.get("CLAUDE_ANY_PROVIDER", "").strip()
8246
+ if provider:
8247
+ cmd_provider(argparse.Namespace(name=provider))
8248
+ skip_menu = True
8249
+ api_key_env = os.environ.get("CLAUDE_ANY_API_KEY_ENV", "").strip()
8250
+ api_key = os.environ.get("CLAUDE_ANY_API_KEY", "").strip()
8251
+ current_provider, _ = get_current_provider(load_config())
8252
+ if api_key_env:
8253
+ value = os.environ.get(api_key_env, "")
8254
+ if not value:
8255
+ raise SystemExit(f"Environment variable {api_key_env} is empty or not set")
8256
+ cmd_set_api_key(argparse.Namespace(provider=current_provider, key=value))
8257
+ skip_menu = True
8258
+ elif api_key:
8259
+ cmd_set_api_key(argparse.Namespace(provider=current_provider, key=api_key))
8260
+ skip_menu = True
8261
+ base_url = os.environ.get("CLAUDE_ANY_BASE_URL", "").strip()
8262
+ if base_url:
8263
+ current_provider, _ = get_current_provider(load_config())
8264
+ cmd_base_url(argparse.Namespace(provider=current_provider, url=base_url))
8265
+ skip_menu = True
8266
+ model = os.environ.get("CLAUDE_ANY_MODEL", "").strip()
8267
+ if model:
8268
+ cmd_model(argparse.Namespace(value=[model]))
8269
+ skip_menu = True
8270
+ advisor_model = os.environ.get("CLAUDE_ANY_ADVISOR_MODEL", "").strip()
8271
+ if advisor_model:
8272
+ set_advisor_model_config(advisor_model)
8273
+ skip_menu = True
8274
+ provider_option_keys = {
8275
+ "CLAUDE_ANY_MAX_OUTPUT_TOKENS": "max_output_tokens",
8276
+ "CLAUDE_ANY_CONTEXT_WINDOW": "context_window",
8277
+ "CLAUDE_ANY_REQUEST_TIMEOUT_MS": "request_timeout_ms",
8278
+ "CLAUDE_ANY_RATE_LIMIT_RPM": "rate_limit_rpm",
8279
+ "CLAUDE_ANY_RATE_LIMIT_STATUS": "rate_limit_status",
8280
+ "CLAUDE_ANY_STREAM": "stream_enabled",
8281
+ "CLAUDE_ANY_STREAM_WORD_CHUNKING": "stream_word_chunking",
8282
+ }
8283
+ provider_values = [
8284
+ f"{option_key}={os.environ[env_key].strip()}"
8285
+ for env_key, option_key in provider_option_keys.items()
8286
+ if os.environ.get(env_key, "").strip()
8287
+ ]
8288
+ if provider_values:
8289
+ cmd_provider_options(argparse.Namespace(values=provider_values))
8290
+ skip_menu = True
8291
+ ollama_values: list[str] = []
8292
+ if os.environ.get("CLAUDE_ANY_OLLAMA_NUM_CTX", "").strip():
8293
+ ollama_values.append(f"num_ctx={os.environ['CLAUDE_ANY_OLLAMA_NUM_CTX'].strip()}")
8294
+ for item in os.environ.get("CLAUDE_ANY_OLLAMA_OPTIONS", "").replace(",", " ").split():
8295
+ if item.strip():
8296
+ ollama_values.append(item.strip())
8297
+ if ollama_values:
8298
+ cmd_ollama_options(argparse.Namespace(values=ollama_values))
8299
+ skip_menu = True
8300
+ return skip_menu, web_search_override, disable_skills_override, update_check_override, force_menu
8301
+
8302
+
8303
+ def run_cli(argv: list[str]) -> int:
8304
+ if argv and argv[0] in ("help", "--help", "-h"):
8305
+ print(cli_usage())
8306
+ return 0
8307
+ argv = pop_headless_env_file_args(argv)
8308
+ if argv:
8309
+ head, rest = argv[0], argv[1:]
8183
8310
  if head in ("version", "--version", "-v"):
8184
8311
  print(f"claude-any {VERSION}")
8185
8312
  return 0
@@ -8263,16 +8390,30 @@ def run_cli(argv: list[str]) -> int:
8263
8390
  subprocess.run([ncp, "kill"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
8264
8391
  return 0
8265
8392
 
8266
- passthrough: list[str] = []
8267
- skip_menu = False
8268
- web_search_override: bool | None = None
8269
- disable_skills_override: bool | None = None
8270
- update_check = True
8271
- i = 0
8272
- while i < len(argv):
8273
- arg = argv[i]
8274
- if arg == "--ca-provider" or arg.startswith("--ca-provider="):
8275
- provider_value = arg.split("=", 1)[1] if "=" in arg else None
8393
+ passthrough: list[str] = []
8394
+ skip_menu, web_search_override, disable_skills_override, update_check_override, force_menu = apply_headless_env_config()
8395
+ update_check = True
8396
+ if update_check_override is not None:
8397
+ update_check = update_check_override
8398
+ i = 0
8399
+ while i < len(argv):
8400
+ arg = argv[i]
8401
+ if arg in ("--ca-menu", "--ca-interactive"):
8402
+ force_menu = True
8403
+ i += 1
8404
+ elif arg == "--ca-language" or arg.startswith("--ca-language="):
8405
+ value = arg.split("=", 1)[1] if "=" in arg else None
8406
+ if value is None:
8407
+ if i + 1 >= len(argv):
8408
+ raise SystemExit("Missing language for --ca-language")
8409
+ value = argv[i + 1]
8410
+ i += 2
8411
+ else:
8412
+ i += 1
8413
+ cmd_language(argparse.Namespace(value=value))
8414
+ skip_menu = True
8415
+ elif arg == "--ca-provider" or arg.startswith("--ca-provider="):
8416
+ provider_value = arg.split("=", 1)[1] if "=" in arg else None
8276
8417
  if provider_value:
8277
8418
  cmd_provider(argparse.Namespace(name=provider_value))
8278
8419
  skip_menu = True
@@ -8301,20 +8442,32 @@ def run_cli(argv: list[str]) -> int:
8301
8442
  provider, _ = get_current_provider(load_config())
8302
8443
  cmd_base_url(argparse.Namespace(provider=provider, url=value))
8303
8444
  skip_menu = True
8304
- elif arg == "--ca-model" or arg.startswith("--ca-model="):
8305
- value = arg.split("=", 1)[1] if "=" in arg else None
8306
- if value is None:
8307
- if i + 1 >= len(argv):
8308
- raise SystemExit("Missing model id for --ca-model")
8445
+ elif arg == "--ca-model" or arg.startswith("--ca-model="):
8446
+ value = arg.split("=", 1)[1] if "=" in arg else None
8447
+ if value is None:
8448
+ if i + 1 >= len(argv):
8449
+ raise SystemExit("Missing model id for --ca-model")
8309
8450
  value = argv[i + 1]
8310
8451
  i += 2
8311
8452
  else:
8312
8453
  i += 1
8313
- cmd_model(argparse.Namespace(value=[value]))
8314
- skip_menu = True
8315
- elif arg == "--ca-models":
8316
- cmd_models(argparse.Namespace(provider=None))
8317
- return 0
8454
+ cmd_model(argparse.Namespace(value=[value]))
8455
+ skip_menu = True
8456
+ elif arg == "--ca-advisor-model" or arg.startswith("--ca-advisor-model="):
8457
+ value = arg.split("=", 1)[1] if "=" in arg else None
8458
+ if value is None:
8459
+ if i + 1 >= len(argv):
8460
+ raise SystemExit("Missing model id for --ca-advisor-model")
8461
+ value = argv[i + 1]
8462
+ i += 2
8463
+ else:
8464
+ i += 1
8465
+ for line in set_advisor_model_config(value):
8466
+ print(line)
8467
+ skip_menu = True
8468
+ elif arg == "--ca-models":
8469
+ cmd_models(argparse.Namespace(provider=None))
8470
+ return 0
8318
8471
  elif arg == "--ca-api-key" or arg.startswith("--ca-api-key="):
8319
8472
  value = arg.split("=", 1)[1] if "=" in arg else None
8320
8473
  if value is None:
@@ -8419,25 +8572,77 @@ def run_cli(argv: list[str]) -> int:
8419
8572
  i += 1
8420
8573
  cmd_provider_options(argparse.Namespace(values=[f"context_window={value}"]))
8421
8574
  skip_menu = True
8422
- elif arg == "--ca-request-timeout-ms" or arg.startswith("--ca-request-timeout-ms="):
8423
- value = arg.split("=", 1)[1] if "=" in arg else None
8424
- if value is None:
8425
- if i + 1 >= len(argv):
8426
- raise SystemExit("Missing value for --ca-request-timeout-ms")
8575
+ elif arg == "--ca-request-timeout-ms" or arg.startswith("--ca-request-timeout-ms="):
8576
+ value = arg.split("=", 1)[1] if "=" in arg else None
8577
+ if value is None:
8578
+ if i + 1 >= len(argv):
8579
+ raise SystemExit("Missing value for --ca-request-timeout-ms")
8427
8580
  value = argv[i + 1]
8428
8581
  i += 2
8429
8582
  else:
8430
8583
  i += 1
8431
- cmd_provider_options(argparse.Namespace(values=[f"request_timeout_ms={value}"]))
8432
- skip_menu = True
8433
- elif arg == "--ca-web-search":
8434
- web_search_override = True
8435
- skip_menu = True
8436
- i += 1
8437
- elif arg == "--ca-no-web-search":
8438
- web_search_override = False
8439
- skip_menu = True
8440
- i += 1
8584
+ cmd_provider_options(argparse.Namespace(values=[f"request_timeout_ms={value}"]))
8585
+ skip_menu = True
8586
+ elif arg == "--ca-rate-limit-rpm" or arg.startswith("--ca-rate-limit-rpm="):
8587
+ value = arg.split("=", 1)[1] if "=" in arg else None
8588
+ if value is None:
8589
+ if i + 1 >= len(argv):
8590
+ raise SystemExit("Missing value for --ca-rate-limit-rpm")
8591
+ value = argv[i + 1]
8592
+ i += 2
8593
+ else:
8594
+ i += 1
8595
+ cmd_provider_options(argparse.Namespace(values=[f"rate_limit_rpm={value}"]))
8596
+ skip_menu = True
8597
+ elif arg == "--ca-rate-limit-status" or arg.startswith("--ca-rate-limit-status="):
8598
+ value = arg.split("=", 1)[1] if "=" in arg else None
8599
+ if value is None:
8600
+ if i + 1 >= len(argv):
8601
+ raise SystemExit("Missing on/off for --ca-rate-limit-status")
8602
+ value = argv[i + 1]
8603
+ i += 2
8604
+ else:
8605
+ i += 1
8606
+ cmd_provider_options(argparse.Namespace(values=[f"rate_limit_status={value}"]))
8607
+ skip_menu = True
8608
+ elif arg == "--ca-stream" or arg.startswith("--ca-stream="):
8609
+ value = arg.split("=", 1)[1] if "=" in arg else None
8610
+ if value is None:
8611
+ if i + 1 >= len(argv):
8612
+ raise SystemExit("Missing on/off for --ca-stream")
8613
+ value = argv[i + 1]
8614
+ i += 2
8615
+ else:
8616
+ i += 1
8617
+ cmd_provider_options(argparse.Namespace(values=[f"stream_enabled={value}"]))
8618
+ skip_menu = True
8619
+ elif arg == "--ca-stream-word-chunking" or arg.startswith("--ca-stream-word-chunking="):
8620
+ value = arg.split("=", 1)[1] if "=" in arg else None
8621
+ if value is None:
8622
+ if i + 1 >= len(argv):
8623
+ raise SystemExit("Missing on/off for --ca-stream-word-chunking")
8624
+ value = argv[i + 1]
8625
+ i += 2
8626
+ else:
8627
+ i += 1
8628
+ cmd_provider_options(argparse.Namespace(values=[f"stream_word_chunking={value}"]))
8629
+ skip_menu = True
8630
+ elif arg == "--ca-web-search":
8631
+ web_search_override = True
8632
+ skip_menu = True
8633
+ i += 1
8634
+ elif arg == "--ca-no-web-search":
8635
+ web_search_override = False
8636
+ skip_menu = True
8637
+ i += 1
8638
+ elif arg == "--ca-web-fetch":
8639
+ cmd_web_fetch(argparse.Namespace(value="on"))
8640
+ skip_menu = True
8641
+ i += 1
8642
+ elif arg == "--ca-no-web-fetch":
8643
+ cmd_web_fetch(argparse.Namespace(value="off"))
8644
+ skip_menu = True
8645
+ i += 1
8441
8646
  elif arg == "--ca-disable-skills":
8442
8647
  disable_skills_override = True
8443
8648
  skip_menu = True
@@ -8462,9 +8667,10 @@ def run_cli(argv: list[str]) -> int:
8462
8667
  else:
8463
8668
  passthrough.append(arg)
8464
8669
  i += 1
8465
- return launch_claude(
8466
- passthrough,
8467
- skip_menu=skip_menu,
8670
+ return launch_claude(
8671
+ passthrough,
8672
+ skip_menu=skip_menu,
8673
+ force_menu=force_menu,
8468
8674
  web_search_override=web_search_override,
8469
8675
  disable_skills_override=disable_skills_override,
8470
8676
  update_check=update_check,
package/docs/README.ja.md CHANGED
@@ -47,7 +47,7 @@ vLLM、NVIDIA hosted、self-hosted NIM を選択し、通常の Claude Code 引
47
47
 
48
48
  Credits: One Ciel LLC
49
49
 
50
- 現在のバージョン: `0.1.33`
50
+ 現在のバージョン: `0.1.34`
51
51
 
52
52
  ## 作られた理由
53
53
 
@@ -116,13 +116,53 @@ claude-any --ca-provider ollama --ca-base-url http://127.0.0.1:11434 --ca-model
116
116
  claude-any --ca-provider nvidia-hosted --ca-model z-ai/glm-4.7 --ca-no-update-check -p "Reply with OK only." --output-format text
117
117
  ```
118
118
 
119
- 保存済み provider/model を使い、メニューだけをスキップ:
120
-
121
- ```sh
122
- CLAUDE_ANY_SKIP_MENU=1 claude-any -p "Summarize this repository." --output-format text
123
- ```
124
-
125
- その他の例は [manual](manual.md#headless-usage) を参照してください。
119
+ 保存済み provider/model を使い、メニューだけをスキップ:
120
+
121
+ ```sh
122
+ CLAUDE_ANY_SKIP_MENU=1 claude-any -p "Summarize this repository." --output-format text
123
+ ```
124
+
125
+ すべての起動オプションをフラグで渡す例:
126
+
127
+ ```sh
128
+ claude-any --ca-provider nvidia-hosted --ca-base-url https://integrate.api.nvidia.com/v1 --ca-model z-ai/glm-4.7 --ca-advisor-model deepseek-ai/deepseek-v4-pro --ca-api-key-env NVIDIA_API_KEY --ca-max-output-tokens 4096 --ca-context-window 65536 --ca-request-timeout-ms 300000 --ca-rate-limit-rpm 40 --ca-rate-limit-status on --ca-no-update-check -p "Reply with OK only." --output-format text
129
+ ```
130
+
131
+ 同じ値を環境変数で指定:
132
+
133
+ ```sh
134
+ export CLAUDE_ANY_SKIP_MENU=1
135
+ export CLAUDE_ANY_PROVIDER=nvidia-hosted
136
+ export CLAUDE_ANY_BASE_URL=https://integrate.api.nvidia.com/v1
137
+ export CLAUDE_ANY_MODEL=z-ai/glm-4.7
138
+ export CLAUDE_ANY_ADVISOR_MODEL=deepseek-ai/deepseek-v4-pro
139
+ export CLAUDE_ANY_API_KEY_ENV=NVIDIA_API_KEY
140
+ export CLAUDE_ANY_MAX_OUTPUT_TOKENS=4096
141
+ export CLAUDE_ANY_CONTEXT_WINDOW=65536
142
+ export CLAUDE_ANY_REQUEST_TIMEOUT_MS=300000
143
+ export CLAUDE_ANY_RATE_LIMIT_RPM=40
144
+ export CLAUDE_ANY_RATE_LIMIT_STATUS=on
145
+ claude-any -p "Reply with OK only." --output-format text
146
+ ```
147
+
148
+ `.env` 方式では、同じ `CLAUDE_ANY_*` 値をファイルに保存して明示的に読み込みます:
149
+
150
+ ```sh
151
+ claude-any --ca-env-file .env.claude-any -p "Reply with OK only." --output-format text
152
+ ```
153
+
154
+ 上書き順序は固定です: メニューで保存された最後のユーザー選択が基準になり、
155
+ OS 環境変数、`--ca-env-file` の `.env` 値、CLI `--ca-*` パラメータ、
156
+ `--ca-menu` で再度開いた UI での最終選択の順に上書きされます。
157
+
158
+ ヘッドレス対応範囲: provider、base URL、model、Advisor model、API key または
159
+ API-key 環境変数、max output、context window、request timeout、RPM limit、
160
+ RPM status 表示、streaming、web search、web fetch、Claude skills、update check、
161
+ language、Ollama context/options、通常の Claude Code passthrough 引数をすべて
162
+ メニューなしで設定できます。API key は `--ca-api-key` で直接渡せますが、
163
+ スクリプトでは shell history に秘密値を残さない `--ca-api-key-env` を推奨します。
164
+
165
+ その他の例は [manual](manual.md#headless-usage) を参照してください。
126
166
 
127
167
  **アップグレード:**
128
168
 
@@ -311,6 +351,13 @@ Windows/Linux 管理、クリーンアップスクリプト、定期的なセキ
311
351
 
312
352
  ## 変更履歴
313
353
 
354
+ ### 0.1.34
355
+
356
+ - **完全な headless 設定経路**: `--ca-env-file`、環境変数マッピング、Advisor
357
+ model、rate-limit、streaming、language、web-fetch の headless 制御を追加。
358
+ - **上書き順序を文書化**: 保存済みメニュー選択 < OS 環境変数 < `.env` ファイル <
359
+ CLI パラメータ < `--ca-menu` で直接選んだ最終 UI 選択。
360
+
314
361
  ### 0.1.33
315
362
 
316
363
  - **すべての README の先頭にロゴを追加**: 英語、韓国語、日本語、中国語 README
package/docs/README.ko.md CHANGED
@@ -47,7 +47,7 @@ NVIDIA hosted, self-hosted NIM을 선택하고, Claude Code의 일반 인자는
47
47
 
48
48
  Credits: One Ciel LLC
49
49
 
50
- 현재 버전: `0.1.33`
50
+ 현재 버전: `0.1.34`
51
51
 
52
52
  ## 왜 만들었나
53
53
 
@@ -116,14 +116,54 @@ claude-any --ca-provider ollama --ca-base-url http://127.0.0.1:11434 --ca-model
116
116
  claude-any --ca-provider nvidia-hosted --ca-model z-ai/glm-4.7 --ca-no-update-check -p "Reply with OK only." --output-format text
117
117
  ```
118
118
 
119
- 저장된 provider/model을 그대로 쓰고 메뉴만 건너뛰기:
120
-
121
- ```sh
122
- CLAUDE_ANY_SKIP_MENU=1 claude-any -p "Summarize this repository." --output-format text
123
- ```
124
-
125
- 많은 예시는 [헤드리스 예제](#헤드리스-에이전트-채팅)와
126
- [전체 manual](manual.md#headless-usage)을 참고하세요.
119
+ 저장된 provider/model을 그대로 쓰고 메뉴만 건너뛰기:
120
+
121
+ ```sh
122
+ CLAUDE_ANY_SKIP_MENU=1 claude-any -p "Summarize this repository." --output-format text
123
+ ```
124
+
125
+ 모든 실행 옵션을 플래그로 전달:
126
+
127
+ ```sh
128
+ claude-any --ca-provider nvidia-hosted --ca-base-url https://integrate.api.nvidia.com/v1 --ca-model z-ai/glm-4.7 --ca-advisor-model deepseek-ai/deepseek-v4-pro --ca-api-key-env NVIDIA_API_KEY --ca-max-output-tokens 4096 --ca-context-window 65536 --ca-request-timeout-ms 300000 --ca-rate-limit-rpm 40 --ca-rate-limit-status on --ca-no-update-check -p "Reply with OK only." --output-format text
129
+ ```
130
+
131
+ 같은 값을 환경변수로 설정:
132
+
133
+ ```sh
134
+ export CLAUDE_ANY_SKIP_MENU=1
135
+ export CLAUDE_ANY_PROVIDER=nvidia-hosted
136
+ export CLAUDE_ANY_BASE_URL=https://integrate.api.nvidia.com/v1
137
+ export CLAUDE_ANY_MODEL=z-ai/glm-4.7
138
+ export CLAUDE_ANY_ADVISOR_MODEL=deepseek-ai/deepseek-v4-pro
139
+ export CLAUDE_ANY_API_KEY_ENV=NVIDIA_API_KEY
140
+ export CLAUDE_ANY_MAX_OUTPUT_TOKENS=4096
141
+ export CLAUDE_ANY_CONTEXT_WINDOW=65536
142
+ export CLAUDE_ANY_REQUEST_TIMEOUT_MS=300000
143
+ export CLAUDE_ANY_RATE_LIMIT_RPM=40
144
+ export CLAUDE_ANY_RATE_LIMIT_STATUS=on
145
+ claude-any -p "Reply with OK only." --output-format text
146
+ ```
147
+
148
+ `.env` 방식은 같은 `CLAUDE_ANY_*` 값을 파일에 저장한 뒤 명시적으로 불러옵니다:
149
+
150
+ ```sh
151
+ claude-any --ca-env-file .env.claude-any -p "Reply with OK only." --output-format text
152
+ ```
153
+
154
+ 오버라이드 순서는 고정되어 있습니다: 메뉴에서 저장된 최종 사용자 선택값이
155
+ 기본값이고, OS 환경변수, `--ca-env-file`의 `.env` 값, CLI `--ca-*` 파라미터,
156
+ `--ca-menu`로 다시 연 인터페이스에서 사용자가 직접 고른 값 순서로 덮어씁니다.
157
+
158
+ 헤드리스 지원 범위: provider, base URL, model, Advisor model, API key 또는
159
+ API-key 환경변수, max output, context window, request timeout, RPM limit,
160
+ RPM status 표시, streaming, web search, web fetch, Claude skills, update check,
161
+ language, Ollama context/options, 일반 Claude Code passthrough 인자를 모두 메뉴
162
+ 없이 설정할 수 있습니다. API key는 `--ca-api-key`로 직접 전달할 수 있지만,
163
+ 스크립트에서는 shell history에 비밀값이 남지 않는 `--ca-api-key-env`를 권장합니다.
164
+
165
+ 더 많은 예시는 [헤드리스 예제](#헤드리스-에이전트-채팅)와
166
+ [전체 manual](manual.md#headless-usage)을 참고하세요.
127
167
 
128
168
  **업그레이드:**
129
169
 
@@ -311,6 +351,13 @@ Windows 이벤트 로그 리뷰, 바이러스/랜섬웨어 침입 시도 정리,
311
351
 
312
352
  ## 변경 이력
313
353
 
354
+ ### 0.1.34
355
+
356
+ - **완전한 headless 설정 경로**: `--ca-env-file`, 환경변수 매핑, Advisor model,
357
+ rate-limit, streaming, language, web-fetch headless 제어를 추가했습니다.
358
+ - **오버라이드 순서 문서화**: 저장된 메뉴 선택값 < OS 환경변수 < `.env` 파일 <
359
+ CLI 파라미터 < `--ca-menu`로 직접 고른 최종 인터페이스 선택값.
360
+
314
361
  ### 0.1.33
315
362
 
316
363
  - **모든 README 상단 로고 브랜딩**: 영어, 한국어, 일본어, 중국어 README 최상단에
package/docs/README.zh.md CHANGED
@@ -47,7 +47,7 @@ NIM,并把普通 Claude Code 参数原样传递。
47
47
 
48
48
  Credits: One Ciel LLC
49
49
 
50
- 当前版本: `0.1.33`
50
+ 当前版本: `0.1.34`
51
51
 
52
52
  ## 为什么存在
53
53
 
@@ -113,13 +113,53 @@ claude-any --ca-provider ollama --ca-base-url http://127.0.0.1:11434 --ca-model
113
113
  claude-any --ca-provider nvidia-hosted --ca-model z-ai/glm-4.7 --ca-no-update-check -p "Reply with OK only." --output-format text
114
114
  ```
115
115
 
116
- 使用已保存的 provider/model,只跳过菜单:
117
-
118
- ```sh
119
- CLAUDE_ANY_SKIP_MENU=1 claude-any -p "Summarize this repository." --output-format text
120
- ```
121
-
122
- 更多示例见 [manual](manual.md#headless-usage)。
116
+ 使用已保存的 provider/model,只跳过菜单:
117
+
118
+ ```sh
119
+ CLAUDE_ANY_SKIP_MENU=1 claude-any -p "Summarize this repository." --output-format text
120
+ ```
121
+
122
+ flags 传入全部启动选项:
123
+
124
+ ```sh
125
+ claude-any --ca-provider nvidia-hosted --ca-base-url https://integrate.api.nvidia.com/v1 --ca-model z-ai/glm-4.7 --ca-advisor-model deepseek-ai/deepseek-v4-pro --ca-api-key-env NVIDIA_API_KEY --ca-max-output-tokens 4096 --ca-context-window 65536 --ca-request-timeout-ms 300000 --ca-rate-limit-rpm 40 --ca-rate-limit-status on --ca-no-update-check -p "Reply with OK only." --output-format text
126
+ ```
127
+
128
+ 也可以用环境变量传入同样的值:
129
+
130
+ ```sh
131
+ export CLAUDE_ANY_SKIP_MENU=1
132
+ export CLAUDE_ANY_PROVIDER=nvidia-hosted
133
+ export CLAUDE_ANY_BASE_URL=https://integrate.api.nvidia.com/v1
134
+ export CLAUDE_ANY_MODEL=z-ai/glm-4.7
135
+ export CLAUDE_ANY_ADVISOR_MODEL=deepseek-ai/deepseek-v4-pro
136
+ export CLAUDE_ANY_API_KEY_ENV=NVIDIA_API_KEY
137
+ export CLAUDE_ANY_MAX_OUTPUT_TOKENS=4096
138
+ export CLAUDE_ANY_CONTEXT_WINDOW=65536
139
+ export CLAUDE_ANY_REQUEST_TIMEOUT_MS=300000
140
+ export CLAUDE_ANY_RATE_LIMIT_RPM=40
141
+ export CLAUDE_ANY_RATE_LIMIT_STATUS=on
142
+ claude-any -p "Reply with OK only." --output-format text
143
+ ```
144
+
145
+ `.env` 方式是把同样的 `CLAUDE_ANY_*` 值保存到文件,并显式加载:
146
+
147
+ ```sh
148
+ claude-any --ca-env-file .env.claude-any -p "Reply with OK only." --output-format text
149
+ ```
150
+
151
+ 覆盖顺序是固定的: 菜单保存的最后一次用户选择是基线,随后依次由 OS 环境变量、
152
+ `--ca-env-file` 的 `.env` 值、CLI `--ca-*` 参数覆盖;如果使用 `--ca-menu`
153
+ 重新打开界面,用户在界面中的最终选择会覆盖前面所有值。
154
+
155
+ Headless 覆盖范围: provider、base URL、model、Advisor model、API key 或
156
+ API-key 环境变量、max output、context window、request timeout、RPM limit、
157
+ RPM status 显示、streaming、web search、web fetch、Claude skills、update check、
158
+ language、Ollama context/options,以及普通 Claude Code passthrough 参数,都可以
159
+ 不打开菜单直接配置。API key 可以用 `--ca-api-key` 直接传入,但脚本中更推荐
160
+ `--ca-api-key-env`,避免密钥进入 shell history。
161
+
162
+ 更多示例见 [manual](manual.md#headless-usage)。
123
163
 
124
164
  **升级:**
125
165
 
@@ -297,6 +337,13 @@ Hermes 格式模型或部分较旧的 Qwen tool template。
297
337
 
298
338
  ## 更新日志
299
339
 
340
+ ### 0.1.34
341
+
342
+ - **完整 headless 配置路径**:新增 `--ca-env-file`、环境变量映射、Advisor
343
+ model、rate-limit、streaming、language、web-fetch headless 控制。
344
+ - **记录覆盖顺序**:已保存菜单选择 < OS 环境变量 < `.env` 文件 < CLI 参数 <
345
+ 通过 `--ca-menu` 直接选择的最终界面值。
346
+
300
347
  ### 0.1.33
301
348
 
302
349
  - **所有 README 顶部加入 Logo 品牌展示**:在英文、韩文、日文和中文 README
package/docs/manual.md CHANGED
@@ -10,7 +10,7 @@ Code starts, while passing normal Claude Code arguments through unchanged.
10
10
 
11
11
  Credits: One Ciel LLC
12
12
 
13
- Current version: `0.1.33`
13
+ Current version: `0.1.34`
14
14
 
15
15
  ## Install
16
16
 
@@ -247,11 +247,22 @@ Any's saved configuration first, skips the menu, starts the required
247
247
  router services, then immediately executes Claude Code with the remaining
248
248
  arguments.
249
249
 
250
- Basic pattern:
251
-
252
- ```sh
253
- claude-any --ca-provider PROVIDER --ca-model MODEL [claude-code args...]
254
- ```
250
+ Basic pattern:
251
+
252
+ ```sh
253
+ claude-any --ca-provider PROVIDER --ca-model MODEL [claude-code args...]
254
+ ```
255
+
256
+ Configuration precedence is deterministic:
257
+
258
+ 1. Saved user choices from the interactive menu.
259
+ 2. OS environment variables such as `CLAUDE_ANY_PROVIDER`.
260
+ 3. Values loaded from `--ca-env-file .env.claude-any`.
261
+ 4. CLI `--ca-*` parameters.
262
+ 5. If `--ca-menu` is present, the final choice made in the interactive menu.
263
+
264
+ That lets automation provide defaults while still allowing a human operator to
265
+ make the final choice when needed.
255
266
 
256
267
  Direct Claude Code launch examples:
257
268
 
@@ -304,11 +315,11 @@ claude-any \
304
315
  --ca-context-window 65536 \
305
316
  --ca-max-output-tokens 4096
306
317
 
307
- # NVIDIA hosted API Catalog through the local Claude Any router
308
- export NVIDIA_API_KEY="..."
309
- claude-any \
310
- --ca-provider nvidia-hosted \
311
- --ca-api-key-env NVIDIA_API_KEY \
318
+ # NVIDIA hosted API Catalog through the local Claude Any router
319
+ export NVIDIA_API_KEY="..."
320
+ claude-any \
321
+ --ca-provider nvidia-hosted \
322
+ --ca-api-key-env NVIDIA_API_KEY \
312
323
  --ca-model moonshotai/kimi-k2.6 \
313
324
  --ca-request-timeout-ms 300000
314
325
 
@@ -316,9 +327,92 @@ claude-any \
316
327
  claude-any \
317
328
  --ca-provider self-hosted-nim \
318
329
  --ca-base-url http://127.0.0.1:8000 \
319
- --ca-model model \
320
- --ca-api-key not-used
321
- ```
330
+ --ca-model model \
331
+ --ca-api-key not-used
332
+ ```
333
+
334
+ Full headless configuration with flags:
335
+
336
+ ```sh
337
+ claude-any \
338
+ --ca-language en \
339
+ --ca-provider nvidia-hosted \
340
+ --ca-base-url https://integrate.api.nvidia.com/v1 \
341
+ --ca-model z-ai/glm-4.7 \
342
+ --ca-advisor-model deepseek-ai/deepseek-v4-pro \
343
+ --ca-api-key-env NVIDIA_API_KEY \
344
+ --ca-max-output-tokens 4096 \
345
+ --ca-context-window 65536 \
346
+ --ca-request-timeout-ms 300000 \
347
+ --ca-rate-limit-rpm 40 \
348
+ --ca-rate-limit-status on \
349
+ --ca-stream on \
350
+ --ca-stream-word-chunking off \
351
+ --ca-web-search \
352
+ --ca-web-fetch \
353
+ --ca-enable-skills \
354
+ --ca-no-update-check \
355
+ -p "Reply with OK only." \
356
+ --output-format text
357
+ ```
358
+
359
+ Full headless configuration with environment variables:
360
+
361
+ ```sh
362
+ export CLAUDE_ANY_SKIP_MENU=1
363
+ export CLAUDE_ANY_LANGUAGE=en
364
+ export CLAUDE_ANY_PROVIDER=nvidia-hosted
365
+ export CLAUDE_ANY_BASE_URL=https://integrate.api.nvidia.com/v1
366
+ export CLAUDE_ANY_MODEL=z-ai/glm-4.7
367
+ export CLAUDE_ANY_ADVISOR_MODEL=deepseek-ai/deepseek-v4-pro
368
+ export CLAUDE_ANY_API_KEY_ENV=NVIDIA_API_KEY
369
+ export CLAUDE_ANY_MAX_OUTPUT_TOKENS=4096
370
+ export CLAUDE_ANY_CONTEXT_WINDOW=65536
371
+ export CLAUDE_ANY_REQUEST_TIMEOUT_MS=300000
372
+ export CLAUDE_ANY_RATE_LIMIT_RPM=40
373
+ export CLAUDE_ANY_RATE_LIMIT_STATUS=on
374
+ export CLAUDE_ANY_STREAM=on
375
+ export CLAUDE_ANY_STREAM_WORD_CHUNKING=off
376
+ export CLAUDE_ANY_WEB_SEARCH=on
377
+ export CLAUDE_ANY_WEB_FETCH=on
378
+ export CLAUDE_ANY_DISABLE_SKILLS=off
379
+ export CLAUDE_ANY_UPDATE_CHECK=off
380
+ claude-any -p "Reply with OK only." --output-format text
381
+ ```
382
+
383
+ The same values can be stored in a dotenv-style file and loaded explicitly:
384
+
385
+ ```dotenv
386
+ CLAUDE_ANY_SKIP_MENU=1
387
+ CLAUDE_ANY_LANGUAGE=en
388
+ CLAUDE_ANY_PROVIDER=nvidia-hosted
389
+ CLAUDE_ANY_BASE_URL=https://integrate.api.nvidia.com/v1
390
+ CLAUDE_ANY_MODEL=z-ai/glm-4.7
391
+ CLAUDE_ANY_ADVISOR_MODEL=deepseek-ai/deepseek-v4-pro
392
+ CLAUDE_ANY_API_KEY_ENV=NVIDIA_API_KEY
393
+ CLAUDE_ANY_MAX_OUTPUT_TOKENS=4096
394
+ CLAUDE_ANY_CONTEXT_WINDOW=65536
395
+ CLAUDE_ANY_REQUEST_TIMEOUT_MS=300000
396
+ CLAUDE_ANY_RATE_LIMIT_RPM=40
397
+ CLAUDE_ANY_RATE_LIMIT_STATUS=on
398
+ CLAUDE_ANY_STREAM=on
399
+ CLAUDE_ANY_STREAM_WORD_CHUNKING=off
400
+ CLAUDE_ANY_WEB_SEARCH=on
401
+ CLAUDE_ANY_WEB_FETCH=on
402
+ CLAUDE_ANY_DISABLE_SKILLS=off
403
+ CLAUDE_ANY_UPDATE_CHECK=off
404
+ ```
405
+
406
+ ```sh
407
+ claude-any --ca-env-file .env.claude-any -p "Reply with OK only." --output-format text
408
+ ```
409
+
410
+ To let `.env` or CLI values prefill the menu while the user makes the final
411
+ choice, add `--ca-menu`:
412
+
413
+ ```sh
414
+ claude-any --ca-env-file .env.claude-any --ca-model z-ai/glm-4.7 --ca-menu
415
+ ```
322
416
 
323
417
  Passing Claude Code arguments:
324
418
 
@@ -352,31 +446,42 @@ claude-any stop
352
446
 
353
447
  Common Claude Any setup flags:
354
448
 
355
- | Flag | Purpose |
356
- | --- | --- |
357
- | `--ca-provider PROVIDER` | Set provider and skip the menu for this launch. |
358
- | `--ca-model MODEL` | Set the current provider model. |
359
- | `--ca-base-url URL` | Set the current provider base URL. |
360
- | `--ca-api-key KEY` | Store the current provider API key directly. Prefer env vars for scripts. |
361
- | `--ca-api-key-env ENVVAR` | Store the current provider API key from an environment variable. |
449
+ | Flag | Purpose |
450
+ | --- | --- |
451
+ | `--ca-env-file PATH` | Load `CLAUDE_ANY_*` values from a dotenv-style file. |
452
+ | `--ca-menu` | Apply env/flag values, then open the interactive menu for the final user choice. |
453
+ | `--ca-language en|ko|ja|zh` | Set display language. |
454
+ | `--ca-provider PROVIDER` | Set provider and skip the menu for this launch. |
455
+ | `--ca-model MODEL` | Set the current provider model. |
456
+ | `--ca-advisor-model MODEL` | Set the Advisor model; use `off` to disable it. |
457
+ | `--ca-base-url URL` | Set the current provider base URL. |
458
+ | `--ca-api-key KEY` | Store the current provider API key directly. Prefer env vars for scripts. |
459
+ | `--ca-api-key-env ENVVAR` | Store the current provider API key from an environment variable. |
362
460
  | `--ca-set-api-key PROVIDER KEY` | Store a key for a specific provider. |
363
461
  | `--ca-set-api-key-env PROVIDER ENVVAR` | Store a provider key from an environment variable. |
364
- | `--ca-max-output-tokens VALUE` | Set provider output-token cap. |
365
- | `--ca-context-window VALUE` | Set provider/router context-window cap where supported. |
366
- | `--ca-request-timeout-ms VALUE` | Set upstream request timeout in milliseconds. |
367
- | `--ca-ollama-num-ctx VALUE` | Set Ollama `num_ctx`. |
368
- | `--ca-ollama-ctx-range MIN MAX` | Set Ollama auto context range. |
369
- | `--ca-ollama-option KEY=VALUE` | Set an Ollama option such as `temperature=0.3`. |
370
- | `--ca-web-search` / `--ca-no-web-search` | Force-enable or disable web-search MCP for this launch. |
371
- | `--ca-disable-skills` / `--ca-enable-skills` | Control Claude Code skills for this launch. |
372
- | `--ca-no-update-check` | Skip the Claude Code update check. |
373
- | `--ca-status` | Print status and exit. |
462
+ | `--ca-max-output-tokens VALUE` | Set provider output-token cap. |
463
+ | `--ca-context-window VALUE` | Set provider/router context-window cap where supported. |
464
+ | `--ca-request-timeout-ms VALUE` | Set upstream request timeout in milliseconds. |
465
+ | `--ca-rate-limit-rpm VALUE` | Set provider RPM limit; `0` disables throttling but keeps usage display. |
466
+ | `--ca-rate-limit-status on|off` | Show or hide RPM/rate-limit status in the Claude Code statusline. |
467
+ | `--ca-stream on|off` | Enable or disable streaming through the router. |
468
+ | `--ca-stream-word-chunking on|off` | Split streamed text into smaller word-like chunks when enabled. |
469
+ | `--ca-ollama-num-ctx VALUE` | Set Ollama `num_ctx`. |
470
+ | `--ca-ollama-ctx-range MIN MAX` | Set Ollama auto context range. |
471
+ | `--ca-ollama-option KEY=VALUE` | Set an Ollama option such as `temperature=0.3`. |
472
+ | `--ca-web-search` / `--ca-no-web-search` | Force-enable or disable web-search MCP for this launch. |
473
+ | `--ca-web-fetch` / `--ca-no-web-fetch` | Enable or disable fetch MCP for web page content. |
474
+ | `--ca-disable-skills` / `--ca-enable-skills` | Control Claude Code skills for this launch. |
475
+ | `--ca-no-update-check` | Skip the Claude Code update check. |
476
+ | `--ca-status` | Print status and exit. |
374
477
  | `--ca-stop` | Stop managed router services and exit. |
375
478
 
376
479
  Notes for automation:
377
480
 
378
- - `--ca-api-key-env` avoids putting secrets directly in shell history.
379
- - `claude-any stop` is safe to run before scripted tests to remove stale
481
+ - `--ca-api-key-env` avoids putting secrets directly in shell history.
482
+ - `--ca-api-key` and `--ca-set-api-key` are available for direct key passing,
483
+ but prefer the environment-variable forms in shared scripts and terminals.
484
+ - `claude-any stop` is safe to run before scripted tests to remove stale
380
485
  router/proxy processes.
381
486
  - Use `claude-any test 60 auto` for a quick readiness check and reserve
382
487
  `claude-any test 180 full` for deeper provider validation.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oneciel-ai/claude-any",
3
- "version": "0.1.33",
3
+ "version": "0.1.34",
4
4
  "description": "Claude Code provider selector for Anthropic, Ollama, Ollama Cloud, vLLM, NVIDIA hosted, and self-hosted NIM.",
5
5
  "license": "MIT",
6
6
  "author": "One Ciel LLC",