63 lines
2.1 KiB
Python
Executable File
63 lines
2.1 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""Code Claw Launcher - OpenRouter primary, Kimi fallback
|
|
Keys read at runtime from source files. No hardcoded secrets."""
|
|
|
|
import os, sys, json, subprocess, time
|
|
|
|
OR_KEY_FILE = r"/Users/apayne/.timmy/openrouter_key"
|
|
CLAW_BIN = r"/Users/apayne/code-claw/rust/target/debug/claw"
|
|
CONF_HOME = r"/Users/apayne/.claw-qwen36-openrouter"
|
|
|
|
# Models that support tool-use (bash). Ordered: try cheaper first.
|
|
MODELS = [
|
|
"qwen/qwen3-235b-a22b", # heavy hitter, tool-use capable
|
|
"anthropic/claude-3.5-haiku-20241022", # cheaper alternative
|
|
]
|
|
|
|
def probe(key, model, timeout=15):
|
|
"""Test if a model is available via OpenRouter."""
|
|
try:
|
|
r = subprocess.run(
|
|
["curl","-s","-o","/dev/null","-w","%{http_code}",
|
|
"--max-time",str(timeout),
|
|
"https://openrouter.ai/api/v1/chat/completions",
|
|
"-H","Authorization: Bearer "+key,
|
|
"-H","Content-Type: application/json",
|
|
"-d",json.dumps({"model":model,"max_tokens":5,
|
|
"messages":[{"role":"user","content":"hi"}]})],
|
|
capture_output=True, text=True, timeout=timeout+5)
|
|
return int(r.stdout) if r.stdout.isdigit() else 0
|
|
except Exception:
|
|
return 0
|
|
|
|
def main():
|
|
with open(OR_KEY_FILE) as f:
|
|
key = f.read().strip()
|
|
os.makedirs(CONF_HOME, exist_ok=True)
|
|
os.chdir(os.path.dirname(CLAW_BIN))
|
|
env = os.environ.copy()
|
|
env["CLAW_FORCE_OPENAI_COMPAT"] = "1"
|
|
env["OPENAI_API_KEY"] = key
|
|
env["OPENAI_BASE_URL"] = "https://openrouter.ai/api/v1"
|
|
env["CLAW_CONFIG_HOME"] = CONF_HOME
|
|
print("Code Claw Launcher")
|
|
print("=" * 50)
|
|
for m in MODELS:
|
|
s = probe(key, m)
|
|
print(" Probe [%s]: HTTP %d" % (m, s))
|
|
if s == 200:
|
|
print("")
|
|
print(" -> Launching with " + m)
|
|
print("=" * 50)
|
|
time.sleep(0.5)
|
|
os.execve(CLAW_BIN, [CLAW_BIN, "--model", m], env)
|
|
return
|
|
print("")
|
|
print(" -> OpenRouter unavailable. Falling back to Kimi CLI.")
|
|
print("=" * 50)
|
|
time.sleep(0.5)
|
|
os.execvp("kimi-cli", ["kimi-cli"])
|
|
|
|
if __name__ == "__main__":
|
|
main()
|