[Entrypoint] Add realtime OpenPI robot serving API (#3673)

Signed-off-by: Yangshen Deng <yangshen.d@outlook.com>
Signed-off-by: amy-why-3459 <wuhaiyan17@huawei.com>
Co-authored-by: Meng <meng_chen99@163.com>
Co-authored-by: amy-why-3459 <wuhaiyan17@huawei.com>
This commit is contained in:
authored and GitHub committed 2026-06-01 14:47:23 +08:00
1 parent ac4106900b
commit 634af60fba
6 files changed
+966

No files matched your search

@@ -133,6 +133,7 @@ from vllm_omni.entrypoints.openai.storage import STORAGE_MANAGER
from vllm_omni.entrypoints.openai.stores import VIDEO_STORE, VIDEO_TASKS
from vllm_omni.entrypoints.openai.utils import get_stage_type, parse_lora_request
from vllm_omni.entrypoints.openai.video_api_utils import decode_input_reference
from vllm_omni.entrypoints.openpi.serving import ServingRealtimeRobotOpenPI
from vllm_omni.inputs.data import OmniDiffusionSamplingParams, OmniTextPrompt
logger = init_logger(__name__)
@@ -633,6 +634,10 @@ async def omni_init_app_state(
)
state.openai_streaming_speech = None
state.openai_streaming_video = None
state.openai_serving_realtime_robot = ServingRealtimeRobotOpenPI.create_policy_server(
engine_client=engine_client,
model_name=model_name,
)
state.enable_server_load_tracking = getattr(args, "enable_server_load_tracking", False)
state.server_load_metrics = 0
@@ -963,6 +968,7 @@ async def omni_init_app_state(
model_name=served_model_names[0] if served_model_names else None,
stage_configs=state.stage_configs,
)
state.openai_serving_realtime_robot = None
state.enable_server_load_tracking = args.enable_server_load_tracking
state.server_load_metrics = 0
@@ -1406,6 +1412,23 @@ async def realtime_websocket(websocket: WebSocket):
await connection.handle_connection()
@router.websocket("/v1/realtime/robot/openpi")
async def realtime_robot_openpi(websocket: WebSocket):
"""WebSocket endpoint for robot policy inference via OpenPI messages."""
from vllm_omni.entrypoints.openpi.connection import (
RobotRealtimeConnection,
)
serving = getattr(websocket.app.state, "openai_serving_realtime_robot", None)
if serving is None:
await websocket.accept()
await websocket.send_json({"type": "error", "error": "Robot policy not available", "code": "unsupported"})
await websocket.close()
return
connection = RobotRealtimeConnection(websocket, serving)
await connection.handle_connection()
# Health and Model endpoints for diffusion mode