public ChatMessage ragVertexAISearch()

in gemini/sample-apps/fixmycar/backend/src/main/java/com/cpet/fixmycarbackend/FixMyCarBackendController.java [77:126]


  public ChatMessage ragVertexAISearch(ChatMessage message) {
    // ⭐ Step 1 - Search
    logger.info("⭐ project Id: " + projectId);
    String location = "global";
    String collectionId = "default_collection";
    logger.info("⭐ Datastore ID is: " + datastoreId);
    String servingConfigId = "default_search";
    String searchQuery = message.getPrompt();
    logger.info("⭐ Datastore query: " + searchQuery);
    // Note - discoveryengine is the underlying API for Vertex AI Search
    String endpoint = String.format("discoveryengine.googleapis.com:443", location);
    String vectorSearchResults = "";
    try {
      SearchServiceSettings settings = SearchServiceSettings.newBuilder().setEndpoint(endpoint).build();
      SearchServiceClient searchServiceClient = SearchServiceClient.create(settings);
      SearchRequest request = SearchRequest.newBuilder()
          .setServingConfig(
              ServingConfigName.formatProjectLocationCollectionDataStoreServingConfigName(
                  projectId, location, collectionId, datastoreId, servingConfigId))
          .setQuery(searchQuery)
          .setPageSize(10)
          .build();
      SearchResponse response = searchServiceClient.search(request).getPage().getResponse();
      // Note - the Vertex AI Search API response is tricky to parse because
      // it's a
      // proto-based object (not JSON / REST response)
      List<SearchResult> resultsList = response.getResultsList();
      logger.info("🔍 Found " + resultsList.size() + " results.");
      for (SearchResponse.SearchResult element : resultsList) {
        Struct derivedStructData = element.getDocument().getDerivedStructData();
        Map<String, Value> fields = derivedStructData.getFieldsMap();
        Value extractiveAnswersValue = fields.get("extractive_answers");
        ListValue listValue = extractiveAnswersValue.getListValue();
        Value firstValue = listValue.getValues(0);
        Struct structValue = firstValue.getStructValue();
        Map<String, Value> innerFields = structValue.getFieldsMap();
        Value contentValue = innerFields.get("content");
        String stringValue = contentValue.getStringValue();
        vectorSearchResults += stringValue;
      }
    } catch (Exception e) {
      logger.error("⚠️ Vertex AI Search Error: " + e);
    }

    // ⭐ Step 2 - Inference w/ augmented prompt
    logger.info("🔍 Vertex AI Search results: " + vectorSearchResults);
    String result = geminiInference(message.getPrompt(), vectorSearchResults);
    message.setResponse(result);
    return message;
  }