Files
wehub-resource-sync 94057c3d3e
PR Test (NPU) / check-changes (push) Has been cancelled
PR Test (NPU) / pr-gate (push) Has been cancelled
PR Test (NPU) / set-image-config (push) Has been cancelled
PR Test (NPU) / stage-b-test-1-npu-a2 (0) (push) Has been cancelled
PR Test (NPU) / stage-b-test-1-npu-a2 (1) (push) Has been cancelled
PR Test (NPU) / stage-b-test-2-npu-a2 (0) (push) Has been cancelled
PR Test (NPU) / stage-b-test-2-npu-a2 (1) (push) Has been cancelled
PR Test (NPU) / stage-b-test-4-npu-a3 (push) Has been cancelled
PR Test (NPU) / stage-b-test-16-npu-a3 (push) Has been cancelled
PR Test (NPU) / multimodal-gen-test-1-npu-a3 (push) Has been cancelled
PR Test (NPU) / multimodal-gen-test-2-npu-a3 (push) Has been cancelled
PR Test (Arm64) / pr-gate (push) Has been cancelled
PR Test (Arm64) / check-changes (push) Has been cancelled
PR Test (Arm64) / build-test (push) Has been cancelled
PR Test (sgl-router) / gate (push) Has been cancelled
PR Test (sgl-router) / tier-1 — lint (push) Has been cancelled
PR Test (sgl-router) / tier-2 — build + test (push) Has been cancelled
PR Test (sgl-router) / tier-3 — docker (placeholder) (push) Has been cancelled
PR Test (sgl-router) / tier-3 — k8s integration (push) Has been cancelled
PR Test (sgl-router) / tier-3 — e2e (push) Has been cancelled
PR Test (sgl-router) / finish (push) Has been cancelled
PR Test (NPU) / single-node-poc (map[name:qwen3_6_27b_w8a8_1p_in64k_out1k_50ms runner:linux-aarch64-a3-2 test_case:test/registered/ascend/performance/qwen3_6_27b/test_npu_qwen3_6_27b_w8a8_1p_in64k_out1k_50ms.py test_type:perf]) (push) Has been cancelled
PR Test (NPU) / pr-test-npu-finish (push) Has been cancelled
PR Test (Xeon) / pr-gate (push) Has been cancelled
PR Test (Xeon) / check-changes (push) Has been cancelled
PR Test (Xeon) / build-test (, xeon-gnr, base-b-test-cpu) (push) Has been cancelled
PR Test (XPU) / check-changes (push) Has been cancelled
PR Test (XPU) / pr-gate (push) Has been cancelled
PR Test (XPU) / stage-a-test-1-gpu-xpu (push) Has been cancelled
PR Test (XPU) / wait-for-stage-a (push) Has been cancelled
PR Test (XPU) / stage-b-test-1-gpu-xpu (push) Has been cancelled
PR Test (XPU) / finish (push) Has been cancelled
CI Model Inventory / build-inventory (push) Has been cancelled
Lint / lint (push) Has been cancelled
PR Benchmark (SMG Components) / Benchmark Compilation Check (push) Has been cancelled
PR Benchmark (SMG Components) / Benchmark - Manual Policy (push) Has been cancelled
PR Benchmark (SMG Components) / Benchmark - Request Processing (push) Has been cancelled
PR Benchmark (SMG Components) / Benchmark Summary (push) Has been cancelled
PR Test (SMG) / build-wheel (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on windows (x86_64 - auto) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on macos (x86_64 - auto) (push) Has been cancelled
PR Test (SMG) / python-unit-tests (push) Has been cancelled
PR Test (SMG) / unit-tests (push) Has been cancelled
PR Test (SMG) / benchmarks (push) Has been cancelled
PR Test (SMG) / chat-completions (push) Has been cancelled
PR Test (SMG) / chat-completions-4gpu (push) Has been cancelled
PR Test (SMG) / e2e (push) Has been cancelled
PR Test (SMG) / docker-build-test (push) Has been cancelled
PR Test (SMG) / k8s-integration (push) Has been cancelled
PR Test (SMG) / finish (push) Has been cancelled
PR Test (SMG) / summarize-benchmarks (push) Has been cancelled
Release SGLang Model Gateway Docker Image / publish (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on macos (aarch64 - auto) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on linux (aarch64 - auto) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on linux (x86_64 - auto) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on linux (aarch64 - musllinux_1_1) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on linux (x86_64 - musllinux_1_1) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / Build SDist (push) Has been cancelled
Release SGLang Model Gateway to PyPI / Upload to PyPI (push) Has been cancelled
Release SGLang Kernels / build-cu129-matrix (aarch64, 12.9, 3.10, arm-kernel-build-node) (push) Has been cancelled
Release SGLang Kernels / build-cu129-matrix (x86_64, 12.9, 3.10, x64-kernel-build-node) (push) Has been cancelled
Release SGLang Kernels / release-cu129 (push) Has been cancelled
Release SGLang Kernels / build-cu130-matrix (aarch64, 13.0, 3.10, arm-kernel-build-node) (push) Has been cancelled
Release SGLang Kernels / build-cu130-matrix (x86_64, 13.0, 3.10, x64-kernel-build-node) (push) Has been cancelled
Release SGLang Kernels / release-cu130 (push) Has been cancelled
Release SGLang Kernels / build-rocm-matrix (3.10, 700) (push) Has been cancelled
Release SGLang Kernels / build-rocm-matrix (3.10, 720) (push) Has been cancelled
Release SGLang Kernels / release-rocm700 (push) Has been cancelled
Release SGLang Kernels / release-rocm720 (push) Has been cancelled
Release SGLang Kernels / build-musa43 (43, 3.10) (push) Has been cancelled
Release SGLang Kernels / release-musa43 (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:38:16 +08:00

113 lines
3.7 KiB
Python

# SPDX-License-Identifier: Apache-2.0
from __future__ import annotations
from collections import OrderedDict
from typing import Any
from sglang.multimodal_gen.runtime.utils.logging_utils import init_logger
logger = init_logger(__name__)
class BaseRealtimeState:
"""per-session state owned by pipeline stages"""
def dispose(self) -> None:
pass
class RealtimeSession:
"""reusable state container across realtime request chunks"""
def __init__(self) -> None:
self._states: dict[type[BaseRealtimeState], BaseRealtimeState] = {}
@staticmethod
def resolve_session_id(req: Any) -> str | None:
session_id = req.realtime_session_id
if isinstance(session_id, str) and session_id:
return session_id
return None
def get_or_create_state(
self, state_cls: type[BaseRealtimeState]
) -> BaseRealtimeState:
"""returns the BaseRealtimeState instance hold by the current RealtimeSession"""
state = self._states.get(state_cls)
if state is None:
state = state_cls()
self._states[state_cls] = state
return state
def get_state(self, state_cls: type[BaseRealtimeState]) -> BaseRealtimeState | None:
return self._states.get(state_cls)
def dispose(self) -> None:
for state in list(self._states.values()):
state.dispose()
self._states.clear()
class RealtimeSessionCache:
"""lru cache that binds incoming chunks to persistent realtime sessions"""
def __init__(self, max_sessions: int = 64) -> None:
self.max_sessions = max_sessions
self._sessions: OrderedDict[str, RealtimeSession] = OrderedDict()
def _dispose_session(
self, session_id: str, session: RealtimeSession | None
) -> None:
if session is None:
return
try:
session.dispose()
except Exception as e:
logger.warning(
"Failed to dispose realtime session cache entry %s: %s",
session_id,
e,
)
def release(self, session_id: str) -> bool:
session = self._sessions.pop(session_id, None)
released = session is not None
self._dispose_session(session_id, session)
logger.info(
"Realtime session release: session_id=%s released=%s",
session_id,
released,
)
return released
def attach(self, req: Any) -> None:
session_id = RealtimeSession.resolve_session_id(req)
if session_id is None:
return
if session_id not in self._sessions:
if req.block_idx > 0:
raise ValueError(
"Missing realtime session state for "
f"session_id={session_id} block_idx={req.block_idx}."
)
self._sessions[session_id] = req.session or RealtimeSession()
elif req.block_idx == 0:
old_session = self._sessions[session_id]
new_session = req.session or RealtimeSession()
if old_session is not new_session:
self._dispose_session(session_id, old_session)
self._sessions[session_id] = new_session
logger.info("Realtime session reset: session_id=%s", session_id)
req.session = self._sessions[session_id]
self._sessions.move_to_end(session_id)
self._evict_stale_sessions()
def _evict_stale_sessions(self) -> None:
while len(self._sessions) > self.max_sessions:
stale_session_id, stale_session = self._sessions.popitem(last=False)
self._dispose_session(stale_session_id, stale_session)
logger.debug("Evicted stale realtime session cache: %s", stale_session_id)