2929import com .google .adk .tools .ToolContext ;
3030import com .google .cloud .aiplatform .v1 .RagContexts ;
3131import com .google .cloud .aiplatform .v1 .RagQuery ;
32+ import com .google .cloud .aiplatform .v1 .RagRetrievalConfig ;
3233import com .google .cloud .aiplatform .v1 .RetrieveContextsRequest ;
3334import com .google .cloud .aiplatform .v1 .RetrieveContextsRequest .VertexRagStore .RagResource ;
3435import com .google .cloud .aiplatform .v1 .RetrieveContextsResponse ;
@@ -107,6 +108,53 @@ public void runAsync_withResults_returnsContexts() throws Exception {
107108 verify (vertexRagServiceClient ).retrieveContexts (eq (expectedRequest ));
108109 }
109110
111+ @ Test
112+ public void runAsync_withSimilarityTopK_setsRagRetrievalConfig () throws Exception {
113+ ImmutableList <RagResource > ragResources =
114+ ImmutableList .of (RagResource .newBuilder ().setRagCorpus ("corpus1" ).build ());
115+ Double vectorDistanceThreshold = 0.5 ;
116+ Integer similarityTopK = 10 ;
117+ VertexAiRagRetrieval tool =
118+ VertexAiRagRetrieval .builder ()
119+ .name ("testTool" )
120+ .description ("test description" )
121+ .vertexRagServiceClient (vertexRagServiceClient )
122+ .parent ("projects/test-project/locations/us-central1" )
123+ .ragResources (ragResources )
124+ .vectorDistanceThreshold (vectorDistanceThreshold )
125+ .similarityTopK (similarityTopK )
126+ .build ();
127+ String query = "test query" ;
128+ ToolContext toolContext = buildToolContext ();
129+ RetrieveContextsRequest expectedRequest =
130+ RetrieveContextsRequest .newBuilder ()
131+ .setParent ("projects/test-project/locations/us-central1" )
132+ .setQuery (
133+ RagQuery .newBuilder ()
134+ .setText (query )
135+ .setRagRetrievalConfig (
136+ RagRetrievalConfig .newBuilder ().setTopK (similarityTopK ).build ()))
137+ .setVertexRagStore (
138+ com .google .cloud .aiplatform .v1 .RetrieveContextsRequest .VertexRagStore .newBuilder ()
139+ .addAllRagResources (ragResources )
140+ .setVectorDistanceThreshold (vectorDistanceThreshold ))
141+ .build ();
142+ when (vertexRagServiceClient .retrieveContexts (eq (expectedRequest )))
143+ .thenReturn (
144+ RetrieveContextsResponse .newBuilder ()
145+ .setContexts (
146+ RagContexts .newBuilder ()
147+ .addContexts (RagContexts .Context .newBuilder ().setText ("context1" ))
148+ .addContexts (RagContexts .Context .newBuilder ().setText ("context2" )))
149+ .build ());
150+
151+ Map <String , Object > result =
152+ tool .runAsync (ImmutableMap .of ("query" , query ), toolContext ).blockingGet ();
153+
154+ assertThat (result ).containsExactly ("response" , ImmutableList .of ("context1" , "context2" ));
155+ verify (vertexRagServiceClient ).retrieveContexts (eq (expectedRequest ));
156+ }
157+
110158 @ Test
111159 public void runAsync_noResults_returnsNoResultFoundMessage () throws Exception {
112160 ImmutableList <RagResource > ragResources =
@@ -154,14 +202,17 @@ public void processLlmRequest_gemini2Model_addVertexRagStoreToConfig() {
154202 ImmutableList <RagResource > ragResources =
155203 ImmutableList .of (RagResource .newBuilder ().setRagCorpus ("corpus1" ).build ());
156204 Double vectorDistanceThreshold = 0.5 ;
205+ Integer similarityTopK = 10 ;
157206 VertexAiRagRetrieval tool =
158- new VertexAiRagRetrieval (
159- "testTool" ,
160- "test description" ,
161- vertexRagServiceClient ,
162- "projects/test-project/locations/us-central1" ,
163- ragResources ,
164- vectorDistanceThreshold );
207+ VertexAiRagRetrieval .builder ()
208+ .name ("testTool" )
209+ .description ("test description" )
210+ .vertexRagServiceClient (vertexRagServiceClient )
211+ .parent ("projects/test-project/locations/us-central1" )
212+ .ragResources (ragResources )
213+ .vectorDistanceThreshold (vectorDistanceThreshold )
214+ .similarityTopK (similarityTopK )
215+ .build ();
165216 LlmRequest .Builder llmRequestBuilder = LlmRequest .builder ().model ("gemini-2-pro" );
166217 ToolContext toolContext = buildToolContext ();
167218
@@ -181,7 +232,8 @@ public void processLlmRequest_gemini2Model_addVertexRagStoreToConfig() {
181232 VertexRagStoreRagResource .builder ()
182233 .ragCorpus ("corpus1" )
183234 .build ()))
184- .vectorDistanceThreshold (0.5 )
235+ .vectorDistanceThreshold (vectorDistanceThreshold )
236+ .similarityTopK (similarityTopK )
185237 .build ())
186238 .build ())
187239 .build ());
@@ -212,7 +264,9 @@ public void processLlmRequest_gemini2Model_addVertexRagStoreToConfig() {
212264 }
213265
214266 @ Test
215- public void processLlmRequest_otherModel_doNotAddVertexRagStoreToConfig () {
267+ public void processLlmRequest_gemini2Model_withoutSimilarityTopK_addVertexRagStoreToConfig () {
268+ // This test's behavior depends on the GOOGLE_GENAI_USE_VERTEXAI environment variable
269+ boolean useVertexAi = Boolean .parseBoolean (System .getenv ("GOOGLE_GENAI_USE_VERTEXAI" ));
216270 ImmutableList <RagResource > ragResources =
217271 ImmutableList .of (RagResource .newBuilder ().setRagCorpus ("corpus1" ).build ());
218272 Double vectorDistanceThreshold = 0.5 ;
@@ -224,6 +278,71 @@ public void processLlmRequest_otherModel_doNotAddVertexRagStoreToConfig() {
224278 "projects/test-project/locations/us-central1" ,
225279 ragResources ,
226280 vectorDistanceThreshold );
281+ LlmRequest .Builder llmRequestBuilder = LlmRequest .builder ().model ("gemini-2-pro" );
282+ ToolContext toolContext = buildToolContext ();
283+
284+ tool .processLlmRequest (llmRequestBuilder , toolContext ).blockingAwait ();
285+
286+ if (useVertexAi ) {
287+ // Assert that VertexRagStore is added to the config without similarityTopK
288+ assertThat (llmRequestBuilder .build ().config ().get ().tools ().get ())
289+ .containsExactly (
290+ Tool .builder ()
291+ .retrieval (
292+ Retrieval .builder ()
293+ .vertexRagStore (
294+ VertexRagStore .builder ()
295+ .ragResources (
296+ ImmutableList .of (
297+ VertexRagStoreRagResource .builder ()
298+ .ragCorpus ("corpus1" )
299+ .build ()))
300+ .vectorDistanceThreshold (vectorDistanceThreshold )
301+ .build ())
302+ .build ())
303+ .build ());
304+ } else {
305+ // Assert that the function declaration is added instead
306+ assertThat (llmRequestBuilder .build ().config ().get ().tools ().get ())
307+ .containsExactly (
308+ Tool .builder ()
309+ .functionDeclarations (
310+ ImmutableList .of (
311+ FunctionDeclaration .builder ()
312+ .name ("testTool" )
313+ .description ("test description" )
314+ .parameters (
315+ Schema .builder ()
316+ .properties (
317+ ImmutableMap .of (
318+ "query" ,
319+ Schema .builder ()
320+ .description ("The query to retrieve." )
321+ .type ("STRING" )
322+ .build ()))
323+ .type ("OBJECT" )
324+ .build ())
325+ .build ()))
326+ .build ());
327+ }
328+ }
329+
330+ @ Test
331+ public void processLlmRequest_otherModel_doNotAddVertexRagStoreToConfig () {
332+ ImmutableList <RagResource > ragResources =
333+ ImmutableList .of (RagResource .newBuilder ().setRagCorpus ("corpus1" ).build ());
334+ Double vectorDistanceThreshold = 0.5 ;
335+ Integer similarityTopK = 10 ;
336+ VertexAiRagRetrieval tool =
337+ VertexAiRagRetrieval .builder ()
338+ .name ("testTool" )
339+ .description ("test description" )
340+ .vertexRagServiceClient (vertexRagServiceClient )
341+ .parent ("projects/test-project/locations/us-central1" )
342+ .ragResources (ragResources )
343+ .vectorDistanceThreshold (vectorDistanceThreshold )
344+ .similarityTopK (similarityTopK )
345+ .build ();
227346 LlmRequest .Builder llmRequestBuilder = LlmRequest .builder ().model ("other-model" );
228347 ToolContext toolContext = buildToolContext ();
229348 GenerateContentConfig initialConfig = GenerateContentConfig .builder ().build ();
0 commit comments