run-evaluations.yml 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. name: Run Evaluations
  2. on:
  3. workflow_dispatch:
  4. inputs:
  5. agent:
  6. description: 'Agent to test'
  7. required: false
  8. default: 'openagent'
  9. type: choice
  10. options:
  11. - openagent
  12. - opencoder
  13. - system-builder
  14. pattern:
  15. description: 'Test pattern (glob)'
  16. required: false
  17. default: '**/golden/*.yaml'
  18. type: string
  19. model:
  20. description: 'Model to use (provider/model)'
  21. required: false
  22. default: 'opencode/grok-code'
  23. type: string
  24. seed:
  25. description: 'Seed for reproducible randomness'
  26. required: false
  27. default: 'ci-evaluation-seed'
  28. type: string
  29. timeout:
  30. description: 'Test timeout in milliseconds'
  31. required: false
  32. default: '120000'
  33. type: string
  34. schedule:
  35. # Run daily at 2 AM UTC
  36. - cron: '0 2 * * *'
  37. push:
  38. branches: [main]
  39. paths:
  40. - 'evals/framework/**'
  41. - 'evals/agents/**'
  42. - 'package.json'
  43. - 'pnpm-lock.yaml'
  44. - 'pnpm-workspace.yaml'
  45. - '.github/workflows/run-evaluations.yml'
  46. jobs:
  47. run-evaluations:
  48. runs-on: ubuntu-latest
  49. steps:
  50. - name: Checkout code
  51. uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
  52. with:
  53. persist-credentials: false
  54. - name: Setup pnpm
  55. uses: pnpm/action-setup@b0f76dfb45f55f8421693e4803ac7bb65143bd34 # v6
  56. - name: Setup Node.js
  57. uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
  58. with:
  59. node-version: '20'
  60. cache: 'pnpm'
  61. cache-dependency-path: pnpm-lock.yaml
  62. - name: Install workspace dependencies
  63. run: pnpm install --frozen-lockfile
  64. - name: Build framework
  65. run: pnpm --dir evals/framework run build
  66. - name: Install OpenCode CLI
  67. run: |
  68. pnpm add --global opencode-ai@1.17.20
  69. opencode --version
  70. - name: Run evaluations
  71. working-directory: evals/framework
  72. env:
  73. EVAL_AGENT: ${{ inputs.agent || 'openagent' }}
  74. EVAL_MODEL: ${{ inputs.model || 'opencode/grok-code' }}
  75. EVAL_PATTERN: ${{ inputs.pattern || '**/golden/*.yaml' }}
  76. EVAL_SEED: ${{ inputs.seed || 'ci-evaluation-seed' }}
  77. EVAL_TIMEOUT: ${{ inputs.timeout || '120000' }}
  78. OPENCODE_API_KEY: ${{ secrets.OPENCODE_API_KEY }}
  79. OPENCODE_SESSION_STORAGE: /tmp/opencode-sessions
  80. run: |
  81. # Create isolated session directory
  82. mkdir -p /tmp/opencode-sessions
  83. # Run evaluations with isolation and seeding
  84. pnpm run eval:sdk \
  85. -- --agent="$EVAL_AGENT" \
  86. --pattern="$EVAL_PATTERN" \
  87. --model="$EVAL_MODEL" \
  88. --seed="$EVAL_SEED" \
  89. --timeout="$EVAL_TIMEOUT" \
  90. --isolate-environment \
  91. --debug
  92. - name: Upload results
  93. uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
  94. if: always()
  95. with:
  96. name: evaluation-results
  97. path: |
  98. evals/results/
  99. evals/test_tmp/
  100. retention-days: 30
  101. - name: Generate summary
  102. if: always()
  103. run: |
  104. if [ -f "evals/results/latest.json" ]; then
  105. echo "## Evaluation Results" >> $GITHUB_STEP_SUMMARY
  106. echo "" >> $GITHUB_STEP_SUMMARY
  107. node <<'NODE' >> "$GITHUB_STEP_SUMMARY"
  108. const fs = require('node:fs')
  109. const results = JSON.parse(fs.readFileSync('evals/results/latest.json', 'utf8'))
  110. console.log(`| ✅ ${results.summary.passed}/${results.summary.total} tests passed`)
  111. console.log(`| ❌ ${results.summary.failed} failures`)
  112. console.log('')
  113. if (results.summary.failed > 0) {
  114. console.log('### Failed Tests')
  115. for (const test of results.tests.filter((result) => !result.passed)) {
  116. const messages = (test.violations.details ?? []).map((detail) => detail.message)
  117. const reason = messages.length > 0 ? messages.join(', ') : `${test.violations.errors} error violations`
  118. console.log(`- ${test.id}: ${reason}`)
  119. }
  120. }
  121. NODE
  122. else
  123. echo "## No Results Generated" >> $GITHUB_STEP_SUMMARY
  124. echo "Evaluation run may have failed to complete." >> $GITHUB_STEP_SUMMARY
  125. fi
  126. - name: Cleanup
  127. if: always()
  128. run: |
  129. # Clean up temporary session storage
  130. rm -rf /tmp/opencode-sessions