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.

Files changed (162) hide show
  1. agent_starter_pack-0.0.1b0.dist-info/METADATA +143 -0
  2. agent_starter_pack-0.0.1b0.dist-info/RECORD +162 -0
  3. agent_starter_pack-0.0.1b0.dist-info/WHEEL +4 -0
  4. agent_starter_pack-0.0.1b0.dist-info/entry_points.txt +2 -0
  5. agent_starter_pack-0.0.1b0.dist-info/licenses/LICENSE +201 -0
  6. agents/agentic_rag_vertexai_search/README.md +22 -0
  7. agents/agentic_rag_vertexai_search/app/agent.py +145 -0
  8. agents/agentic_rag_vertexai_search/app/retrievers.py +79 -0
  9. agents/agentic_rag_vertexai_search/app/templates.py +53 -0
  10. agents/agentic_rag_vertexai_search/notebooks/evaluating_langgraph_agent.ipynb +1561 -0
  11. agents/agentic_rag_vertexai_search/template/.templateconfig.yaml +14 -0
  12. agents/agentic_rag_vertexai_search/tests/integration/test_agent.py +57 -0
  13. agents/crewai_coding_crew/README.md +34 -0
  14. agents/crewai_coding_crew/app/agent.py +86 -0
  15. agents/crewai_coding_crew/app/crew/config/agents.yaml +39 -0
  16. agents/crewai_coding_crew/app/crew/config/tasks.yaml +37 -0
  17. agents/crewai_coding_crew/app/crew/crew.py +71 -0
  18. agents/crewai_coding_crew/notebooks/evaluating_crewai_agent.ipynb +1571 -0
  19. agents/crewai_coding_crew/notebooks/evaluating_langgraph_agent.ipynb +1561 -0
  20. agents/crewai_coding_crew/template/.templateconfig.yaml +12 -0
  21. agents/crewai_coding_crew/tests/integration/test_agent.py +47 -0
  22. agents/langgraph_base_react/README.md +9 -0
  23. agents/langgraph_base_react/app/agent.py +73 -0
  24. agents/langgraph_base_react/notebooks/evaluating_langgraph_agent.ipynb +1561 -0
  25. agents/langgraph_base_react/template/.templateconfig.yaml +13 -0
  26. agents/langgraph_base_react/tests/integration/test_agent.py +48 -0
  27. agents/multimodal_live_api/README.md +50 -0
  28. agents/multimodal_live_api/app/agent.py +86 -0
  29. agents/multimodal_live_api/app/server.py +193 -0
  30. agents/multimodal_live_api/app/templates.py +51 -0
  31. agents/multimodal_live_api/app/vector_store.py +55 -0
  32. agents/multimodal_live_api/template/.templateconfig.yaml +15 -0
  33. agents/multimodal_live_api/tests/integration/test_server_e2e.py +254 -0
  34. agents/multimodal_live_api/tests/load_test/load_test.py +40 -0
  35. agents/multimodal_live_api/tests/unit/test_server.py +143 -0
  36. src/base_template/.gitignore +197 -0
  37. src/base_template/Makefile +37 -0
  38. src/base_template/README.md +91 -0
  39. src/base_template/app/utils/tracing.py +143 -0
  40. src/base_template/app/utils/typing.py +115 -0
  41. src/base_template/deployment/README.md +123 -0
  42. src/base_template/deployment/cd/deploy-to-prod.yaml +98 -0
  43. src/base_template/deployment/cd/staging.yaml +215 -0
  44. src/base_template/deployment/ci/pr_checks.yaml +51 -0
  45. src/base_template/deployment/terraform/apis.tf +34 -0
  46. src/base_template/deployment/terraform/build_triggers.tf +122 -0
  47. src/base_template/deployment/terraform/dev/apis.tf +42 -0
  48. src/base_template/deployment/terraform/dev/iam.tf +90 -0
  49. src/base_template/deployment/terraform/dev/log_sinks.tf +66 -0
  50. src/base_template/deployment/terraform/dev/providers.tf +29 -0
  51. src/base_template/deployment/terraform/dev/storage.tf +76 -0
  52. src/base_template/deployment/terraform/dev/variables.tf +126 -0
  53. src/base_template/deployment/terraform/dev/vars/env.tfvars +21 -0
  54. src/base_template/deployment/terraform/iam.tf +130 -0
  55. src/base_template/deployment/terraform/locals.tf +50 -0
  56. src/base_template/deployment/terraform/log_sinks.tf +72 -0
  57. src/base_template/deployment/terraform/providers.tf +35 -0
  58. src/base_template/deployment/terraform/service_accounts.tf +42 -0
  59. src/base_template/deployment/terraform/storage.tf +100 -0
  60. src/base_template/deployment/terraform/variables.tf +202 -0
  61. src/base_template/deployment/terraform/vars/env.tfvars +43 -0
  62. src/base_template/pyproject.toml +113 -0
  63. src/base_template/tests/unit/test_utils/test_tracing_exporter.py +140 -0
  64. src/cli/commands/create.py +534 -0
  65. src/cli/commands/setup_cicd.py +730 -0
  66. src/cli/main.py +35 -0
  67. src/cli/utils/__init__.py +35 -0
  68. src/cli/utils/cicd.py +662 -0
  69. src/cli/utils/gcp.py +120 -0
  70. src/cli/utils/logging.py +51 -0
  71. src/cli/utils/template.py +644 -0
  72. src/data_ingestion/README.md +79 -0
  73. src/data_ingestion/data_ingestion_pipeline/components/ingest_data.py +175 -0
  74. src/data_ingestion/data_ingestion_pipeline/components/process_data.py +321 -0
  75. src/data_ingestion/data_ingestion_pipeline/pipeline.py +58 -0
  76. src/data_ingestion/data_ingestion_pipeline/submit_pipeline.py +184 -0
  77. src/data_ingestion/pyproject.toml +17 -0
  78. src/data_ingestion/uv.lock +999 -0
  79. src/deployment_targets/agent_engine/app/agent_engine_app.py +238 -0
  80. src/deployment_targets/agent_engine/app/utils/gcs.py +42 -0
  81. src/deployment_targets/agent_engine/deployment_metadata.json +4 -0
  82. src/deployment_targets/agent_engine/notebooks/intro_reasoning_engine.ipynb +869 -0
  83. src/deployment_targets/agent_engine/tests/integration/test_agent_engine_app.py +120 -0
  84. src/deployment_targets/agent_engine/tests/load_test/.results/.placeholder +0 -0
  85. src/deployment_targets/agent_engine/tests/load_test/.results/report.html +264 -0
  86. src/deployment_targets/agent_engine/tests/load_test/.results/results_exceptions.csv +1 -0
  87. src/deployment_targets/agent_engine/tests/load_test/.results/results_failures.csv +1 -0
  88. src/deployment_targets/agent_engine/tests/load_test/.results/results_stats.csv +3 -0
  89. src/deployment_targets/agent_engine/tests/load_test/.results/results_stats_history.csv +22 -0
  90. src/deployment_targets/agent_engine/tests/load_test/README.md +42 -0
  91. src/deployment_targets/agent_engine/tests/load_test/load_test.py +100 -0
  92. src/deployment_targets/agent_engine/tests/unit/test_dummy.py +22 -0
  93. src/deployment_targets/cloud_run/Dockerfile +29 -0
  94. src/deployment_targets/cloud_run/app/server.py +128 -0
  95. src/deployment_targets/cloud_run/deployment/terraform/artifact_registry.tf +22 -0
  96. src/deployment_targets/cloud_run/deployment/terraform/dev/service_accounts.tf +20 -0
  97. src/deployment_targets/cloud_run/tests/integration/test_server_e2e.py +192 -0
  98. src/deployment_targets/cloud_run/tests/load_test/.results/.placeholder +0 -0
  99. src/deployment_targets/cloud_run/tests/load_test/README.md +79 -0
  100. src/deployment_targets/cloud_run/tests/load_test/load_test.py +85 -0
  101. src/deployment_targets/cloud_run/tests/unit/test_server.py +142 -0
  102. src/deployment_targets/cloud_run/uv.lock +6952 -0
  103. src/frontends/live_api_react/frontend/package-lock.json +19405 -0
  104. src/frontends/live_api_react/frontend/package.json +56 -0
  105. src/frontends/live_api_react/frontend/public/favicon.ico +0 -0
  106. src/frontends/live_api_react/frontend/public/index.html +62 -0
  107. src/frontends/live_api_react/frontend/public/robots.txt +3 -0
  108. src/frontends/live_api_react/frontend/src/App.scss +189 -0
  109. src/frontends/live_api_react/frontend/src/App.test.tsx +25 -0
  110. src/frontends/live_api_react/frontend/src/App.tsx +205 -0
  111. src/frontends/live_api_react/frontend/src/components/audio-pulse/AudioPulse.tsx +64 -0
  112. src/frontends/live_api_react/frontend/src/components/audio-pulse/audio-pulse.scss +68 -0
  113. src/frontends/live_api_react/frontend/src/components/control-tray/ControlTray.tsx +217 -0
  114. src/frontends/live_api_react/frontend/src/components/control-tray/control-tray.scss +201 -0
  115. src/frontends/live_api_react/frontend/src/components/logger/Logger.tsx +241 -0
  116. src/frontends/live_api_react/frontend/src/components/logger/logger.scss +133 -0
  117. src/frontends/live_api_react/frontend/src/components/logger/mock-logs.ts +151 -0
  118. src/frontends/live_api_react/frontend/src/components/side-panel/SidePanel.tsx +161 -0
  119. src/frontends/live_api_react/frontend/src/components/side-panel/side-panel.scss +285 -0
  120. src/frontends/live_api_react/frontend/src/contexts/LiveAPIContext.tsx +48 -0
  121. src/frontends/live_api_react/frontend/src/hooks/use-live-api.ts +115 -0
  122. src/frontends/live_api_react/frontend/src/hooks/use-media-stream-mux.ts +23 -0
  123. src/frontends/live_api_react/frontend/src/hooks/use-screen-capture.ts +72 -0
  124. src/frontends/live_api_react/frontend/src/hooks/use-webcam.ts +69 -0
  125. src/frontends/live_api_react/frontend/src/index.css +28 -0
  126. src/frontends/live_api_react/frontend/src/index.tsx +35 -0
  127. src/frontends/live_api_react/frontend/src/multimodal-live-types.ts +242 -0
  128. src/frontends/live_api_react/frontend/src/react-app-env.d.ts +17 -0
  129. src/frontends/live_api_react/frontend/src/reportWebVitals.ts +31 -0
  130. src/frontends/live_api_react/frontend/src/setupTests.ts +21 -0
  131. src/frontends/live_api_react/frontend/src/utils/audio-recorder.ts +111 -0
  132. src/frontends/live_api_react/frontend/src/utils/audio-streamer.ts +270 -0
  133. src/frontends/live_api_react/frontend/src/utils/audioworklet-registry.ts +43 -0
  134. src/frontends/live_api_react/frontend/src/utils/multimodal-live-client.ts +329 -0
  135. src/frontends/live_api_react/frontend/src/utils/store-logger.ts +64 -0
  136. src/frontends/live_api_react/frontend/src/utils/utils.ts +86 -0
  137. src/frontends/live_api_react/frontend/src/utils/worklets/audio-processing.ts +73 -0
  138. src/frontends/live_api_react/frontend/src/utils/worklets/vol-meter.ts +65 -0
  139. src/frontends/live_api_react/frontend/tsconfig.json +25 -0
  140. src/frontends/streamlit/frontend/side_bar.py +213 -0
  141. src/frontends/streamlit/frontend/streamlit_app.py +263 -0
  142. src/frontends/streamlit/frontend/style/app_markdown.py +37 -0
  143. src/frontends/streamlit/frontend/utils/chat_utils.py +67 -0
  144. src/frontends/streamlit/frontend/utils/local_chat_history.py +125 -0
  145. src/frontends/streamlit/frontend/utils/message_editing.py +59 -0
  146. src/frontends/streamlit/frontend/utils/multimodal_utils.py +217 -0
  147. src/frontends/streamlit/frontend/utils/stream_handler.py +282 -0
  148. src/frontends/streamlit/frontend/utils/title_summary.py +77 -0
  149. src/resources/containers/data_processing/Dockerfile +25 -0
  150. src/resources/locks/uv-agentic_rag_vertexai_search-agent_engine.lock +4684 -0
  151. src/resources/locks/uv-agentic_rag_vertexai_search-cloud_run.lock +5799 -0
  152. src/resources/locks/uv-crewai_coding_crew-agent_engine.lock +5509 -0
  153. src/resources/locks/uv-crewai_coding_crew-cloud_run.lock +6688 -0
  154. src/resources/locks/uv-langgraph_base_react-agent_engine.lock +4595 -0
  155. src/resources/locks/uv-langgraph_base_react-cloud_run.lock +5710 -0
  156. src/resources/locks/uv-multimodal_live_api-cloud_run.lock +5665 -0
  157. src/resources/setup_cicd/cicd_variables.tf +36 -0
  158. src/resources/setup_cicd/github.tf +85 -0
  159. src/resources/setup_cicd/providers.tf +39 -0
  160. src/utils/generate_locks.py +135 -0
  161. src/utils/lock_utils.py +82 -0
  162. 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"