Skip to content

feat(bfcl): nightly covers non_live + live + multi_turn - #1764

Merged
slin1237 merged 3 commits into
mainfrom
feat/bfcl-nightly-live-multiturn
Jun 17, 2026
Merged

slin1237 merged 3 commits into
mainfrom
feat/bfcl-nightly-live-multiturn

Conversation

@key4ng

@key4ng key4ng commented Jun 17, 2026 •

Copy link
Copy Markdown
Member

Description

Problem

The nightly BFCL A/B only ran the 7 non_live AST categories (~16 min). It didn't exercise live (real-user function-calling data) or multi_turn (multi-turn tool-use loops) — the categories most representative of real agentic use, and multi-turn in particular is a distinct parser/streaming code path.

Solution

Expand the nightly to non_live + live + multi_turn (17 categories). All three are static/reproducible (no internet — live is real-user data, multi_turn is state-based simulation). Excludes the agentic/executable categories (web_search_*, memory_*, exec_*) that need web-search / memory / sandbox infra. The PR-time sanity run is unchanged (quick non-live subset).

Changes

  • .github/workflows/nightly-bfcl.yml: schedule/dispatch CATEGORIES default → 17 categories (non_live + live + multi_turn); workflow_dispatch categories input default updated to match; PR-event categories unchanged (simple_python,irrelevance); bfcl-ab timeout-minutes 120 → 240 (multi-turn state simulation is much slower).
  • scripts/bfcl/README.md: nightly-scope note updated; removed a dev-history note.

Test Plan

  • nightly-bfcl.yml parses; 17 categories resolved; triggers = schedule + pull_request + workflow_dispatch; pre-commit green.
  • The non_live slice is already validated end-to-end on an H100 box (per the README table: SMG at parity, +0.18pp overall).
  • Not yet run end-to-end with live + multi_turn. Recommend a manual workflow_dispatch (or watching the first nightly) to shake them out before relying on the numbers — multi_turn is a new code path (multi-turn tool loops + reasoning) and the main thing to verify, plus confirming the ~240 min budget holds.
Checklist
  • cargo +nightly fmt passes (n/a — no Rust changes)
  • cargo clippy --all-targets --all-features -- -D warnings passes (n/a — no Rust changes)
  • (Optional) Documentation updated
  • (Optional) Please join us on Slack #sig-smg to discuss, review, and merge PRs

🤖 Generated with Claude Code

Summary by CodeRabbit

  • Documentation

    • Updated BFCL nightly testing documentation with clarifications on test coverage, validation status, and vLLM parser compatibility for newer hardware SKUs.
  • Chores

    • Extended nightly pipeline runtime and expanded default test coverage to include additional live and multi-turn test categories.

key4ng added 2 commits June 16, 2026 22:02
…-live sanity)

Expands the nightly BFCL A/B category set from non_live (7) to non_live + live +
multi_turn (17): adds the 6 live (real-user data) and 4 multi_turn (state-based)
categories — all static/reproducible, no internet. Excludes the agentic/
executable categories (web_search/memory/exec) that need external infra.

- schedule/dispatch default -> 17 categories; PR sanity stays simple_python,
  irrelevance.
- bfcl-ab timeout 120 -> 240 min (multi_turn state simulation is much slower).
- README scope note updated.

Signed-off-by: key4ng <rukeyang@gmail.com>
@github-actions github-actions Bot added documentation Improvements or additions to documentation ci CI/CD configuration changes labels Jun 17, 2026
@coderabbitai

coderabbitai Bot commented Jun 17, 2026 •

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

The nightly BFCL workflow is updated to expand default test categories to include live and multi-turn entries (excluding agentic/executable), doubling the bfcl-ab job timeout from 120 to 240 minutes. The BFCL README is clarified with reformatted sections, new vLLM guidance for mid-2026 SKUs, and a revised scope note that distinguishes nightly coverage from the end-to-end validation table.

Changes

BFCL Nightly Coverage Expansion

