Spaces:
Running
Running
| name: Sync to Hugging Face Spaces | |
| # Automatically syncs code from GitHub main branch to all 5 Hugging Face Spaces. | |
| # Each job syncs a different subset of the repo to a specific HF Space. | |
| # | |
| # Two HF accounts are used: | |
| # - RottenShadow: ailixir-drug-repurposing, ailixir-chemical-rag | |
| # - shdwRow (secondary): ailixir-admet, ailixir-generation | |
| # - Ailixir-AI-Team: ailixir-api | |
| # | |
| # Required GitHub secrets: | |
| # HF_TOKEN β HF access token for RottenShadow account (read+write permissions) | |
| # HF_TOKEN_AILIXIR β HF access token for Ailixir-AI-Team account (read+write permissions) | |
| # HF_TOKEN_SHDWROW β HF access token for shdwRow account (read+write permissions) | |
| # GOOGLE_CLIENT_ID β Google OAuth client ID | |
| # GOOGLE_CLIENT_SECRET β Google OAuth client secret | |
| on: | |
| push: | |
| branches: [main, feature/hugging-face-deploy] | |
| workflow_dispatch: | |
| jobs: | |
| # ββ Backend API (Laravel) ββββββββββββββββββββββββββββββββββββββ | |
| # Syncs the full repo minus AI app directories to Ailixir-AI-Team/ailixir-api. | |
| # The live SQLite database (database/ailixir.sqlite) is preserved across syncs: | |
| # - Excluded from rsync so it's never overwritten | |
| # - Restored from HEAD via git checkout so live data isn't committed | |
| backend: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 | |
| - name: Sync ailixir-api | |
| env: | |
| HF_TOKEN_AILIXIR: ${{ secrets.HF_TOKEN_AILIXIR }} | |
| run: | | |
| SPACE="Ailixir-AI-Team/ailixir-api" | |
| REPO_URL="https://Ailixir-AI-Team:${HF_TOKEN_AILIXIR}@huggingface.co/spaces/${SPACE}" | |
| git clone --depth 1 "$REPO_URL" /tmp/hf-space | |
| cd /tmp/hf-space | |
| # Sync files (new, modified, deleted) but preserve the live database | |
| rsync -av --delete --exclude=ai_apps --exclude=.git --exclude=.env --exclude=.dockerignore --exclude=public/imgs --exclude=storage --exclude=Diagrams --exclude=database/ailixir.sqlite "$GITHUB_WORKSPACE/" . | |
| cp "$GITHUB_WORKSPACE/README_HF.md" README.md 2>/dev/null || true | |
| # Write .env with all required environment variables for HF Spaces | |
| printf '%s\n' \ | |
| 'RUN_MODE=hf' \ | |
| 'APP_KEY=base64:T/MgQZht16genNJN3aZ5flCuvfe7Zfs4yFhuAFO2itU=' \ | |
| 'AI_INTEGRATION_ROUTES_ENABLED=true' \ | |
| 'APP_URL=https://Ailixir-AI-Team-ailixir-api.hf.space' \ | |
| 'APP_DEBUG=true' \ | |
| 'ADMET_AI_URL=https://shdwRow-ailixir-admet.hf.space' \ | |
| 'CHEMICAL_AI_URL=https://RottenShadow-ailixir-chemical-rag.hf.space' \ | |
| 'DRUG_REPURPOSING_URL=https://RottenShadow-ailixir-drug-repurposing.hf.space' \ | |
| 'GENERATION_SERVICE_URL=https://shdwRow-ailixir-generation.hf.space' \ | |
| 'GOOGLE_CLIENT_ID=${{ secrets.GOOGLE_CLIENT_ID }}' \ | |
| 'GOOGLE_CLIENT_SECRET=${{ secrets.GOOGLE_CLIENT_SECRET }}' \ | |
| 'GOOGLE_REDIRECT_URI=https://Ailixir-AI-Team-ailixir-api.hf.space/api/user/auth/google' \ | |
| 'CLOUDINARY_CLOUD_NAME=dummy_cloud' \ | |
| 'CLOUDINARY_API_KEY=dummy_key' \ | |
| 'CLOUDINARY_API_SECRET=dummy_secret' \ | |
| 'QUEUE_CONNECTION=sync' \ | |
| > .env | |
| git config user.name "AILIXIR Bot" | |
| git config user.email "bot@ailixir.app" | |
| # Prevent the live database from being tracked/committed | |
| git checkout HEAD -- database/ailixir.sqlite 2>/dev/null || true | |
| git add -A | |
| if git diff --cached --quiet; then echo " No changes"; else git commit -m "Auto-sync: $GITHUB_SHA"; git push; fi | |
| # ββ Drug Repurposing (FastAPI) βββββββββββββββββββββββββββββββββ | |
| # Syncs ai_apps/Drug Reporposing/ to RottenShadow/ailixir-drug-repurposing. | |
| # Renames Dockerfile.hf β Dockerfile if present. | |
| # Can run in mock mode for testing (set USE_MOCK_MODEL=true in HF secrets). | |
| drug-repurposing: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 | |
| - name: Sync ailixir-drug-repurposing | |
| env: | |
| HF_TOKEN: ${{ secrets.HF_TOKEN }} | |
| run: | | |
| SPACE="RottenShadow/ailixir-drug-repurposing" | |
| REPO_URL="https://RottenShadow:${HF_TOKEN}@huggingface.co/spaces/${SPACE}" | |
| git clone --depth 1 "$REPO_URL" /tmp/hf-space | |
| cd /tmp/hf-space | |
| rsync -av --delete --exclude=.git --exclude=__pycache__ --exclude='*.pyc' --exclude=digrams --exclude=docs --exclude=docker "$GITHUB_WORKSPACE/ai_apps/Drug Reporposing/" . | |
| cp "$GITHUB_WORKSPACE/ai_apps/Drug Reporposing/README_HF.md" README.md 2>/dev/null || true | |
| if [ -f Dockerfile.hf ]; then mv Dockerfile.hf Dockerfile; fi | |
| git config user.name "AILIXIR Bot" | |
| git config user.email "bot@ailixir.app" | |
| git add -A | |
| if git diff --cached --quiet; then echo " No changes"; else git commit -m "Auto-sync: $GITHUB_SHA"; git push; fi | |
| # ββ ADMET Prediction (FastAPI + PyTorch) βββββββββββββββββββββββ | |
| # Syncs ai_apps/ADMIT/admet_inference/ to shdwRow/ailixir-admet. | |
| # Uses HF Xet for binary .ckpt model files. | |
| # Requires HF_TOKEN_SHDWROW secret (shdwRow account). | |
| admet: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 | |
| - name: Install git-xet for binary file support | |
| run: | | |
| curl --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/huggingface/xet-core/refs/heads/main/git_xet/install.sh | sh | |
| git xet install | |
| - name: Sync ailixir-admet | |
| env: | |
| HF_TOKEN_SHDWROW: ${{ secrets.HF_TOKEN_SHDWROW }} | |
| run: | | |
| SPACE="shdwRow/ailixir-admet" | |
| REPO_URL="https://shdwRow:${HF_TOKEN_SHDWROW}@huggingface.co/spaces/${SPACE}" | |
| git clone --depth 1 "$REPO_URL" /tmp/hf-space | |
| cd /tmp/hf-space | |
| rsync -av --delete --exclude=.git --exclude=datasets.rar "$GITHUB_WORKSPACE/ai_apps/ADMIT/admet_inference/" . | |
| cp README_HF.md README.md 2>/dev/null || true | |
| git config user.name "AILIXIR Bot" | |
| git config user.email "bot@ailixir.app" | |
| git config lfs.allowincompletepush true | |
| git lfs install | |
| git lfs track '*.ckpt' | |
| git add -A | |
| if git diff --cached --quiet; then echo " No changes"; else git commit -m "Auto-sync: $GITHUB_SHA"; git push; fi | |
| # ββ Chemical RAG (FastAPI + ChromaDB) βββββββββββββββββββββββββ | |
| # Syncs ai_apps/chemical-rag-system/chemical-rag-system/ to RottenShadow/ailixir-chemical-rag. | |
| chemical-rag: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 | |
| - name: Sync ailixir-chemical-rag | |
| env: | |
| HF_TOKEN: ${{ secrets.HF_TOKEN }} | |
| run: | | |
| SPACE="RottenShadow/ailixir-chemical-rag" | |
| REPO_URL="https://RottenShadow:${HF_TOKEN}@huggingface.co/spaces/${SPACE}" | |
| git clone --depth 1 "$REPO_URL" /tmp/hf-space | |
| cd /tmp/hf-space | |
| rsync -av --delete --exclude=.git --exclude=digrams "$GITHUB_WORKSPACE/ai_apps/chemical-rag-system/chemical-rag-system/" . | |
| cp README_HF.md README.md 2>/dev/null || true | |
| git config user.name "AILIXIR Bot" | |
| git config user.email "bot@ailixir.app" | |
| git add -A | |
| if git diff --cached --quiet; then echo " No changes"; else git commit -m "Auto-sync: $GITHUB_SHA"; git push; fi | |
| # ββ Molecular Generation (FastAPI + REINVENT4) ββββββββββββββββ | |
| # Syncs ai_apps/generation/ to shdwRow/ailixir-generation. | |
| # Renames Dockerfile.hf β Dockerfile (or Dockerfile.api β Dockerfile as fallback). | |
| # Uses HF Xet for binary .ckpt, .pt, .pkl model files. | |
| # Requires HF_TOKEN_SHDWROW secret (shdwRow account). | |
| generation: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 | |
| - name: Install git-xet for binary file support | |
| run: | | |
| curl --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/huggingface/xet-core/refs/heads/main/git_xet/install.sh | sh | |
| git xet install | |
| - name: Sync ailixir-generation | |
| env: | |
| HF_TOKEN_SHDWROW: ${{ secrets.HF_TOKEN_SHDWROW }} | |
| run: | | |
| SPACE="shdwRow/ailixir-generation" | |
| REPO_URL="https://shdwRow:${HF_TOKEN_SHDWROW}@huggingface.co/spaces/${SPACE}" | |
| git clone --depth 1 "$REPO_URL" /tmp/hf-space | |
| cd /tmp/hf-space | |
| rsync -av --delete --exclude=.git --exclude=bundle/models "$GITHUB_WORKSPACE/ai_apps/generation/" . | |
| cp "$GITHUB_WORKSPACE/ai_apps/generation/README_HF.md" README.md 2>/dev/null || true | |
| if [ -f Dockerfile.hf ]; then mv Dockerfile.hf Dockerfile; elif [ -f Dockerfile.api ]; then mv Dockerfile.api Dockerfile; fi | |
| git config user.name "AILIXIR Bot" | |
| git config user.email "bot@ailixir.app" | |
| git add -A | |
| if git diff --cached --quiet; then echo " No changes"; else git commit -m "Auto-sync: $GITHUB_SHA"; git push; fi | |
| chat-bot: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 | |
| - name: Install Hugging Face CLI | |
| run: pip install -U "huggingface_hub[cli]" | |
| - name: Add Gemini key to Hugging Face Space secrets | |
| env: | |
| HF_TOKEN_SHDWROW: ${{ secrets.HF_TOKEN_SHDWROW }} | |
| GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }} | |
| run: | | |
| hf spaces secrets add shdwRow/ailixir-chat-bot \ | |
| -s GEMINI_API_KEY="$GEMINI_API_KEY" \ | |
| --token "$HF_TOKEN_SHDWROW" | |
| - name: Sync ailixir-chat-bot | |
| env: | |
| HF_TOKEN_SHDWROW: ${{ secrets.HF_TOKEN_SHDWROW }} | |
| run: | | |
| SPACE="shdwRow/ailixir-chat-bot" | |
| REPO_URL="https://shdwRow:${HF_TOKEN_SHDWROW}@huggingface.co/spaces/${SPACE}" | |
| git clone --depth 1 "$REPO_URL" /tmp/hf-chat-bot | |
| cd /tmp/hf-chat-bot | |
| rsync -av --delete \ | |
| --exclude=.git \ | |
| --exclude=.env \ | |
| --exclude=__pycache__ \ | |
| --exclude='*.pyc' \ | |
| --exclude='*.db' \ | |
| --exclude='*.db-shm' \ | |
| --exclude='*.db-wal' \ | |
| "$GITHUB_WORKSPACE/ai_apps/chem_agent_api/" . | |
| git config user.name "AILIXIR Bot" | |
| git config user.email "bot@ailixir.app" | |
| git add -A | |
| if git diff --cached --quiet; then | |
| echo "No changes" | |
| else | |
| git commit -m "Auto-sync chat bot: $GITHUB_SHA" | |
| git push | |
| fi | |