Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
85 commits
Select commit Hold shift + click to select a range
8285dac
llm-benchmark: add normalized table evals
bradleyshep Jul 17, 2026
e51e287
llm-benchmark: add behavioral table evals
bradleyshep Jul 17, 2026
ba223b3
llm-benchmark: add reducer behavior evals
bradleyshep Jul 17, 2026
0d3f74c
llm-benchmark: add scheduled batch deletion eval
bradleyshep Jul 17, 2026
fb2f938
llm-benchmark: add query builder view evals
bradleyshep Jul 17, 2026
644340e
llm-benchmark: add procedural view evals
bradleyshep Jul 17, 2026
2f647d6
llm-benchmark: complete view eval coverage
bradleyshep Jul 17, 2026
ba06e21
llm-benchmark: add auth and lifecycle evals
bradleyshep Jul 17, 2026
8c510ff
llm-benchmark: add procedure and http evals
bradleyshep Jul 17, 2026
ce87575
llm-benchmark: add migration-aware default eval
bradleyshep Jul 17, 2026
633f6d7
llm-benchmark: add migration and RLS evals
bradleyshep Jul 17, 2026
8106177
Support stable local LLM benchmark builds
bradleyshep Jul 17, 2026
6c3139f
Retry silent LLM benchmark publish failures
bradleyshep Jul 17, 2026
104fafd
Make local LLM benchmark logs collision proof
bradleyshep Jul 17, 2026
25c8b31
Include existing modules in migration eval prompts
bradleyshep Jul 17, 2026
401b206
Make advanced LLM evals self-contained
bradleyshep Jul 17, 2026
f49cc64
Document advanced TypeScript server APIs
bradleyshep Jul 17, 2026
43c0330
Validate LLM benchmark goldens behaviorally
bradleyshep Jul 17, 2026
6d06baa
Generalize advanced TypeScript server guidance
bradleyshep Jul 17, 2026
9a775e5
Clarify advanced view eval requirements
bradleyshep Jul 17, 2026
2f6bb29
Document TypeScript server API edge cases
bradleyshep Jul 17, 2026
b3f4bbc
Grade only specified HTTP response headers
bradleyshep Jul 17, 2026
4a084de
Bound LLM benchmark scorer calls
bradleyshep Jul 17, 2026
239ebbe
Document advanced Rust and C# server APIs
bradleyshep Jul 17, 2026
fd97271
Refine TypeScript eval guidance and prompts
bradleyshep Jul 17, 2026
87ee8c8
Align new eval prompts with benchmark format
bradleyshep Jul 17, 2026
5567d91
Retry transient HTTP eval calls
bradleyshep Jul 17, 2026
3c250b9
Clarify ambiguous eval task contracts
bradleyshep Jul 18, 2026
4a1252e
Fix reducer schema parity extraction
bradleyshep Jul 18, 2026
081432f
Strengthen view eval result grading
bradleyshep Jul 18, 2026
d39578f
Ignore reducer parameter names in schema parity
bradleyshep Jul 18, 2026
97ba8af
Clarify private table eval contracts
bradleyshep Jul 18, 2026
4af3acd
Clarify aggregate table visibility
bradleyshep Jul 18, 2026
7958c49
Allow complete benchmark module responses
bradleyshep Jul 18, 2026
2d00980
Avoid implicit response caps for optional providers
bradleyshep Jul 18, 2026
e040c8d
Clarify private schema and scheduled exports
bradleyshep Jul 18, 2026
ccf14de
Retry silent Rust compiler exits
bradleyshep Jul 18, 2026
d188c8f
Align Rust lifecycle prompt with golden schema
bradleyshep Jul 18, 2026
ef4b8b1
Retry diagnostic-free Cargo exits
bradleyshep Jul 18, 2026
9e7607f
Fix Rust external upload golden capture
bradleyshep Jul 18, 2026
c699171
Clarify Rust lifecycle and HTTP APIs
bradleyshep Jul 18, 2026
414e2b1
Generalize LLM eval guidance and strengthen checks
bradleyshep Jul 19, 2026
905249e
Clarify TypeScript eval guidance
bradleyshep Jul 19, 2026
3d21ee7
Document TypeScript module type contracts
bradleyshep Jul 19, 2026
f672791
Clarify Rust query and HTTP context contracts
bradleyshep Jul 20, 2026
5fb7784
Correct Rust procedural view guidance
bradleyshep Jul 20, 2026
d38f6d9
Correct Rust string accessor guidance
bradleyshep Jul 20, 2026
3dfba78
Clarify C# view and HTTP contracts
bradleyshep Jul 20, 2026
4b41dae
Clarify C# HTTP types and presence IDs
bradleyshep Jul 20, 2026
005a093
Retry transient dotnet linker failures
bradleyshep Jul 20, 2026
25e0b50
updates
bradleyshep Jul 20, 2026
62aa9e9
updates
bradleyshep Jul 20, 2026
5d63ebe
Update SKILL.md
bradleyshep Jul 20, 2026
5fe4011
Update StdbModule.csproj
bradleyshep Jul 20, 2026
35c5d42
Update templates.rs
bradleyshep Jul 21, 2026
6cb8317
Harden Rust LLM benchmark evaluation
bradleyshep Jul 21, 2026
6719f9d
fixes
bradleyshep Jul 21, 2026
b59d00d
Improve C# benchmark reliability
bradleyshep Jul 21, 2026
219d866
Clarify C# connection ID encoding eval
bradleyshep Jul 21, 2026
b58c1fa
Merge remote-tracking branch 'origin/bradley/fix-csharp-llm-bench' in…
bradleyshep Jul 21, 2026
e96a9fc
Harden LLM benchmark validation and cleanup
bradleyshep Jul 21, 2026
9bcdc72
Clarify HTTP APIs in server benchmark skills
bradleyshep Jul 22, 2026
5c5eb8f
Merge branch 'master' into bradley/new-llm-benchmark-evals-0717
bradleyshep Jul 22, 2026
438f71c
Clarify TypeScript benchmark guidance
bradleyshep Jul 22, 2026
5aac866
Harden benchmark regression tests
bradleyshep Jul 22, 2026
bdbeb96
Remove bias
bradleyshep Jul 22, 2026
21125cb
remove bias
bradleyshep Jul 22, 2026
a4a4a3a
cleanup
bradleyshep Jul 22, 2026
07ad955
Use workspace CLI for LLM benchmark runs
bradleyshep Jul 22, 2026
173fa66
Parallelize periodic benchmarks by language
bradleyshep Jul 23, 2026
02e1781
Merge branch 'master' into bradley/new-llm-benchmark-evals-0717
bradleyshep Jul 23, 2026
3483bd6
Keep parallel Rust benchmark builds isolated
bradleyshep Jul 23, 2026
30dbf5a
Refine TypeScript eval guidance and randomness scoring
bradleyshep Jul 23, 2026
3571338
updates
bradleyshep Jul 23, 2026
808baa4
Merge branch 'master' into bradley/new-llm-benchmark-evals-0717
bradleyshep Jul 23, 2026
5b46b13
lints
bradleyshep Jul 23, 2026
0db8781
analysis + post to discord
bradleyshep Jul 24, 2026
c3e0fb6
Update llm-benchmark-periodic.yml
bradleyshep Jul 24, 2026
c018a44
discord summary script
bradleyshep Jul 24, 2026
7c265e5
reasoning arg
bradleyshep Jul 27, 2026
48f890c
Merge branch 'master' into bradley/llm-analysis-expansion
bradleyshep Jul 27, 2026
ef59cc2
polish
bradleyshep Jul 28, 2026
719d982
Merge branch 'master' into bradley/llm-analysis-expansion
bradleyshep Jul 28, 2026
8680f50
Merge branch 'master' into bradley/llm-analysis-expansion
bradleyshep Jul 29, 2026
3e5666f
Allow benchmark runs to skip task catalog upload
bradleyshep Jul 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
189 changes: 142 additions & 47 deletions .github/workflows/llm-benchmark-periodic.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,16 @@ on:
description: 'Run benchmarks without uploading results'
required: false
default: 'false'
skip_task_catalog_upload:
description: 'Skip uploading the benchmark task catalog'
required: false
type: boolean
default: false
post_discord:
description: 'Post the analysis summary to Discord'
required: false
type: boolean
default: false

