google-adk 0.0.2__py3-none-any.whl → 0.0.4__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/run_config.py +4 -0
- google/adk/auth/auth_preprocessor.py +19 -16
- google/adk/cli/agent_graph.py +31 -5
- google/adk/cli/browser/index.html +1 -1
- google/adk/cli/browser/{main-XUU6OGCC.js → main-CU22TRPI.js} +30 -30
- google/adk/cli/cli.py +8 -8
- google/adk/cli/cli_deploy.py +2 -4
- google/adk/cli/cli_tools_click.py +57 -12
- google/adk/cli/fast_api.py +19 -9
- google/adk/flows/llm_flows/contents.py +21 -1
- google/adk/flows/llm_flows/functions.py +3 -1
- google/adk/models/google_llm.py +0 -1
- google/adk/runners.py +13 -2
- google/adk/version.py +1 -1
- {google_adk-0.0.2.dist-info → google_adk-0.0.4.dist-info}/METADATA +4 -2
- google_adk-0.0.4.dist-info/RECORD +175 -0
- {google_adk-0.0.2.dist-info → google_adk-0.0.4.dist-info}/WHEEL +1 -1
- google/adk/cli/media_streamer/__init__.py +0 -19
- google/adk/cli/media_streamer/index.html +0 -228
- google/adk/tests/__init__.py +0 -14
- google/adk/tests/integration/.env.example +0 -10
- google/adk/tests/integration/__init__.py +0 -18
- google/adk/tests/integration/conftest.py +0 -119
- google/adk/tests/integration/fixture/__init__.py +0 -14
- google/adk/tests/integration/fixture/agent_with_config/__init__.py +0 -15
- google/adk/tests/integration/fixture/agent_with_config/agent.py +0 -88
- google/adk/tests/integration/fixture/callback_agent/__init__.py +0 -15
- google/adk/tests/integration/fixture/callback_agent/agent.py +0 -105
- google/adk/tests/integration/fixture/context_update_test/OWNERS +0 -1
- google/adk/tests/integration/fixture/context_update_test/__init__.py +0 -15
- google/adk/tests/integration/fixture/context_update_test/agent.py +0 -43
- google/adk/tests/integration/fixture/context_update_test/successful_test.session.json +0 -582
- google/adk/tests/integration/fixture/context_variable_agent/__init__.py +0 -15
- google/adk/tests/integration/fixture/context_variable_agent/agent.py +0 -115
- google/adk/tests/integration/fixture/customer_support_ma/__init__.py +0 -15
- google/adk/tests/integration/fixture/customer_support_ma/agent.py +0 -172
- google/adk/tests/integration/fixture/ecommerce_customer_service_agent/__init__.py +0 -15
- google/adk/tests/integration/fixture/ecommerce_customer_service_agent/agent.py +0 -338
- google/adk/tests/integration/fixture/ecommerce_customer_service_agent/order_query.test.json +0 -69
- google/adk/tests/integration/fixture/ecommerce_customer_service_agent/test_config.json +0 -6
- google/adk/tests/integration/fixture/flow_complex_spark/__init__.py +0 -15
- google/adk/tests/integration/fixture/flow_complex_spark/agent.py +0 -182
- google/adk/tests/integration/fixture/flow_complex_spark/sample.debug.log +0 -243
- google/adk/tests/integration/fixture/flow_complex_spark/sample.session.json +0 -190
- google/adk/tests/integration/fixture/hello_world_agent/__init__.py +0 -15
- google/adk/tests/integration/fixture/hello_world_agent/agent.py +0 -95
- google/adk/tests/integration/fixture/hello_world_agent/roll_die.test.json +0 -24
- google/adk/tests/integration/fixture/hello_world_agent/test_config.json +0 -6
- google/adk/tests/integration/fixture/home_automation_agent/__init__.py +0 -15
- google/adk/tests/integration/fixture/home_automation_agent/agent.py +0 -304
- google/adk/tests/integration/fixture/home_automation_agent/simple_test.test.json +0 -5
- google/adk/tests/integration/fixture/home_automation_agent/simple_test2.test.json +0 -5
- google/adk/tests/integration/fixture/home_automation_agent/test_config.json +0 -5
- google/adk/tests/integration/fixture/home_automation_agent/test_files/dependent_tool_calls.test.json +0 -18
- google/adk/tests/integration/fixture/home_automation_agent/test_files/memorizing_past_events/eval_data.test.json +0 -17
- google/adk/tests/integration/fixture/home_automation_agent/test_files/memorizing_past_events/test_config.json +0 -6
- google/adk/tests/integration/fixture/home_automation_agent/test_files/simple_multi_turn_conversation.test.json +0 -18
- google/adk/tests/integration/fixture/home_automation_agent/test_files/simple_test.test.json +0 -17
- google/adk/tests/integration/fixture/home_automation_agent/test_files/simple_test2.test.json +0 -5
- google/adk/tests/integration/fixture/home_automation_agent/test_files/test_config.json +0 -5
- google/adk/tests/integration/fixture/tool_agent/__init__.py +0 -15
- google/adk/tests/integration/fixture/tool_agent/agent.py +0 -218
- google/adk/tests/integration/fixture/tool_agent/files/Agent_test_plan.pdf +0 -0
- google/adk/tests/integration/fixture/trip_planner_agent/__init__.py +0 -15
- google/adk/tests/integration/fixture/trip_planner_agent/agent.py +0 -110
- google/adk/tests/integration/fixture/trip_planner_agent/initial.session.json +0 -13
- google/adk/tests/integration/fixture/trip_planner_agent/test_config.json +0 -5
- google/adk/tests/integration/fixture/trip_planner_agent/test_files/initial.session.json +0 -13
- google/adk/tests/integration/fixture/trip_planner_agent/test_files/test_config.json +0 -5
- google/adk/tests/integration/fixture/trip_planner_agent/test_files/trip_inquiry_sub_agent.test.json +0 -7
- google/adk/tests/integration/fixture/trip_planner_agent/trip_inquiry.test.json +0 -19
- google/adk/tests/integration/models/__init__.py +0 -14
- google/adk/tests/integration/models/test_google_llm.py +0 -65
- google/adk/tests/integration/test_callback.py +0 -70
- google/adk/tests/integration/test_context_variable.py +0 -67
- google/adk/tests/integration/test_evalute_agent_in_fixture.py +0 -76
- google/adk/tests/integration/test_multi_agent.py +0 -28
- google/adk/tests/integration/test_multi_turn.py +0 -42
- google/adk/tests/integration/test_single_agent.py +0 -23
- google/adk/tests/integration/test_sub_agent.py +0 -26
- google/adk/tests/integration/test_system_instruction.py +0 -177
- google/adk/tests/integration/test_tools.py +0 -287
- google/adk/tests/integration/test_with_test_file.py +0 -34
- google/adk/tests/integration/tools/__init__.py +0 -14
- google/adk/tests/integration/utils/__init__.py +0 -16
- google/adk/tests/integration/utils/asserts.py +0 -75
- google/adk/tests/integration/utils/test_runner.py +0 -97
- google/adk/tests/unittests/__init__.py +0 -14
- google/adk/tests/unittests/agents/__init__.py +0 -14
- google/adk/tests/unittests/agents/test_base_agent.py +0 -407
- google/adk/tests/unittests/agents/test_langgraph_agent.py +0 -191
- google/adk/tests/unittests/agents/test_llm_agent_callbacks.py +0 -138
- google/adk/tests/unittests/agents/test_llm_agent_fields.py +0 -231
- google/adk/tests/unittests/agents/test_loop_agent.py +0 -136
- google/adk/tests/unittests/agents/test_parallel_agent.py +0 -92
- google/adk/tests/unittests/agents/test_sequential_agent.py +0 -114
- google/adk/tests/unittests/artifacts/__init__.py +0 -14
- google/adk/tests/unittests/artifacts/test_artifact_service.py +0 -276
- google/adk/tests/unittests/auth/test_auth_handler.py +0 -575
- google/adk/tests/unittests/conftest.py +0 -73
- google/adk/tests/unittests/fast_api/__init__.py +0 -14
- google/adk/tests/unittests/fast_api/test_fast_api.py +0 -269
- google/adk/tests/unittests/flows/__init__.py +0 -14
- google/adk/tests/unittests/flows/llm_flows/__init__.py +0 -14
- google/adk/tests/unittests/flows/llm_flows/_test_examples.py +0 -142
- google/adk/tests/unittests/flows/llm_flows/test_agent_transfer.py +0 -311
- google/adk/tests/unittests/flows/llm_flows/test_functions_long_running.py +0 -244
- google/adk/tests/unittests/flows/llm_flows/test_functions_request_euc.py +0 -346
- google/adk/tests/unittests/flows/llm_flows/test_functions_sequential.py +0 -93
- google/adk/tests/unittests/flows/llm_flows/test_functions_simple.py +0 -258
- google/adk/tests/unittests/flows/llm_flows/test_identity.py +0 -66
- google/adk/tests/unittests/flows/llm_flows/test_instructions.py +0 -164
- google/adk/tests/unittests/flows/llm_flows/test_model_callbacks.py +0 -142
- google/adk/tests/unittests/flows/llm_flows/test_other_configs.py +0 -46
- google/adk/tests/unittests/flows/llm_flows/test_tool_callbacks.py +0 -269
- google/adk/tests/unittests/models/__init__.py +0 -14
- google/adk/tests/unittests/models/test_google_llm.py +0 -224
- google/adk/tests/unittests/models/test_litellm.py +0 -804
- google/adk/tests/unittests/models/test_models.py +0 -60
- google/adk/tests/unittests/sessions/__init__.py +0 -14
- google/adk/tests/unittests/sessions/test_session_service.py +0 -227
- google/adk/tests/unittests/sessions/test_vertex_ai_session_service.py +0 -246
- google/adk/tests/unittests/streaming/__init__.py +0 -14
- google/adk/tests/unittests/streaming/test_streaming.py +0 -50
- google/adk/tests/unittests/tools/__init__.py +0 -14
- google/adk/tests/unittests/tools/apihub_tool/clients/test_apihub_client.py +0 -499
- google/adk/tests/unittests/tools/apihub_tool/test_apihub_toolset.py +0 -204
- google/adk/tests/unittests/tools/application_integration_tool/clients/test_connections_client.py +0 -600
- google/adk/tests/unittests/tools/application_integration_tool/clients/test_integration_client.py +0 -630
- google/adk/tests/unittests/tools/application_integration_tool/test_application_integration_toolset.py +0 -345
- google/adk/tests/unittests/tools/google_api_tool/__init__.py +0 -13
- google/adk/tests/unittests/tools/google_api_tool/test_googleapi_to_openapi_converter.py +0 -657
- google/adk/tests/unittests/tools/openapi_tool/auth/credential_exchangers/test_auto_auth_credential_exchanger.py +0 -145
- google/adk/tests/unittests/tools/openapi_tool/auth/credential_exchangers/test_base_auth_credential_exchanger.py +0 -68
- google/adk/tests/unittests/tools/openapi_tool/auth/credential_exchangers/test_oauth2_exchanger.py +0 -153
- google/adk/tests/unittests/tools/openapi_tool/auth/credential_exchangers/test_service_account_exchanger.py +0 -196
- google/adk/tests/unittests/tools/openapi_tool/auth/test_auth_helper.py +0 -573
- google/adk/tests/unittests/tools/openapi_tool/common/test_common.py +0 -436
- google/adk/tests/unittests/tools/openapi_tool/openapi_spec_parser/test.yaml +0 -1367
- google/adk/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_openapi_spec_parser.py +0 -628
- google/adk/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_openapi_toolset.py +0 -139
- google/adk/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_operation_parser.py +0 -406
- google/adk/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_rest_api_tool.py +0 -966
- google/adk/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_tool_auth_handler.py +0 -201
- google/adk/tests/unittests/tools/retrieval/__init__.py +0 -14
- google/adk/tests/unittests/tools/retrieval/test_vertex_ai_rag_retrieval.py +0 -147
- google/adk/tests/unittests/tools/test_agent_tool.py +0 -167
- google/adk/tests/unittests/tools/test_base_tool.py +0 -141
- google/adk/tests/unittests/tools/test_build_function_declaration.py +0 -277
- google/adk/tests/unittests/utils.py +0 -304
- google_adk-0.0.2.dist-info/RECORD +0 -308
- {google_adk-0.0.2.dist-info → google_adk-0.0.4.dist-info}/entry_points.txt +0 -0
- {google_adk-0.0.2.dist-info → google_adk-0.0.4.dist-info/licenses}/LICENSE +0 -0
@@ -1,224 +0,0 @@
|
|
1
|
-
# Copyright 2025 Google LLC
|
2
|
-
#
|
3
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
-
# you may not use this file except in compliance with the License.
|
5
|
-
# You may obtain a copy of the License at
|
6
|
-
#
|
7
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
-
#
|
9
|
-
# Unless required by applicable law or agreed to in writing, software
|
10
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
-
# See the License for the specific language governing permissions and
|
13
|
-
# limitations under the License.
|
14
|
-
|
15
|
-
import sys
|
16
|
-
from unittest import mock
|
17
|
-
|
18
|
-
from google.adk import version
|
19
|
-
from google.adk.models.gemini_llm_connection import GeminiLlmConnection
|
20
|
-
from google.adk.models.google_llm import Gemini
|
21
|
-
from google.adk.models.llm_request import LlmRequest
|
22
|
-
from google.adk.models.llm_response import LlmResponse
|
23
|
-
from google.genai import types
|
24
|
-
from google.genai.types import Content
|
25
|
-
from google.genai.types import Part
|
26
|
-
import pytest
|
27
|
-
|
28
|
-
|
29
|
-
@pytest.fixture
|
30
|
-
def generate_content_response():
|
31
|
-
return types.GenerateContentResponse(
|
32
|
-
candidates=[
|
33
|
-
types.Candidate(
|
34
|
-
content=Content(
|
35
|
-
role="model",
|
36
|
-
parts=[Part.from_text(text="Hello, how can I help you?")],
|
37
|
-
),
|
38
|
-
finish_reason=types.FinishReason.STOP,
|
39
|
-
)
|
40
|
-
]
|
41
|
-
)
|
42
|
-
|
43
|
-
|
44
|
-
@pytest.fixture
|
45
|
-
def gemini_llm():
|
46
|
-
return Gemini(model="gemini-1.5-flash")
|
47
|
-
|
48
|
-
|
49
|
-
@pytest.fixture
|
50
|
-
def llm_request():
|
51
|
-
return LlmRequest(
|
52
|
-
model="gemini-1.5-flash",
|
53
|
-
contents=[Content(role="user", parts=[Part.from_text(text="Hello")])],
|
54
|
-
config=types.GenerateContentConfig(
|
55
|
-
temperature=0.1,
|
56
|
-
response_modalities=[types.Modality.TEXT],
|
57
|
-
system_instruction="You are a helpful assistant",
|
58
|
-
),
|
59
|
-
)
|
60
|
-
|
61
|
-
|
62
|
-
def test_supported_models():
|
63
|
-
models = Gemini.supported_models()
|
64
|
-
assert len(models) == 3
|
65
|
-
assert models[0] == r"gemini-.*"
|
66
|
-
assert models[1] == r"projects\/.+\/locations\/.+\/endpoints\/.+"
|
67
|
-
assert (
|
68
|
-
models[2]
|
69
|
-
== r"projects\/.+\/locations\/.+\/publishers\/google\/models\/gemini.+"
|
70
|
-
)
|
71
|
-
|
72
|
-
|
73
|
-
def test_client_version_header():
|
74
|
-
model = Gemini(model="gemini-1.5-flash")
|
75
|
-
client = model.api_client
|
76
|
-
expected_header = (
|
77
|
-
f"google-adk/{version.__version__}"
|
78
|
-
f" gl-python/{sys.version.split()[0]} google-genai-sdk/"
|
79
|
-
)
|
80
|
-
assert (
|
81
|
-
expected_header
|
82
|
-
in client._api_client._http_options.headers["x-goog-api-client"]
|
83
|
-
)
|
84
|
-
assert (
|
85
|
-
expected_header in client._api_client._http_options.headers["user-agent"]
|
86
|
-
)
|
87
|
-
|
88
|
-
|
89
|
-
def test_maybe_append_user_content(gemini_llm, llm_request):
|
90
|
-
# Test with user content already present
|
91
|
-
gemini_llm._maybe_append_user_content(llm_request)
|
92
|
-
assert len(llm_request.contents) == 1
|
93
|
-
|
94
|
-
# Test with model content as the last message
|
95
|
-
llm_request.contents.append(
|
96
|
-
Content(role="model", parts=[Part.from_text(text="Response")])
|
97
|
-
)
|
98
|
-
gemini_llm._maybe_append_user_content(llm_request)
|
99
|
-
assert len(llm_request.contents) == 3
|
100
|
-
assert llm_request.contents[-1].role == "user"
|
101
|
-
assert "Continue processing" in llm_request.contents[-1].parts[0].text
|
102
|
-
|
103
|
-
|
104
|
-
@pytest.mark.asyncio
|
105
|
-
async def test_generate_content_async(
|
106
|
-
gemini_llm, llm_request, generate_content_response
|
107
|
-
):
|
108
|
-
with mock.patch.object(gemini_llm, "api_client") as mock_client:
|
109
|
-
# Create a mock coroutine that returns the generate_content_response
|
110
|
-
async def mock_coro():
|
111
|
-
return generate_content_response
|
112
|
-
|
113
|
-
# Assign the coroutine to the mocked method
|
114
|
-
mock_client.aio.models.generate_content.return_value = mock_coro()
|
115
|
-
|
116
|
-
responses = [
|
117
|
-
resp
|
118
|
-
async for resp in gemini_llm.generate_content_async(
|
119
|
-
llm_request, stream=False
|
120
|
-
)
|
121
|
-
]
|
122
|
-
|
123
|
-
assert len(responses) == 1
|
124
|
-
assert isinstance(responses[0], LlmResponse)
|
125
|
-
assert responses[0].content.parts[0].text == "Hello, how can I help you?"
|
126
|
-
mock_client.aio.models.generate_content.assert_called_once()
|
127
|
-
|
128
|
-
|
129
|
-
@pytest.mark.asyncio
|
130
|
-
async def test_generate_content_async_stream(gemini_llm, llm_request):
|
131
|
-
with mock.patch.object(gemini_llm, "api_client") as mock_client:
|
132
|
-
# Create mock stream responses
|
133
|
-
class MockAsyncIterator:
|
134
|
-
|
135
|
-
def __init__(self, seq):
|
136
|
-
self.iter = iter(seq)
|
137
|
-
|
138
|
-
def __aiter__(self):
|
139
|
-
return self
|
140
|
-
|
141
|
-
async def __anext__(self):
|
142
|
-
try:
|
143
|
-
return next(self.iter)
|
144
|
-
except StopIteration:
|
145
|
-
raise StopAsyncIteration
|
146
|
-
|
147
|
-
mock_responses = [
|
148
|
-
types.GenerateContentResponse(
|
149
|
-
candidates=[
|
150
|
-
types.Candidate(
|
151
|
-
content=Content(
|
152
|
-
role="model", parts=[Part.from_text(text="Hello")]
|
153
|
-
),
|
154
|
-
finish_reason=None,
|
155
|
-
)
|
156
|
-
]
|
157
|
-
),
|
158
|
-
types.GenerateContentResponse(
|
159
|
-
candidates=[
|
160
|
-
types.Candidate(
|
161
|
-
content=Content(
|
162
|
-
role="model", parts=[Part.from_text(text=", how")]
|
163
|
-
),
|
164
|
-
finish_reason=None,
|
165
|
-
)
|
166
|
-
]
|
167
|
-
),
|
168
|
-
types.GenerateContentResponse(
|
169
|
-
candidates=[
|
170
|
-
types.Candidate(
|
171
|
-
content=Content(
|
172
|
-
role="model",
|
173
|
-
parts=[Part.from_text(text=" can I help you?")],
|
174
|
-
),
|
175
|
-
finish_reason=types.FinishReason.STOP,
|
176
|
-
)
|
177
|
-
]
|
178
|
-
),
|
179
|
-
]
|
180
|
-
|
181
|
-
# Create a mock coroutine that returns the MockAsyncIterator
|
182
|
-
async def mock_coro():
|
183
|
-
return MockAsyncIterator(mock_responses)
|
184
|
-
|
185
|
-
# Set the mock to return the coroutine
|
186
|
-
mock_client.aio.models.generate_content_stream.return_value = mock_coro()
|
187
|
-
|
188
|
-
responses = [
|
189
|
-
resp
|
190
|
-
async for resp in gemini_llm.generate_content_async(
|
191
|
-
llm_request, stream=True
|
192
|
-
)
|
193
|
-
]
|
194
|
-
|
195
|
-
# Assertions remain the same
|
196
|
-
assert len(responses) == 4
|
197
|
-
assert responses[0].partial is True
|
198
|
-
assert responses[1].partial is True
|
199
|
-
assert responses[2].partial is True
|
200
|
-
assert responses[3].content.parts[0].text == "Hello, how can I help you?"
|
201
|
-
mock_client.aio.models.generate_content_stream.assert_called_once()
|
202
|
-
|
203
|
-
|
204
|
-
@pytest.mark.asyncio
|
205
|
-
async def test_connect(gemini_llm, llm_request):
|
206
|
-
# Create a mock connection
|
207
|
-
mock_connection = mock.MagicMock(spec=GeminiLlmConnection)
|
208
|
-
|
209
|
-
# Create a mock context manager
|
210
|
-
class MockContextManager:
|
211
|
-
|
212
|
-
async def __aenter__(self):
|
213
|
-
return mock_connection
|
214
|
-
|
215
|
-
async def __aexit__(self, *args):
|
216
|
-
pass
|
217
|
-
|
218
|
-
# Mock the connect method at the class level
|
219
|
-
with mock.patch(
|
220
|
-
"google.adk.models.google_llm.Gemini.connect",
|
221
|
-
return_value=MockContextManager(),
|
222
|
-
):
|
223
|
-
async with gemini_llm.connect(llm_request) as connection:
|
224
|
-
assert connection is mock_connection
|