name: Free Tier AI Analysis on: pull_request: types: [opened, synchronize] issues: types: [opened, labeled] workflow_dispatch: permissions: contents: read pull-requests: write issues: write jobs: # Groq - 14,400 requests/day FREE (Llama 3, Mixtral) groq-analysis: if: github.event_name == 'pull_request' runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - name: Get diff id: diff run: | git diff origin/${{ github.base_ref }}...HEAD > /tmp/diff.txt head -c 30000 /tmp/diff.txt > /tmp/diff_truncated.txt - name: Groq Analysis if: env.GROQ_API_KEY != '' env: GROQ_API_KEY: ${{ secrets.GROQ_API_KEY }} run: | # Groq is FAST and FREE (14,400 req/day) DIFF=$(cat /tmp/diff_truncated.txt | jq -Rs .) curl -s https://api.groq.com/openai/v1/chat/completions \ -H "Authorization: Bearer $GROQ_API_KEY" \ -H "Content-Type: application/json" \ -d "{ \"model\": \"llama-3.3-70b-versatile\", \"messages\": [{ \"role\": \"user\", \"content\": \"Review this diff for security issues, bugs, and code smells. Be very concise. Output as: SECURITY: x issues, BUGS: x issues, SMELLS: x issues. Then list critical items only.\n\nDiff:\n${DIFF}\" }], \"temperature\": 0.1, \"max_tokens\": 500 }" | jq -r '.choices[0].message.content' > /tmp/groq_review.txt cat /tmp/groq_review.txt # Mistral - Free tier available mistral-analysis: if: github.event_name == 'pull_request' && vars.MISTRAL_API_KEY != '' runs-on: ubuntu-latest continue-on-error: true steps: - uses: actions/checkout@v4 - name: Mistral Code Review env: MISTRAL_API_KEY: ${{ secrets.MISTRAL_API_KEY }} run: | echo "Mistral analysis would run here" # Similar pattern to Groq # Cohere - 1000 req/month free (good for classification) cohere-classify: if: github.event_name == 'issues' runs-on: ubuntu-latest continue-on-error: true steps: - name: Classify Issue if: env.COHERE_API_KEY != '' env: COHERE_API_KEY: ${{ secrets.COHERE_API_KEY }} run: | # Use Cohere to classify issue type/priority TITLE="${{ github.event.issue.title }}" BODY="${{ github.event.issue.body }}" curl -s https://api.cohere.ai/v1/classify \ -H "Authorization: Bearer $COHERE_API_KEY" \ -H "Content-Type: application/json" \ -d "{ \"inputs\": [\"$TITLE\"], \"examples\": [ {\"text\": \"App crashes on login\", \"label\": \"bug\"}, {\"text\": \"Add dark mode\", \"label\": \"feature\"}, {\"text\": \"SQL injection in auth\", \"label\": \"security\"}, {\"text\": \"Slow page load\", \"label\": \"performance\"} ] }" | jq '.classifications[0].prediction' # Cloudflare Workers AI - 10,000 neurons/day FREE cloudflare-ai: if: github.event_name == 'pull_request' && vars.CF_ACCOUNT_ID != '' runs-on: ubuntu-latest continue-on-error: true steps: - name: Cloudflare AI Analysis env: CF_API_TOKEN: ${{ secrets.CF_API_TOKEN }} CF_ACCOUNT_ID: ${{ vars.CF_ACCOUNT_ID }} run: | # Cloudflare Workers AI - runs at the edge echo "Cloudflare AI analysis would run here" # @cf/meta/llama-3-8b-instruct is free # Aggregate results and create summary aggregate: needs: [groq-analysis] if: always() && github.event_name == 'pull_request' runs-on: ubuntu-latest steps: - name: Create Summary uses: actions/github-script@v7 with: script: | const summary = `## 🤖 Free Tier AI Analysis Multiple AI services analyzed this PR: | Service | Status | Free Tier | |---------|--------|-----------| | Groq (Llama 3) | ${{ needs.groq-analysis.result }} | 14,400 req/day | | Mistral | skipped | 1M tokens/month | | Cohere | skipped | 1000 req/month | | Cloudflare AI | skipped | 10K neurons/day | --- _Add API keys to your fork secrets to enable more services._ _All analysis runs on contributor's free tier allowance._ `; // Only comment if at least one analysis ran if ('${{ needs.groq-analysis.result }}' !== 'skipped') { await github.rest.issues.createComment({ owner: context.repo.owner, repo: context.repo.repo, issue_number: context.issue.number, body: summary }); }