permissions:
contents: read
Expand All @@ -48,9 +58,29 @@ concurrency:
cancel-in-progress: true

jobs:
prepare_matrix:
name: Prepare benchmark matrix
runs-on: ubuntu-latest
outputs:
languages: ${{ steps.matrix.outputs.languages }}
steps:
- id: matrix
env:
INPUT_LANGUAGES: ${{ inputs.languages || 'rust,csharp,typescript' }}
run: |
languages="$(jq -cn --arg value "$INPUT_LANGUAGES" '$value | split(",") | map(gsub("^\\s+|\\s+$"; "")) | map(select(length > 0))')"
echo "languages=$languages" >> "$GITHUB_OUTPUT"

run-benchmarks:
name: Run benchmarks (${{ matrix.lang }})
needs: prepare_matrix
runs-on: spacetimedb-new-runner-2

strategy:
fail-fast: false
matrix:
lang: ${{ fromJSON(needs.prepare_matrix.outputs.languages) }}

steps:
- name: Checkout repository
uses: actions/checkout@v4
Expand All @@ -61,11 +91,13 @@ jobs:
- uses: Swatinem/rust-cache@v2

- name: Setup .NET SDK
if: matrix.lang == 'csharp'
uses: actions/setup-dotnet@v4
with:
global-json-file: global.json

