#!/bin/bash set -e echo "=== BBToken OpenCode Quickstart (Linux) ===" if [ -z "$BASE_URL" ] || [ -z "$API_KEY" ]; then echo "Error: BASE_URL and API_KEY environment variables are required" echo "Usage: BASE_URL=https://bbtoken.cloud/v1 API_KEY=sk-bbt-... bash <(curl -fsSL https://bbtoken.cloud/docs/linux.sh)" exit 1 fi # Step 1: Install OpenCode if not found if command -v opencode &> /dev/null; then echo "[OK] opencode already installed" else echo "-> Installing opencode..." curl -fsSL https://opencode.ai/install | bash echo "[OK] opencode installed" fi # Step 2: Fetch available models from /v1/models echo "-> Fetching available models..." MODELS_RESPONSE=$(curl -s "$BASE_URL/models" -H "Authorization: Bearer $API_KEY") if command -v python3 &> /dev/null; then MODEL_IDS=$(echo "$MODELS_RESPONSE" | python3 -c "import sys,json; d=json.load(sys.stdin); [print(m['id']) for m in d.get('data',[])]" 2>/dev/null) VISION_MODELS=$(echo "$MODELS_RESPONSE" | python3 -c "import sys,json; d=json.load(sys.stdin); [print(m['id']) for m in d.get('data',[]) if m.get('vision') is True]" 2>/dev/null) elif command -v jq &> /dev/null; then MODEL_IDS=$(echo "$MODELS_RESPONSE" | jq -r '.data[].id' 2>/dev/null) VISION_MODELS=$(echo "$MODELS_RESPONSE" | jq -r '.data[] | select(.vision == true) | .id' 2>/dev/null) else echo "[Warning] Neither python3 nor jq found. Using default models." MODEL_IDS="glm-5.2" VISION_MODELS="" fi FIRST_MODEL=$(echo "$MODEL_IDS" | head -n1) if [ -z "$FIRST_MODEL" ]; then echo "[Warning] No models returned. Using fallback." FIRST_MODEL="glm-5.2" MODEL_IDS="glm-5.2" VISION_MODELS="" fi echo "[OK] Found $(echo "$MODEL_IDS" | wc -l | tr -d ' ') models, default: $FIRST_MODEL" # Step 3: Create config directory CONFIG_DIR="$HOME/.config/opencode" mkdir -p "$CONFIG_DIR" # Step 4: Generate opencode config with fetched models { echo '{' echo ' "$schema": "https://opencode.ai/config.json",' echo ' "provider": {' echo ' "bbtoken": {' echo ' "npm": "@ai-sdk/openai-compatible",' echo ' "options": {' echo " \"baseURL\": \"$BASE_URL\"," echo " \"apiKey\": \"$API_KEY\"" echo ' },' echo ' "models": {' TOTAL=$(echo "$MODEL_IDS" | wc -l | tr -d ' ') COUNT=0 while IFS= read -r model; do COUNT=$((COUNT + 1)) if [ $COUNT -lt $TOTAL ]; then COMMA="," else COMMA="" fi INPUT='["text"]' if printf '%s\n' "$VISION_MODELS" | grep -Fxq "$model"; then INPUT='["text", "image"]'; fi echo " \"$model\": { \"name\": \"$model\", \"modalities\": { \"input\": $INPUT, \"output\": [\"text\"] } }$COMMA" done <<< "$MODEL_IDS" echo ' }' echo ' }' echo ' },' echo " \"model\": \"bbtoken/$FIRST_MODEL\"," echo " \"permission\": \"allow\"" echo '}' } > "$CONFIG_DIR/opencode.json" # Step 5: Write to opencode.jsonc as well cp "$CONFIG_DIR/opencode.json" "$CONFIG_DIR/opencode.jsonc" echo "[OK] Config written to:" echo " $CONFIG_DIR/opencode.json" echo " $CONFIG_DIR/opencode.jsonc" echo "" echo "=== Done! ===" echo "Now run: opencode" echo "Default model: bbtoken/$FIRST_MODEL"