Skip to content

agent runs in a background thread #28

agent runs in a background thread

agent runs in a background thread #28

Workflow file for this run

name: Release
on:
push:
tags:
- "v*"
permissions:
contents: write
packages: write
env:
REGISTRY: ghcr.io
IMAGE_NAME: ${{ github.repository }}
jobs:
# ──────────────────────────────────────────────
# Build and push Docker images to GHCR
# ──────────────────────────────────────────────
docker:
name: Docker (${{ matrix.image_suffix }})
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
include:
- image_suffix: agent
dockerfile: Dockerfile
context: .
- image_suffix: omniparser
dockerfile: docker/omniparser/Dockerfile
context: .
- image_suffix: desktop
dockerfile: app/gui/Dockerfile
context: app/gui
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract metadata
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}-${{ matrix.image_suffix }}
tags: |
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
type=raw,value=latest
- name: Build and push
uses: docker/build-push-action@v5
with:
context: ${{ matrix.context }}
file: ${{ matrix.dockerfile }}
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max
# ──────────────────────────────────────────────
# Build platform binaries with PyInstaller
# ──────────────────────────────────────────────
pyinstaller:
name: Binary (${{ matrix.os_label }})
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-latest
os_label: linux
data_sep: ":"
ext: ""
- os: windows-latest
os_label: windows
data_sep: ";"
ext: ".exe"
- os: macos-latest
os_label: macos
data_sep: ":"
ext: ""
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.10"
- name: Install dependencies
shell: bash
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
pip install pyinstaller
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: "20"
- name: Build frontend
shell: bash
env:
VITE_BACKEND_PORT: "7926"
run: |
cd app/ui_layer/browser/frontend
npm install
npx vite build
- name: Create default config.json
shell: bash
run: |
echo "{\"use_conda\": false, \"gui_mode_enabled\": false}" > config.json
- name: Build with PyInstaller
shell: bash
run: |
pyinstaller \
--noconfirm \
--clean \
--onefile \
--name CraftBot \
--collect-submodules app \
--collect-submodules agent_core \
--collect-submodules agents \
--collect-submodules decorators \
--collect-submodules chromadb \
--hidden-import onnxruntime \
--hidden-import tokenizers \
--collect-data tiktoken_ext \
--collect-submodules tiktoken \
--exclude-module torch \
--exclude-module torchvision \
--exclude-module torchaudio \
--exclude-module triton \
--exclude-module nvidia \
--exclude-module transformers \
--exclude-module cv2 \
--exclude-module matplotlib \
--exclude-module tensorflow \
--additional-hooks-dir hooks \
--runtime-hook rthooks/rthook-rich-unicode.py \
--add-data "assets${{ matrix.data_sep }}assets" \
--add-data "main.py${{ matrix.data_sep }}." \
--add-data "config.json${{ matrix.data_sep }}." \
--add-data ".env.example${{ matrix.data_sep }}." \
--add-data "requirements.txt${{ matrix.data_sep }}." \
--add-data "environment.yml${{ matrix.data_sep }}." \
--add-data "app/data${{ matrix.data_sep }}app/data" \
--add-data "app/ui_layer/browser/frontend/dist${{ matrix.data_sep }}app/ui_layer/browser/frontend/dist" \
--add-data "app/gui/docker-compose.yaml${{ matrix.data_sep }}app/gui" \
--add-data "app/gui/Dockerfile${{ matrix.data_sep }}app/gui" \
--add-data "app/gui/custom-cont-init.d${{ matrix.data_sep }}app/gui/custom-cont-init.d" \
--add-data "agents${{ matrix.data_sep }}agents" \
run.py
- name: Rename artifact
shell: bash
run: |
mv "dist/CraftBot${{ matrix.ext }}" \
"dist/CraftBot-${{ matrix.os_label }}${{ matrix.ext }}"
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: release-${{ matrix.os_label }}
path: dist/CraftBot-${{ matrix.os_label }}${{ matrix.ext }}
# ──────────────────────────────────────────────
# Create GitHub Release with all artifacts
# ──────────────────────────────────────────────
release:
name: Publish GitHub Release
needs: [docker, pyinstaller]
runs-on: ubuntu-latest
steps:
- name: Download all artifacts
uses: actions/download-artifact@v4
with:
path: release
merge-multiple: true
- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
files: release/**
generate_release_notes: true
body: |
## Installation
### Docker Compose (Recommended)
Includes the agent, OmniParser, and GUI desktop VM — all in one.
```bash
git clone https://github.com/zfoong/CraftBot.git
cd CraftBot
cp .env.example .env # Edit with your API keys
docker compose up
```
For GPU acceleration on OmniParser:
```bash
docker compose -f docker-compose.yml -f docker-compose.gpu.yml up
```
### Standalone Binary
Download the binary for your platform from the assets below.
Requires Docker for GUI mode and Omniparser. Run with `--no-omniparser` to skip OmniParser setup. Run with `--no-conda` to skip conda setup and use system Python instead.