- name: Install WASI workload
if: matrix.lang == 'csharp'
env:
DOTNET_MULTILEVEL_LOOKUP: "0"
DOTNET_CLI_HOME: ${{ runner.temp }}/dotnet-home
Expand All @@ -74,25 +106,25 @@ jobs:
dotnet workload install wasi-experimental --skip-manifest-update --disable-parallel

- name: Pack C# runtime packages
if: ${{ github.event_name != 'workflow_dispatch' || contains(inputs.languages || 'rust,csharp,typescript', 'csharp') }}
if: matrix.lang == 'csharp'
run: |
dotnet pack -c Release crates/bindings-csharp/BSATN.Runtime
dotnet pack -c Release crates/bindings-csharp/Runtime

- name: Set up Node.js
if: ${{ github.event_name != 'workflow_dispatch' || contains(inputs.languages || 'rust,csharp,typescript', 'typescript') }}
if: matrix.lang == 'typescript'
uses: actions/setup-node@v4
with:
node-version: 22

- name: Install pnpm
if: ${{ github.event_name != 'workflow_dispatch' || contains(inputs.languages || 'rust,csharp,typescript', 'typescript') }}
if: matrix.lang == 'typescript'
uses: ./.github/actions/setup-pnpm
with:
run_install: true

- name: Build TypeScript SDK
if: ${{ github.event_name != 'workflow_dispatch' || contains(inputs.languages || 'rust,csharp,typescript', 'typescript') }}
if: matrix.lang == 'typescript'
run: pnpm build
working-directory: crates/bindings-typescript

Expand All @@ -119,22 +151,28 @@ jobs:
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: "1"
MSBUILDDISABLENODEREUSE: "1"
DOTNET_CLI_USE_MSBUILD_SERVER: "0"
LLM_BENCH_CSHARP_CONCURRENCY: "1"
INPUT_LANGUAGES: ${{ inputs.languages || 'rust,csharp,typescript' }}
LLM_BENCH_CONCURRENCY: "8"
LLM_BENCH_RUST_CONCURRENCY: "4"
LLM_BENCH_CSHARP_CONCURRENCY: "2"
LLM_BENCH_ROUTE_CONCURRENCY: ${{ matrix.lang == 'typescript' && '4' || '2' }}
LLM_BENCHMARK_REPORT_DIR: ${{ runner.temp }}/llm-benchmark-reports
INPUT_LANGUAGE: ${{ matrix.lang }}
INPUT_MODEL_SET: ${{ inputs.model_set || 'website_active' }}
INPUT_MODELS: ${{ inputs.models || '' }}
INPUT_MODES: ${{ inputs.modes || 'guidelines,no_context' }}
INPUT_CATEGORIES: ${{ inputs.categories || '' }}
INPUT_TASKS: ${{ inputs.tasks || '' }}
INPUT_DRY_RUN: ${{ inputs.dry_run || 'false' }}
INPUT_SKIP_TASK_CATALOG_UPLOAD: ${{ inputs.skip_task_catalog_upload || 'false' }}
run: |
LANGS="$INPUT_LANGUAGES"
LANG="$INPUT_LANGUAGE"
MODEL_SET="$INPUT_MODEL_SET"
MODELS="$INPUT_MODELS"
MODES="$INPUT_MODES"
CATEGORIES="$INPUT_CATEGORIES"
TASKS="$INPUT_TASKS"
DRY_RUN="$INPUT_DRY_RUN"
SKIP_TASK_CATALOG_UPLOAD="$INPUT_SKIP_TASK_CATALOG_UPLOAD"

case "$MODEL_SET" in
website_active)
Expand Down Expand Up @@ -162,45 +200,102 @@ jobs:
;;
esac

SUCCEEDED=0
FAILED=0
for LANG in $(echo "$LANGS" | tr ',' ' '); do
EXTRA_ARGS=()
if [ -n "$CATEGORIES" ]; then
EXTRA_ARGS+=(--categories "$CATEGORIES")
fi
if [ -n "$TASKS" ]; then
EXTRA_ARGS+=(--tasks "$TASKS")
fi
if [ "$DRY_RUN" = "true" ]; then
EXTRA_ARGS+=(--dry-run)
fi

