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({})