@oneciel-ai/claude-any 0.1.32 → 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
@@ -1,6 +1,10 @@
1
- # Claude Any
2
-
3
- ![Claude Any: full Claude Code experience with free or low-cost LLMs](claude-any-adv.png)
1
+ # Claude Any
2
+
3
+ <p align="center">
4
+ <img src="logo.png" alt="Claude Any logo" width="360">
5
+ </p>
6
+
7
+ ![Claude Any: full Claude Code experience with free or low-cost LLMs](claude-any-adv.png)
4
8
 
5
9
  | English | [한국어](docs/README.ko.md) | [日本語](docs/README.ja.md) | [中文](docs/README.zh.md) |
6
10
  | --- | --- | --- | --- |
@@ -44,7 +48,7 @@ arguments through unchanged.
44
48
 
45
49
  Credits: One Ciel LLC
46
50
 
47
- Current version: `0.1.32`
51
+ Current version: `0.1.34`
48
52
 
49
53
  ## Why This Exists
50
54
 
@@ -117,14 +121,57 @@ Run one non-interactive Claude Code prompt:
117
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
118
122
  ```
119
123
 
120
- Use the saved provider/model and only skip the menu:
121
-
122
- ```sh
123
- CLAUDE_ANY_SKIP_MENU=1 claude-any -p "Summarize this repository." --output-format text
124
- ```
125
-
126
- More examples are in [Headless Examples](#headless-examples) and
127
- [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).
128
175
 
129
176
  **Upgrade:**
130
177
 
@@ -334,6 +381,21 @@ steps under that larger model's supervision.
334
381
 
335
382
  ## Changelog
336
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
+
392
+ ### 0.1.33
393
+
394
+ - **Logo branding in every README**: add the Claude Any logo at the top of the
395
+ English, Korean, Japanese, and Chinese README files.
396
+ - **npm image assets included**: package `logo.png`, `logo-small.png`, and
397
+ `claude-any-adv.png` so the npm README renders the same branding as GitHub.
398
+
337
399
  ### 0.1.32
338
400
 
339
401
  - **NVIDIA preset menu fix**: LLM presets no longer try to apply the unsupported
Binary file
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.32"
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
@@ -1,6 +1,10 @@
1
- # Claude Any
2
-
3
- ![Claude Any: 無料または低コスト LLM で Claude Code 体験](../claude-any-adv.png)
1
+ # Claude Any
2
+
3
+ <p align="center">
4
+ <img src="../logo.png" alt="Claude Any ロゴ" width="360">
5
+ </p>
6
+
7
+ ![Claude Any: 無料または低コスト LLM で Claude Code 体験](../claude-any-adv.png)
4
8
 
5
9
  | [English](../README.md) | [한국어](README.ko.md) | 日本語 | [中文](README.zh.md) |
6
10
  | --- | --- | --- | --- |
@@ -43,7 +47,7 @@ vLLM、NVIDIA hosted、self-hosted NIM を選択し、通常の Claude Code 引
43
47
 
44
48
  Credits: One Ciel LLC
45
49
 
46
- 現在のバージョン: `0.1.32`
50
+ 現在のバージョン: `0.1.34`
47
51
 
48
52
  ## 作られた理由
49
53
 
@@ -112,13 +116,53 @@ claude-any --ca-provider ollama --ca-base-url http://127.0.0.1:11434 --ca-model
112
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
113
117
  ```
114
118
 
115
- 保存済み provider/model を使い、メニューだけをスキップ:
116
-
117
- ```sh
118
- CLAUDE_ANY_SKIP_MENU=1 claude-any -p "Summarize this repository." --output-format text
119
- ```
120
-
121
- その他の例は [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) を参照してください。
122
166
 
123
167
  **アップグレード:**
124
168
 
@@ -307,6 +351,20 @@ Windows/Linux 管理、クリーンアップスクリプト、定期的なセキ
307
351
 
308
352
  ## 変更履歴
309
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
+
361
+ ### 0.1.33
362
+
363
+ - **すべての README の先頭にロゴを追加**: 英語、韓国語、日本語、中国語 README
364
+ の先頭に Claude Any ロゴを配置しました。
365
+ - **npm に画像アセットを同梱**: npm README でも GitHub と同じブランディングが
366
+ 表示されるよう、`logo.png`、`logo-small.png`、`claude-any-adv.png` をパッケージに含めました。
367
+
310
368
  ### 0.1.32
311
369
 
312
370
  - **NVIDIA preset メニュー修正**: NVIDIA hosted で未対応の `native` option を
package/docs/README.ko.md CHANGED
@@ -1,6 +1,10 @@
1
- # Claude Any
2
-
3
- ![Claude Any: 무료 또는 저비용 LLM으로 Claude Code 경험](../claude-any-adv.png)
1
+ # Claude Any
2
+
3
+ <p align="center">
4
+ <img src="../logo.png" alt="Claude Any 로고" width="360">
5
+ </p>
6
+
7
+ ![Claude Any: 무료 또는 저비용 LLM으로 Claude Code 경험](../claude-any-adv.png)
4
8
 
