diff --git a/livekit-api/livekit/api/access_token.py b/livekit-api/livekit/api/access_token.py index 4f4d1658..003468ce 100644 --- a/livekit-api/livekit/api/access_token.py +++ b/livekit-api/livekit/api/access_token.py @@ -270,12 +270,23 @@ def verify(self, token: str, *, verify_signature: bool = True) -> Claims: } inference = InferenceGrants(**inference_dict) + observability_dict = claims.get("observability", dict()) + observability_dict = {camel_to_snake(k): v for k, v in observability_dict.items()} + observability_dict = { + k: v + for k, v in observability_dict.items() + if k in ObservabilityGrants.__dataclass_fields__ + } + observability = ObservabilityGrants(**observability_dict) + grant_claims = Claims( identity=claims.get("sub", ""), name=claims.get("name", ""), + kind=claims.get("kind", ""), video=video, sip=sip, inference=inference, + observability=observability, attributes=claims.get("attributes", {}), metadata=claims.get("metadata", ""), sha256=claims.get("sha256", ""), diff --git a/tests/api/test_access_token.py b/tests/api/test_access_token.py index df5f4678..83458ce5 100644 --- a/tests/api/test_access_token.py +++ b/tests/api/test_access_token.py @@ -4,6 +4,7 @@ import jwt import pytest from livekit.api import AccessToken, TokenVerifier, VideoGrants, SIPGrants +from livekit.api.access_token import ObservabilityGrants from livekit.protocol.room import RoomConfiguration from livekit.protocol.agent_dispatch import RoomAgentDispatch @@ -116,3 +117,18 @@ def test_verify_token_missing_exp() -> None: token_verifier = TokenVerifier(TEST_API_KEY, TEST_API_SECRET) with pytest.raises(Exception): token_verifier.verify(token) + + +def test_verify_token_preserves_kind_and_observability() -> None: + token = ( + AccessToken(TEST_API_KEY, TEST_API_SECRET) + .with_identity("test_identity") + .with_kind("agent") + .with_observability_grants(ObservabilityGrants(write=True)) + .to_jwt() + ) + + claims = TokenVerifier(TEST_API_KEY, TEST_API_SECRET).verify(token) + assert claims.kind == "agent" + assert claims.observability is not None + assert claims.observability.write is True