Layer / File(s) Summary
Workflow category defaults and timeout increase
.github/workflows/nightly-bfcl.yml
Header comments are updated to describe static/reproducible scope and exclude agentic/executable categories. The workflow_dispatch categories default and the bfcl-ab job's scheduled CATEGORIES env var are both expanded to include live and multi-turn categories. timeout-minutes is raised from 120 to 240.
README clarifications, vLLM guidance, and scope alignment
scripts/bfcl/README.md
Track B and FC mode sections are reformatted for clarity; key env knobs description is condensed. A new note is added under Gotchas describing mid-2026 SKU vLLM parser name verification via vllm serve --help. Validation status section is expanded to distinguish the non_live-only end-to-end table from the broader nightly coverage scope (non_live + live + multi_turn), removing the prior bundled fixes note.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Possibly related PRs

  • lightseekorg/smg#1724: Introduced the nightly BFCL A/B framework that this PR builds on — the expanded categories inputs and increased bfcl-ab timeout-minutes are direct extensions of the workflow structure from that PR.

Suggested reviewers

  • gongwei-130
  • CatherineSue
  • XinyueZhang369
  • slin1237

Poem

🐇 Hop hop, the nightly test grows wide,
Live and multi-turn now join the ride!
Four hours strong beneath the moon,
The README scope was fixed in tune.
No agentic bunnies hop inside! 🚫

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely captures the main change: expanding nightly BFCL coverage to include three category types (non_live, live, multi_turn). It accurately reflects the primary objective documented in the PR objectives.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/bfcl-nightly-live-multiturn

Comment @coderabbitai help to get the list of available commands and usage tips.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request updates the scripts/bfcl/README.md file to clarify the scope of nightly runs versus PR-time checks, and removes outdated troubleshooting notes. The feedback suggests a minor phrasing improvement in the README to clarify how per-PR correctness is verified.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

Comment thread scripts/bfcl/README.md Outdated
Comment on lines +160 to +161
(`simple_python,irrelevance`); per-PR correctness is the cheap CPU Track-A
parser-conformance gate (`crates/parser_conformance`). Scale to multiple runs ×

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The phrase "per-PR correctness is the cheap CPU Track-A parser-conformance gate" contains a minor category error (correctness is a property, whereas the gate is a mechanism). It would be clearer to state that correctness is verified by or checked via the gate.

Suggested change:

(`simple_python,irrelevance`); per-PR correctness is verified by the cheap CPU Track-A
parser-conformance gate (`crates/parser_conformance`). Scale to multiple runs ×

@claude claude Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Straightforward CI config change — expands nightly BFCL A/B from 7 non_live categories to 17 (non_live + live + multi_turn), bumps timeout appropriately, and updates the README scope note. Category lists are consistent across the workflow_dispatch input default and CATEGORIES env fallback. PR-time sanity subset is unchanged. No issues found.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/nightly-bfcl.yml:
- Around line 108-110: The nightly workflow expands to 17 categories in the
CATEGORIES environment variable, but the run_ab.py script only computes results
from categories with discovered score files, allowing the job to pass even if
one category produces no score artifact. Add a validation step after the
run_ab.py execution that checks whether all requested categories from the
CATEGORIES environment variable were actually processed and included in the
report, and fail the workflow if any are missing. This ensures complete coverage
before allowing the job to succeed.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 05b51fc0-f759-4bd0-aa17-5f2ca9f82c53

📥 Commits

Reviewing files that changed from the base of the PR and between b1120b1 and a409ae4.

📒 Files selected for processing (2)
  • .github/workflows/nightly-bfcl.yml
  • scripts/bfcl/README.md

Comment on lines +108 to 110
# PR = quick non-live sanity subset; schedule/dispatch = non_live + live + multi_turn.
CATEGORIES: ${{ github.event.inputs.categories || (github.event_name == 'pull_request' && 'simple_python,irrelevance' || 'simple_python,simple_java,simple_javascript,multiple,parallel,parallel_multiple,irrelevance,live_simple,live_multiple,live_parallel,live_parallel_multiple,live_irrelevance,live_relevance,multi_turn_base,multi_turn_miss_func,multi_turn_miss_param,multi_turn_long_context') }}
steps:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Fail the workflow when any requested category is missing from the report.

At Line 109, the nightly scope expands to 17 categories, but scripts/bfcl/run_ab.py currently computes overall from only categories with discovered score files. If one of the new categories produces no score artifact, the job can still pass with partial coverage.

Suggested guard step (after `run_ab.py`)
       - name: Launch arms + run official BFCL A/B
         env:
@@
           python scripts/bfcl/run_ab.py \
             --baseline  "vllm=$A_URL" \
             --candidate "smg=$B_URL" \
             --bfcl-model "$BFCL_MODEL_FC" \
             --categories "$CATEGORIES" \
             --bfcl "$(command -v bfcl)" \
             --project-root "$RUNNER_TEMP/bfcl_ab" \
             --out "$RUNNER_TEMP/bfcl_ab.md" \
             --json-out "$RUNNER_TEMP/bfcl_ab.json" \
             --tolerance 0.02 || echo "BFCL_AB_REGRESSION=1" >> "$GITHUB_ENV"
+      - name: Verify all requested categories produced scores
+        if: success()
+        run: |
+          python - <<'PY'
+          import json, os, sys
+          req = [c.strip() for c in os.environ["CATEGORIES"].split(",") if c.strip()]
+          p = os.path.join(os.environ["RUNNER_TEMP"], "bfcl_ab.json")
+          with open(p, encoding="utf-8") as f:
+              payload = json.load(f)
+          rows = {r["category"]: r for r in payload.get("per_category", [])}
+          missing = [
+              c for c in req
+              if c not in rows or rows[c].get("baseline") is None or rows[c].get("candidate") is None
+          ]
+          if missing:
+              print("Missing BFCL scores for categories: " + ", ".join(missing), file=sys.stderr)
+              sys.exit(1)
+          PY
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/nightly-bfcl.yml around lines 108 - 110, The nightly
workflow expands to 17 categories in the CATEGORIES environment variable, but
the run_ab.py script only computes results from categories with discovered score
files, allowing the job to pass even if one category produces no score artifact.
Add a validation step after the run_ab.py execution that checks whether all
requested categories from the CATEGORIES environment variable were actually
processed and included in the report, and fail the workflow if any are missing.
This ensures complete coverage before allowing the job to succeed.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: a409ae42b6

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

# PR = quick non-live sanity subset; schedule/dispatch = full non-live set.
CATEGORIES: ${{ github.event.inputs.categories || (github.event_name == 'pull_request' && 'simple_python,irrelevance' || 'simple_python,simple_java,simple_javascript,multiple,parallel,parallel_multiple,irrelevance') }}
# PR = quick non-live sanity subset; schedule/dispatch = non_live + live + multi_turn.
CATEGORIES: ${{ github.event.inputs.categories || (github.event_name == 'pull_request' && 'simple_python,irrelevance' || 'simple_python,simple_java,simple_javascript,multiple,parallel,parallel_multiple,irrelevance,live_simple,live_multiple,live_parallel,live_parallel_multiple,live_irrelevance,live_relevance,multi_turn_base,multi_turn_miss_func,multi_turn_miss_param,multi_turn_long_context') }}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Avoid ambiguous BFCL score matches when adding live categories

When the default nightly set includes both parallel/multiple and live_parallel/live_multiple, the existing score parser in scripts/bfcl/run_ab.py searches with score_root.rglob(f"*{category}_score.json"). That pattern is ambiguous: the parallel row can also match BFCL_v4_live_parallel_score.json, and multiple can match parallel_multiple/live_multiple, so the nightly report and regression gate can attribute the wrong accuracy depending on traversal order. Please make the score lookup exact (or group-aware) before running mixed non-live and live categories in one job.

Useful? React with 👍 / 👎.

…aps)

Signed-off-by: key4ng <rukeyang@gmail.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
scripts/bfcl/README.md (1)

104-105: 🧹 Nitpick | 🔵 Trivial | ⚡ Quick win

Add validation-status caveat for live and multi_turn categories.

The scope note correctly distinguishes the nightly's expanded coverage (non_live + live + multi_turn, 17 categories) from the validation table's non_live slice. However, per the PR objectives, live and multi_turn categories have not yet run end-to-end. Users reading this section should be advised to manually validate or observe the first nightly run before relying on results from those newly-added categories.

