yt-claw-v9 / start.sh
Arshit Malik
fix: route /v1/ to gateway for chat API
ad44f36
Raw
History Blame
4.31 kB
#!/bin/bash
set -e
pkill -f "health" 2>/dev/null || true
crontab -r 2>/dev/null || true
echo "[boot] Pulling OpenClaw state from Dataset..."
python3 -c "
import sys, os; sys.path.insert(0, '/app')
HF_TOKEN = os.environ.get('HF_TOKEN', '')
DATASET_REPO = os.environ.get('OPENCLAW_DATASET_REPO', '')
if HF_TOKEN and DATASET_REPO:
from huggingface_hub import hf_hub_download
from huggingface_hub.utils import EntryNotFoundError
for fname in ['openclaw.json', 'SOUL.md']:
try:
hf_hub_download(repo_id=DATASET_REPO, filename=f'openclaw/{fname}',
repo_type='dataset', token=HF_TOKEN,
local_dir='/root', local_dir_use_symlinks=False)
except EntryNotFoundError: pass
except Exception as e: print(f' {e}')
"
echo "[boot] Configuring OpenClaw..."
mkdir -p ~/.openclaw
cat > ~/.openclaw/openclaw.json << JSONEOF
{
"gateway": {
"port": 8081,
"bind": "loopback",
"mode": "local",
"channelHealthCheckMinutes": 0,
"auth": {"mode": "none"}
},
"models": {
"providers": {
"ollama": {
"baseUrl": "http://127.0.0.1:11434/v1",
"apiKey": "ollama-local",
"api": "openai-completions",
"models": [
{
"id": "hf.co/bartowski/DeepSeek-R1-Distill-Qwen-14B-GGUF:IQ3_XS",
"name": "DeepSeek R1 Distill Qwen 14B",
"contextWindow": 131072,
"maxTokens": 8192,
"input": ["text"]
}
]
}
}
},
"agents": {
"defaults": {
"model": {"primary": "ollama/hf.co/bartowski/DeepSeek-R1-Distill-Qwen-14B-GGUF:IQ3_XS"},
"workspace": "/app/yt-flow"
}
}
}
JSONEOF
[ -f /app/SOUL.md ] && cp /app/SOUL.md ~/.openclaw/SOUL.md
git config --global user.name "YT Pipeline Bot"
git config --global user.email "yt-pipe-bot@hf.space"
git clone https://arshitmalik:${HF_TOKEN}@huggingface.co/spaces/arshitmalik/yt-flow /app/yt-flow 2>/dev/null || true
cat > /tmp/backup.sh << 'CRONEOF'
#!/bin/bash
python3 -c "
import os, sys; sys.path.insert(0, '/app')
HF_TOKEN = os.environ.get('HF_TOKEN', '')
DATASET_REPO = os.environ.get('OPENCLAW_DATASET_REPO', '')
if not HF_TOKEN or not DATASET_REPO: sys.exit(0)
from huggingface_hub import HfApi
api = HfApi(token=HF_TOKEN)
from pathlib import Path
for f in Path('/root/.openclaw').glob('*'):
if f.is_file():
try:
api.upload_file(
path_or_fileobj=str(f),
path_in_repo=f'openclaw/{f.name}',
repo_id=DATASET_REPO,
repo_type='dataset'
)
except Exception as e: pass
" 2>/dev/null
CRONEOF
chmod +x /tmp/backup.sh
echo "*/15 * * * * /tmp/backup.sh" | crontab -
echo "[boot] Starting health server on :8080..."
python3 /app/health_server.py &
echo "[boot] Health server PID: $!"
echo "[boot] Starting nginx..."
sed -i "s|location /health|location /v1/ { proxy_pass http://127.0.0.1:8081; proxy_http_version 1.1; proxy_set_header Host \$host; }
location /health|" /etc/nginx/sites-available/default
nginx
echo "[boot] Starting Ollama..."
export OLLAMA_FLASH_ATTENTION=1
export OLLAMA_KV_CACHE_TYPE=q4_0
export OLLAMA_NUM_CTX=131072
OLLAMA_HOST=127.0.0.1 OLLAMA_NUM_PARALLEL=1 OLLAMA_MAX_LOADED_MODELS=1 ollama serve &
for i in $(seq 1 30); do
if curl -sf http://127.0.0.1:11434/api/tags > /dev/null 2>&1; then
echo "[boot] Ollama ready after ${i}s"; break
fi
sleep 2
done
echo "[boot] Pulling IQ3_XS model for 128K context..."
ollama pull hf.co/bartowski/DeepSeek-R1-Distill-Qwen-14B-GGUF:IQ3_XS &
PULL_PID=$!
wait $PULL_PID
echo "[boot] Model ready"
echo "[boot] Starting OpenClaw gateway on :8081..."
openclaw gateway --allow-unconfigured 2>&1 &
OPENCLAW_PID=$!
echo "[boot] Waiting for OpenClaw..."
for i in $(seq 1 30); do
if curl -sf http://127.0.0.1:8081/health > /dev/null 2>&1; then
echo "[boot] OpenClaw ready after ${i}s"
break
fi
sleep 2
done
sleep 10
pkill -f "health-monitor" 2>/dev/null || true
echo ""
echo "=============================================="
echo " OpenClaw LIVE - 14B IQ3_XS (128K)"
echo " Visit the health page for the canvas link."
echo "=============================================="
echo ""
wait $OPENCLAW_PID 2>/dev/null
sleep infinity