if [ "$MODEL_SET" = "website_active" ]; then
if llm_benchmark run --lang "$LANG" --modes "$MODES" --model-source remote "${EXTRA_ARGS[@]}"; then
SUCCEEDED=$((SUCCEEDED + 1))
else
echo "::warning::Benchmark run failed for lang=$LANG"
FAILED=$((FAILED + 1))
fi
elif [ "$MODEL_SET" = "local_defaults" ]; then
if llm_benchmark run --lang "$LANG" --modes "$MODES" "${EXTRA_ARGS[@]}"; then
SUCCEEDED=$((SUCCEEDED + 1))
else
echo "::warning::Benchmark run failed for lang=$LANG"
FAILED=$((FAILED + 1))
fi
else
if llm_benchmark run --lang "$LANG" --modes "$MODES" --models "${MODEL_ARGS[@]}" "${EXTRA_ARGS[@]}"; then
SUCCEEDED=$((SUCCEEDED + 1))
else
echo "::warning::Benchmark run failed for lang=$LANG models=$MODELS"
FAILED=$((FAILED + 1))
fi
fi
EXTRA_ARGS=()
if [ -n "$CATEGORIES" ]; then
EXTRA_ARGS+=(--categories "$CATEGORIES")
fi
if [ -n "$TASKS" ]; then
EXTRA_ARGS+=(--tasks "$TASKS")
fi
if [ "$DRY_RUN" = "true" ]; then
EXTRA_ARGS+=(--dry-run)
fi
if [ "$SKIP_TASK_CATALOG_UPLOAD" = "true" ]; then
EXTRA_ARGS+=(--skip-task-catalog-upload)
fi

if [ "$MODEL_SET" = "website_active" ]; then
llm_benchmark run --lang "$LANG" --modes "$MODES" --model-source remote "${EXTRA_ARGS[@]}"
elif [ "$MODEL_SET" = "local_defaults" ]; then
llm_benchmark run --lang "$LANG" --modes "$MODES" "${EXTRA_ARGS[@]}"
else
llm_benchmark run --lang "$LANG" --modes "$MODES" --models "${MODEL_ARGS[@]}" "${EXTRA_ARGS[@]}"
fi

- name: Upload analysis reports
if: always()
uses: actions/upload-artifact@v4
with:
name: llm-benchmark-analysis-${{ matrix.lang }}
path: ${{ runner.temp }}/llm-benchmark-reports
if-no-files-found: ignore
retention-days: 14

summarize:
name: Summarize benchmark analysis
if: always()
needs: run-benchmarks
runs-on: ubuntu-latest

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Test Discord formatter
run: python3 tools/xtask-llm-benchmark/scripts/test_discord_summary.py

- name: Download analysis reports
continue-on-error: true
uses: actions/download-artifact@v4
with:
pattern: llm-benchmark-analysis-*
path: reports
merge-multiple: true

- name: Publish workflow summary
run: |
echo "# LLM benchmark analysis" >> "$GITHUB_STEP_SUMMARY"
echo >> "$GITHUB_STEP_SUMMARY"

if [ ! -d reports ] || ! find reports -type f -name '*.md' -print -quit | grep -q .; then
echo "No analysis reports were produced." >> "$GITHUB_STEP_SUMMARY"
exit 0
fi

echo "Full per-model reports are available in the workflow artifacts." >> "$GITHUB_STEP_SUMMARY"
echo >> "$GITHUB_STEP_SUMMARY"

find reports -type f -name '*.md' -print | sort | while IFS= read -r report; do
awk '/^## Failure patterns/{exit} NR <= 80 {print}' "$report" >> "$GITHUB_STEP_SUMMARY"
echo >> "$GITHUB_STEP_SUMMARY"
echo "---" >> "$GITHUB_STEP_SUMMARY"
echo >> "$GITHUB_STEP_SUMMARY"
done
echo "Benchmark runs: $SUCCEEDED succeeded, $FAILED failed"
if [ "$FAILED" -gt 0 ]; then
echo "::error::$FAILED benchmark run(s) failed"
exit 1

- name: Prepare Discord summary
if: github.event_name == 'schedule' || inputs.post_discord
env:
RUN_URL: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}
RUN_LABEL: ${{ github.event_name == 'schedule' && 'Weekly scheduled run' || 'Manual run' }}
run: >
python3 tools/xtask-llm-benchmark/scripts/discord_summary.py
--reports-dir reports
--run-url "$RUN_URL"
--run-label "$RUN_LABEL"
--output discord-payload.json

- name: Post Discord summary
if: github.event_name == 'schedule' || inputs.post_discord
continue-on-error: true
env:
DISCORD_WEBHOOK_URL: ${{ secrets.LLM_BENCHMARK_DISCORD_WEBHOOK_URL }}
run: |
if [ -z "$DISCORD_WEBHOOK_URL" ]; then
echo "::warning::LLM_BENCHMARK_DISCORD_WEBHOOK_URL is not configured"
exit 0
fi

curl --fail --silent --show-error \
--header 'Content-Type: application/json' \
--data-binary @discord-payload.json \
"$DISCORD_WEBHOOK_URL"
Loading
Loading