Files
timmy-home/scripts/codeclaw-launcher.py

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()