name: AI Fix Loop
on:
workflow_dispatch:
inputs:
branch:
description: "Branch to run"
required: true
default: "main"
attempts:
description: "Max attempts"
default: "40"
type: number
pr-on-fail:
description: "Create a PR on failure"
default: false
type: boolean
permissions:
contents: write
pull-requests: write
issues: write
jobs:
loop:
name: AI Fix Loop
runs-on: ubuntu-latest
timeout-minutes: 360
env:
MAX_ATTEMPTS: ${{ github.event.inputs.attempts }}
BRANCH: ${{ github.event.inputs.branch }}
steps:
- name: Print inputs
run: |
echo "MAX_ATTEMPTS=${{ env.MAX_ATTEMPTS }}"
echo "BRANCH=${{ env.BRANCH }}"
- name: Install Yek
run: curl -fsSL https://bodo.run/yek.sh | bash
- name: Checkout
uses: actions/checkout@v4
with:
ref: ${{ env.BRANCH }}
fetch-depth: 0
- name: Cache Rust dependencies
uses: actions/cache@v3
with:
path: |
~/.cargo
target/
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "20"
- name: Install askds
run: npm install -g askds@latest
- name: Setup Rust
uses: dtolnay/rust-toolchain@stable
- name: Build
run: cargo build --locked
- name: Run AI Fix
id: ai_fix
timeout-minutes: 360
continue-on-error: true
env:
DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}
FIREWORKS_AI_API_KEY: ${{ secrets.FIREWORKS_AI_API_KEY }}
RUST_TEST_TIMEOUT: 300
MAX_ATTEMPTS: ${{ env.MAX_ATTEMPTS }}
run: |
bash ./scripts/ai-loop.sh
echo "success=$?" >> "$GITHUB_OUTPUT"
- name: Upload attempts log
uses: actions/upload-artifact@v3
with:
name: attempts-log
path: attempts.txt
- name: Create PR or Issue
if: always() && ${{ github.event.inputs.pr-on-fail }}
uses: peter-evans/create-pull-request@v5
env:
GH_TOKEN: ${{ secrets.PAT_TOKEN }}
with:
token: ${{ env.GH_TOKEN }}
commit-message: "AI Fix"
title: "AI Fix for ${{ env.BRANCH }} (Attempts: ${{ env.MAX_ATTEMPTS }})"
body: |
## AI Fix Results
- Successfully fixed: ${{ steps.ai_fix.outputs.success == '0' && 'Yes' || 'No' }}
- Total attempts: ${{ env.MAX_ATTEMPTS }}
- Source branch: `${{ env.BRANCH }}`
Check the attempts.txt artifact for details.
branch: ${{ env.BRANCH }}-ai-fix
base: ${{ env.BRANCH }}