diff --git a/knowledge/repos/vllm-omni/components/serving/rules.md b/knowledge/repos/vllm-omni/components/serving/rules.md index d25787d9..e4d55e59 100644 --- a/knowledge/repos/vllm-omni/components/serving/rules.md +++ b/knowledge/repos/vllm-omni/components/serving/rules.md @@ -1,10 +1,10 @@ --- title: "Serving 规则" created: 2026-07-20 -updated: 2026-09-05 +updated: 2026-10-23 type: rule tags: [vllm-omni, components, serving] -sources: ["Issue #5369", "PR #3576", "PR #4583", "PR #4718", "PR #4834", "PR #4905", "PR #4912", "PR #5085", "PR #5157", "PR #5374", "PR #5670", "PR #5682", "PR #5713", "PR #5732", "PR #5746", "PR #5752", "PR #5843", "PR #5957", "PR #6008", "PR #6138", "PR #6202", "Issue #5811", "PR #6150", "claude-workflow-starter-private@09dca46", "zuiho-kai/claude-workflow-starter@c217fc6", .pre-commit-config.yaml, vllm_omni/entrypoints/async_omni.py, vllm_omni/entrypoints/omni_base.py, vllm_omni/entrypoints/openai/api_server.py, vllm_omni/entrypoints/openai/diffusion_request_utils.py, vllm_omni/entrypoints/openai/serving_chat.py, vllm_omni/entrypoints/openai/serving_speech.py, vllm_omni/entrypoints/openai/serving_video.py, vllm_omni/entrypoints/openai/video_api_utils.py, vllm_omni/entrypoints/openai/tts_adapters/, vllm_omni/engine/async_omni_engine.py, vllm_omni/engine/orchestrator.py, vllm_omni/engine/stage_pool.py, vllm_omni/engine/cfg_companion_tracker.py, vllm_omni/metrics/prometheus.py, tests/dfx/reliability/test_reliability_qwen3_omni.py, tests/engine/test_orchestrator_error_handling.py, tests/entrypoints/test_async_omni.py, tests/entrypoints/test_omni_entrypoints.py, tests/entrypoints/openai_api/test_api_server_guards.py, tests/entrypoints/openai_api/test_audex_serving_guards.py, tests/entrypoints/openai_api/test_omni_sleep_wakeup.py, tests/entrypoints/openai_api/test_serving_speech.py, tests/entrypoints/openai_api/test_tts_detection.py, tests/entrypoints/openai_api/test_video_api_utils.py, tests/entrypoints/openai_api/test_video_server.py, tests/tools/test_check_tts_adapter.py, tools/pre_commit/check_tts_adapter.py, "PR #4795", "PR #4755", "PR #3805", "PR #5878", "PR #6070", "PR #6122", "PR #4499", "PR #6050", "PR #6329", "PR #5999", "PR #5445", "PR #6288", "PR #6622", "PR #6499", "PR #6529", "PR #6776", recipes/MiniMaxAI/MiniMax-H3.md] +sources: ["Issue #5369", "PR #3576", "PR #4583", "PR #4718", "PR #4834", "PR #4905", "PR #4912", "PR #5085", "PR #5157", "PR #5374", "PR #5670", "PR #5682", "PR #5713", "PR #5732", "PR #5746", "PR #5752", "PR #5843", "PR #5957", "PR #6008", "PR #6138", "PR #6202", "Issue #5811", "PR #6150", claude-workflow-starter-private@09dca46, zuiho-kai/claude-workflow-starter@c217fc6, .pre-commit-config.yaml, vllm_omni/entrypoints/async_omni.py, vllm_omni/entrypoints/omni_base.py, vllm_omni/entrypoints/openai/api_server.py, vllm_omni/entrypoints/openai/diffusion_request_utils.py, vllm_omni/entrypoints/openai/serving_chat.py, vllm_omni/entrypoints/openai/serving_speech.py, vllm_omni/entrypoints/openai/serving_video.py, vllm_omni/entrypoints/openai/video_api_utils.py, vllm_omni/entrypoints/openai/tts_adapters/, vllm_omni/engine/async_omni_engine.py, vllm_omni/engine/orchestrator.py, vllm_omni/engine/stage_pool.py, vllm_omni/engine/cfg_companion_tracker.py, vllm_omni/metrics/prometheus.py, tests/dfx/reliability/test_reliability_qwen3_omni.py, tests/engine/test_orchestrator_error_handling.py, tests/entrypoints/test_async_omni.py, tests/entrypoints/test_omni_entrypoints.py, tests/entrypoints/openai_api/test_api_server_guards.py, tests/entrypoints/openai_api/test_audex_serving_guards.py, tests/entrypoints/openai_api/test_omni_sleep_wakeup.py, tests/entrypoints/openai_api/test_serving_speech.py, tests/entrypoints/openai_api/test_tts_detection.py, tests/entrypoints/openai_api/test_video_api_utils.py, tests/entrypoints/openai_api/test_video_server.py, tests/tools/test_check_tts_adapter.py, tools/pre_commit/check_tts_adapter.py, "PR #4795", "PR #4755", "PR #3805", "PR #5878", "PR #6070", "PR #6122", "PR #4499", "PR #6050", "PR #6329", "PR #5999", "PR #5445", "PR #6288", "PR #6622", "PR #6499", "PR #6529", "PR #6776", recipes/MiniMaxAI/MiniMax-H3.md, "PR #6824", "PR #9282"] confidence: high --- @@ -237,3 +237,12 @@ confidence: high - 强制:INFO 级别只记录 request ID、模型类型、voice clone、reference image 和参数等元数据;用户输入仅在 `self.request_logger` 存在时通过 `logger.debug` 输出,并按 `max_log_len` 预留日志前缀长度进行截断;未配置上限时使用 200 字符默认上限。 - 禁止:在 INFO 日志中写入原始 `text` 或 `prompt`;无条件输出 DEBUG 用户内容;使用固定预览长度替代请求日志开关;在未配置 `max_log_len` 时输出无界用户输入。 - 验收:覆盖 TTS、diffusion TTS、audio generation 和 diffusion chat,断言 INFO 不含用户内容;启用 `--enable-log-requests` 时 DEBUG 才输出内容,且配置与未配置 `max_log_len` 时均遵守截断上限。 ^[PR #6329] + +## VLLM-OMNI-PR9282-DUPLEX-APPEND-GATE — 全双工响应门只统计未完成的 response-bound append 任务 + +- 触发:修改 `vllm_omni/engine/duplex/session/context.py` 中 append 任务的跟踪与清理、`has_response_bound_append_tasks` / `cancel_append_tasks`,或 barge-in/VAD 之后新回合的响应门判定。 +- 强制:响应门只统计 `response_bound` 且尚未 `task.done()` 的 append 任务;已运行完成但仍留在 `append_tasks` 里等待 done callback 清理的任务,不得在 barge-in 取消前一响应后继续关闭下一语音回合的响应门。活动响应与未播放输出仍由各自独立的门控制。 +- 禁止:仅凭任务仍出现在 `append_tasks` 中(不检查 `task.done()`)就让响应门保持关闭;不得用 sleep、时序假设或削减参数化来掩盖该窗口。 +- 验收:`tests/engine/duplex/test_session_manager.py` 必须覆盖真实 asyncio 任务已完成但 done callback 尚未运行的窗口,并对 response_bound 与非 response_bound 两种情况断言门状态;运行 duplex 相关 core_model CPU 测试(`tests/engine/duplex` 与 `tests/model_executor/models/qwen3_omni/test_duplex_plugin.py`)确认多轮音频用例不再间歇性失败;`docs/design/fullduplex.md` 同步该门语义。^[PR #9282] + + diff --git a/knowledge/repos/vllm-omni/models/minimax-h3/rules-loading.md b/knowledge/repos/vllm-omni/models/minimax-h3/rules-loading.md index 21db7aa5..ffb668dc 100644 --- a/knowledge/repos/vllm-omni/models/minimax-h3/rules-loading.md +++ b/knowledge/repos/vllm-omni/models/minimax-h3/rules-loading.md @@ -1,10 +1,10 @@ --- title: "MiniMax H3 加载规则" created: 2026-09-02 -updated: 2026-09-04 +updated: 2026-10-23 type: rule tags: [vllm-omni, models, diffusion] -sources: ["PR #5706", "PR #5737", "PR #5824", vllm_omni/diffusion/models/minimax_h3/encoder.py, vllm_omni/diffusion/models/minimax_h3/minimax_h3_transformer.py, vllm_omni/diffusion/models/minimax_h3/pipeline_minimax_h3.py, tests/diffusion/models/minimax_h3/test_minimax_h3_contract.py, "PR #5910", "PR #6213", "PR #6445", "PR #6486"] +sources: ["PR #5706", "PR #5737", "PR #5824", vllm_omni/diffusion/models/minimax_h3/encoder.py, vllm_omni/diffusion/models/minimax_h3/minimax_h3_transformer.py, vllm_omni/diffusion/models/minimax_h3/pipeline_minimax_h3.py, tests/diffusion/models/minimax_h3/test_minimax_h3_contract.py, "PR #5910", "PR #6213", "PR #6445", "PR #6486", "PR #8801"] confidence: high --- @@ -72,3 +72,12 @@ H3 的该 contract 当前只为 BF16 no-AllGather DLO final-layout consumer 接 区分 TP rank/size 与 SP layout,等价 DP replicas 才共享;TP/SP/layout/model revision 改变时必须以 `preferred` 重新产生 artifact,`required` 只消费 exact hit。它不扩大 direct checkpoint mmap、 online quantization 或 AllGather 的支持范围。^[PR #6486] + +## VLLM-OMNI-PR8801-H3-NATIVE-PARTITION — 本地 MiniMax-H3 判定必须让 native 分区布局优先于 modular 标记文件 + +- 触发:修改 `vllm_omni/model_executor/models/minimax_h3/checkpoint.py` 的 `is_minimax_h3_modular`、`_NATIVE_PARTITIONS`、`resolve_minimax_h3_model_root`/`resolve_minimax_h3_diffusion_model_path`,或本地 checkpoint 的 native/FastH3 modular 判定顺序。 +- 强制:本地目录必须先按 native 分区判定——`FL2VA/model_index.json` 或 `Ref2VA/model_index.json` 存在即判 native(返回 `False`),之后才检查 `modular_model_index.json`/`fastvideo_inference.json` 标记。依据是官方 `MiniMaxAI/MiniMax-H3` 仓库会在根目录同时携带 `modular_model_index.json` 与 `FL2VA/`/`Ref2VA/` 分区,而 FastH3 modular release 没有分区;误判会让 pipeline init 因找不到 `fastvideo_inference.json` 抛 `FileNotFoundError`。native root 下 encoder resolver 必须返回 `FL2VA/text_encoder`,diffusion resolver 返回 `FL2VA`。Hub ID 走独立分支,不受该本地目录判定影响。 +- 禁止:仅凭 modular 标记文件存在就把含分区的本地快照判成 FastH3 modular;把没有 `model_index.json` 的空分区目录当作 native 证据;改动判定顺序时影响 Hub ID 分支或破坏既有 FastH3 本地/Hub 检测语义。 +- 验收:`tests/diffusion/models/minimax_h3/test_fasth3_checkpoint.py` 必须同时覆盖混合根 case(`FL2VA/`+`Ref2VA/`+`modular_model_index.json` 判为 native,且两个 resolver 返回分区路径)与对照 case(仅空分区目录加 modular 标记仍判为 modular),并保持既有 FastH3 本地与 Hub 检测测试全部通过。^[PR #8801] + +