rts-commander / docs /AI_MODEL_FIX.md
Luigi's picture
chore(structure): move docs into docs/ and tests into tests/
ccbaf39

๐Ÿค– AI Model Configuration for HF Spaces

Date: 3 octobre 2025
Issue Fixed: Permission denied when downloading AI model
Status: โœ… RESOLVED


๐Ÿ› Problem Identified

Error Log

โš ๏ธ AI Model not found. Attempting automatic download...
๐Ÿ“ฆ Downloading model (~350 MB)...
   From: https://huggingface.co/Qwen/Qwen2.5-0.5B-Instruct-GGUF/resolve/main/qwen2.5-0.5b-instruct-q4_0.gguf
   To: /home/luigi/rts/qwen2.5-0.5b-instruct-q4_0.gguf
   This may take a few minutes...
โŒ Auto-download failed: [Errno 13] Permission denied: '/home/luigi'
   Tactical analysis disabled.

Root Cause

  1. Hardcoded path: /home/luigi/rts/qwen2.5-0.5b-instruct-q4_0.gguf
  2. No permission handling: Tried to write to user home directory
  3. HF Spaces incompatibility: Container runs as different user

โœ… Fix Applied

Changes in ai_analysis.py

1. Smart Path Resolution (Lines 193-200)

# Before:
possible_paths = [
    Path("/home/luigi/rts/qwen2.5-0.5b-instruct-q4_0.gguf"),  # โŒ Hardcoded
    Path("./qwen2.5-0.5b-instruct-q4_0.gguf"),
    Path("../qwen2.5-0.5b-instruct-q4_0.gguf"),
]

# After:
possible_paths = [
    Path("./qwen2.5-0.5b-instruct-q4_0.gguf"),  # Current directory
    Path("../qwen2.5-0.5b-instruct-q4_0.gguf"),  # Parent directory
    Path(__file__).parent / "qwen2.5-0.5b-instruct-q4_0.gguf",  # Same dir as script
    Path(__file__).parent.parent / "qwen2.5-0.5b-instruct-q4_0.gguf",  # Root project
]

2. Permission-Safe Download (Lines 217-227)

# Test write permission first
try:
    default_path = Path("./qwen2.5-0.5b-instruct-q4_0.gguf").resolve()
    # Test write permission
    test_file = default_path.parent / ".write_test"
    test_file.touch()
    test_file.unlink()
except (PermissionError, OSError):
    # Fallback to temp directory
    import tempfile
    default_path = Path(tempfile.gettempdir()) / "qwen2.5-0.5b-instruct-q4_0.gguf"

Benefits

  • โœ… No more hardcoded paths
  • โœ… Tests write permissions before download
  • โœ… Falls back to /tmp/ if needed
  • โœ… Works on HF Spaces containers
  • โœ… Works on local development
  • โœ… Graceful degradation (game works without AI)

๐ŸŽฎ Game Behavior

Without AI Model

INFO:     Uvicorn running on http://0.0.0.0:7860
โš ๏ธ AI Model not found. Attempting automatic download...
๐Ÿ“ฆ Downloading model (~350 MB)...
   [Download progress or fallback message]

Game still works! Tactical analysis is optional.

With AI Model

INFO:     Uvicorn running on http://0.0.0.0:7860
โœ… AI Model loaded: ./qwen2.5-0.5b-instruct-q4_0.gguf
๐Ÿง  Tactical analysis available

Players can use AI analysis feature.


๐Ÿ“ฆ Model Information

Qwen2.5-0.5B-Instruct-GGUF

Download Locations (Priority Order)

  1. ./qwen2.5-0.5b-instruct-q4_0.gguf (current directory)
  2. ../qwen2.5-0.5b-instruct-q4_0.gguf (parent directory)
  3. /web/qwen2.5-0.5b-instruct-q4_0.gguf (script directory)
  4. /qwen2.5-0.5b-instruct-q4_0.gguf (project root)
  5. /tmp/qwen2.5-0.5b-instruct-q4_0.gguf (fallback)

