[gRPC] Stream engine state changes (#39915)

Signed-off-by: William Arnold <7565007+Aphoh@users.noreply.github.com>
Co-authored-by: ishandhanani <82981111+ishandhanani@users.noreply.github.com>
This commit is contained in:
William Arnold
2026-09-17 19:17:25 -07:00
committed by GitHub
co-authored by ishandhanani
parent a407915c17
commit 0214954f26
6 changed files with 273 additions and 38 deletions
+6 -2
View File
@@ -84,6 +84,9 @@ class RuntimeHandle:
self.tokenizer_manager.auto_create_handle_loop()
self._event_loop = self.tokenizer_manager.event_loop
def set_engine_state_changed_callback(self, callback) -> None:
self.tokenizer_manager.set_engine_state_changed_callback(callback)
@property
def _tm_loop(self):
"""Return the TokenizerManager loop used by communicator RPCs."""
@@ -449,8 +452,9 @@ class RuntimeHandle:
ServerStatus.UnHealthy,
)
def get_is_ready(self) -> bool:
return self.tokenizer_manager.is_ready()
def is_pause(self) -> bool:
"""Return the tokenizer manager's authoritative generation pause state."""
return self.tokenizer_manager.is_pause
def tokenize(self, text: str, add_special_tokens: bool = True) -> str:
tokenizer = self.tokenizer_manager.tokenizer
@@ -416,10 +416,53 @@ class TokenizerManager(TokenizerControlMixin, TokenizerManagerScoreMixin):
# Set by whoever owns the event loop, and left None for Engine and grpc,
# which own no server. Class-level to leave the frozen __init__ alone.
_server_stop_hook: Optional[Callable[[], None]] = None
_engine_state_changed_callback: Optional[Callable[[], None]] = None
def set_server_stop_hook(self, hook: Callable[[], None]) -> None:
self._server_stop_hook = hook
def _notify_engine_state_changed(self) -> None:
callback = self._engine_state_changed_callback
if callback is None:
return
try:
callback()
except Exception:
logger.exception("Engine-state change callback failed")
def _set_engine_state_field(self, name: str, value: Any) -> None:
if value == getattr(self, name, None):
return
setattr(self, name, value)
self._notify_engine_state_changed()
def set_engine_state_changed_callback(self, callback: Callable[[], None]) -> None:
self._engine_state_changed_callback = callback
@property
def server_status(self):
return self._server_status
@server_status.setter
def server_status(self, value) -> None:
self._set_engine_state_field("_server_status", value)
@property
def gracefully_exit(self) -> bool:
return self._gracefully_exit
@gracefully_exit.setter
def gracefully_exit(self, value: bool) -> None:
self._set_engine_state_field("_gracefully_exit", value)
@property
def is_pause(self) -> bool:
return self._is_pause
@is_pause.setter
def is_pause(self, value: bool) -> None:
self._set_engine_state_field("_is_pause", value)
@property
def serving_chat_class(self):
"""Return the serving chat class for OpenAI API.