MiklX commited on
Commit
1a51515
·
1 Parent(s): 361b919

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +105 -0
app.py ADDED
@@ -0,0 +1,105 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from flask import Flask, request, jsonify
2
+ import difflib
3
+ import json
4
+ import re
5
+
6
+ app = Flask(__name__)
7
+
8
+ # Загрузка данных обучения из файла
9
+ def load_training_data(filename):
10
+ training_data = {}
11
+ with open(filename, 'r', encoding='utf-8') as file:
12
+ for line in file:
13
+ question, answer = line.strip().split('|')
14
+ training_data[question] = answer
15
+ return training_data
16
+
17
+ # Загрузка функций из JSON-файла
18
+ def load_functions(filename):
19
+ with open(filename, 'r') as file:
20
+ functions = json.load(file)
21
+ return functions
22
+
23
+ # База данных вопросов и ответов
24
+ training_data_file = 'smii_default.txt'
25
+ database = load_training_data(training_data_file)
26
+
27
+ # Загрузка функций
28
+ functions_file = 'smii_functions.txt'
29
+ functions = load_functions(functions_file)
30
+
31
+ # Функция для получения наиболее подходящего ответа на вопрос
32
+ def get_response(question, training_data):
33
+ best_match = None
34
+ best_match_ratio = 0
35
+
36
+ for query in training_data:
37
+ similarity_ratio = difflib.SequenceMatcher(None, question, query).ratio()
38
+ if similarity_ratio > best_match_ratio:
39
+ best_match = query
40
+ best_match_ratio = similarity_ratio
41
+
42
+ return training_data.get(best_match, "Извините, я не понимаю ваш вопрос.")
43
+
44
+ # Список ключевых слов
45
+ keywords = ["посчитай", "посчитаешь", "посчитаете", "посчитаем", "посчитали",
46
+ "вычисли", "вычислишь", "вычислите", "вычислим", "вычислили",
47
+ "подсчитай", "подсчитаешь", "подсчитаете", "подсчитаем", "подсчитали",
48
+ "рассчитай", "рассчитаешь", "рассчитаете", "рассчитаем", "рассчитали"]
49
+
50
+ # Функция для проверки, является ли ввод математическим выражением и вычисления его
51
+ def calculate_formula(input_text):
52
+ # Создаем регулярное выражение, включая ключевые слова
53
+ pattern = r'({})\s+(.+)'.format('|'.join(keywords))
54
+ match = re.search(pattern, input_text)
55
+
56
+ if match:
57
+ keyword = match.group(1)
58
+ formula = match.group(2)
59
+ try:
60
+ result = eval(formula)
61
+ return f"Я вычислил, получилось - {formula} = {result}"
62
+ except Exception:
63
+ return "Ошибка при вычислении формулы."
64
+ return None
65
+
66
+ # Умные функции для взаимодействия
67
+ def smart_functions(user_input, functions):
68
+ for trigger, data in functions.items():
69
+ if trigger in user_input:
70
+ function_name = data.get("function")
71
+ if function_name and function_name in globals():
72
+ function = globals()[function_name]
73
+ return function(user_input)
74
+ return None
75
+
76
+ # Роут для обработки запросов
77
+ @app.route('/ask', methods=['POST'])
78
+ def ask():
79
+ auth = request.authorization
80
+ if not auth or not (auth.username == 'your_username' and auth.password == 'your_password'):
81
+ return jsonify({'message': 'Authentication failed'}), 401
82
+
83
+ request_data = request.get_json()
84
+ learning_files = request_data.get('learning', '').split(';')
85
+ question = request_data.get('question', '')
86
+
87
+ if len(learning_files) != 2:
88
+ return jsonify({'message': 'Invalid request format'}), 400
89
+
90
+ learning_data = load_training_data(learning_files[0])
91
+ training_data = load_training_data(learning_files[1])
92
+
93
+ formula_result = calculate_formula(question)
94
+ if formula_result:
95
+ return jsonify({'response': formula_result})
96
+
97
+ smart_function_result = smart_functions(question, functions)
98
+ if smart_function_result:
99
+ return jsonify({'response': smart_function_result})
100
+
101
+ response = get_response(question, training_data)
102
+ return jsonify({'response': response})
103
+
104
+ if __name__ == '__main__':
105
+ app.run(host="0.0.0.0", port=7860, debug=False)