Skip to content

Commit e37ae28

Browse files
committed
feat: expose credential service in readonly context
1 parent bf39c00 commit e37ae28

File tree

2 files changed

+22
-0
lines changed

2 files changed

+22
-0
lines changed

src/google/adk/agents/readonly_context.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
from google.genai import types
2424

2525
from .invocation_context import InvocationContext
26+
from ..auth.credential_service.base_credential_service import BaseCredentialService
2627

2728

2829
class ReadonlyContext:
@@ -52,3 +53,8 @@ def agent_name(self) -> str:
5253
def state(self) -> MappingProxyType[str, Any]:
5354
"""The state of the current session. READONLY field."""
5455
return MappingProxyType(self._invocation_context.session.state)
56+
57+
@property
58+
def credential_service(self) -> Optional[BaseCredentialService]:
59+
"""The credential service for the current invocation."""
60+
return self._invocation_context.credential_service

tests/unittests/agents/test_readonly_context.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,25 @@
22
from unittest.mock import MagicMock
33

44
from google.adk.agents.readonly_context import ReadonlyContext
5+
from google.adk.auth.credential_service.base_credential_service import BaseCredentialService
56
import pytest
67

78

9+
class DummyCredentialService(BaseCredentialService):
10+
async def load_credential(self,auth_config, tool_context):
11+
pass
12+
13+
async def save_credential(self,auth_config, tool_context):
14+
pass
15+
16+
817
@pytest.fixture
918
def mock_invocation_context():
1019
mock_context = MagicMock()
1120
mock_context.invocation_id = "test-invocation-id"
1221
mock_context.agent.name = "test-agent-name"
1322
mock_context.session.state = {"key1": "value1", "key2": "value2"}
23+
mock_context.credential_service = DummyCredentialService()
1424

1525
return mock_context
1626

@@ -32,3 +42,9 @@ def test_state_content(mock_invocation_context):
3242
assert isinstance(state, MappingProxyType)
3343
assert state["key1"] == "value1"
3444
assert state["key2"] == "value2"
45+
46+
47+
def test_credential_service(mock_invocation_context):
48+
readonly_context = ReadonlyContext(mock_invocation_context)
49+
assert readonly_context.credential_service is not None
50+
assert isinstance(readonly_context.credential_service, BaseCredentialService)

0 commit comments

Comments
 (0)