def similar()

in dialogflow-prebuilt-agents/cloud-functions/retail_assistant/main.py [0:0]


def similar():
  """Find similar products using Retail Recommendation API."""
  app.logger.warning("REACHED /SIMILAR")
  request_json = request.get_json(silent=False)
  app.logger.warning("REQUEST: %s", request_json)

  product_id = request_json["product_id"]

  page_size = 2
  placement = (  # A recommendation model created during product catalog creation.
      "similar-item"
  )

  user_event = {
      "event_type": "detail-page-view",
      "visitor_id": str(uuid.uuid4()),
      "product_details": [{"product": {"id": product_id}}],
  }

  # Retail Recommendation API request
  predict_request = {
      "placement": (
          "projects/"
          + PROJECT_NUMBER
          + "/locations/global/catalogs/default_catalog/servingConfigs/"
          + placement
      ),
      "user_event": user_event,
      "page_size": page_size,
      "filter": "filterOutOfStockItems",
      "params": {"returnProduct": True, "returnScore": True},
  }

  try:
    # Retail Recommendation API call
    response = predict_client.predict(predict_request)
    res = MessageToDict(response._pb)
    app.logger.warning("RAW RESPONSE: %s", res)
    app.logger.warning("RAW RESULT: %s", res["results"])
    data = res["results"]

    # Remove unnecessary 'metadata' parent nodes to normalize output between /search and /similar results.
    for i in range(len(data)):
      data[i] = data[i]["metadata"]
    data = get_minimal_payload(data)
    app.logger.warning("RESULT: %s", data)

    if len(data) > 0:
      # Transform product's data into custom template format to display in UI
      response = generate_custom_template(data)
    else:
      response = {}

    return flask.jsonify(response)
  except Exception as e:
    app.logger.warning("Retail Search Exception: %s", e)
    return flask.jsonify({})