5
9
  | [English](../README.md) | 한국어 | [日本語](README.ja.md) | [中文](README.zh.md) |
6
10
  | --- | --- | --- | --- |
@@ -43,7 +47,7 @@ NVIDIA hosted, self-hosted NIM을 선택하고, Claude Code의 일반 인자는
43
47
 
44
48
  Credits: One Ciel LLC
45
49
 
46
- 현재 버전: `0.1.32`
50
+ 현재 버전: `0.1.34`
47
51
 
48
52
  ## 왜 만들었나
49
53
 
@@ -112,14 +116,54 @@ claude-any --ca-provider ollama --ca-base-url http://127.0.0.1:11434 --ca-model
112
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
113
117
  ```
114
118
 
115
- 저장된 provider/model을 그대로 쓰고 메뉴만 건너뛰기:
116
-
117
- ```sh
118
- CLAUDE_ANY_SKIP_MENU=1 claude-any -p "Summarize this repository." --output-format text
119
- ```
120
-
121
- 많은 예시는 [헤드리스 예제](#헤드리스-에이전트-채팅)와
122
- [전체 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)을 참고하세요.
123
167
 
124
168
  **업그레이드:**
125
169
 
@@ -307,6 +351,20 @@ Windows 이벤트 로그 리뷰, 바이러스/랜섬웨어 침입 시도 정리,
307
351
 
308
352
  ## 변경 이력
309
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
+
361
+ ### 0.1.33
362
+
363
+ - **모든 README 상단 로고 브랜딩**: 영어, 한국어, 일본어, 중국어 README 최상단에
364
+ Claude Any 로고를 추가했습니다.
365
+ - **npm 이미지 자산 포함**: npm README에서도 GitHub와 같은 브랜딩이 보이도록
366
+ `logo.png`, `logo-small.png`, `claude-any-adv.png`를 패키지에 포함했습니다.
367
+
310
368
  ### 0.1.32
311
369
 
312
370
  - **NVIDIA preset 메뉴 수정**: NVIDIA hosted에서 지원하지 않는 `native` 옵션을
package/docs/README.zh.md CHANGED
@@ -1,6 +1,10 @@
1
- # Claude Any
2
-
3
- ![Claude Any: 使用免费或低成本 LLM 获得 Claude Code 体验](../claude-any-adv.png)
1
+ # Claude Any
2
+
3
+ <p align="center">
4
+ <img src="../logo.png" alt="Claude Any 标志" width="360">
5
+ </p>
6
+
7
+ ![Claude Any: 使用免费或低成本 LLM 获得 Claude Code 体验](../claude-any-adv.png)
4
8
 
5
9
  | [English](../README.md) | [한국어](README.ko.md) | [日本語](README.ja.md) | 中文 |
6
10
  | --- | --- | --- | --- |
@@ -43,7 +47,7 @@ NIM,并把普通 Claude Code 参数原样传递。
43
47
 
44
48
  Credits: One Ciel LLC
45
49
 
46
- 当前版本: `0.1.32`
50
+ 当前版本: `0.1.34`
47
51
 
48
52
  ## 为什么存在
49
53
 
@@ -109,13 +113,53 @@ claude-any --ca-provider ollama --ca-base-url http://127.0.0.1:11434 --ca-model
109
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
110
114
  ```
111
115
 
112
- 使用已保存的 provider/model,只跳过菜单:
113
-
114
- ```sh
115
- CLAUDE_ANY_SKIP_MENU=1 claude-any -p "Summarize this repository." --output-format text
116
- ```
117
-
118
- 更多示例见 [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)。
119
163
 
120
164
  **升级:**
121
165
 
@@ -293,6 +337,20 @@ Hermes 格式模型或部分较旧的 Qwen tool template。
293
337
 
294
338
  ## 更新日志
295
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
+
347
+ ### 0.1.33
348
+
349
+ - **所有 README 顶部加入 Logo 品牌展示**:在英文、韩文、日文和中文 README
350
+ 顶部添加 Claude Any Logo。
351
+ - **npm 包包含图片资源**:将 `logo.png`、`logo-small.png` 和
352
+ `claude-any-adv.png` 打进包内,让 npm README 与 GitHub 显示一致的品牌图片。
353
+
296
354
  ### 0.1.32
297
355
 
298
356
  - **NVIDIA preset 菜单修复**:在 NVIDIA hosted 上应用 LLM preset 时不再触碰
