Spaces:
Sleeping
Sleeping
Claude Code commited on
Commit ·
3be6dbc
1
Parent(s): 8445d86
Claude Code: Review and verify Cain's HuggingFace dataset persistence configuration.
Browse files- HF_DATASET_CONFIGURATION_REPORT.md +115 -0
- scripts/verify-hf-dataset.sh +89 -0
HF_DATASET_CONFIGURATION_REPORT.md
CHANGED
|
@@ -272,4 +272,119 @@ For issues or questions:
|
|
| 272 |
|
| 273 |
---
|
| 274 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 275 |
**Report End**
|
|
|
|
| 272 |
|
| 273 |
---
|
| 274 |
|
| 275 |
+
---
|
| 276 |
+
|
| 277 |
+
## Code Implementation Verification (2026-03-14)
|
| 278 |
+
|
| 279 |
+
### ✅ Verified Components
|
| 280 |
+
|
| 281 |
+
| Component | File | Status | Notes |
|
| 282 |
+
|-----------|------|--------|-------|
|
| 283 |
+
| Sync Script | `scripts/sync_hf.py` | ✅ VERIFIED | 929 lines, full implementation |
|
| 284 |
+
| Token Redirect | `scripts/token-redirect.cjs` | ✅ PRESENT | 321 lines, handles auth & A2A |
|
| 285 |
+
| DNS Fix | `scripts/dns-fix.cjs` | ✅ PRESENT | 130 lines, DoH fallback |
|
| 286 |
+
| Dockerfile | `Dockerfile` | ✅ VERIFIED | Node.js 22-bookworm base |
|
| 287 |
+
| Config Template | `.openclaw/openclaw.json` | ✅ TEMPLATE | Dynamic patching via sync_hf.py |
|
| 288 |
+
| Default Config | `scripts/openclaw.json.default` | ✅ PRESENT | Used when config missing |
|
| 289 |
+
|
| 290 |
+
### Key Implementation Details
|
| 291 |
+
|
| 292 |
+
**1. Full Directory Sync (sync_hf.py:182-687)**
|
| 293 |
+
```python
|
| 294 |
+
class OpenClawFullSync:
|
| 295 |
+
"""Upload/download the entire ~/.openclaw directory to HF Dataset."""
|
| 296 |
+
```
|
| 297 |
+
|
| 298 |
+
**2. Change Detection (sync_hf.py:203-239)**
|
| 299 |
+
- Computes hash of file paths + modification times
|
| 300 |
+
- Skips upload when no changes detected
|
| 301 |
+
- Reduces unnecessary API calls
|
| 302 |
+
|
| 303 |
+
**3. Auto-Derived Dataset ID (sync_hf.py:105-120)**
|
| 304 |
+
```python
|
| 305 |
+
# SPACE_ID = "tao-shen/HuggingClaw-Cain"
|
| 306 |
+
# Auto-derived: "tao-shen/HuggingClaw-Cain-data"
|
| 307 |
+
if not HF_REPO_ID and SPACE_ID:
|
| 308 |
+
HF_REPO_ID = f"{SPACE_ID}-data"
|
| 309 |
+
```
|
| 310 |
+
|
| 311 |
+
**4. Graceful Shutdown (sync_hf.py:881-918)**
|
| 312 |
+
- SIGINT/SIGTERM handlers
|
| 313 |
+
- Final sync before exit
|
| 314 |
+
- Background sync cleanup
|
| 315 |
+
|
| 316 |
+
### No Discrepancies Found
|
| 317 |
+
|
| 318 |
+
The code implementation is **correct and complete**. The only issue is the missing `HF_TOKEN` environment variable in the running Space.
|
| 319 |
+
|
| 320 |
+
---
|
| 321 |
+
|
| 322 |
+
## Scripts Verification Summary
|
| 323 |
+
|
| 324 |
+
### `scripts/sync_hf.py` - ✅ Complete Implementation
|
| 325 |
+
|
| 326 |
+
**Key Features:**
|
| 327 |
+
- [x] Full directory sync (~/.openclaw ↔ HF Dataset)
|
| 328 |
+
- [x] Auto-derived dataset ID from SPACE_ID
|
| 329 |
+
- [x] AUTO_CREATE_DATASET support
|
| 330 |
+
- [x] Change detection via file hashing
|
| 331 |
+
- [x] Background sync loop (configurable interval)
|
| 332 |
+
- [x] Graceful shutdown with final sync
|
| 333 |
+
- [x] Telegram API base probing
|
| 334 |
+
- [x] A2A gateway configuration
|
| 335 |
+
- [x] Coding agent configuration
|
| 336 |
+
- [x] Workspace template deployment
|
| 337 |
+
|
| 338 |
+
**Environment Variables Handled:**
|
| 339 |
+
| Variable | Lines | Purpose |
|
| 340 |
+
|----------|-------|---------|
|
| 341 |
+
| `HF_TOKEN` | 61, 191-193 | HF API authentication |
|
| 342 |
+
| `SPACE_ID` | 97, 105-120 | Auto-derive dataset ID |
|
| 343 |
+
| `AUTO_CREATE_DATASET` | 100, 244-266 | Auto-create if missing |
|
| 344 |
+
| `OPENCLAW_DATASET_REPO` | 105 | Manual dataset override |
|
| 345 |
+
| `SYNC_INTERVAL` | 99 | Sync frequency (default: 60s) |
|
| 346 |
+
|
| 347 |
+
### `scripts/token-redirect.cjs` - ✅ Present
|
| 348 |
+
|
| 349 |
+
**Features:**
|
| 350 |
+
- Token-based authentication redirect
|
| 351 |
+
- A2A gateway proxy (port 18800)
|
| 352 |
+
- Office mode frontend serving
|
| 353 |
+
- `/api/state` endpoint
|
| 354 |
+
- Remote agent polling
|
| 355 |
+
- WebSocket upgrade handling
|
| 356 |
+
|
| 357 |
+
### `scripts/dns-fix.cjs` - ✅ Present
|
| 358 |
+
|
| 359 |
+
**Features:**
|
| 360 |
+
- DNS-over-HTTPS via Cloudflare (1.1.1.1)
|
| 361 |
+
- Pre-resolved domain caching
|
| 362 |
+
- System DNS fallback
|
| 363 |
+
- Node.js dns.lookup monkey-patch
|
| 364 |
+
|
| 365 |
+
### Dockerfile - ✅ Correct Architecture
|
| 366 |
+
|
| 367 |
+
**Configuration:**
|
| 368 |
+
```dockerfile
|
| 369 |
+
FROM node:22-bookworm # Correct base
|
| 370 |
+
COPY --from=ghcr.io/openclaw/openclaw:latest
|
| 371 |
+
# A2A gateway extension
|
| 372 |
+
# Claude Code CLI
|
| 373 |
+
# Scripts and frontend
|
| 374 |
+
```
|
| 375 |
+
|
| 376 |
+
---
|
| 377 |
+
|
| 378 |
+
## Conclusion
|
| 379 |
+
|
| 380 |
+
**Code Status:** ✅ All components verified and correctly implemented
|
| 381 |
+
|
| 382 |
+
**Environment Status:** ⚠️ `HF_TOKEN` missing - persistence disabled
|
| 383 |
+
|
| 384 |
+
**Action Required:** Add `HF_TOKEN` and `AUTO_CREATE_DATASET=true` to Space Secrets
|
| 385 |
+
|
| 386 |
+
**Documentation:** ✅ Comprehensive (SETUP.md, PERSISTENCE_README.md)
|
| 387 |
+
|
| 388 |
+
---
|
| 389 |
+
|
| 390 |
**Report End**
|
scripts/verify-hf-dataset.sh
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/bin/bash
|
| 2 |
+
# HF Dataset Persistence Verification Script for Cain
|
| 3 |
+
# This script checks if the required environment variables are set correctly
|
| 4 |
+
|
| 5 |
+
set -e
|
| 6 |
+
|
| 7 |
+
echo "======================================"
|
| 8 |
+
echo "HF Dataset Persistence Verification"
|
| 9 |
+
echo "======================================"
|
| 10 |
+
echo ""
|
| 11 |
+
|
| 12 |
+
# Check HF_TOKEN
|
| 13 |
+
if [ -z "$HF_TOKEN" ]; then
|
| 14 |
+
echo "❌ CRITICAL: HF_TOKEN is NOT set"
|
| 15 |
+
echo " Data persistence will NOT work!"
|
| 16 |
+
echo " Please add HF_TOKEN to your Space's Secrets"
|
| 17 |
+
else
|
| 18 |
+
echo "✅ HF_TOKEN is set"
|
| 19 |
+
fi
|
| 20 |
+
echo ""
|
| 21 |
+
|
| 22 |
+
# Check AUTO_CREATE_DATASET
|
| 23 |
+
if [ "$AUTO_CREATE_DATASET" = "true" ] || [ "$AUTO_CREATE_DATASET" = "1" ]; then
|
| 24 |
+
echo "✅ AUTO_CREATE_DATASET is enabled"
|
| 25 |
+
else
|
| 26 |
+
echo "⚠️ AUTO_CREATE_DATASET is NOT set to true"
|
| 27 |
+
echo " Dataset will NOT be auto-created if missing"
|
| 28 |
+
echo " Current value: $AUTO_CREATE_DATASET"
|
| 29 |
+
fi
|
| 30 |
+
echo ""
|
| 31 |
+
|
| 32 |
+
# Check SPACE_ID and derived dataset
|
| 33 |
+
if [ -n "$SPACE_ID" ]; then
|
| 34 |
+
echo "✅ SPACE_ID: $SPACE_ID"
|
| 35 |
+
DERIVED_DATASET="${SPACE_ID}-data"
|
| 36 |
+
echo " → Derived dataset: $DERIVED_DATASET"
|
| 37 |
+
else
|
| 38 |
+
echo "⚠️ SPACE_ID is not set (expected in HF Spaces)"
|
| 39 |
+
fi
|
| 40 |
+
echo ""
|
| 41 |
+
|
| 42 |
+
# Check for explicit OPENCLAW_DATASET_REPO override
|
| 43 |
+
if [ -n "$OPENCLAW_DATASET_REPO" ]; then
|
| 44 |
+
echo "ℹ️ OPENCLAW_DATASET_REPO (override): $OPENCLAW_DATASET_REPO"
|
| 45 |
+
else
|
| 46 |
+
echo "ℹ️ Using auto-derived dataset ID from SPACE_ID"
|
| 47 |
+
fi
|
| 48 |
+
echo ""
|
| 49 |
+
|
| 50 |
+
# Check sync script exists and is executable
|
| 51 |
+
SYNC_SCRIPT="/home/node/scripts/sync_hf.py"
|
| 52 |
+
if [ -f "$SYNC_SCRIPT" ]; then
|
| 53 |
+
echo "✅ Sync script exists: $SYNC_SCRIPT"
|
| 54 |
+
if [ -x "$SYNC_SCRIPT" ]; then
|
| 55 |
+
echo " Script is executable"
|
| 56 |
+
else
|
| 57 |
+
echo " ⚠️ Script is NOT executable (chmod +x needed)"
|
| 58 |
+
fi
|
| 59 |
+
else
|
| 60 |
+
echo "❌ Sync script NOT found: $SYNC_SCRIPT"
|
| 61 |
+
fi
|
| 62 |
+
echo ""
|
| 63 |
+
|
| 64 |
+
# Check openclaw.json config
|
| 65 |
+
CONFIG_FILE="/home/node/.openclaw/openclaw.json"
|
| 66 |
+
if [ -f "$CONFIG_FILE" ]; then
|
| 67 |
+
echo "✅ OpenClaw config exists: $CONFIG_FILE"
|
| 68 |
+
echo " Content preview:"
|
| 69 |
+
head -n 20 "$CONFIG_FILE" | sed 's/^/ /'
|
| 70 |
+
else
|
| 71 |
+
echo "⚠️ OpenClaw config NOT found (will be created on first run)"
|
| 72 |
+
fi
|
| 73 |
+
echo ""
|
| 74 |
+
|
| 75 |
+
echo "======================================"
|
| 76 |
+
echo "Summary"
|
| 77 |
+
echo "======================================"
|
| 78 |
+
echo ""
|
| 79 |
+
echo "Required for persistence:"
|
| 80 |
+
echo " 1. HF_TOKEN - Hugging Face access token"
|
| 81 |
+
echo " → Create at: https://huggingface.co/settings/tokens"
|
| 82 |
+
echo " → Add to Space: Settings → Secrets (new)"
|
| 83 |
+
echo ""
|
| 84 |
+
echo " 2. AUTO_CREATE_DATASET=true (optional)"
|
| 85 |
+
echo " → Auto-create dataset if it doesn't exist"
|
| 86 |
+
echo " → Add to Space: Settings → Environment Variables"
|
| 87 |
+
echo ""
|
| 88 |
+
echo "The dataset will be named: ${SPACE_ID:-<SPACE_ID>}-data"
|
| 89 |
+
echo ""
|