from __future__ import annotations
import hashlib
import json
from .. import p2p_pb2
_OPTIONAL_SOURCE_ID_FIELDS = (
"backend_framework_version",
"torch_version",
"cuda_version",
"triton_version",
"gpu_arch",
"compile_config_digest",
)
def compute_mx_source_id(identity: p2p_pb2.SourceIdentity) -> str:
canonical = _canonical_json(identity)
digest = hashlib.sha256(canonical.encode()).hexdigest()
return digest[:16]
def _canonical_json(identity: p2p_pb2.SourceIdentity) -> str:
sorted_extra: dict[str, str] = {}
for k, v in sorted(identity.extra_parameters.items()):
lk = k.lower()
if lk not in sorted_extra:
sorted_extra[lk] = v.lower()
payload = {
"mx_version": identity.mx_version.lower(),
"mx_source_type": identity.mx_source_type,
"model_name": identity.model_name.lower(),
"backend_framework": identity.backend_framework,
"tensor_parallel_size": identity.tensor_parallel_size,
"pipeline_parallel_size": identity.pipeline_parallel_size,
"expert_parallel_size": identity.expert_parallel_size,
"dtype": identity.dtype.lower(),
"quantization": identity.quantization.lower(),
"extra_parameters": sorted_extra,
"revision": identity.revision.lower(),
}
for field in _OPTIONAL_SOURCE_ID_FIELDS:
value = getattr(identity, field)
if value:
payload[field] = value.lower()
return json.dumps(payload, separators=(",", ":"), sort_keys=True)