package/docs/manual.md CHANGED
@@ -1,12 +1,16 @@
1
- # Claude Any Manual
2
-
3
- Claude Any is a pre-launch configuration layer for Claude Code. It lets you
4
- choose a provider, model, base URL, API key, and provider options before Claude
5
- Code starts, while passing normal Claude Code arguments through unchanged.
1
+ # Claude Any Manual
2
+
3
+ <p align="center">
4
+ <img src="../logo-small.png" alt="Claude Any logo" width="220">
5
+ </p>
6
+
7
+ Claude Any is a pre-launch configuration layer for Claude Code. It lets you
8
+ choose a provider, model, base URL, API key, and provider options before Claude
9
+ Code starts, while passing normal Claude Code arguments through unchanged.
6
10
 
7
11
  Credits: One Ciel LLC
8
12
 
9
- Current version: `0.1.32`
13
+ Current version: `0.1.34`
10
14
 
11
15
  ## Install
12
16
 
@@ -243,11 +247,22 @@ Any's saved configuration first, skips the menu, starts the required
243
247
  router services, then immediately executes Claude Code with the remaining
244
248
  arguments.
245
249
 
246
- Basic pattern:
247
-
248
- ```sh
249
- claude-any --ca-provider PROVIDER --ca-model MODEL [claude-code args...]
250
- ```
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.
251
266
 
252
267
  Direct Claude Code launch examples:
253
268
 
@@ -300,11 +315,11 @@ claude-any \
300
315
  --ca-context-window 65536 \
301
316
  --ca-max-output-tokens 4096
302
317
 
303
- # NVIDIA hosted API Catalog through the local Claude Any router
304
- export NVIDIA_API_KEY="..."
305
- claude-any \
306
- --ca-provider nvidia-hosted \
307
- --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 \
308
323
  --ca-model moonshotai/kimi-k2.6 \
309
324
  --ca-request-timeout-ms 300000
310
325
 
@@ -312,9 +327,92 @@ claude-any \
312
327
  claude-any \
313
328
  --ca-provider self-hosted-nim \
314
329
  --ca-base-url http://127.0.0.1:8000 \
315
- --ca-model model \
316
- --ca-api-key not-used
317
- ```
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
+ ```
318
416
 
319
417
  Passing Claude Code arguments:
320
418
 
@@ -348,31 +446,42 @@ claude-any stop
348
446
 
349
447
  Common Claude Any setup flags:
350
448
 
351
- | Flag | Purpose |
352
- | --- | --- |
353
- | `--ca-provider PROVIDER` | Set provider and skip the menu for this launch. |
354
- | `--ca-model MODEL` | Set the current provider model. |
355
- | `--ca-base-url URL` | Set the current provider base URL. |
356
- | `--ca-api-key KEY` | Store the current provider API key directly. Prefer env vars for scripts. |
357
- | `--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. |
358
460
  | `--ca-set-api-key PROVIDER KEY` | Store a key for a specific provider. |
359
461
  | `--ca-set-api-key-env PROVIDER ENVVAR` | Store a provider key from an environment variable. |
360
- | `--ca-max-output-tokens VALUE` | Set provider output-token cap. |
361
- | `--ca-context-window VALUE` | Set provider/router context-window cap where supported. |
362
- | `--ca-request-timeout-ms VALUE` | Set upstream request timeout in milliseconds. |
363
- | `--ca-ollama-num-ctx VALUE` | Set Ollama `num_ctx`. |
364
- | `--ca-ollama-ctx-range MIN MAX` | Set Ollama auto context range. |
365
- | `--ca-ollama-option KEY=VALUE` | Set an Ollama option such as `temperature=0.3`. |
366
- | `--ca-web-search` / `--ca-no-web-search` | Force-enable or disable web-search MCP for this launch. |
367
- | `--ca-disable-skills` / `--ca-enable-skills` | Control Claude Code skills for this launch. |
368
- | `--ca-no-update-check` | Skip the Claude Code update check. |
369
- | `--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. |
370
477
  | `--ca-stop` | Stop managed router services and exit. |
371
478
 
372
479
  Notes for automation:
373
480
 
374
- - `--ca-api-key-env` avoids putting secrets directly in shell history.
375
- - `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
376
485
  router/proxy processes.
377
486
  - Use `claude-any test 60 auto` for a quick readiness check and reserve
378
487
  `claude-any test 180 full` for deeper provider validation.
package/logo-small.png ADDED
Binary file
package/logo.png ADDED
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oneciel-ai/claude-any",
3
- "version": "0.1.32",
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",
@@ -24,9 +24,12 @@
24
24
  "claude-any-tool-guard.py",
25
25
  "npm-bin/",
26
26
  "install.sh",
27
- "install.ps1",
28
- "README.md",
29
- "LICENSE",
27
+ "install.ps1",
28
+ "README.md",
29
+ "logo.png",
30
+ "logo-small.png",
31
+ "claude-any-adv.png",
32
+ "LICENSE",
30
33
  "NOTICE",
31
34
  "docs/"
32
35
  ],