google-adk 0.5.0__py3-none-any.whl → 1.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. google/adk/agents/base_agent.py +76 -30
  2. google/adk/agents/base_agent.py.orig +330 -0
  3. google/adk/agents/callback_context.py +0 -5
  4. google/adk/agents/llm_agent.py +122 -30
  5. google/adk/agents/loop_agent.py +1 -1
  6. google/adk/agents/parallel_agent.py +7 -0
  7. google/adk/agents/readonly_context.py +7 -1
  8. google/adk/agents/run_config.py +1 -1
  9. google/adk/agents/sequential_agent.py +31 -0
  10. google/adk/agents/transcription_entry.py +4 -2
  11. google/adk/artifacts/gcs_artifact_service.py +1 -1
  12. google/adk/artifacts/in_memory_artifact_service.py +1 -1
  13. google/adk/auth/auth_credential.py +6 -1
  14. google/adk/auth/auth_preprocessor.py +7 -1
  15. google/adk/auth/auth_tool.py +3 -4
  16. google/adk/cli/agent_graph.py +5 -5
  17. google/adk/cli/browser/index.html +2 -2
  18. google/adk/cli/browser/{main-ULN5R5I5.js → main-QOEMUXM4.js} +44 -45
  19. google/adk/cli/cli.py +7 -7
  20. google/adk/cli/cli_deploy.py +7 -2
  21. google/adk/cli/cli_eval.py +172 -99
  22. google/adk/cli/cli_tools_click.py +147 -64
  23. google/adk/cli/fast_api.py +330 -148
  24. google/adk/cli/fast_api.py.orig +174 -80
  25. google/adk/cli/utils/common.py +23 -0
  26. google/adk/cli/utils/evals.py +83 -1
  27. google/adk/cli/utils/logs.py +13 -5
  28. google/adk/code_executors/__init__.py +3 -1
  29. google/adk/code_executors/built_in_code_executor.py +52 -0
  30. google/adk/evaluation/__init__.py +1 -1
  31. google/adk/evaluation/agent_evaluator.py +168 -128
  32. google/adk/evaluation/eval_case.py +102 -0
  33. google/adk/evaluation/eval_set.py +37 -0
  34. google/adk/evaluation/eval_sets_manager.py +42 -0
  35. google/adk/evaluation/evaluation_generator.py +88 -113
  36. google/adk/evaluation/evaluator.py +56 -0
  37. google/adk/evaluation/local_eval_sets_manager.py +264 -0
  38. google/adk/evaluation/response_evaluator.py +106 -2
  39. google/adk/evaluation/trajectory_evaluator.py +83 -2
  40. google/adk/events/event.py +6 -1
  41. google/adk/events/event_actions.py +6 -1
  42. google/adk/examples/example_util.py +3 -2
  43. google/adk/flows/llm_flows/_code_execution.py +9 -1
  44. google/adk/flows/llm_flows/audio_transcriber.py +4 -3
  45. google/adk/flows/llm_flows/base_llm_flow.py +54 -15
  46. google/adk/flows/llm_flows/functions.py +9 -8
  47. google/adk/flows/llm_flows/instructions.py +13 -5
  48. google/adk/flows/llm_flows/single_flow.py +1 -1
  49. google/adk/memory/__init__.py +1 -1
  50. google/adk/memory/_utils.py +23 -0
  51. google/adk/memory/base_memory_service.py +23 -21
  52. google/adk/memory/base_memory_service.py.orig +76 -0
  53. google/adk/memory/in_memory_memory_service.py +57 -25
  54. google/adk/memory/memory_entry.py +37 -0
  55. google/adk/memory/vertex_ai_rag_memory_service.py +38 -15
  56. google/adk/models/anthropic_llm.py +16 -9
  57. google/adk/models/gemini_llm_connection.py +11 -11
  58. google/adk/models/google_llm.py +9 -2
  59. google/adk/models/google_llm.py.orig +305 -0
  60. google/adk/models/lite_llm.py +77 -21
  61. google/adk/models/llm_response.py +14 -2
  62. google/adk/models/registry.py +1 -1
  63. google/adk/runners.py +65 -41
  64. google/adk/sessions/__init__.py +1 -1
  65. google/adk/sessions/base_session_service.py +6 -33
  66. google/adk/sessions/database_session_service.py +58 -65
  67. google/adk/sessions/in_memory_session_service.py +106 -24
  68. google/adk/sessions/session.py +3 -0
  69. google/adk/sessions/vertex_ai_session_service.py +23 -45
  70. google/adk/telemetry.py +3 -0
  71. google/adk/tools/__init__.py +4 -7
  72. google/adk/tools/{built_in_code_execution_tool.py → _built_in_code_execution_tool.py} +11 -0
  73. google/adk/tools/_memory_entry_utils.py +30 -0
  74. google/adk/tools/agent_tool.py +9 -9
  75. google/adk/tools/apihub_tool/apihub_toolset.py +55 -74
  76. google/adk/tools/application_integration_tool/application_integration_toolset.py +107 -85
  77. google/adk/tools/application_integration_tool/clients/connections_client.py +20 -0
  78. google/adk/tools/application_integration_tool/clients/integration_client.py +6 -6
  79. google/adk/tools/application_integration_tool/integration_connector_tool.py +69 -26
  80. google/adk/tools/base_toolset.py +58 -0
  81. google/adk/tools/enterprise_search_tool.py +65 -0
  82. google/adk/tools/function_parameter_parse_util.py +2 -2
  83. google/adk/tools/google_api_tool/__init__.py +18 -70
  84. google/adk/tools/google_api_tool/google_api_tool.py +11 -5
  85. google/adk/tools/google_api_tool/google_api_toolset.py +126 -0
  86. google/adk/tools/google_api_tool/google_api_toolsets.py +102 -0
  87. google/adk/tools/google_api_tool/googleapi_to_openapi_converter.py +40 -42
  88. google/adk/tools/langchain_tool.py +96 -49
  89. google/adk/tools/load_memory_tool.py +14 -5
  90. google/adk/tools/mcp_tool/__init__.py +3 -2
  91. google/adk/tools/mcp_tool/mcp_session_manager.py +153 -16
  92. google/adk/tools/mcp_tool/mcp_session_manager.py.orig +322 -0
  93. google/adk/tools/mcp_tool/mcp_tool.py +12 -12
  94. google/adk/tools/mcp_tool/mcp_toolset.py +155 -195
  95. google/adk/tools/openapi_tool/openapi_spec_parser/openapi_toolset.py +32 -7
  96. google/adk/tools/openapi_tool/openapi_spec_parser/operation_parser.py +31 -31
  97. google/adk/tools/openapi_tool/openapi_spec_parser/tool_auth_handler.py +1 -1
  98. google/adk/tools/preload_memory_tool.py +27 -18
  99. google/adk/tools/retrieval/__init__.py +1 -1
  100. google/adk/tools/retrieval/vertex_ai_rag_retrieval.py +1 -1
  101. google/adk/tools/toolbox_toolset.py +79 -0
  102. google/adk/tools/transfer_to_agent_tool.py +0 -1
  103. google/adk/version.py +1 -1
  104. {google_adk-0.5.0.dist-info → google_adk-1.0.0.dist-info}/METADATA +7 -5
  105. google_adk-1.0.0.dist-info/RECORD +195 -0
  106. google/adk/agents/remote_agent.py +0 -50
  107. google/adk/tools/google_api_tool/google_api_tool_set.py +0 -110
  108. google/adk/tools/google_api_tool/google_api_tool_sets.py +0 -112
  109. google/adk/tools/toolbox_tool.py +0 -46
  110. google_adk-0.5.0.dist-info/RECORD +0 -180
  111. {google_adk-0.5.0.dist-info → google_adk-1.0.0.dist-info}/WHEEL +0 -0
  112. {google_adk-0.5.0.dist-info → google_adk-1.0.0.dist-info}/entry_points.txt +0 -0
  113. {google_adk-0.5.0.dist-info → google_adk-1.0.0.dist-info}/licenses/LICENSE +0 -0
@@ -14,8 +14,15 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
+ import inspect
17
18
  import logging
18
- from typing import Any, AsyncGenerator, Awaitable, Callable, Literal, Optional, Union
19
+ from typing import Any
20
+ from typing import AsyncGenerator
21
+ from typing import Awaitable
22
+ from typing import Callable
23
+ from typing import Literal
24
+ from typing import Optional
25
+ from typing import Union
19
26
 
20
27
  from google.genai import types
21
28
  from pydantic import BaseModel
@@ -38,6 +45,7 @@ from ..models.llm_response import LlmResponse
38
45
  from ..models.registry import LLMRegistry
39
46
  from ..planners.base_planner import BasePlanner
40
47
  from ..tools.base_tool import BaseTool
48
+ from ..tools.base_toolset import BaseToolset
41
49
  from ..tools.function_tool import FunctionTool
42
50
  from ..tools.tool_context import ToolContext
43
51
  from .base_agent import BaseAgent
@@ -45,7 +53,7 @@ from .callback_context import CallbackContext
45
53
  from .invocation_context import InvocationContext
46
54
  from .readonly_context import ReadonlyContext
47
55
 
48
- logger = logging.getLogger(__name__)
56
+ logger = logging.getLogger('google_adk.' + __name__)
49
57
 
50
58
  _SingleBeforeModelCallback: TypeAlias = Callable[
51
59
  [CallbackContext, LlmRequest],
@@ -67,29 +75,43 @@ AfterModelCallback: TypeAlias = Union[
67
75
  list[_SingleAfterModelCallback],
68
76
  ]
69
77
 
70
- BeforeToolCallback: TypeAlias = Callable[
78
+ _SingleBeforeToolCallback: TypeAlias = Callable[
71
79
  [BaseTool, dict[str, Any], ToolContext],
72
80
  Union[Awaitable[Optional[dict]], Optional[dict]],
73
81
  ]
74
- AfterToolCallback: TypeAlias = Callable[
82
+
83
+ BeforeToolCallback: TypeAlias = Union[
84
+ _SingleBeforeToolCallback,
85
+ list[_SingleBeforeToolCallback],
86
+ ]
87
+
88
+ _SingleAfterToolCallback: TypeAlias = Callable[
75
89
  [BaseTool, dict[str, Any], ToolContext, dict],
76
90
  Union[Awaitable[Optional[dict]], Optional[dict]],
77
91
  ]
78
92
 
79
- InstructionProvider: TypeAlias = Callable[[ReadonlyContext], str]
93
+ AfterToolCallback: TypeAlias = Union[
94
+ _SingleAfterToolCallback,
95
+ list[_SingleAfterToolCallback],
96
+ ]
80
97
 
81
- ToolUnion: TypeAlias = Union[Callable, BaseTool]
98
+ InstructionProvider: TypeAlias = Callable[
99
+ [ReadonlyContext], Union[str, Awaitable[str]]
100
+ ]
101
+
102
+ ToolUnion: TypeAlias = Union[Callable, BaseTool, BaseToolset]
82
103
  ExamplesUnion = Union[list[Example], BaseExampleProvider]
83
104
 
84
105
 
85
- def _convert_tool_union_to_tool(
86
- tool_union: ToolUnion,
87
- ) -> BaseTool:
88
- return (
89
- tool_union
90
- if isinstance(tool_union, BaseTool)
91
- else FunctionTool(tool_union)
92
- )
106
+ async def _convert_tool_union_to_tools(
107
+ tool_union: ToolUnion, ctx: ReadonlyContext
108
+ ) -> list[BaseTool]:
109
+ if isinstance(tool_union, BaseTool):
110
+ return [tool_union]
111
+ if isinstance(tool_union, Callable):
112
+ return [FunctionTool(func=tool_union)]
113
+
114
+ return await tool_union.get_tools(ctx)
93
115
 
94
116
 
95
117
  class LlmAgent(BaseAgent):
@@ -128,7 +150,12 @@ class LlmAgent(BaseAgent):
128
150
 
129
151
  # LLM-based agent transfer configs - Start
130
152
  disallow_transfer_to_parent: bool = False
131
- """Disallows LLM-controlled transferring to the parent agent."""
153
+ """Disallows LLM-controlled transferring to the parent agent.
154
+
155
+ NOTE: Setting this as True also prevents this agent to continue reply to the
156
+ end-user. This behavior prevents one-way transfer, in which end-user may be
157
+ stuck with one agent that cannot transfer to other agents in the agent tree.
158
+ """
132
159
  disallow_transfer_to_peers: bool = False
133
160
  """Disallows LLM-controlled transferring to the peer agents."""
134
161
  # LLM-based agent transfer configs - End
@@ -173,8 +200,7 @@ class LlmAgent(BaseAgent):
173
200
 
174
201
  Check out available code executions in `google.adk.code_executor` package.
175
202
 
176
- NOTE: to use model's built-in code executor, don't set this field, add
177
- `google.adk.tools.built_in_code_execution` to tools instead.
203
+ NOTE: to use model's built-in code executor, use the `BuiltInCodeExecutor`.
178
204
  """
179
205
  # Advance features - End
180
206
 
@@ -214,7 +240,10 @@ class LlmAgent(BaseAgent):
214
240
  will be ignored and the provided content will be returned to user.
215
241
  """
216
242
  before_tool_callback: Optional[BeforeToolCallback] = None
217
- """Called before the tool is called.
243
+ """Callback or list of callbacks to be called before calling the tool.
244
+
245
+ When a list of callbacks is provided, the callbacks will be called in the
246
+ order they are listed until a callback does not return None.
218
247
 
219
248
  Args:
220
249
  tool: The tool to be called.
@@ -226,7 +255,10 @@ class LlmAgent(BaseAgent):
226
255
  the framework will skip calling the actual tool.
227
256
  """
228
257
  after_tool_callback: Optional[AfterToolCallback] = None
229
- """Called after the tool is called.
258
+ """Callback or list of callbacks to be called after calling the tool.
259
+
260
+ When a list of callbacks is provided, the callbacks will be called in the
261
+ order they are listed until a callback does not return None.
230
262
 
231
263
  Args:
232
264
  tool: The tool to be called.
@@ -275,33 +307,65 @@ class LlmAgent(BaseAgent):
275
307
  ancestor_agent = ancestor_agent.parent_agent
276
308
  raise ValueError(f'No model found for {self.name}.')
277
309
 
278
- def canonical_instruction(self, ctx: ReadonlyContext) -> str:
310
+ async def canonical_instruction(
311
+ self, ctx: ReadonlyContext
312
+ ) -> tuple[str, bool]:
279
313
  """The resolved self.instruction field to construct instruction for this agent.
280
314
 
281
315
  This method is only for use by Agent Development Kit.
316
+
317
+ Args:
318
+ ctx: The context to retrieve the session state.
319
+
320
+ Returns:
321
+ A tuple of (instruction, bypass_state_injection).
322
+ instruction: The resolved self.instruction field.
323
+ bypass_state_injection: Whether the instruction is based on
324
+ InstructionProvider.
282
325
  """
283
326
  if isinstance(self.instruction, str):
284
- return self.instruction
327
+ return self.instruction, False
285
328
  else:
286
- return self.instruction(ctx)
287
-
288
- def canonical_global_instruction(self, ctx: ReadonlyContext) -> str:
329
+ instruction = self.instruction(ctx)
330
+ if inspect.isawaitable(instruction):
331
+ instruction = await instruction
332
+ return instruction, True
333
+
334
+ async def canonical_global_instruction(
335
+ self, ctx: ReadonlyContext
336
+ ) -> tuple[str, bool]:
289
337
  """The resolved self.instruction field to construct global instruction.
290
338
 
291
339
  This method is only for use by Agent Development Kit.
340
+
341
+ Args:
342
+ ctx: The context to retrieve the session state.
343
+
344
+ Returns:
345
+ A tuple of (instruction, bypass_state_injection).
346
+ instruction: The resolved self.global_instruction field.
347
+ bypass_state_injection: Whether the instruction is based on
348
+ InstructionProvider.
292
349
  """
293
350
  if isinstance(self.global_instruction, str):
294
- return self.global_instruction
351
+ return self.global_instruction, False
295
352
  else:
296
- return self.global_instruction(ctx)
353
+ global_instruction = self.global_instruction(ctx)
354
+ if inspect.isawaitable(global_instruction):
355
+ global_instruction = await global_instruction
356
+ return global_instruction, True
297
357
 
298
- @property
299
- def canonical_tools(self) -> list[BaseTool]:
300
- """The resolved self.tools field as a list of BaseTool.
358
+ async def canonical_tools(
359
+ self, ctx: ReadonlyContext = None
360
+ ) -> list[BaseTool]:
361
+ """The resolved self.tools field as a list of BaseTool based on the context.
301
362
 
302
363
  This method is only for use by Agent Development Kit.
303
364
  """
304
- return [_convert_tool_union_to_tool(tool) for tool in self.tools]
365
+ resolved_tools = []
366
+ for tool_union in self.tools:
367
+ resolved_tools.extend(await _convert_tool_union_to_tools(tool_union, ctx))
368
+ return resolved_tools
305
369
 
306
370
  @property
307
371
  def canonical_before_model_callbacks(
@@ -329,6 +393,34 @@ class LlmAgent(BaseAgent):
329
393
  return self.after_model_callback
330
394
  return [self.after_model_callback]
331
395
 
396
+ @property
397
+ def canonical_before_tool_callbacks(
398
+ self,
399
+ ) -> list[BeforeToolCallback]:
400
+ """The resolved self.before_tool_callback field as a list of BeforeToolCallback.
401
+
402
+ This method is only for use by Agent Development Kit.
403
+ """
404
+ if not self.before_tool_callback:
405
+ return []
406
+ if isinstance(self.before_tool_callback, list):
407
+ return self.before_tool_callback
408
+ return [self.before_tool_callback]
409
+
410
+ @property
411
+ def canonical_after_tool_callbacks(
412
+ self,
413
+ ) -> list[AfterToolCallback]:
414
+ """The resolved self.after_tool_callback field as a list of AfterToolCallback.
415
+
416
+ This method is only for use by Agent Development Kit.
417
+ """
418
+ if not self.after_tool_callback:
419
+ return []
420
+ if isinstance(self.after_tool_callback, list):
421
+ return self.after_tool_callback
422
+ return [self.after_tool_callback]
423
+
332
424
  @property
333
425
  def _llm_flow(self) -> BaseLlmFlow:
334
426
  if (
@@ -58,5 +58,5 @@ class LoopAgent(BaseAgent):
58
58
  async def _run_live_impl(
59
59
  self, ctx: InvocationContext
60
60
  ) -> AsyncGenerator[Event, None]:
61
- raise NotImplementedError('The behavior for run_live is not defined yet.')
61
+ raise NotImplementedError('This is not supported yet for LoopAgent.')
62
62
  yield # AsyncGenerator requires having at least one yield statement
@@ -94,3 +94,10 @@ class ParallelAgent(BaseAgent):
94
94
  agent_runs = [agent.run_async(ctx) for agent in self.sub_agents]
95
95
  async for event in _merge_agent_run(agent_runs):
96
96
  yield event
97
+
98
+ @override
99
+ async def _run_live_impl(
100
+ self, ctx: InvocationContext
101
+ ) -> AsyncGenerator[Event, None]:
102
+ raise NotImplementedError("This is not supported yet for ParallelAgent.")
103
+ yield # AsyncGenerator requires having at least one yield statement
@@ -15,10 +15,11 @@
15
15
  from __future__ import annotations
16
16
 
17
17
  from types import MappingProxyType
18
- from typing import Any
18
+ from typing import Any, Optional
19
19
  from typing import TYPE_CHECKING
20
20
 
21
21
  if TYPE_CHECKING:
22
+ from google.genai import types
22
23
  from .invocation_context import InvocationContext
23
24
 
24
25
 
@@ -30,6 +31,11 @@ class ReadonlyContext:
30
31
  ) -> None:
31
32
  self._invocation_context = invocation_context
32
33
 
34
+ @property
35
+ def user_content(self) -> Optional[types.Content]:
36
+ """The user content that started this invocation. READONLY field."""
37
+ return self._invocation_context.user_content
38
+
33
39
  @property
34
40
  def invocation_id(self) -> str:
35
41
  """The current invocation id."""
@@ -22,7 +22,7 @@ from pydantic import BaseModel
22
22
  from pydantic import ConfigDict
23
23
  from pydantic import field_validator
24
24
 
25
- logger = logging.getLogger(__name__)
25
+ logger = logging.getLogger('google_adk.' + __name__)
26
26
 
27
27
 
28
28
  class StreamingMode(Enum):
@@ -23,6 +23,7 @@ from typing_extensions import override
23
23
  from ..agents.invocation_context import InvocationContext
24
24
  from ..events.event import Event
25
25
  from .base_agent import BaseAgent
26
+ from .llm_agent import LlmAgent
26
27
 
27
28
 
28
29
  class SequentialAgent(BaseAgent):
@@ -40,6 +41,36 @@ class SequentialAgent(BaseAgent):
40
41
  async def _run_live_impl(
41
42
  self, ctx: InvocationContext
42
43
  ) -> AsyncGenerator[Event, None]:
44
+ """Implementation for live SequentialAgent.
45
+
46
+ Compared to non-live case, live agents process a continous streams of audio
47
+ or video, so it doesn't have a way to tell if it's finished and should pass
48
+ to next agent or not. So we introduce a task_compelted() function so the
49
+ model can call this function to signal that it's finished the task and we
50
+ can move on to next agent.
51
+
52
+ Args:
53
+ ctx: The invocation context of the agent.
54
+ """
55
+ # There is no way to know if it's using live during init phase so we have to init it here
56
+ for sub_agent in self.sub_agents:
57
+ # add tool
58
+ def task_completed():
59
+ """
60
+ Signals that the model has successfully completed the user's question
61
+ or task.
62
+ """
63
+ return "Task completion signaled."
64
+
65
+ if isinstance(sub_agent, LlmAgent):
66
+ # Use function name to dedupe.
67
+ if task_completed.__name__ not in sub_agent.tools:
68
+ sub_agent.tools.append(task_completed)
69
+ sub_agent.instruction += f"""If you finished the user' request
70
+ according to its description, call {task_completed.__name__} function
71
+ to exit so the next agents can take over. When calling this function,
72
+ do not generate any text other than the function call.'"""
73
+
43
74
  for sub_agent in self.sub_agents:
44
75
  async for event in sub_agent.run_live(ctx):
45
76
  yield event
@@ -12,6 +12,7 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from typing import Optional
15
16
  from typing import Union
16
17
 
17
18
  from google.genai import types
@@ -28,8 +29,9 @@ class TranscriptionEntry(BaseModel):
28
29
  )
29
30
  """The pydantic model config."""
30
31
 
31
- role: str
32
- """The role that created this data, typically "user" or "model"""
32
+ role: Optional[str] = None
33
+ """The role that created this data, typically "user" or "model". For function
34
+ call, this is None."""
33
35
 
34
36
  data: Union[types.Blob, types.Content]
35
37
  """The data that can be used for transcription"""
@@ -23,7 +23,7 @@ from typing_extensions import override
23
23
 
24
24
  from .base_artifact_service import BaseArtifactService
25
25
 
26
- logger = logging.getLogger(__name__)
26
+ logger = logging.getLogger("google_adk." + __name__)
27
27
 
28
28
 
29
29
  class GcsArtifactService(BaseArtifactService):
@@ -24,7 +24,7 @@ from typing_extensions import override
24
24
 
25
25
  from .base_artifact_service import BaseArtifactService
26
26
 
27
- logger = logging.getLogger(__name__)
27
+ logger = logging.getLogger("google_adk." + __name__)
28
28
 
29
29
 
30
30
  class InMemoryArtifactService(BaseArtifactService, BaseModel):
@@ -15,13 +15,18 @@
15
15
  from enum import Enum
16
16
  from typing import Any, Dict, List, Optional
17
17
 
18
+ from pydantic import alias_generators
18
19
  from pydantic import BaseModel
19
20
  from pydantic import ConfigDict
20
21
  from pydantic import Field
21
22
 
22
23
 
23
24
  class BaseModelWithConfig(BaseModel):
24
- model_config = ConfigDict(extra="allow")
25
+ model_config = ConfigDict(
26
+ extra="allow",
27
+ alias_generator=alias_generators.to_camel,
28
+ populate_by_name=True,
29
+ )
25
30
  """The pydantic model config."""
26
31
 
27
32
 
@@ -20,6 +20,7 @@ from typing import TYPE_CHECKING
20
20
  from typing_extensions import override
21
21
 
22
22
  from ..agents.invocation_context import InvocationContext
23
+ from ..agents.readonly_context import ReadonlyContext
23
24
  from ..events.event import Event
24
25
  from ..flows.llm_flows import functions
25
26
  from ..flows.llm_flows._base_llm_processor import BaseLlmRequestProcessor
@@ -105,7 +106,12 @@ class _AuthLlmRequestProcessor(BaseLlmRequestProcessor):
105
106
  function_response_event = await functions.handle_function_calls_async(
106
107
  invocation_context,
107
108
  event,
108
- {tool.name: tool for tool in agent.canonical_tools},
109
+ {
110
+ tool.name: tool
111
+ for tool in await agent.canonical_tools(
112
+ ReadonlyContext(invocation_context)
113
+ )
114
+ },
109
115
  # there could be parallel function calls that require auth
110
116
  # auth response would be a dict keyed by function call id
111
117
  tools_to_resume,
@@ -12,13 +12,12 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- from pydantic import BaseModel
16
-
17
15
  from .auth_credential import AuthCredential
16
+ from .auth_credential import BaseModelWithConfig
18
17
  from .auth_schemes import AuthScheme
19
18
 
20
19
 
21
- class AuthConfig(BaseModel):
20
+ class AuthConfig(BaseModelWithConfig):
22
21
  """The auth config sent by tool asking client to collect auth credentials and
23
22
 
24
23
  adk and client will help to fill in the response
@@ -45,7 +44,7 @@ class AuthConfig(BaseModel):
45
44
  this field"""
46
45
 
47
46
 
48
- class AuthToolArguments(BaseModel):
47
+ class AuthToolArguments(BaseModelWithConfig):
49
48
  """the arguments for the special long running function tool that is used to
50
49
 
51
50
  request end user credentials.
@@ -25,7 +25,7 @@ from ..tools.agent_tool import AgentTool
25
25
  from ..tools.base_tool import BaseTool
26
26
  from ..tools.function_tool import FunctionTool
27
27
 
28
- logger = logging.getLogger(__name__)
28
+ logger = logging.getLogger('google_adk.' + __name__)
29
29
 
30
30
  try:
31
31
  from ..tools.retrieval.base_retrieval_tool import BaseRetrievalTool
@@ -35,7 +35,7 @@ else:
35
35
  retrieval_tool_module_loaded = True
36
36
 
37
37
 
38
- def build_graph(graph, agent: BaseAgent, highlight_pairs):
38
+ async def build_graph(graph, agent: BaseAgent, highlight_pairs):
39
39
  dark_green = '#0F5223'
40
40
  light_green = '#69CB87'
41
41
  light_gray = '#cccccc'
@@ -133,15 +133,15 @@ def build_graph(graph, agent: BaseAgent, highlight_pairs):
133
133
  build_graph(graph, sub_agent, highlight_pairs)
134
134
  draw_edge(agent.name, sub_agent.name)
135
135
  if isinstance(agent, LlmAgent):
136
- for tool in agent.canonical_tools:
136
+ for tool in await agent.canonical_tools():
137
137
  draw_node(tool)
138
138
  draw_edge(agent.name, get_node_name(tool))
139
139
 
140
140
 
141
- def get_agent_graph(root_agent, highlights_pairs, image=False):
141
+ async def get_agent_graph(root_agent, highlights_pairs, image=False):
142
142
  print('build graph')
143
143
  graph = graphviz.Digraph(graph_attr={'rankdir': 'LR', 'bgcolor': '#333537'})
144
- build_graph(graph, root_agent, highlights_pairs)
144
+ await build_graph(graph, root_agent, highlights_pairs)
145
145
  if image:
146
146
  return graph.pipe(format='png')
147
147
  else:
@@ -25,9 +25,9 @@
25
25
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
26
26
  <style>@font-face{font-family:'Open Sans';font-style:italic;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtE6F15M.woff2) format('woff2');unicode-range:U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}@font-face{font-family:'Open Sans';font-style:italic;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWvU6F15M.woff2) format('woff2');unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}@font-face{font-family:'Open Sans';font-style:italic;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtU6F15M.woff2) format('woff2');unicode-range:U+1F00-1FFF;}@font-face{font-family:'Open Sans';font-style:italic;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuk6F15M.woff2) format('woff2');unicode-range:U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;}@font-face{font-family:'Open Sans';font-style:italic;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWu06F15M.woff2) format('woff2');unicode-range:U+0307-0308, U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F;}@font-face{font-family:'Open Sans';font-style:italic;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWxU6F15M.woff2) format('woff2');unicode-range:U+0302-0303, U+0305, U+0307-0308, U+0310, U+0312, U+0315, U+031A, U+0326-0327, U+032C, U+032F-0330, U+0332-0333, U+0338, U+033A, U+0346, U+034D, U+0391-03A1, U+03A3-03A9, U+03B1-03C9, U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5, U+2016-2017, U+2034-2038, U+203C, U+2040, U+2043, U+2047, U+2050, U+2057, U+205F, U+2070-2071, U+2074-208E, U+2090-209C, U+20D0-20DC, U+20E1, U+20E5-20EF, U+2100-2112, U+2114-2115, U+2117-2121, U+2123-214F, U+2190, U+2192, U+2194-21AE, U+21B0-21E5, U+21F1-21F2, U+21F4-2211, U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319, U+231C-2321, U+2336-237A, U+237C, U+2395, U+239B-23B7, U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, U+25B7, U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F, U+27C0-27FF, U+2900-2AFF, U+2B0E-2B11, U+2B30-2B4C, U+2BFE, U+3030, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF;}@font-face{font-family:'Open Sans';font-style:italic;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqW106F15M.woff2) format('woff2');unicode-range:U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1, U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6, U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF;}@font-face{font-family:'Open Sans';font-style:italic;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtk6F15M.woff2) format('woff2');unicode-range:U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;}@font-face{font-family:'Open Sans';font-style:italic;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWt06F15M.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face{font-family:'Open Sans';font-style:italic;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuU6F.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}@font-face{font-family:'Open Sans';font-style:normal;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSKmu1aB.woff2) format('woff2');unicode-range:U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}@font-face{font-family:'Open Sans';font-style:normal;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSumu1aB.woff2) format('woff2');unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}@font-face{font-family:'Open Sans';font-style:normal;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSOmu1aB.woff2) format('woff2');unicode-range:U+1F00-1FFF;}@font-face{font-family:'Open Sans';font-style:normal;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSymu1aB.woff2) format('woff2');unicode-range:U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;}@font-face{font-family:'Open Sans';font-style:normal;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS2mu1aB.woff2) format('woff2');unicode-range:U+0307-0308, U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F;}@font-face{font-family:'Open Sans';font-style:normal;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTVOmu1aB.woff2) format('woff2');unicode-range:U+0302-0303, U+0305, U+0307-0308, U+0310, U+0312, U+0315, U+031A, U+0326-0327, U+032C, U+032F-0330, U+0332-0333, U+0338, U+033A, U+0346, U+034D, U+0391-03A1, U+03A3-03A9, U+03B1-03C9, U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5, U+2016-2017, U+2034-2038, U+203C, U+2040, U+2043, U+2047, U+2050, U+2057, U+205F, U+2070-2071, U+2074-208E, U+2090-209C, U+20D0-20DC, U+20E1, U+20E5-20EF, U+2100-2112, U+2114-2115, U+2117-2121, U+2123-214F, U+2190, U+2192, U+2194-21AE, U+21B0-21E5, U+21F1-21F2, U+21F4-2211, U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319, U+231C-2321, U+2336-237A, U+237C, U+2395, U+239B-23B7, U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, U+25B7, U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F, U+27C0-27FF, U+2900-2AFF, U+2B0E-2B11, U+2B30-2B4C, U+2BFE, U+3030, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF;}@font-face{font-family:'Open Sans';font-style:normal;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTUGmu1aB.woff2) format('woff2');unicode-range:U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1, U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6, U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF;}@font-face{font-family:'Open Sans';font-style:normal;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSCmu1aB.woff2) format('woff2');unicode-range:U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;}@font-face{font-family:'Open Sans';font-style:normal;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSGmu1aB.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face{font-family:'Open Sans';font-style:normal;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS-muw.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}</style>
27
27
  <style>@font-face{font-family:'Material Icons';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/materialicons/v143/flUhRq6tzZclQEJ-Vdg-IuiaDsNc.woff2) format('woff2');}.material-icons{font-family:'Material Icons';font-weight:normal;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:'liga';-webkit-font-smoothing:antialiased;}</style>
28
- <style>@font-face{font-family:'Material Symbols Outlined';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/materialsymbolsoutlined/v241/kJF1BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzByHX9rA6RzaxHMPdY43zj-jCxv3fzvRNU22ZXGJpEpjC_1v-p_4MrImHCIJIZrDCvHOej.woff2) format('woff2');}.material-symbols-outlined{font-family:'Material Symbols Outlined';font-weight:normal;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:'liga';-webkit-font-smoothing:antialiased;}</style>
28
+ <style>@font-face{font-family:'Material Symbols Outlined';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/materialsymbolsoutlined/v244/kJF1BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzByHX9rA6RzaxHMPdY43zj-jCxv3fzvRNU22ZXGJpEpjC_1v-p_4MrImHCIJIZrDCvHOej.woff2) format('woff2');}.material-symbols-outlined{font-family:'Material Symbols Outlined';font-weight:normal;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:'liga';-webkit-font-smoothing:antialiased;}</style>
29
29
  <style>html{color-scheme:dark}html{--mat-sys-background:light-dark(#fcf9f8, #131314);--mat-sys-error:light-dark(#ba1a1a, #ffb4ab);--mat-sys-error-container:light-dark(#ffdad6, #93000a);--mat-sys-inverse-on-surface:light-dark(#f3f0f0, #313030);--mat-sys-inverse-primary:light-dark(#c1c7cd, #595f65);--mat-sys-inverse-surface:light-dark(#313030, #e5e2e2);--mat-sys-on-background:light-dark(#1c1b1c, #e5e2e2);--mat-sys-on-error:light-dark(#ffffff, #690005);--mat-sys-on-error-container:light-dark(#410002, #ffdad6);--mat-sys-on-primary:light-dark(#ffffff, #2b3136);--mat-sys-on-primary-container:light-dark(#161c21, #dde3e9);--mat-sys-on-primary-fixed:light-dark(#161c21, #161c21);--mat-sys-on-primary-fixed-variant:light-dark(#41474d, #41474d);--mat-sys-on-secondary:light-dark(#ffffff, #003061);--mat-sys-on-secondary-container:light-dark(#001b3c, #d5e3ff);--mat-sys-on-secondary-fixed:light-dark(#001b3c, #001b3c);--mat-sys-on-secondary-fixed-variant:light-dark(#0f4784, #0f4784);--mat-sys-on-surface:light-dark(#1c1b1c, #e5e2e2);--mat-sys-on-surface-variant:light-dark(#44474a, #e1e2e6);--mat-sys-on-tertiary:light-dark(#ffffff, #2b3136);--mat-sys-on-tertiary-container:light-dark(#161c21, #dde3e9);--mat-sys-on-tertiary-fixed:light-dark(#161c21, #161c21);--mat-sys-on-tertiary-fixed-variant:light-dark(#41474d, #41474d);--mat-sys-outline:light-dark(#74777b, #8e9194);--mat-sys-outline-variant:light-dark(#c4c7ca, #44474a);--mat-sys-primary:light-dark(#595f65, #c1c7cd);--mat-sys-primary-container:light-dark(#dde3e9, #41474d);--mat-sys-primary-fixed:light-dark(#dde3e9, #dde3e9);--mat-sys-primary-fixed-dim:light-dark(#c1c7cd, #c1c7cd);--mat-sys-scrim:light-dark(#000000, #000000);--mat-sys-secondary:light-dark(#305f9d, #a7c8ff);--mat-sys-secondary-container:light-dark(#d5e3ff, #0f4784);--mat-sys-secondary-fixed:light-dark(#d5e3ff, #d5e3ff);--mat-sys-secondary-fixed-dim:light-dark(#a7c8ff, #a7c8ff);--mat-sys-shadow:light-dark(#000000, #000000);--mat-sys-surface:light-dark(#fcf9f8, #131314);--mat-sys-surface-bright:light-dark(#fcf9f8, #393939);--mat-sys-surface-container:light-dark(#f0eded, #201f20);--mat-sys-surface-container-high:light-dark(#eae7e7, #2a2a2a);--mat-sys-surface-container-highest:light-dark(#e5e2e2, #393939);--mat-sys-surface-container-low:light-dark(#f6f3f3, #1c1b1c);--mat-sys-surface-container-lowest:light-dark(#ffffff, #0e0e0e);--mat-sys-surface-dim:light-dark(#dcd9d9, #131314);--mat-sys-surface-tint:light-dark(#595f65, #c1c7cd);--mat-sys-surface-variant:light-dark(#e1e2e6, #44474a);--mat-sys-tertiary:light-dark(#595f65, #c1c7cd);--mat-sys-tertiary-container:light-dark(#dde3e9, #41474d);--mat-sys-tertiary-fixed:light-dark(#dde3e9, #dde3e9);--mat-sys-tertiary-fixed-dim:light-dark(#c1c7cd, #c1c7cd);--mat-sys-neutral-variant20:#2d3134;--mat-sys-neutral10:#1c1b1c}html{--mat-sys-level0:0px 0px 0px 0px rgba(0, 0, 0, .2), 0px 0px 0px 0px rgba(0, 0, 0, .14), 0px 0px 0px 0px rgba(0, 0, 0, .12)}html{--mat-sys-level1:0px 2px 1px -1px rgba(0, 0, 0, .2), 0px 1px 1px 0px rgba(0, 0, 0, .14), 0px 1px 3px 0px rgba(0, 0, 0, .12)}html{--mat-sys-level2:0px 3px 3px -2px rgba(0, 0, 0, .2), 0px 3px 4px 0px rgba(0, 0, 0, .14), 0px 1px 8px 0px rgba(0, 0, 0, .12)}html{--mat-sys-level3:0px 3px 5px -1px rgba(0, 0, 0, .2), 0px 6px 10px 0px rgba(0, 0, 0, .14), 0px 1px 18px 0px rgba(0, 0, 0, .12)}html{--mat-sys-level4:0px 5px 5px -3px rgba(0, 0, 0, .2), 0px 8px 10px 1px rgba(0, 0, 0, .14), 0px 3px 14px 2px rgba(0, 0, 0, .12)}html{--mat-sys-level5:0px 7px 8px -4px rgba(0, 0, 0, .2), 0px 12px 17px 2px rgba(0, 0, 0, .14), 0px 5px 22px 4px rgba(0, 0, 0, .12)}html{--mat-sys-corner-extra-large:28px;--mat-sys-corner-extra-large-top:28px 28px 0 0;--mat-sys-corner-extra-small:4px;--mat-sys-corner-extra-small-top:4px 4px 0 0;--mat-sys-corner-full:9999px;--mat-sys-corner-large:16px;--mat-sys-corner-large-end:0 16px 16px 0;--mat-sys-corner-large-start:16px 0 0 16px;--mat-sys-corner-large-top:16px 16px 0 0;--mat-sys-corner-medium:12px;--mat-sys-corner-none:0;--mat-sys-corner-small:8px}html{--mat-sys-dragged-state-layer-opacity:.16;--mat-sys-focus-state-layer-opacity:.12;--mat-sys-hover-state-layer-opacity:.08;--mat-sys-pressed-state-layer-opacity:.12}html{font-family:Google Sans,Helvetica Neue,sans-serif!important}body{height:100vh;margin:0}:root{--mat-sys-primary:black;--mdc-checkbox-selected-icon-color:white;--mat-sys-background:#131314;--mat-tab-header-active-label-text-color:#8AB4F8;--mat-tab-header-active-hover-label-text-color:#8AB4F8;--mat-tab-header-active-focus-label-text-color:#8AB4F8;--mat-tab-header-label-text-weight:500;--mdc-text-button-label-text-color:#89b4f8}:root{--mdc-dialog-container-color:#2b2b2f}:root{--mdc-dialog-subhead-color:white}:root{--mdc-circular-progress-active-indicator-color:#a8c7fa}:root{--mdc-circular-progress-size:80}</style><link rel="stylesheet" href="styles-4VDSPQ37.css" media="print" onload="this.media='all'"><noscript><link rel="stylesheet" href="styles-4VDSPQ37.css"></noscript></head>
30
30
  <body>
31
31
  <app-root></app-root>
32
- <script src="polyfills-FFHMD2TL.js" type="module"></script><script src="main-ULN5R5I5.js" type="module"></script></body>
32
+ <script src="polyfills-FFHMD2TL.js" type="module"></script><script src="main-QOEMUXM4.js" type="module"></script></body>
33
33
  </html>