Skip to content

[Misc] remove legacy full_duplex alias for auto_response - #8024

Merged
linyueqian merged 1 commit into
vllm-project:mainfrom
NickCao:codex/drop-full-duplex
Sep 23, 2026
Merged

linyueqian merged 1 commit into
vllm-project:mainfrom
NickCao:codex/drop-full-duplex

Conversation

@NickCao

@NickCao NickCao commented Sep 22, 2026

Copy link
Copy Markdown
Collaborator

Purpose

Keep auto_response as the sole runtime switch for automatic duplex responses.

Test Plan

vLLM Version: 0.30.0

vLLM-Omni Commit: f6f748e

grep for full_duplex

Test Result

no reference remains in either code or doc.

@vllm-omni-review-bot

Copy link
Copy Markdown

This PR appears to belong to: docs/design/module/model_integration.md, docs/design/module/ar_runtime.md, docs/design/module/engine_orchestration.md.

Module owners: @tzhouam @fake0fan @Gaohan123

Routing: @tzhouam via module of the changed files, semantic router, CODEOWNERS; @fake0fan via module of the changed files, semantic router; @Gaohan123 via module of the changed files

@NickCao, please review your own changes and leave a short self-review comment describing what you checked. PRs without author self-review may not be assigned a reviewer.

Please take a look when you have a chance. If you would like an automated review, mention @vllm-omni-review-bot in a comment.

@NickCao

NickCao commented Sep 22, 2026

Copy link
Copy Markdown
Collaborator Author

@vllm-omni-review-bot

@vllm-omni-review-bot

vllm-omni-review-bot commented Sep 22, 2026 •

Copy link
Copy Markdown

Omni ReviewBot triage note

Automated triage of commit ed9806f494cd produced:

  • Priority: high. Prompt maintainer attention is suggested.

These are automated triage suggestions only — the final decision belongs to the maintainers.

@vllm-omni-review-bot

Copy link
Copy Markdown
Omni ReviewBot routing record

Assigned Strict under experiment vllm-omni-strict-5050-20260829.

@vllm-omni-review-bot vllm-omni-review-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.

Omni ReviewBot review

Scan:

Category Result
Tests / verification 2 finding(s) below
Security no finding reported
Docs / comments 2 finding(s) below
Behavior / compatibility no finding reported
Correctness 1 finding(s) below

Validated:

  • [resolved] Bot self-review/routing chatter — not a code defect at this head.
  • [claim-verified] Purpose: sole runtime switch is auto_response — emitter.py:128, serving_adapter.py:120, plugin.py:163 all drop the full_duplex OR.
  • [validated] in-repo producers already on auto_response only: vllm_omni/clients/duplex.py:282 {"auto_response": self.auto_response}; examples realtime_web profiles; docs/serving/realtime_duplex_api.md:641
  • [validated] gate_report clean; no CI intersection ask.
  • [validated] No new external dependency calls; checklist 10 N/A.
  • [validated] public docs never listed the alias: realtime_duplex_api.md:466 extra_body keys are (auto_response, force_listen_count, duplex_initial_user_text)

Keep three items on the primary alias removal: (7) shared auto_responds() now silently ignores full_duplex-only clients while Nemotron still fails loud — demoted to minor and merged with the docs tombstone; (0) no tests pin the new negative contract — merge of the adversary/investigator test asks; (10) Test Result overclaims “no full_duplex in code or doc” — demoted to nit. Drop no_issue/resolved/excluded notes and optional _require_native_full_duplex renames; dup Nemotron/Qwen/site-local repeats onto 0 or 7.

Verdict: COMMENT

Findings

  • **[P2] This diff makes auto-response / Nemotron native full-duplex depend only on ext…** — vllm_omni/engine/duplex/session/emitter.pyThis diff makes auto-response / Nemotron native full-duplex depend only onextra.get("auto_response") is True(and Qwen only rejects that key). The formerfull_duplexOR-alias is gone. No test files are in the PR, and existing duplex tests only setauto_responseTrue/False — none assertextra_body={"full_duplex": True}. Add a focused negative unit that full_duplex: Truealone does not makeSessionEmitter.auto_responds()True and does not satisfy Nemotron_require_native_full_duplex` (optional: Qwen no longer raises on that key alone), so reintroducing the alias cannot regress unnoticed.

Evidence: emitter.py:128 return extra.get("auto_response") is True; serving_adapter.py:120 enabled = isinstance(extra_body, dict) and extra_body.get("auto_response") is True; plugin.py:163 if extra_body.get("auto_response"):; unchanged by this diff, present in the PR-time tree: clients/duplex.py:243 auto_response: bool = True; unchanged by this diff: tests/ grep for ['"]full_duplex['"] / extra_body.*full_duplex returns zero matches — duplex harnesses only pass auto_response (e.g. tests/engine/duplex/test_session_runner.py:222 body: dict[str, object] = {"auto_response": auto_response, **(extra_body or {})}).

  • **[P2] Qwen validate_client_extra_body no longer rejects full_duplex (only auto_r…** — `` Qwen validate_client_extra_bodyno longer rejectsfull_duplex(onlyauto_response/realtime_tools); with the alias deleted, full_duplex` is an ignored unknown extra — expected residual.

