agent-starter-pack 0.0.1b0__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.
Potentially problematic release.
This version of agent-starter-pack might be problematic. Click here for more details.
- agent_starter_pack-0.0.1b0.dist-info/METADATA +143 -0
- agent_starter_pack-0.0.1b0.dist-info/RECORD +162 -0
- agent_starter_pack-0.0.1b0.dist-info/WHEEL +4 -0
- agent_starter_pack-0.0.1b0.dist-info/entry_points.txt +2 -0
- agent_starter_pack-0.0.1b0.dist-info/licenses/LICENSE +201 -0
- agents/agentic_rag_vertexai_search/README.md +22 -0
- agents/agentic_rag_vertexai_search/app/agent.py +145 -0
- agents/agentic_rag_vertexai_search/app/retrievers.py +79 -0
- agents/agentic_rag_vertexai_search/app/templates.py +53 -0
- agents/agentic_rag_vertexai_search/notebooks/evaluating_langgraph_agent.ipynb +1561 -0
- agents/agentic_rag_vertexai_search/template/.templateconfig.yaml +14 -0
- agents/agentic_rag_vertexai_search/tests/integration/test_agent.py +57 -0
- agents/crewai_coding_crew/README.md +34 -0
- agents/crewai_coding_crew/app/agent.py +86 -0
- agents/crewai_coding_crew/app/crew/config/agents.yaml +39 -0
- agents/crewai_coding_crew/app/crew/config/tasks.yaml +37 -0
- agents/crewai_coding_crew/app/crew/crew.py +71 -0
- agents/crewai_coding_crew/notebooks/evaluating_crewai_agent.ipynb +1571 -0
- agents/crewai_coding_crew/notebooks/evaluating_langgraph_agent.ipynb +1561 -0
- agents/crewai_coding_crew/template/.templateconfig.yaml +12 -0
- agents/crewai_coding_crew/tests/integration/test_agent.py +47 -0
- agents/langgraph_base_react/README.md +9 -0
- agents/langgraph_base_react/app/agent.py +73 -0
- agents/langgraph_base_react/notebooks/evaluating_langgraph_agent.ipynb +1561 -0
- agents/langgraph_base_react/template/.templateconfig.yaml +13 -0
- agents/langgraph_base_react/tests/integration/test_agent.py +48 -0
- agents/multimodal_live_api/README.md +50 -0
- agents/multimodal_live_api/app/agent.py +86 -0
- agents/multimodal_live_api/app/server.py +193 -0
- agents/multimodal_live_api/app/templates.py +51 -0
- agents/multimodal_live_api/app/vector_store.py +55 -0
- agents/multimodal_live_api/template/.templateconfig.yaml +15 -0
- agents/multimodal_live_api/tests/integration/test_server_e2e.py +254 -0
- agents/multimodal_live_api/tests/load_test/load_test.py +40 -0
- agents/multimodal_live_api/tests/unit/test_server.py +143 -0
- src/base_template/.gitignore +197 -0
- src/base_template/Makefile +37 -0
- src/base_template/README.md +91 -0
- src/base_template/app/utils/tracing.py +143 -0
- src/base_template/app/utils/typing.py +115 -0
- src/base_template/deployment/README.md +123 -0
- src/base_template/deployment/cd/deploy-to-prod.yaml +98 -0
- src/base_template/deployment/cd/staging.yaml +215 -0
- src/base_template/deployment/ci/pr_checks.yaml +51 -0
- src/base_template/deployment/terraform/apis.tf +34 -0
- src/base_template/deployment/terraform/build_triggers.tf +122 -0
- src/base_template/deployment/terraform/dev/apis.tf +42 -0
- src/base_template/deployment/terraform/dev/iam.tf +90 -0
- src/base_template/deployment/terraform/dev/log_sinks.tf +66 -0
- src/base_template/deployment/terraform/dev/providers.tf +29 -0
- src/base_template/deployment/terraform/dev/storage.tf +76 -0
- src/base_template/deployment/terraform/dev/variables.tf +126 -0
- src/base_template/deployment/terraform/dev/vars/env.tfvars +21 -0
- src/base_template/deployment/terraform/iam.tf +130 -0
- src/base_template/deployment/terraform/locals.tf +50 -0
- src/base_template/deployment/terraform/log_sinks.tf +72 -0
- src/base_template/deployment/terraform/providers.tf +35 -0
- src/base_template/deployment/terraform/service_accounts.tf +42 -0
- src/base_template/deployment/terraform/storage.tf +100 -0
- src/base_template/deployment/terraform/variables.tf +202 -0
- src/base_template/deployment/terraform/vars/env.tfvars +43 -0
- src/base_template/pyproject.toml +113 -0
- src/base_template/tests/unit/test_utils/test_tracing_exporter.py +140 -0
- src/cli/commands/create.py +534 -0
- src/cli/commands/setup_cicd.py +730 -0
- src/cli/main.py +35 -0
- src/cli/utils/__init__.py +35 -0
- src/cli/utils/cicd.py +662 -0
- src/cli/utils/gcp.py +120 -0
- src/cli/utils/logging.py +51 -0
- src/cli/utils/template.py +644 -0
- src/data_ingestion/README.md +79 -0
- src/data_ingestion/data_ingestion_pipeline/components/ingest_data.py +175 -0
- src/data_ingestion/data_ingestion_pipeline/components/process_data.py +321 -0
- src/data_ingestion/data_ingestion_pipeline/pipeline.py +58 -0
- src/data_ingestion/data_ingestion_pipeline/submit_pipeline.py +184 -0
- src/data_ingestion/pyproject.toml +17 -0
- src/data_ingestion/uv.lock +999 -0
- src/deployment_targets/agent_engine/app/agent_engine_app.py +238 -0
- src/deployment_targets/agent_engine/app/utils/gcs.py +42 -0
- src/deployment_targets/agent_engine/deployment_metadata.json +4 -0
- src/deployment_targets/agent_engine/notebooks/intro_reasoning_engine.ipynb +869 -0
- src/deployment_targets/agent_engine/tests/integration/test_agent_engine_app.py +120 -0
- src/deployment_targets/agent_engine/tests/load_test/.results/.placeholder +0 -0
- src/deployment_targets/agent_engine/tests/load_test/.results/report.html +264 -0
- src/deployment_targets/agent_engine/tests/load_test/.results/results_exceptions.csv +1 -0
- src/deployment_targets/agent_engine/tests/load_test/.results/results_failures.csv +1 -0
- src/deployment_targets/agent_engine/tests/load_test/.results/results_stats.csv +3 -0
- src/deployment_targets/agent_engine/tests/load_test/.results/results_stats_history.csv +22 -0
- src/deployment_targets/agent_engine/tests/load_test/README.md +42 -0
- src/deployment_targets/agent_engine/tests/load_test/load_test.py +100 -0
- src/deployment_targets/agent_engine/tests/unit/test_dummy.py +22 -0
- src/deployment_targets/cloud_run/Dockerfile +29 -0
- src/deployment_targets/cloud_run/app/server.py +128 -0
- src/deployment_targets/cloud_run/deployment/terraform/artifact_registry.tf +22 -0
- src/deployment_targets/cloud_run/deployment/terraform/dev/service_accounts.tf +20 -0
- src/deployment_targets/cloud_run/tests/integration/test_server_e2e.py +192 -0
- src/deployment_targets/cloud_run/tests/load_test/.results/.placeholder +0 -0
- src/deployment_targets/cloud_run/tests/load_test/README.md +79 -0
- src/deployment_targets/cloud_run/tests/load_test/load_test.py +85 -0
- src/deployment_targets/cloud_run/tests/unit/test_server.py +142 -0
- src/deployment_targets/cloud_run/uv.lock +6952 -0
- src/frontends/live_api_react/frontend/package-lock.json +19405 -0
- src/frontends/live_api_react/frontend/package.json +56 -0
- src/frontends/live_api_react/frontend/public/favicon.ico +0 -0
- src/frontends/live_api_react/frontend/public/index.html +62 -0
- src/frontends/live_api_react/frontend/public/robots.txt +3 -0
- src/frontends/live_api_react/frontend/src/App.scss +189 -0
- src/frontends/live_api_react/frontend/src/App.test.tsx +25 -0
- src/frontends/live_api_react/frontend/src/App.tsx +205 -0
- src/frontends/live_api_react/frontend/src/components/audio-pulse/AudioPulse.tsx +64 -0
- src/frontends/live_api_react/frontend/src/components/audio-pulse/audio-pulse.scss +68 -0
- src/frontends/live_api_react/frontend/src/components/control-tray/ControlTray.tsx +217 -0
- src/frontends/live_api_react/frontend/src/components/control-tray/control-tray.scss +201 -0
- src/frontends/live_api_react/frontend/src/components/logger/Logger.tsx +241 -0
- src/frontends/live_api_react/frontend/src/components/logger/logger.scss +133 -0
- src/frontends/live_api_react/frontend/src/components/logger/mock-logs.ts +151 -0
- src/frontends/live_api_react/frontend/src/components/side-panel/SidePanel.tsx +161 -0
- src/frontends/live_api_react/frontend/src/components/side-panel/side-panel.scss +285 -0
- src/frontends/live_api_react/frontend/src/contexts/LiveAPIContext.tsx +48 -0
- src/frontends/live_api_react/frontend/src/hooks/use-live-api.ts +115 -0
- src/frontends/live_api_react/frontend/src/hooks/use-media-stream-mux.ts +23 -0
- src/frontends/live_api_react/frontend/src/hooks/use-screen-capture.ts +72 -0
- src/frontends/live_api_react/frontend/src/hooks/use-webcam.ts +69 -0
- src/frontends/live_api_react/frontend/src/index.css +28 -0
- src/frontends/live_api_react/frontend/src/index.tsx +35 -0
- src/frontends/live_api_react/frontend/src/multimodal-live-types.ts +242 -0
- src/frontends/live_api_react/frontend/src/react-app-env.d.ts +17 -0
- src/frontends/live_api_react/frontend/src/reportWebVitals.ts +31 -0
- src/frontends/live_api_react/frontend/src/setupTests.ts +21 -0
- src/frontends/live_api_react/frontend/src/utils/audio-recorder.ts +111 -0
- src/frontends/live_api_react/frontend/src/utils/audio-streamer.ts +270 -0
- src/frontends/live_api_react/frontend/src/utils/audioworklet-registry.ts +43 -0
- src/frontends/live_api_react/frontend/src/utils/multimodal-live-client.ts +329 -0
- src/frontends/live_api_react/frontend/src/utils/store-logger.ts +64 -0
- src/frontends/live_api_react/frontend/src/utils/utils.ts +86 -0
- src/frontends/live_api_react/frontend/src/utils/worklets/audio-processing.ts +73 -0
- src/frontends/live_api_react/frontend/src/utils/worklets/vol-meter.ts +65 -0
- src/frontends/live_api_react/frontend/tsconfig.json +25 -0
- src/frontends/streamlit/frontend/side_bar.py +213 -0
- src/frontends/streamlit/frontend/streamlit_app.py +263 -0
- src/frontends/streamlit/frontend/style/app_markdown.py +37 -0
- src/frontends/streamlit/frontend/utils/chat_utils.py +67 -0
- src/frontends/streamlit/frontend/utils/local_chat_history.py +125 -0
- src/frontends/streamlit/frontend/utils/message_editing.py +59 -0
- src/frontends/streamlit/frontend/utils/multimodal_utils.py +217 -0
- src/frontends/streamlit/frontend/utils/stream_handler.py +282 -0
- src/frontends/streamlit/frontend/utils/title_summary.py +77 -0
- src/resources/containers/data_processing/Dockerfile +25 -0
- src/resources/locks/uv-agentic_rag_vertexai_search-agent_engine.lock +4684 -0
- src/resources/locks/uv-agentic_rag_vertexai_search-cloud_run.lock +5799 -0
- src/resources/locks/uv-crewai_coding_crew-agent_engine.lock +5509 -0
- src/resources/locks/uv-crewai_coding_crew-cloud_run.lock +6688 -0
- src/resources/locks/uv-langgraph_base_react-agent_engine.lock +4595 -0
- src/resources/locks/uv-langgraph_base_react-cloud_run.lock +5710 -0
- src/resources/locks/uv-multimodal_live_api-cloud_run.lock +5665 -0
- src/resources/setup_cicd/cicd_variables.tf +36 -0
- src/resources/setup_cicd/github.tf +85 -0
- src/resources/setup_cicd/providers.tf +39 -0
- src/utils/generate_locks.py +135 -0
- src/utils/lock_utils.py +82 -0
- src/utils/watch_and_rebuild.py +190 -0
|
@@ -0,0 +1,85 @@
|
|
|
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 json
|
|
16
|
+
import os
|
|
17
|
+
import time
|
|
18
|
+
|
|
19
|
+
from locust import HttpUser, between, task
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class ChatStreamUser(HttpUser):
|
|
23
|
+
"""Simulates a user interacting with the chat stream API."""
|
|
24
|
+
|
|
25
|
+
wait_time = between(1, 3) # Wait 1-3 seconds between tasks
|
|
26
|
+
|
|
27
|
+
@task
|
|
28
|
+
def chat_stream(self) -> None:
|
|
29
|
+
"""Simulates a chat stream interaction."""
|
|
30
|
+
headers = {"Content-Type": "application/json"}
|
|
31
|
+
if os.environ.get("_ID_TOKEN"):
|
|
32
|
+
headers["Authorization"] = f"Bearer {os.environ['_ID_TOKEN']}"
|
|
33
|
+
|
|
34
|
+
data = {
|
|
35
|
+
"input": {
|
|
36
|
+
"messages": [
|
|
37
|
+
{"type": "human", "content": "Hello, AI!"},
|
|
38
|
+
{"type": "ai", "content": "Hello!"},
|
|
39
|
+
{"type": "human", "content": "Who are you?"},
|
|
40
|
+
]
|
|
41
|
+
},
|
|
42
|
+
"config": {
|
|
43
|
+
"metadata": {"user_id": "test-user", "session_id": "test-session"}
|
|
44
|
+
},
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
start_time = time.time()
|
|
48
|
+
|
|
49
|
+
with self.client.post(
|
|
50
|
+
"/stream_messages",
|
|
51
|
+
headers=headers,
|
|
52
|
+
json=data,
|
|
53
|
+
catch_response=True,
|
|
54
|
+
name="/stream_messages first message",
|
|
55
|
+
stream=True,
|
|
56
|
+
) as response:
|
|
57
|
+
if response.status_code == 200:
|
|
58
|
+
events = []
|
|
59
|
+
for line in response.iter_lines():
|
|
60
|
+
if line:
|
|
61
|
+
event = json.loads(line)
|
|
62
|
+
events.append(event)
|
|
63
|
+
for chunk in event:
|
|
64
|
+
if (
|
|
65
|
+
isinstance(chunk, dict)
|
|
66
|
+
and chunk.get("type") == "constructor"
|
|
67
|
+
):
|
|
68
|
+
if not chunk.get("kwargs", {}).get("content"):
|
|
69
|
+
continue
|
|
70
|
+
response.success()
|
|
71
|
+
end_time = time.time()
|
|
72
|
+
total_time = end_time - start_time
|
|
73
|
+
self.environment.events.request.fire(
|
|
74
|
+
request_type="POST",
|
|
75
|
+
name="/stream_messages end",
|
|
76
|
+
response_time=total_time
|
|
77
|
+
* 1000, # Convert to milliseconds
|
|
78
|
+
response_length=len(json.dumps(events)),
|
|
79
|
+
response=response,
|
|
80
|
+
context={},
|
|
81
|
+
)
|
|
82
|
+
return
|
|
83
|
+
response.failure("No valid response content received")
|
|
84
|
+
else:
|
|
85
|
+
response.failure(f"Unexpected status code: {response.status_code}")
|
|
@@ -0,0 +1,142 @@
|
|
|
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 importlib.util
|
|
16
|
+
import json
|
|
17
|
+
import logging
|
|
18
|
+
import os
|
|
19
|
+
from collections.abc import Generator
|
|
20
|
+
from unittest.mock import MagicMock, patch
|
|
21
|
+
|
|
22
|
+
import pytest
|
|
23
|
+
from fastapi.testclient import TestClient
|
|
24
|
+
from google.auth import exceptions as google_auth_exceptions
|
|
25
|
+
from google.auth.credentials import Credentials
|
|
26
|
+
from langchain_core.messages import HumanMessage
|
|
27
|
+
|
|
28
|
+
from app.utils.typing import InputChat
|
|
29
|
+
|
|
30
|
+
# Set up logging
|
|
31
|
+
logging.basicConfig(level=logging.INFO)
|
|
32
|
+
logger = logging.getLogger(__name__)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
@pytest.fixture(autouse=True)
|
|
36
|
+
def mock_google_cloud_credentials() -> Generator[None, None, None]:
|
|
37
|
+
"""Mock Google Cloud credentials for testing."""
|
|
38
|
+
with patch.dict(
|
|
39
|
+
os.environ,
|
|
40
|
+
{
|
|
41
|
+
"GOOGLE_APPLICATION_CREDENTIALS": "/path/to/mock/credentials.json",
|
|
42
|
+
"GOOGLE_CLOUD_PROJECT_ID": "mock-project-id",
|
|
43
|
+
},
|
|
44
|
+
):
|
|
45
|
+
yield
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
@pytest.fixture(autouse=True)
|
|
49
|
+
def mock_google_auth_default() -> Generator[None, None, None]:
|
|
50
|
+
"""Mock the google.auth.default function for testing."""
|
|
51
|
+
mock_credentials = MagicMock(spec=Credentials)
|
|
52
|
+
mock_project = "mock-project-id"
|
|
53
|
+
|
|
54
|
+
with patch("google.auth.default", return_value=(mock_credentials, mock_project)):
|
|
55
|
+
yield
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
@pytest.fixture
|
|
59
|
+
def sample_input_chat() -> InputChat:
|
|
60
|
+
"""
|
|
61
|
+
Fixture to create a sample input chat for testing.
|
|
62
|
+
"""
|
|
63
|
+
return InputChat(
|
|
64
|
+
messages=[HumanMessage(content="What is the meaning of life?")],
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
@pytest.fixture(autouse=True)
|
|
69
|
+
def mock_dependencies() -> Generator[None, None, None]:
|
|
70
|
+
"""
|
|
71
|
+
Mock Vertex AI dependencies for testing.
|
|
72
|
+
Patches VertexAIEmbeddings (if defined) and ChatVertexAI.
|
|
73
|
+
"""
|
|
74
|
+
patches = []
|
|
75
|
+
try:
|
|
76
|
+
try:
|
|
77
|
+
importlib.util.find_spec("app.agent.VertexAIEmbeddings")
|
|
78
|
+
except (ModuleNotFoundError, google_auth_exceptions.DefaultCredentialsError):
|
|
79
|
+
pass
|
|
80
|
+
else:
|
|
81
|
+
patches.append(patch("app.agent.VertexAIEmbeddings"))
|
|
82
|
+
patches.append(patch("app.agent.ChatVertexAI"))
|
|
83
|
+
|
|
84
|
+
for patch_item in patches:
|
|
85
|
+
mock = patch_item.start()
|
|
86
|
+
mock.return_value = MagicMock()
|
|
87
|
+
|
|
88
|
+
yield
|
|
89
|
+
except google_auth_exceptions.GoogleAuthError:
|
|
90
|
+
yield
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def test_redirect_root_to_docs() -> None:
|
|
94
|
+
"""
|
|
95
|
+
Test that the root endpoint (/) redirects to the Swagger UI documentation.
|
|
96
|
+
"""
|
|
97
|
+
with patch("app.server.agent") as _:
|
|
98
|
+
from app.server import app
|
|
99
|
+
|
|
100
|
+
client = TestClient(app)
|
|
101
|
+
response = client.get("/")
|
|
102
|
+
assert response.status_code == 200
|
|
103
|
+
assert "Swagger UI" in response.text
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
@pytest.mark.asyncio
|
|
107
|
+
async def test_stream_chat_events() -> None:
|
|
108
|
+
"""
|
|
109
|
+
Test the stream endpoint to ensure it correctly handles
|
|
110
|
+
streaming responses and generates the expected events.
|
|
111
|
+
"""
|
|
112
|
+
from app.server import app
|
|
113
|
+
|
|
114
|
+
input_data = {
|
|
115
|
+
"input": {
|
|
116
|
+
"messages": [
|
|
117
|
+
{"type": "human", "content": "Hello, AI!"},
|
|
118
|
+
{"type": "ai", "content": "Hello!"},
|
|
119
|
+
{"type": "human", "content": "What cooking recipes do you suggest?"},
|
|
120
|
+
],
|
|
121
|
+
},
|
|
122
|
+
"config": {"metadata": {"user_id": "test-user", "session_id": "test-session"}},
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
mock_events = [{"content": "Mocked response"}, {"content": "Additional response"}]
|
|
126
|
+
|
|
127
|
+
with patch("app.server.agent") as mock_agent:
|
|
128
|
+
mock_agent.stream.return_value = mock_events
|
|
129
|
+
|
|
130
|
+
client = TestClient(app)
|
|
131
|
+
response = client.post("stream_messages", json=input_data)
|
|
132
|
+
|
|
133
|
+
assert response.status_code == 200
|
|
134
|
+
|
|
135
|
+
events = []
|
|
136
|
+
for line in response.iter_lines():
|
|
137
|
+
if line:
|
|
138
|
+
events.append(json.loads(line))
|
|
139
|
+
|
|
140
|
+
assert len(events) == 2
|
|
141
|
+
assert events[0]["content"] == "Mocked response"
|
|
142
|
+
assert events[1]["content"] == "Additional response"
|