Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 27 additions & 28 deletions adapters/vllm_omni/manifest.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,8 @@ upstream:
kind: fork_tracking
repo_path: ${VLLM_UPSTREAM_REPO}
remote: origin
# v0.30.0 alignment campaign (2026-09-17): wheel pick and commit
# assignment target the release branch, not upstream main. The branch
# is cut but NOT yet tagged, so this tracks the branch head and is
# re-pinned to the tag commit once v0.30.0 is released.
target_branch: releases/v0.30.0
# v0.32.0 alignment tracks upstream main until the release branch is cut.
target_branch: main

# Repo-specific slice of the SHARED, human-curated knowledge base (the vendored
# community docs at the repo-root `knowledge/` = settings.knowledge_dir;
Expand Down Expand Up @@ -67,10 +64,10 @@ knowledge:
# scoping) may only ever gain coverage here, never lose it.
modules:
worker_runner:
local_paths: [vllm_omni/worker/]
local_paths: [vllm_omni/worker/, vllm_omni/worker_v2/]
upstream_paths: [vllm/v1/worker/]
test_paths: [tests/worker/, tests/diffusion/test_diffusion_worker.py, tests/e2e/offline_inference/custom_pipeline/, tests/e2e/online_serving/test_qwen3_tts_base.py, tests/entrypoints/test_omni_sleep_mode.py]
import_check: "from vllm_omni.worker.gpu_model_runner import *; from vllm_omni.worker.gpu_generation_model_runner import *; from vllm_omni.worker.gpu_ar_model_runner import *; from vllm_omni.worker.gpu_ar_worker import *; print('Worker/Runner imports OK')"
test_paths: [tests/worker/, tests/worker_v2/, tests/diffusion/test_diffusion_worker.py, tests/e2e/features/custom_pipeline/, tests/e2e/online_serving/test_qwen3_tts_base.py, tests/entrypoints/test_omni_sleep_mode.py]
import_check: "from vllm_omni.worker.gpu_model_runner import *; from vllm_omni.worker.gpu_generation_model_runner import *; from vllm_omni.worker.gpu_ar_model_runner import *; from vllm_omni.worker.gpu_ar_worker import *; from vllm_omni.worker_v2.omni_ar_model_runner import *; from vllm_omni.worker_v2.omni_generation_model_runner import *; print('Worker/Runner imports OK')"
wave: 1
risk: high
model_executor:
Expand All @@ -82,14 +79,14 @@ modules:
risk: high
input_output:
local_paths: [vllm_omni/inputs/, vllm_omni/outputs/, vllm_omni/utils/mm_outputs.py, vllm_omni/data_entry_keys.py, vllm_omni/engine/async_omni_engine.py, vllm_omni/engine/orchestrator.py, vllm_omni/engine/serialization.py, vllm_omni/engine/stage_init_utils.py, vllm_omni/engine/stage_engine_core_client.py, vllm_omni/engine/output_processor.py, vllm_omni/request.py]
upstream_paths: [vllm/inputs/, vllm/v1/engine/input_processor.py, vllm/v1/engine/output_processor.py, vllm/v1/request.py]
test_paths: [tests/entrypoints/test_omni_new_request_data.py, tests/engine/test_async_omni_engine_input.py, tests/test_outputs.py]
upstream_paths: [vllm/inputs/, vllm/renderers/, vllm/v1/engine/input_processor.py, vllm/v1/engine/output_processor.py, vllm/v1/request.py]
test_paths: [tests/inputs/, tests/entrypoints/test_omni_new_request_data.py, tests/engine/test_async_omni_engine_input.py, tests/engine/test_omni_request_output.py]
import_check: "from vllm_omni.inputs.data import *; from vllm_omni.inputs.preprocess import *; from vllm_omni.engine.async_omni_engine import AsyncOmniEngine; from vllm_omni.engine.orchestrator import Orchestrator; from vllm_omni.engine.serialization import serialize_additional_information; print('Input/Output imports OK')"
wave: 1
scheduler:
local_paths: [vllm_omni/core/]
upstream_paths: [vllm/v1/core/sched/]
test_paths: [tests/distributed/, tests/diffusion/distributed/test_ulysses_uaa_perf.py]
test_paths: [tests/core/sched/, tests/distributed/, tests/model_executor/test_cfg_pairing.py, tests/diffusion/distributed/test_ulysses_uaa_perf.py]
import_check: "from vllm_omni.core.sched.omni_ar_scheduler import *; from vllm_omni.core.sched.omni_generation_scheduler import *; print('Scheduler imports OK')"
wave: 1
risk: high
Expand Down Expand Up @@ -213,18 +210,10 @@ rebase:
# adapter is active; this whole `rebase:` section is HIGH-RISK (human-only
# writes) so an agent can never self-install hooks
hooks: rebase/hooks.py
# READ-ONLY parent-store read-compat (Rev 8 §9 PR4c, delivered by the
# completion design D2): v3 knowledge retrieval unions these layers LAST
# (runtime > adapter seed > parent) until the PR4d migration executes,
# after which the owner REMOVES these two keys (RUNBOOK step) and the
# compat layer dies. The v3 prelude fails CLOSED when a declared layer
# is unreadable and records open/close logical digests (§8 fairness).
knowledge:
parent_debug_db: ${REBASE_AGENT_ROOT}/agent/store/debug_memory.db
parent_skills_dir: ${REBASE_AGENT_ROOT}/agent/skills
# the parent store's own column carrying the upstream commit — repo
# data, so the neutral read-compat/migration code stays literal-free
parent_upstream_column: vllm_commit
# The READ-ONLY parent-store read-compat `knowledge:` block (Rev 8 §9
# PR4c) is removed (owner decision 2026-10-01): the parent rebase-agent
# checkout no longer exists, so v3 runs on its own runtime + adapter seed
# knowledge only. An absent declaration attests nothing and blocks nothing.
# the shared checkout flock name: v3, the v1 backend, EXT1's external
# startup guard, and PR7 archival ALL take locks/<lock_name>.lock inside
# the checkout, so exclusion is mutual (repo data — the core stays neutral)
Expand All @@ -244,7 +233,10 @@ rebase:
import_check_modules: [vllm._C_stable_libtorch, vllm._C]
ops_namespace: _C
stale_artifact_globs: ["_C*.so", "*.abi3.so", "_moe_C*.so"]
install_env: {VLLM_USE_PRECOMPILED: "1"}
install_env:
VLLM_USE_PRECOMPILED: "1"
VLLM_PRECOMPILED_WHEEL_COMMIT: "{commit}"
VLLM_PRECOMPILED_WHEEL_VARIANT: "{variant}"
reinstall_retries: 3
pin:
dockerfile: docker/Dockerfile.ci
Expand All @@ -260,7 +252,7 @@ rebase:
# trigger env (parent create_build env + trigger_and_monitor extra_env,
# verbatim): opts the FULL suite in — a webhook build without these
# runs fewer tests, which is why pushed rounds create their own build
build_env: {NIGHTLY: "1", RUN_HUNYUAN_IMAGE3_PERF: "1"}
build_env: {NIGHTLY: "1", RUN_HUNYUAN_IMAGE3_PERF: "1", EMAIL_DISTRIBUTION: "0"}
# monitor classification data (parent monitor.py constants — EXCEPT
# the pipeline upload/load lanes, moved to structural: their failure
# suppresses every dynamic test job, so ignoring it was a false-green
Expand Down Expand Up @@ -310,9 +302,9 @@ rebase:
# behavioral routing replay).
assignment_paths:
model_config: [tests/entrypoints/test_stage_utils.py, tests/metrics/test_stats.py]
input_output: [tests/entrypoints/test_omni_new_request_data.py, tests/engine/, tests/test_outputs.py]
input_output: [tests/entrypoints/test_omni_new_request_data.py, tests/engine/, tests/engine/test_omni_request_output.py]
scheduler: [tests/distributed/]
worker_runner: [tests/worker/, tests/diffusion/test_diffusion_worker.py, tests/e2e/offline_inference/custom_pipeline/]
worker_runner: [tests/worker/, tests/worker_v2/, tests/diffusion/test_diffusion_worker.py, tests/e2e/features/custom_pipeline/]
model_executor: [tests/model_executor/, tests/diffusion/, tests/e2e/offline_inference/]
online_serving: [tests/entrypoints/, tests/e2e/online_serving/]
benchmarks: [tests/benchmarks/test_serve_cli.py]
Expand All @@ -332,6 +324,13 @@ rebase:
# full offline inference suite takes about four hours on the shared host,
# so the previous 7200s default could never produce a terminal result.
module_timeout_sec: 21600
# The wrapper refuses a TEST_TIMEOUT_SEC above this cap; it must not be
# lower than the planned budget above or every required command is refused.
module_max_timeout_sec: 21600
# Phase-2 module agents run on the CUDA wheel/runtime above. Broad pytest
# paths must retain CUDA-capable and platform-neutral items while leaving
# NPU/ROCm/XPU/MUSA-only items to their native CI lanes.
module_test_platform: cuda
# root-level artifacts tests leak between runs (test_artifact_cleanup.sh
# TEST_ARTIFACT_GLOBS, verbatim) — gitignored upstream but pile up on disk
artifact_globs: ["audio_chatcmpl-*.wav", "audio_[0-9]*ch_*.wav",
Expand Down Expand Up @@ -372,7 +371,7 @@ rebase:
candidates: [tests/entrypoints/test_stage_utils.py, tests/metrics/test_stats.py, tests/entrypoints/test_omni_llm.py]
fallback: tests/entrypoints/test_stage_utils.py
input_output:
candidates: [tests/entrypoints/test_omni_new_request_data.py, tests/engine/test_async_omni_engine_input.py, tests/entrypoints/test_omni_input_preprocessor.py, tests/test_outputs.py]
candidates: [tests/entrypoints/test_omni_new_request_data.py, tests/engine/test_async_omni_engine_input.py, tests/entrypoints/test_omni_input_preprocessor.py, tests/engine/test_omni_request_output.py]
fallback: tests/entrypoints/test_omni_new_request_data.py
online_serving:
candidates: [tests/entrypoints/test_async_omni.py, tests/entrypoints/test_async_omni_diffusion_config.py, tests/entrypoints/test_omni_diffusion.py, tests/entrypoints/test_omni_stage_diffusion_config.py, tests/entrypoints/openai_api/]
Expand Down
47 changes: 33 additions & 14 deletions adapters/vllm_omni/rebase/api_drift_guard.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,8 @@
# api_drift_guard.py — Inheritance/constructor/unpack drift guard for vllm-omni.
# Ported from the rebase agent (agent/lib/api_drift_guard.py); runs
# standalone with the TARGET repo python (cwd or OMNI_PATH = vllm-omni root).
# Verbatim except two documented divergences: the pooling constructor entry
# (parent's spelling could never import) and constructor-check import
# failures counting as mismatches instead of silent SKIPs (see inline
# comments at both sites).
# Documented divergences cover the pooling constructor/import checks and
# current renderer/EngineClient contracts (see doc/DRIFT_TRIAGE.md).
# Repo-specific maps (INHERITANCE_MAP etc.) are the point of this file living
# in the adapter tree; the copilot core never imports it.
# Run with cwd = vllm-omni repo root (same as tasks/41_check_api_drift.sh).
Expand All @@ -19,13 +17,10 @@
from pathlib import Path

# ---------------------------------------------------------------------------
# Block flash attention C extensions from loading to prevent SIGBUS (signal 7)
# when the .so was compiled for a different CUDA / GPU architecture.
#
# The guard only inspects method signatures — it does not need the real
# flash attention kernels. By raising ImportError (instead of letting the
# process crash with SIGBUS), the existing try/except in the INHERITANCE_MAP
# loop can skip affected classes gracefully.
# Use real extensions by default: current vLLM refuses to import its flash
# attention package when both extensions are blocked, which skips worker and
# serving signatures. For a known incompatible binary, an operator may opt
# into the blocker with IMX_API_DRIFT_BLOCK_FLASH_ATTN=1. That run is partial.
# ---------------------------------------------------------------------------
class _BlockFlashAttnExtensions:
@staticmethod
Expand All @@ -40,14 +35,20 @@ def find_spec(fullname, path, target=None):
return None


sys.meta_path.insert(0, _BlockFlashAttnExtensions)
_block_flash_attn = os.environ.get("IMX_API_DRIFT_BLOCK_FLASH_ATTN", "0")
if _block_flash_attn not in ("0", "1"):
raise ValueError("IMX_API_DRIFT_BLOCK_FLASH_ATTN must be 0 or 1")
if _block_flash_attn == "1":
sys.meta_path.insert(0, _BlockFlashAttnExtensions)
print("PARTIAL Flash attention extensions blocked by operator request; "
"affected import checks may be skipped.")

# Ensure relative paths (vllm_omni/...) resolve when invoked from any cwd.
if "OMNI_PATH" in os.environ:
os.chdir(os.environ["OMNI_PATH"])

INHERITANCE_MAP = [
("vllm.inputs.preprocess", "InputPreprocessor", "vllm_omni.inputs.preprocess", "OmniInputPreprocessor"),
("vllm.renderers", "BaseRenderer", "vllm_omni.inputs.preprocess", "omni_renderer_cls"),
("vllm.v1.engine.core_client", "AsyncMPClient", "vllm_omni.engine.stage_engine_core_client", "StageEngineCoreClient"),
("vllm.engine.protocol", "EngineClient", "vllm_omni.entrypoints.async_omni", "AsyncOmni"),
("vllm.v1.worker.gpu_model_runner", "GPUModelRunner", "vllm_omni.worker.gpu_model_runner", "OmniGPUModelRunner"),
Expand Down Expand Up @@ -219,12 +220,17 @@ def _forbidden_test_imports() -> list[str]:
return findings


def main() -> int:
def _check_inheritance() -> list[str]:
mismatches: list[str] = []
for up_mod, up_cls_name, omni_mod, omni_cls_name in INHERITANCE_MAP:
try:
UpCls = import_class(up_mod, up_cls_name)
OmniCls = import_class(omni_mod, omni_cls_name)
# OmniRenderer is a mixin; the actual upstream subclass is
# constructed by this factory rather than declared statically.
if omni_cls_name == "omni_renderer_cls":
OmniCls = OmniCls(UpCls)
omni_cls_name = OmniCls.__name__
except Exception as e:
print(f"SKIP {omni_cls_name}: import error — {e}")
continue
Expand All @@ -233,6 +239,14 @@ def main() -> int:
print(f"SKIP {omni_cls_name}: not a subclass of {up_cls_name}")
continue

if up_cls_name == "EngineClient" and inspect.isabstract(OmniCls):
msg = (
f"MISMATCH {omni_cls_name}: missing EngineClient implementations "
f"{sorted(OmniCls.__abstractmethods__)}; the engine cannot be instantiated"
)
print(msg)
mismatches.append(msg)

for name in dir(OmniCls):
if name.startswith("__") and name != "__init__":
continue
Expand Down Expand Up @@ -273,6 +287,11 @@ def main() -> int:
else:
print(f" OK {omni_cls_name}.{name}")

return mismatches


def main() -> int:
mismatches = _check_inheritance()
constructor_call_checks = [
(
"vllm.entrypoints.openai.responses.serving",
Expand Down
30 changes: 29 additions & 1 deletion adapters/vllm_omni/rebase/prompt_data.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -32,14 +32,28 @@ debug_prompt_template_live: |
rebase regression. Separate assertion failures, latency-only failures,
cancellation, and broken reporting steps. Record unknown attribution
when evidence is insufficient; do not weaken thresholds or skip tests.
A local gated-model download denial is an access failure. Preserve the
original model source, tokenizer, configuration, geometry, selected
tests and timeout. Do not replace them with a synthetic local builder
or a different public tokenizer to make CI pass. If authorized access
is unavailable, finish with the exact unresolved failure so the parent
can continue the other jobs. A prototype is not the original job's proof.
Read run-directory operator evidence when present, including
codex_krea_scope_rejection.json and the remote main baseline. Do not
claim CI has no model access when its exact job has actually passed.
3. Read the target vLLM API and `git show origin/main:<path>` for Omni intent.
Fix the smallest confirmed rebase-specific cause. After a startup API
fix, inspect adjacent constructor, override, result-field, dummy-run,
and async-output contracts that the first crash could have masked.
4. Reproduce with a targeted test using the real upstream API when possible,
then run the owning suite. Report the exact validated commit and whether
a new remote CI build has reached a terminal result.
5. Write MODULE_DONE {module} to the signal file only after verification.
5. Use the tool environment's IMX_LOG_DIR for this run's artifact directory;
form the absolute signal path as IMX_LOG_DIR/module.{module}.done.
Search only this run directory for signals, never / or /data. Write
MODULE_DONE {module} there only after verification. If the original
test remains failed, report the exact unresolved result and finish
without a success signal so the parent can continue the other jobs.

MODULE={module}

Expand All @@ -51,6 +65,20 @@ pytest_wrapper: "bash '{script_dir}/lib/run_module_pytest.sh'"
# imx-omni-pytest instead of the retired shell script, and fix its quoting)
pytest_wrapper_live: "imx-omni-pytest"

# Operational coverage may grow without changing the historical prompt maps.
# worker_v2 imports upstream worker/output APIs and must be ported with worker.
live_module_overrides:
scheduler:
omni_files: "vllm_omni/core/sched/"
test_paths: ["tests/core/sched/", "tests/distributed/", "tests/model_executor/test_cfg_pairing.py"]
input_output:
vllm_paths: "vllm/inputs/ vllm/renderers/ vllm/v1/engine/input_processor.py vllm/v1/engine/output_processor.py vllm/v1/request.py"
test_paths: ["tests/inputs/", "tests/entrypoints/test_omni_new_request_data.py", "tests/engine/", "tests/engine/test_omni_request_output.py"]
worker_runner:
omni_files: "vllm_omni/worker/ vllm_omni/worker_v2/"
test_paths: ["tests/worker/", "tests/worker_v2/", "tests/diffusion/test_diffusion_worker.py", "tests/e2e/features/custom_pipeline/"]
import_check: "from vllm_omni.worker.gpu_model_runner import *; from vllm_omni.worker.gpu_generation_model_runner import *; from vllm_omni.worker.gpu_ar_model_runner import *; from vllm_omni.worker.gpu_ar_worker import *; from vllm_omni.worker_v2.omni_ar_model_runner import *; from vllm_omni.worker_v2.omni_generation_model_runner import *; print('OK')"

module_vllm_paths:
model_config: "vllm/config/ vllm/engine/arg_utils.py"
input_output: "vllm/inputs/ vllm/v1/engine/input_processor.py vllm/v1/engine/output_processor.py vllm/v1/request.py"
Expand Down
2 changes: 1 addition & 1 deletion adapters/vllm_omni/rebase/shell_golden.json
Original file line number Diff line number Diff line change
Expand Up @@ -601,7 +601,7 @@
"Cannot re-initialize CUDA in forked subprocess",
"cuDNN error",
"CUBLAS_STATUS",
"(?<!non-)FATAL"
"(?<![\\w-])FATAL(?!\\w)"
],
"review": [
"Traceback \\(most recent call last\\)",
Expand Down
Loading
Loading