name: Publish Python 🐍 distribution 📦 to TestPyPI on: push: # workflow_dispatch: # Keep manual trigger # inputs: # version: # description: 'Version number (e.g. 0.0.63.dev20250111)' # required: true # type: string # schedule: # - cron: "0 0 * * *" # Run every day at midnight jobs: # trigger-client-and-models-build: # name: Trigger llama-stack-client and llama-models build # runs-on: ubuntu-latest # outputs: # version: ${{ steps.version.outputs.version }} # client_run_id: ${{ steps.trigger-client.outputs.workflow_id }} # model_run_id: ${{ steps.trigger-models.outputs.workflow_id }} # steps: # - uses: actions/checkout@v4 # with: # persist-credentials: false # - name: Get date # id: date # run: echo "date=$(date +'%Y%m%d')" >> $GITHUB_OUTPUT # - name: Compute version based on dispatch event # id: version # run: | # # Read base version from pyproject.toml # version=$(sed -n 's/.*version="\([^"]*\)".*/\1/p' setup.py) # if [ "${{ github.event_name }}" = "schedule" ]; then # echo "version=${version}.dev${{ steps.date.outputs.date }}" >> $GITHUB_OUTPUT # elif [ "${{ github.event_name }}" = "workflow_dispatch" ]; then # echo "version=${{ inputs.version }}" >> $GITHUB_OUTPUT # else # echo "version=${version}.dev$(shuf -i 10000000-99999999 -n 1)" >> $GITHUB_OUTPUT # fi # - name: Trigger llama-stack-client workflow # id: trigger-client # run: | # response=$(curl -X POST https://api.github.com/repos/meta-llama/llama-stack-client-python/dispatches \ # -H 'Accept: application/vnd.github.everest-preview+json' \ # -H "authorization: Bearer ${{ secrets.PAT_TOKEN }}" \ # --data "{\"event_type\": \"build-client-package\", \"client_payload\": {\"source\": \"llama-stack-nightly\", \"version\": \"${{ steps.version.outputs.version }}\"}}" \ # -w "\n%{http_code}") # http_code=$(echo "$response" | tail -n1) # if [ "$http_code" != "204" ]; then # echo "Failed to trigger client workflow" # exit 1 # fi # # Get the run ID of the triggered workflow # sleep 5 # Wait for workflow to be created # run_id=$(curl -s -H "authorization: Bearer ${{ secrets.PAT_TOKEN }}" \ # "https://api.github.com/repos/meta-llama/llama-stack-client-python/actions/runs?event=repository_dispatch" \ # | jq '.workflow_runs[0].id') # echo "workflow_id=$run_id" >> $GITHUB_OUTPUT # - name: Trigger llama-models workflow # id: trigger-models # run: | # response=$(curl -X POST https://api.github.com/repos/meta-llama/llama-models/dispatches \ # -H 'Accept: application/vnd.github.everest-preview+json' \ # -H "authorization: Bearer ${{ secrets.PAT_TOKEN }}" \ # --data "{\"event_type\": \"build-models-package\", \"client_payload\": {\"source\": \"llama-stack-nightly\", \"version\": \"${{ steps.version.outputs.version }}\"}}" \ # -w "\n%{http_code}") # http_code=$(echo "$response" | tail -n1) # if [ "$http_code" != "204" ]; then # echo "Failed to trigger models workflow" # exit 1 # fi # # Get the run ID of the triggered workflow # sleep 5 # Wait for workflow to be created # run_id=$(curl -s -H "authorization: Bearer ${{ secrets.PAT_TOKEN }}" \ # "https://api.github.com/repos/meta-llama/llama-models/actions/runs?event=repository_dispatch" \ # | jq '.workflow_runs[0].id') # echo "workflow_id=$run_id" >> $GITHUB_OUTPUT # wait-for-workflows: # name: Wait for triggered workflows # needs: trigger-client-and-models-build # runs-on: ubuntu-latest # steps: # - name: Wait for client workflow # run: | # while true; do # status=$(curl -s -H "authorization: Bearer ${{ secrets.PAT_TOKEN }}" \ # "https://api.github.com/repos/meta-llama/llama-stack-client-python/actions/runs/${{ needs.trigger-client-and-models-build.outputs.client_run_id }}" \ # | jq -r '.status') # conclusion=$(curl -s -H "authorization: Bearer ${{ secrets.PAT_TOKEN }}" \ # "https://api.github.com/repos/meta-llama/llama-stack-client-python/actions/runs/${{ needs.trigger-client-and-models-build.outputs.client_run_id }}" \ # | jq -r '.conclusion') # echo "llama-stack-client-python workflow status: $status, conclusion: $conclusion" # if [ "$status" = "completed" ]; then # if [ "$conclusion" != "success" ]; then # echo "llama-stack-client-python workflow failed" # exit 1 # fi # break # fi # sleep 10 # done # - name: Wait for models workflow # run: | # while true; do # status=$(curl -s -H "authorization: Bearer ${{ secrets.PAT_TOKEN }}" \ # "https://api.github.com/repos/meta-llama/llama-models/actions/runs/${{ needs.trigger-client-and-models-build.outputs.model_run_id }}" \ # | jq -r '.status') # conclusion=$(curl -s -H "authorization: Bearer ${{ secrets.PAT_TOKEN }}" \ # "https://api.github.com/repos/meta-llama/llama-models/actions/runs/${{ needs.trigger-client-and-models-build.outputs.model_run_id }}" \ # | jq -r '.conclusion') # echo "llama-models workflow status: $status, conclusion: $conclusion" # if [ "$status" = "completed" ]; then # if [ "$conclusion" != "success" ]; then # echo "llama-models workflow failed" # exit 1 # fi # break # fi # sleep 10 # done # build: # name: Build distribution 📦 # needs: # - wait-for-workflows # - trigger-client-and-models-build # runs-on: ubuntu-latest # steps: # - uses: actions/checkout@v4 # with: # persist-credentials: false # - name: Get date # id: date # run: echo "date=$(date +'%Y%m%d')" >> $GITHUB_OUTPUT # - name: Update version for nightly # run: | # sed -i 's/version="\([^"]*\)"/version="${{ needs.trigger-client-and-models-build.outputs.version }}"/' setup.py # sed -i 's/llama-stack-client>=\([^"]*\)/llama-stack-client==${{ needs.trigger-client-and-models-build.outputs.version }}/' requirements.txt # sed -i 's/llama-models>=\([^"]*\)/llama-models==${{ needs.trigger-client-and-models-build.outputs.version }}/' requirements.txt # - name: Set up Python # uses: actions/setup-python@v5 # with: # python-version: "3.11" # - name: Install pypa/build # run: >- # python3 -m # pip install # build # --user # - name: Build a binary wheel and a source tarball # run: python3 -m build # - name: Store the distribution packages # uses: actions/upload-artifact@v4 # with: # name: python-package-distributions # path: dist/ # publish-to-testpypi: # name: Publish Python 🐍 distribution 📦 to TestPyPI # needs: # - build # runs-on: ubuntu-latest # environment: # name: testrelease # url: https://test.pypi.org/p/llama-stack # permissions: # id-token: write # IMPORTANT: mandatory for trusted publishing # steps: # - name: Download all the dists # uses: actions/download-artifact@v4 # with: # name: python-package-distributions # path: dist/ # - name: Publish distribution 📦 to TestPyPI # uses: pypa/gh-action-pypi-publish@release/v1 # with: # repository-url: https://test.pypi.org/legacy/ test-published-package: name: Test published package # needs: # - publish-to-testpypi # - trigger-client-and-models-build runs-on: ubuntu-latest steps: - name: Install the package run: | max_attempts=6 attempt=1 while [ $attempt -le $max_attempts ]; do echo "Attempt $attempt of $max_attempts to install package..." if pip install --no-cache --index-url https://pypi.org/simple/ --extra-index-url https://test.pypi.org/simple/ llama-stack==0.0.63.dev86738855; then echo "Package installed successfully" break fi if [ $attempt -ge $max_attempts ]; then echo "Failed to install package after $max_attempts attempts" exit 1 fi attempt=$((attempt + 1)) sleep 10 done - name: Test the package versions run: | pip list | grep llama_ - name: Test CLI commands run: | llama model list llama stack build --list-templates llama model prompt-format -m Llama3.2-11B-Vision-Instruct llama stack list-apis llama stack list-providers inference llama stack list-providers telemetry - name: Test Notebook run: | pip install pytest nbval pwd ls pytest -v -s --nbval-lax ./docs/notebooks/Llama_Stack_Building_AI_Applications.ipynb # TODO: add trigger for integration test workflow & docker builds