Evidence: vllm_omni/model_executor/models/qwen3_omni/duplex/plugin.py:163-166 if extra_body.get("auto_response"): / raise DuplexRuntimeConfigError( / "Qwen requires server VAD or explicit commits; native auto_response is unsupported" — full_duplex gate removed; no full_duplex matches remain under vllm_omni/model_executor/models/qwen3_omni/ (PR-time tree grep).

  • [P2] concern 'docs still teach full_duplex as extra_body key' — not present at head — ``
    concern 'docs still teach full_duplex as extra_body key' — not present at head; docs only brand the Full Duplex feature/pages

Evidence: [resolved] concern 'docs still teach full_duplex as extra_body key' — not present at head; docs only brand the Full Duplex feature/pages

  • **[P3] This PR removes only the extra_body wire-key alias (auto_response OR full_…** — docs/serving/full_duplex_api.mdThis PR removes only theextra_body wire-key alias (auto_responseORfull_duplex). Any Test Result that says a grep left “no reference … in either code or doc” overclaims: full_duplexstill appears indocs/serving/full_duplex_api.md(title/prose) and as_require_native_full_duplexinserving_adapter.py. Tighten to “no extra_body.full_duplex alias key remains” (rg ["']full_duplex["']` is empty).

Evidence: unchanged by this diff, present in the PR-time tree: docs/serving/full_duplex_api.md:1 # Full-Duplex WebSocket API; unchanged-by-this-diff name, present in the PR-time tree: vllm_omni/model_executor/models/nemotron_voicechat/duplex/serving_adapter.py:118 def _require_native_full_duplex(config: object) -> None:; post-diff body at serving_adapter.py:120 enabled = isinstance(extra_body, dict) and extra_body.get("auto_response") is True; PR-time tree: rg ["']full_duplex["'] → no matches.

if not isinstance(extra, dict):
return False
return extra.get("auto_response") is True or extra.get("full_duplex") is True
return extra.get("auto_response") is True

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] This hunk drops or extra.get("full_duplex") is True from shared `SessionEmitt…

This hunk drops or extra.get("full_duplex") is True from shared SessionEmitter.auto_responds(), so extra_body with only full_duplex: true now yields False with no error on duplex paths that call it. Sibling validators still allow that key through: MiniCPM/PersonaPlex only intersect private-key sets that omit full_duplex, and Aura only type-checks the object — those sessions open. Nemotron alone raises via _require_native_full_duplex when auto_response is True is missing. Alias-only clients therefore get a silent behavior change on non-Nemotron models. Reject leftover full_duplex at session open (or in auto_responds) with an explicit migration error, or document that legacy full_duplex is unrecognized and callers must use auto_response.

Evidence: emitter.py:128 return extra.get("auto_response") is True — full_duplex no longer enables auto-respond. Unchanged by this diff, present in the PR-time tree: minicpmo_4_5/duplex/plugin.py:724-731 private_keys = sorted(PRIVATE_RUNTIME_CONFIG_KEYS.intersection(extra_body)) / raise only on private keys (frozenset at :79-97 omits full_duplex). Unchanged by this diff: personaplex/duplex/serving_adapter.py:151-156 same private-key-only pattern (_PRIVATE_RUNTIME_CONFIG_KEYS at :31-40 omits full_duplex). Unchanged by this diff: aura_omni/duplex/plugin.py:441-445 only rejects non-dict extra_body. Diff-touched: nemotron_voicechat/duplex/serving_adapter.py:120-124 enabled = isinstance(extra_body, dict) and extra_body.get("auto_response") is True then raises unless enabled.

Suggestion: if "full_duplex" in extra:
raise ValueError(
"extra_body.full_duplex is removed; set extra_body.auto_response=true"
)
return extra.get("auto_response") is True

@linyueqian linyueqian added the ready label to trigger buildkite CI label Sep 22, 2026

@linyueqian linyueqian left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Removing the full_duplex alias leaves auto_response as the one switch, and the three sites here are the only remaining readers on main (emitter, Nemotron VoiceChat adapter, Qwen3-Omni duplex plugin), so nothing keeps honouring the old key. Two behaviour notes worth a line in the release notes: a client that still sends extra_body={"full_duplex": true} now silently gets turn-based responses instead of an error, and Qwen3-Omni, which used to reject full_duplex with a DuplexRuntimeConfigError, now accepts the key and ignores it. Static read at f6f748ed against merge-base 7d6e2ade; no PR code executed.

@hsliuustc0106 hsliuustc0106 added the refactor refactoring for better code scalability and quality label Sep 23, 2026
@vllm-omni-review-bot

Copy link
Copy Markdown

Omni ReviewBot: CI is red on this head

@NickCao required checks failed on f6f748edf43b:

Please fix the failure and push again; this note is updated in place when the head goes green or moves.

Keep auto_response as the sole runtime switch for automatic duplex responses.

Co-authored-by: Codex <noreply@openai.com>
Signed-off-by: Nick Cao <ncao@redhat.com>
@NickCao
NickCao force-pushed the codex/drop-full-duplex branch from f6f748e to ed9806f Compare September 23, 2026 12:34
@NickCao NickCao added ready label to trigger buildkite CI and removed ready label to trigger buildkite CI labels Sep 23, 2026
@NickCao
NickCao enabled auto-merge (squash) September 23, 2026 12:34
@linyueqian
linyueqian merged commit d521b3f into vllm-project:main Sep 23, 2026
7 of 9 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ready label to trigger buildkite CI refactor refactoring for better code scalability and quality

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants