dream
147 строк · 4.8 Кб
1#!/usr/bin/env python
2
3import logging4import time5import os6import random7
8from flask import Flask, request, jsonify9from healthcheck import HealthCheck10import sentry_sdk11from sentry_sdk.integrations.logging import ignore_logger12
13
14import common.dialogflow_framework.utils.dialogflow as dialogflow_utils15import common.dialogflow_framework.programy.text_preprocessing as text_utils16import dialogflows.main as main_dialogflow17import test_server18
19ignore_logger("root")20
21sentry_sdk.init(os.getenv("SENTRY_DSN"))22SERVICE_NAME = os.getenv("SERVICE_NAME")23SERVICE_PORT = int(os.getenv("SERVICE_PORT"))24RANDOM_SEED = int(os.getenv("RANDOM_SEED", 2718))25
26logging.basicConfig(format="%(asctime)s - %(pathname)s - %(lineno)d - %(levelname)s - %(message)s", level=logging.INFO)27logger = logging.getLogger(__name__)28
29
30app = Flask(__name__)31health = HealthCheck(app, "/healthcheck")32logging.getLogger("werkzeug").setLevel("WARNING")33
34DF = main_dialogflow.composite_dialogflow35
36
37def handler(requested_data, random_seed=None):38st_time = time.time()39dialog_batch = requested_data.get("dialog_batch", [])40human_utter_index_batch = requested_data.get("human_utter_index_batch", [0] * len(dialog_batch))41state_batch = requested_data.get(f"{SERVICE_NAME}_state_batch", [{}] * len(dialog_batch))42dff_shared_state_batch = requested_data.get(f"dff_shared_state_batch", [{}] * len(dialog_batch))43entities_batch = requested_data.get("entities_batch", [{}] * len(dialog_batch))44used_links_batch = requested_data.get("used_links_batch", [{}] * len(dialog_batch))45age_group_batch = requested_data.get("age_group_batch", [""] * len(dialog_batch))46disliked_skills_batch = requested_data.get("disliked_skills_batch", [{}] * len(dialog_batch))47clarification_request_flag_batch = requested_data.get(48"clarification_request_flag_batch", [False] * len(dialog_batch)49)50random_seed = requested_data.get("random_seed", random_seed) # for tests51
52responses = []53for (54human_utter_index,55dialog,56state,57dff_shared_state,58entities,59used_links,60age_group,61disliked_skills,62clarification_request_flag,63) in zip(64human_utter_index_batch,65dialog_batch,66state_batch,67dff_shared_state_batch,68entities_batch,69used_links_batch,70age_group_batch,71disliked_skills_batch,72clarification_request_flag_batch,73):74try:75# for tests76if random_seed:77random.seed(int(random_seed))78
79text = dialog["human_utterances"][-1]["text"]80text = text_utils.clean_text(text)81
82dialogflow_utils.load_into_dialogflow(83DF,84human_utter_index,85dialog,86state,87dff_shared_state,88entities,89used_links,90age_group,91disliked_skills,92clarification_request_flag,93)94text, confidence, can_continue = dialogflow_utils.run_turn(DF, text)95(96state,97dff_shared_state,98used_links,99age_group,100disliked_skills,101response_parts,102) = dialogflow_utils.get_dialog_state(DF)103
104human_attr = {105f"{SERVICE_NAME}_state": state,106"dff_shared_state": dff_shared_state,107"used_links": used_links,108"age_group": age_group,109"disliked_skills": disliked_skills,110}111hype_attr = {"can_continue": can_continue}112if response_parts:113hype_attr["response_parts"] = response_parts114
115responses.append((text, confidence, human_attr, {}, hype_attr))116except Exception as exc:117sentry_sdk.capture_exception(exc)118logger.exception(exc)119responses.append(("", 0.0, {}, {}, {}))120
121total_time = time.time() - st_time122logger.info(f"{SERVICE_NAME} exec time = {total_time:.3f}s")123return responses124
125
126try:127test_server.run_test(handler)128logger.info("test query processed")129except Exception as exc:130sentry_sdk.capture_exception(exc)131logger.exception(exc)132raise exc133
134logger.info(f"{SERVICE_NAME} is loaded and ready")135
136
137@app.route("/respond", methods=["POST"])138def respond():139# import common.test_utils as t_utils; t_utils.save_to_test(request.json,"tests/lets_talk_in.json",indent=4) # TEST140# responses = handler(request.json, RANDOM_SEED) # TEST141# import common.test_utils as t_utils; t_utils.save_to_test(responses,"tests/lets_talk_out.json",indent=4) # TEST142responses = handler(request.json)143return jsonify(responses)144
145
146if __name__ == "__main__":147app.run(debug=False, host="0.0.0.0", port=SERVICE_PORT)148