diff --git a/vllm_omni/metrics/stats.py b/vllm_omni/metrics/stats.py index 48e394add..46fec6fcc 100644 --- a/vllm_omni/metrics/stats.py +++ b/vllm_omni/metrics/stats.py @@ -226,8 +226,10 @@ class OrchestratorAggregator: and (multimodal_output := output_to_yield.multimodal_output.get("audio")) is not None and len(multimodal_output) > 0 ): - last = multimodal_output[-1] - nframes = int(last.shape[0]) if last.ndim > 0 else 1 + nframes = sum( + int(t.shape[0]) if t.ndim > 0 else 1 + for t in (multimodal_output if isinstance(multimodal_output, list) else [multimodal_output]) + ) stage_events_for_req = self.stage_events.get(request_id, []) if stage_events_for_req: for stage_event in stage_events_for_req: diff --git a/vllm_omni/outputs.py b/vllm_omni/outputs.py index 3708bc8f9..5bbd27a1d 100644 --- a/vllm_omni/outputs.py +++ b/vllm_omni/outputs.py @@ -127,15 +127,17 @@ class OmniRequestOutput: For pipeline outputs, this checks completion outputs first, then request_output. For diffusion outputs, this returns the local _multimodal_output field. """ - if self.request_output is not None: - # Check completion outputs first (where multimodal_output is attached). - outputs = getattr(self.request_output, "outputs", None) - if isinstance(outputs, list) and outputs: - for output in outputs: - mm = getattr(output, "multimodal_output", None) - if mm: - return mm - return getattr(self.request_output, "multimodal_output", {}) + if self.request_output is None: + return self._multimodal_output + + request_outputs = self.request_output if isinstance(self.request_output, list) else [self.request_output] + for req_out in request_outputs: + # Check completion outputs first (where multimodal_output is attached) + for output in getattr(req_out, "outputs", []): + if mm := getattr(output, "multimodal_output", None): + return mm + if mm := getattr(req_out, "multimodal_output", None): + return mm return self._multimodal_output @property