Files
ray-project--ray/python/ray/serve/_private/handle_options.py
T
2026-07-13 13:17:40 +08:00

83 lines
2.4 KiB
Python

from abc import ABC, abstractmethod
from dataclasses import dataclass, fields
import ray
from ray.serve._private.common import DeploymentHandleSource
from ray.serve._private.constants import (
RAY_SERVE_RUN_ROUTER_IN_SEPARATE_LOOP,
RAY_SERVE_USE_GRPC_BY_DEFAULT,
)
from ray.serve._private.utils import DEFAULT
@dataclass(frozen=True)
class InitHandleOptionsBase(ABC):
"""Init options for each ServeHandle instance.
These fields can be set by calling `.init()` on a handle before
sending the first request.
"""
_prefer_local_routing: bool = False
_source: DeploymentHandleSource = DeploymentHandleSource.UNKNOWN
_run_router_in_separate_loop: bool = RAY_SERVE_RUN_ROUTER_IN_SEPARATE_LOOP
@classmethod
@abstractmethod
def create(cls, **kwargs) -> "InitHandleOptionsBase":
raise NotImplementedError
@dataclass(frozen=True)
class InitHandleOptions(InitHandleOptionsBase):
@classmethod
def create(cls, **kwargs) -> "InitHandleOptions":
for k in list(kwargs.keys()):
if kwargs[k] == DEFAULT.VALUE:
# Use default value
del kwargs[k]
# Detect replica source for handles
if (
"_source" not in kwargs
and ray.serve.context._get_internal_replica_context() is not None
):
kwargs["_source"] = DeploymentHandleSource.REPLICA
return cls(**kwargs)
@dataclass(frozen=True)
class DynamicHandleOptionsBase(ABC):
"""Dynamic options for each ServeHandle instance.
These fields can be changed by calling `.options()` on a handle.
"""
method_name: str = "__call__"
multiplexed_model_id: str = ""
session_id: str = ""
stream: bool = False
@abstractmethod
def copy_and_update(self, **kwargs) -> "DynamicHandleOptionsBase":
pass
@dataclass(frozen=True)
class DynamicHandleOptions(DynamicHandleOptionsBase):
_by_reference: bool = not RAY_SERVE_USE_GRPC_BY_DEFAULT
request_serialization: str = "cloudpickle"
response_serialization: str = "cloudpickle"
def copy_and_update(self, **kwargs) -> "DynamicHandleOptions":
new_kwargs = {}
for f in fields(self):
if f.name not in kwargs or kwargs[f.name] == DEFAULT.VALUE:
new_kwargs[f.name] = getattr(self, f.name)
else:
new_kwargs[f.name] = kwargs[f.name]
return DynamicHandleOptions(**new_kwargs)