#!/usr/bin/env bash # show-current.sh — Display the current model configuration from openclaw state # Usage: show-current.sh set -euo pipefail # Find the state file STATE_FILE="${OPENCLAW_STATE_DIR:-$HOME/.openclaw/state}/openclaw.json" if [[ ! -f "$STATE_FILE" ]]; then # Try alternative locations for alt in \ "/opt/openclaw/state/openclaw.json" \ "${OPENCLAW_CONFIG_DIR:-$HOME/.openclaw/config}/openclaw.json"; do if [[ -f "$alt" ]]; then STATE_FILE="$alt" break fi done fi if [[ ! -f "$STATE_FILE" ]]; then echo "ERROR: Cannot find openclaw.json state file" >&2 echo "Searched:" >&2 echo " ${OPENCLAW_STATE_DIR:-$HOME/.openclaw/state}/openclaw.json" >&2 echo " /opt/openclaw/state/openclaw.json" >&2 echo " ${OPENCLAW_CONFIG_DIR:-$HOME/.openclaw/config}/openclaw.json" >&2 exit 1 fi echo "📁 Config file: $STATE_FILE" echo "" python3 -c " import json, sys, re # Read file and strip JSON5 comments for parsing with open('$STATE_FILE', 'r') as f: content = f.read() # Strip single-line comments (// ...) but not inside strings lines = content.split('\n') cleaned = [] for line in lines: stripped = line.rstrip() s = stripped.lstrip() if s.startswith('//'): continue in_string = False result = [] i = 0 while i < len(stripped): c = stripped[i] if c == '\"' and (i == 0 or stripped[i-1] != '\\\\'): in_string = not in_string elif c == '/' and i + 1 < len(stripped) and stripped[i+1] == '/' and not in_string: break result.append(c) i += 1 cleaned.append(''.join(result)) # Remove trailing commas (JSON5) json_str = '\n'.join(cleaned) json_str = re.sub(r',\s*([}\]])', r'\1', json_str) try: cfg = json.loads(json_str) except json.JSONDecodeError: try: cfg = json.loads(content) except json.JSONDecodeError as e: print(f'ERROR: Failed to parse config: {e}', file=sys.stderr) sys.exit(1) agents = cfg.get('agents', {}) defaults = agents.get('defaults', {}) model = defaults.get('model', {}) if isinstance(model, str): print(f'🎯 Primary: {model}') print(f'⛓️ Fallbacks: (none configured)') else: primary = model.get('primary', '(not set)') fallbacks = model.get('fallbacks', []) print(f'🎯 Primary: {primary}') print(f'⛓️ Fallbacks ({len(fallbacks)}):') for i, fb in enumerate(fallbacks, 1): print(f' {i}. {fb}') # Check for per-agent model overrides agent_list = agents.get('list', []) overrides = [(a.get('id', '?'), a.get('model', '')) for a in agent_list if 'model' in a] if overrides: print() print('⚠️ Per-agent model overrides:') for aid, amodel in overrides: print(f' {aid}: {amodel}') " 2>&1