dream
147 строк · 4.8 Кб
1#!/usr/bin/env python
2
3import logging
4import time
5import os
6import random
7
8from flask import Flask, request, jsonify
9from healthcheck import HealthCheck
10import sentry_sdk
11from sentry_sdk.integrations.logging import ignore_logger
12
13
14import common.dialogflow_framework.utils.dialogflow as dialogflow_utils
15import common.dialogflow_framework.programy.text_preprocessing as text_utils
16import dialogflows.main as main_dialogflow
17import test_server
18
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_dialogflow
35
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 tests
51
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 tests
76if 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_parts
114
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_time
122logger.info(f"{SERVICE_NAME} exec time = {total_time:.3f}s")
123return responses
124
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 exc
133
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) # TEST
140# responses = handler(request.json, RANDOM_SEED) # TEST
141# import common.test_utils as t_utils; t_utils.save_to_test(responses,"tests/lets_talk_out.json",indent=4) # TEST
142responses = handler(request.json)
143return jsonify(responses)
144
145
146if __name__ == "__main__":
147app.run(debug=False, host="0.0.0.0", port=SERVICE_PORT)
148