๐Ÿš€ HF Spaces Deployment

Option 1: Include Model in Repo (Recommended for Demo)

cd /home/luigi/rts/web

# Download model to web directory
wget https://huggingface.co/Qwen/Qwen2.5-0.5B-Instruct-GGUF/resolve/main/qwen2.5-0.5b-instruct-q4_0.gguf

# Add to git
git add qwen2.5-0.5b-instruct-q4_0.gguf
git commit -m "feat: Include AI model for tactical analysis"

# Push to HF Spaces
git push

Pros:

  • โœ… AI available immediately
  • โœ… No download delay on startup
  • โœ… Deterministic deployment

Cons:

  • โŒ Larger repo size (~350 MB)
  • โŒ Slower git operations

Option 2: Download on Startup (Current Behavior)

# Model will be downloaded automatically on first run
# Falls back to /tmp/ on HF Spaces

Pros:

  • โœ… Smaller repo size
  • โœ… Faster git operations

Cons:

  • โŒ ~1 minute startup delay on first run
  • โŒ Uses ephemeral storage (lost on container restart)
  • โŒ Download may fail on HF free tier

Option 3: Disable AI (Minimal Deployment)

# In app.py or environment variable
AI_ENABLED = False

Pros:

  • โœ… Instant startup
  • โœ… Minimal resource usage
  • โœ… No download issues

Cons:

  • โŒ No tactical analysis feature

๐Ÿ”ง Configuration

Environment Variables

# Optional: Override model path
export AI_MODEL_PATH="/path/to/qwen2.5-0.5b-instruct-q4_0.gguf"

# Optional: Disable AI entirely
export AI_ENABLED="false"

In app.py

# Current implementation:
ai_analyzer = AIAnalyzer()  # Auto-detects model

# With explicit path:
ai_analyzer = AIAnalyzer(model_path="/custom/path/model.gguf")

# Disable AI:
ai_analyzer = None  # Game will skip AI analysis

๐Ÿงช Testing

Test Fix Locally

cd /home/luigi/rts/web

# Remove model if exists
rm -f qwen2.5-0.5b-instruct-q4_0.gguf

# Start server
python app.py

# Should see:
# โœ… No permission errors
# โœ… Game starts normally
# โ„น๏ธ AI may try to download or use fallback path

Test on HF Spaces

# Push changes
git add ai_analysis.py
git commit -m "fix: AI model path and permissions"
git push

# Check HF Spaces logs:
# โœ… No "[Errno 13] Permission denied"
# โœ… Game runs successfully

๐Ÿ“Š Impact

Before Fix

  • โŒ Permission denied error on startup
  • โŒ Hardcoded user paths
  • โŒ Would fail on HF Spaces
  • โš ๏ธ Confusing error messages

After Fix

  • โœ… No permission errors
  • โœ… Portable path resolution
  • โœ… Works on HF Spaces
  • โœ… Graceful degradation
  • โœ… Clear fallback behavior

๐ŸŽฏ Recommendations

For Demo/Production on HF Spaces

Option 1: Include model in repo

cd /home/luigi/rts
wget https://huggingface.co/Qwen/Qwen2.5-0.5B-Instruct-GGUF/resolve/main/qwen2.5-0.5b-instruct-q4_0.gguf
git add qwen2.5-0.5b-instruct-q4_0.gguf
git commit -m "feat: Include AI model"
git push

For Quick Testing

Option 3: Disable AI temporarily

# In app.py, comment out AI initialization:
# ai_analyzer = AIAnalyzer()
ai_analyzer = None

For Development

Current setup works! Model auto-downloads to current directory.


โœ… Summary

Issue: Permission denied when downloading AI model
Fix: Smart path resolution + permission testing
Status: โœ… RESOLVED
Game: Works with or without AI model
HF Spaces: Compatible

Files Modified:

  • web/ai_analysis.py (Lines 193-227)

Commits:

git add web/ai_analysis.py
git commit -m "fix: AI model path resolution and permission handling"
git push

๐ŸŽ‰ Ready for deployment!