diff --git a/tests/v1/kv_connector/unit/test_multi_connector.py b/tests/v1/kv_connector/unit/test_multi_connector.py index 64da0d79bf33..a21d92c52244 100644 --- a/tests/v1/kv_connector/unit/test_multi_connector.py +++ b/tests/v1/kv_connector/unit/test_multi_connector.py @@ -239,3 +239,11 @@ def get_connector_events() -> dict[str, list[str]]: print(f"[ERROR] Could not read connector events for {name}: {e}") return connector_events + + +def test_engine_id_conflict(): + configs = [KVTransferConfig() for _ in range(2)] + ids = [config.engine_id for config in configs] + assert ids[0] != ids[1], ( + "Engine IDs should be different for different configs. " + f"Got {ids}") diff --git a/vllm/config.py b/vllm/config.py index 1c916915a046..ff9a9d899384 100644 --- a/vllm/config.py +++ b/vllm/config.py @@ -3492,7 +3492,7 @@ class KVTransferConfig: """The KV connector for vLLM to transmit KV caches between vLLM instances. """ - engine_id: str = str(uuid.uuid4()) + engine_id: Optional[str] = None """The engine id for KV transfers.""" kv_buffer_device: Optional[str] = "cuda" @@ -3549,6 +3549,9 @@ def compute_hash(self) -> str: return hash_str def __post_init__(self) -> None: + if self.engine_id is None: + self.engine_id = str(uuid.uuid4()) + if self.kv_role is not None and self.kv_role not in get_args(KVRole): raise ValueError(f"Unsupported kv_role: {self.kv_role}. " f"Supported roles are {get_args(KVRole)}") diff --git a/vllm/distributed/kv_transfer/kv_connector/v1/nixl_connector.py b/vllm/distributed/kv_transfer/kv_connector/v1/nixl_connector.py index b00f097110b0..6303d77ad305 100644 --- a/vllm/distributed/kv_transfer/kv_connector/v1/nixl_connector.py +++ b/vllm/distributed/kv_transfer/kv_connector/v1/nixl_connector.py @@ -537,6 +537,7 @@ def register_kv_caches(self, kv_caches: dict[str, torch.Tensor]): def add_remote_agent(self, nixl_agent_meta: NixlAgentMetadata): engine_id = nixl_agent_meta.engine_id + assert engine_id != self.engine_id, "Conflict engine id found!" if engine_id in self._remote_agents: return