📝 Suggested addition
 Scope note: the table above is the `non_live` slice. The **nightly** runs the broader reproducible set — **`non_live` + `live` + `multi_turn`** (17 categories; `live` is real-user data, `multi_turn` is state-based simulation — both static, no internet). It excludes the agentic/executable categories (`web_search_*`, `memory_*`, `exec_*`) that need web-search/memory/sandbox infra. **PRs** that touch the pipeline run only a quick non-live sanity subset (`simple_python,irrelevance`); per-PR correctness is the cheap CPU Track-A parser-conformance gate (`crates/parser_conformance`). Scale to multiple runs × the five target models for tight confidence intervals.
+
+⚠️ **Note:** The `live` and `multi_turn` categories are newly added to nightly coverage and have not yet been run end-to-end. Recommend a manual workflow dispatch or observing the first scheduled nightly run to validate functionality and results before relying on them.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@scripts/bfcl/README.md` around lines 104 - 105, The scope note in the
README.md file describes the nightly test coverage including `live` and
`multi_turn` categories but lacks a validation caveat. Add a clear warning
statement after mentioning these categories to advise users that `live` and
`multi_turn` have not yet completed end-to-end execution, and they should
manually validate results or wait for the first nightly run before relying on
data from these newly-added categories. This caveat should be placed within the
scope note paragraph to inform readers of the validation status before they draw
conclusions from results in these categories.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@scripts/bfcl/README.md`:
- Line 75: In the README.md file, replace the phrase "bringing this up" in the
section header with a more specific and clear alternative such as "setting this
up" or "getting this running." Locate the section header that reads "## Gotchas
discovered while bringing this up (read before debugging)" and update it to use
the more descriptive phrase to improve clarity and avoid overused terminology.

---

Outside diff comments:
In `@scripts/bfcl/README.md`:
- Around line 104-105: The scope note in the README.md file describes the
nightly test coverage including `live` and `multi_turn` categories but lacks a
validation caveat. Add a clear warning statement after mentioning these
categories to advise users that `live` and `multi_turn` have not yet completed
end-to-end execution, and they should manually validate results or wait for the
first nightly run before relying on data from these newly-added categories. This
caveat should be placed within the scope note paragraph to inform readers of the
validation status before they draw conclusions from results in these categories.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 8114758b-1d88-4a78-ba19-2125af4e646a

📥 Commits

Reviewing files that changed from the base of the PR and between a409ae4 and 69b1d34.

📒 Files selected for processing (1)
  • scripts/bfcl/README.md

Comment thread scripts/bfcl/README.md
> `vllm serve --help | grep -A40 tool-call-parser`.
> The mid-2026 SKUs (DeepSeek V4, Kimi K2.6, Qwen3.6, MiniMax M2.7) may use newer parser names; confirm against the installed vLLM build: `vllm serve --help | grep -A40 tool-call-parser`.

## Gotchas discovered while bringing this up (read before debugging)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick | 🔵 Trivial | 💤 Low value

Consider alternative phrasing for "bringing this up."

LanguageTool flagged "Gotchas discovered while bringing this up" as potentially overused phrasing. Consider a more specific alternative such as "while setting this up" or "while getting this running."

🧰 Tools
🪛 LanguageTool

[style] ~75-~75: ‘Bringing this up’ can be overused. To elevate your writing, try opting for an alternative.
Context: ...l-parser. ## Gotchas discovered while bringing this up (read before debugging) - **bfcl-eval...

(BRING_THIS_UP)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@scripts/bfcl/README.md` at line 75, In the README.md file, replace the phrase
"bringing this up" in the section header with a more specific and clear
alternative such as "setting this up" or "getting this running." Locate the
section header that reads "## Gotchas discovered while bringing this up (read
before debugging)" and update it to use the more descriptive phrase to improve
clarity and avoid overused terminology.

Source: Linters/SAST tools

@slin1237
slin1237 merged commit 6ac222f into main Jun 17, 2026
34 of 38 checks passed
@slin1237
slin1237 deleted the feat/bfcl-nightly-live-multiturn branch June 17, 2026 15:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci CI/CD configuration changes documentation Improvements or additions to documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants