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.
- google/adk/agents/base_agent.py +76 -30
- google/adk/agents/base_agent.py.orig +330 -0
- google/adk/agents/callback_context.py +0 -5
- google/adk/agents/llm_agent.py +122 -30
- google/adk/agents/loop_agent.py +1 -1
- google/adk/agents/parallel_agent.py +7 -0
- google/adk/agents/readonly_context.py +7 -1
- google/adk/agents/run_config.py +1 -1
- google/adk/agents/sequential_agent.py +31 -0
- google/adk/agents/transcription_entry.py +4 -2
- google/adk/artifacts/gcs_artifact_service.py +1 -1
- google/adk/artifacts/in_memory_artifact_service.py +1 -1
- google/adk/auth/auth_credential.py +6 -1
- google/adk/auth/auth_preprocessor.py +7 -1
- google/adk/auth/auth_tool.py +3 -4
- google/adk/cli/agent_graph.py +5 -5
- google/adk/cli/browser/index.html +2 -2
- google/adk/cli/browser/{main-ULN5R5I5.js → main-QOEMUXM4.js} +44 -45
- google/adk/cli/cli.py +7 -7
- google/adk/cli/cli_deploy.py +7 -2
- google/adk/cli/cli_eval.py +172 -99
- google/adk/cli/cli_tools_click.py +147 -64
- google/adk/cli/fast_api.py +330 -148
- google/adk/cli/fast_api.py.orig +174 -80
- google/adk/cli/utils/common.py +23 -0
- google/adk/cli/utils/evals.py +83 -1
- google/adk/cli/utils/logs.py +13 -5
- google/adk/code_executors/__init__.py +3 -1
- google/adk/code_executors/built_in_code_executor.py +52 -0
- google/adk/evaluation/__init__.py +1 -1
- google/adk/evaluation/agent_evaluator.py +168 -128
- google/adk/evaluation/eval_case.py +102 -0
- google/adk/evaluation/eval_set.py +37 -0
- google/adk/evaluation/eval_sets_manager.py +42 -0
- google/adk/evaluation/evaluation_generator.py +88 -113
- google/adk/evaluation/evaluator.py +56 -0
- google/adk/evaluation/local_eval_sets_manager.py +264 -0
- google/adk/evaluation/response_evaluator.py +106 -2
- google/adk/evaluation/trajectory_evaluator.py +83 -2
- google/adk/events/event.py +6 -1
- google/adk/events/event_actions.py +6 -1
- google/adk/examples/example_util.py +3 -2
- google/adk/flows/llm_flows/_code_execution.py +9 -1
- google/adk/flows/llm_flows/audio_transcriber.py +4 -3
- google/adk/flows/llm_flows/base_llm_flow.py +54 -15
- google/adk/flows/llm_flows/functions.py +9 -8
- google/adk/flows/llm_flows/instructions.py +13 -5
- google/adk/flows/llm_flows/single_flow.py +1 -1
- google/adk/memory/__init__.py +1 -1
- google/adk/memory/_utils.py +23 -0
- google/adk/memory/base_memory_service.py +23 -21
- google/adk/memory/base_memory_service.py.orig +76 -0
- google/adk/memory/in_memory_memory_service.py +57 -25
- google/adk/memory/memory_entry.py +37 -0
- google/adk/memory/vertex_ai_rag_memory_service.py +38 -15
- google/adk/models/anthropic_llm.py +16 -9
- google/adk/models/gemini_llm_connection.py +11 -11
- google/adk/models/google_llm.py +9 -2
- google/adk/models/google_llm.py.orig +305 -0
- google/adk/models/lite_llm.py +77 -21
- google/adk/models/llm_response.py +14 -2
- google/adk/models/registry.py +1 -1
- google/adk/runners.py +65 -41
- google/adk/sessions/__init__.py +1 -1
- google/adk/sessions/base_session_service.py +6 -33
- google/adk/sessions/database_session_service.py +58 -65
- google/adk/sessions/in_memory_session_service.py +106 -24
- google/adk/sessions/session.py +3 -0
- google/adk/sessions/vertex_ai_session_service.py +23 -45
- google/adk/telemetry.py +3 -0
- google/adk/tools/__init__.py +4 -7
- google/adk/tools/{built_in_code_execution_tool.py → _built_in_code_execution_tool.py} +11 -0
- google/adk/tools/_memory_entry_utils.py +30 -0
- google/adk/tools/agent_tool.py +9 -9
- google/adk/tools/apihub_tool/apihub_toolset.py +55 -74
- google/adk/tools/application_integration_tool/application_integration_toolset.py +107 -85
- google/adk/tools/application_integration_tool/clients/connections_client.py +20 -0
- google/adk/tools/application_integration_tool/clients/integration_client.py +6 -6
- google/adk/tools/application_integration_tool/integration_connector_tool.py +69 -26
- google/adk/tools/base_toolset.py +58 -0
- google/adk/tools/enterprise_search_tool.py +65 -0
- google/adk/tools/function_parameter_parse_util.py +2 -2
- google/adk/tools/google_api_tool/__init__.py +18 -70
- google/adk/tools/google_api_tool/google_api_tool.py +11 -5
- google/adk/tools/google_api_tool/google_api_toolset.py +126 -0
- google/adk/tools/google_api_tool/google_api_toolsets.py +102 -0
- google/adk/tools/google_api_tool/googleapi_to_openapi_converter.py +40 -42
- google/adk/tools/langchain_tool.py +96 -49
- google/adk/tools/load_memory_tool.py +14 -5
- google/adk/tools/mcp_tool/__init__.py +3 -2
- google/adk/tools/mcp_tool/mcp_session_manager.py +153 -16
- google/adk/tools/mcp_tool/mcp_session_manager.py.orig +322 -0
- google/adk/tools/mcp_tool/mcp_tool.py +12 -12
- google/adk/tools/mcp_tool/mcp_toolset.py +155 -195
- google/adk/tools/openapi_tool/openapi_spec_parser/openapi_toolset.py +32 -7
- google/adk/tools/openapi_tool/openapi_spec_parser/operation_parser.py +31 -31
- google/adk/tools/openapi_tool/openapi_spec_parser/tool_auth_handler.py +1 -1
- google/adk/tools/preload_memory_tool.py +27 -18
- google/adk/tools/retrieval/__init__.py +1 -1
- google/adk/tools/retrieval/vertex_ai_rag_retrieval.py +1 -1
- google/adk/tools/toolbox_toolset.py +79 -0
- google/adk/tools/transfer_to_agent_tool.py +0 -1
- google/adk/version.py +1 -1
- {google_adk-0.5.0.dist-info → google_adk-1.0.0.dist-info}/METADATA +7 -5
- google_adk-1.0.0.dist-info/RECORD +195 -0
- google/adk/agents/remote_agent.py +0 -50
- google/adk/tools/google_api_tool/google_api_tool_set.py +0 -110
- google/adk/tools/google_api_tool/google_api_tool_sets.py +0 -112
- google/adk/tools/toolbox_tool.py +0 -46
- google_adk-0.5.0.dist-info/RECORD +0 -180
- {google_adk-0.5.0.dist-info → google_adk-1.0.0.dist-info}/WHEEL +0 -0
- {google_adk-0.5.0.dist-info → google_adk-1.0.0.dist-info}/entry_points.txt +0 -0
- {google_adk-0.5.0.dist-info → google_adk-1.0.0.dist-info}/licenses/LICENSE +0 -0
google/adk/agents/llm_agent.py
CHANGED
@@ -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
|
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
|
-
|
78
|
+
_SingleBeforeToolCallback: TypeAlias = Callable[
|
71
79
|
[BaseTool, dict[str, Any], ToolContext],
|
72
80
|
Union[Awaitable[Optional[dict]], Optional[dict]],
|
73
81
|
]
|
74
|
-
|
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
|
-
|
93
|
+
AfterToolCallback: TypeAlias = Union[
|
94
|
+
_SingleAfterToolCallback,
|
95
|
+
list[_SingleAfterToolCallback],
|
96
|
+
]
|
80
97
|
|
81
|
-
|
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
|
86
|
-
tool_union: ToolUnion,
|
87
|
-
) -> BaseTool:
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
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,
|
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
|
-
"""
|
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
|
-
"""
|
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(
|
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
|
-
|
287
|
-
|
288
|
-
|
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
|
-
|
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
|
-
|
299
|
-
|
300
|
-
|
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
|
-
|
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 (
|
google/adk/agents/loop_agent.py
CHANGED
@@ -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('
|
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."""
|
google/adk/agents/run_config.py
CHANGED
@@ -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"""
|
@@ -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(
|
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
|
-
{
|
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,
|
google/adk/auth/auth_tool.py
CHANGED
@@ -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(
|
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(
|
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.
|
google/adk/cli/agent_graph.py
CHANGED
@@ -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/
|
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-
|
32
|
+
<script src="polyfills-FFHMD2TL.js" type="module"></script><script src="main-QOEMUXM4.js" type="module"></script></body>
|
33
33
|
</html>
|