{"id":444190,"date":"2025-01-08T03:01:15","date_gmt":"2025-01-08T03:01:15","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=444190"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2025-01-08T03:01:15","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=444190","title":{"rendered":"<span>\u041f\u0440\u0438\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u043c \u0434\u043e\u0441\u0442\u0443\u043f \u043a API OpenAI\u00a0gpt-4o \u0447\u0435\u0440\u0435\u0437 proxy<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0417\u0430\u043f\u0438\u043b\u0438\u043b \u044f \u0432\u00a0\u0442\u043e\u043c \u0433\u043e\u0434\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430\u00a0Python \u043f\u043e\u00a0\u0434\u043e\u0441\u0442\u0443\u043f\u0443 \u043a\u00a0YandexGPT \u0447\u0435\u0440\u0435\u0437 API, \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u043e\u0442 \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c\u00a0\u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u043f\u043e\u043f\u0438\u043b\u0438\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a\u00a0gpt-4o \u0438 gpt-4o\u2011mini \u0437\u0430\u043e\u0434\u043d\u043e.<\/p>\n<p>\u0427\u0435\u043c \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u0430 \u044d\u0442\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u00a0\u2014 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u00a0\u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u043c\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c\u0438 (\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u00ab\u0421\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u00bb), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0430\u043c\u043e\u043c\u0443, \u0438 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u043e\u0439 (\u00ab\u041a\u0440\u0435\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c\u00bb) \u043a\u00a0YandexGPT \u0438 OpenAI gpt-4o \u043c\u0438\u043d\u0443\u044f \u0438\u0445 \u043f\u0440\u043e\u043c\u043f\u0442\u044b \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043f\u043b\u044e\u0441 \u043d\u0435\u00a0\u043d\u0430\u0434\u043e \u043f\u043b\u0430\u0442\u0438\u0442\u044c \u0437\u0430\u00a0\u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0443 \u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u00a0\u043d\u0430\u0434\u043e\u0431\u043d\u043e\u0441\u0442\u0438, \u043f\u043b\u044e\u0441 \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u00a0GPT \u043c\u043e\u0434\u0435\u043b\u044f\u043c\u0438.<\/p>\n<p>\u0427\u0442\u043e\u00a0\u0431\u044b \u043d\u0435\u00a0\u0437\u0430\u043c\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u043e\u0439 \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a\u00a0OpenAI \u0447\u0435\u0440\u0435\u0437 VPN \u0438 \u043e\u043f\u043b\u0430\u0442\u043e\u0439 \u0435\u0449\u0451 \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e \u0447\u0442\u043e\u00a0\u043d\u0430\u0445\u043e\u0434\u0438\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u043f\u043e\u043f\u0440\u043e\u0449\u0435, \u0437\u0430\u0431\u0438\u0432\u0430\u0435\u043c \u0432\u00a0\u043f\u043e\u0438\u0441\u043a\u0435 \u00ab\u0434\u043e\u0441\u0442\u0443\u043f \u043a\u00a0gpt-4o \u0447\u0435\u0440\u0435\u0437 proxy\u00bb \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0441\u0435\u0440\u0432\u0438\u0441\u00a0\u2014 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c\u0441\u044f, \u043e\u043f\u043b\u0430\u0447\u0438\u0432\u0430\u0435\u043c, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043a\u043b\u044e\u0447 API \u0438 \u0432\u0441\u0451, \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0430 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u00a0\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0438 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u043c \u0441\u0447\u0430\u0441\u0442\u044c\u0435.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/688\/4c9\/54a\/6884c954ad52d4369592cff98e6171ec.JPG\" width=\"839\" height=\"605\"\/><\/figure>\n<p>\u0414\u0435\u043b\u0430\u0435\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u00a0 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435:<\/p>\n<p> 1.\u00a0\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0440\u0430\u0434\u0438\u043e\u043a\u043d\u043e\u043f\u043a\u0438 \u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441<\/p>\n<pre><code class=\"python\">tk.Radiobutton(self.model_selection_frame,text=\"GPT-4o mini\",variable=self.gpt_model_uri,value=\"gpt-4o-mini\",command=self.update_gpt_model_uri).grid(row=0, column=4, padx=5, sticky=\"w\") tk.Radiobutton(self.model_selection_frame,text=\"GPT-4o\",variable=self.gpt_model_uri,value=\"gpt-4o\",command=self.update_gpt_model_uri).grid(row=0, column=5, padx=5, sticky=\"w\")<\/code><\/pre>\n<p>2. \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043a OpenAI \u0447\u0435\u0440\u0435\u0437 proxy<\/p>\n<pre><code class=\"python\"># \u0417\u0430\u043f\u0440\u043e\u0441 \u043a ChatGPT \u0447\u0435\u0440\u0435\u0437 ProxiAPI     def answer_from_proxiapi(self, user_input, system_message, user_temperature, model):          # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043a\u043b\u044e\u0447\u0430 ProxiAPI         if not self.reg_proxi_apy or not self.reg_proxi_apy.strip():             messagebox.showwarning(\"\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435\", \"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043a\u043b\u044e\u0447 \u043a ProxyAPI\")             return                prompt = {             \"model\": model,             \"messages\": [                 {\"role\": \"system\", \"content\": system_message},                 {\"role\": \"user\", \"content\": user_input}             ],             \"temperature\": user_temperature,             \"max_tokens\": 64000         }          url = \"https:\/\/api.proxyapi.ru\/openai\/v1\/chat\/completions\"         headers = {             \"Content-Type\": \"application\/json\",             \"Authorization\": f\"Bearer {self.reg_proxi_apy}\"         }          try:             response = requests.post(url, headers=headers, json=prompt)             response.raise_for_status()  # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u0442\u0430\u0442\u0443\u0441\u0430 HTTP-\u0437\u0430\u043f\u0440\u043e\u0441\u0430             result = response.json()              assistant_text = result.get(\"choices\", [{}])[0].get(\"message\", {}).get(\"content\", \"\u041e\u0448\u0438\u0431\u043a\u0430: \u041e\u0442\u0432\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\")             self.insert_to_result_label(f\" GPT: \\n{assistant_text}\\n\\n\")         except requests.exceptions.RequestException as e:             messagebox.showerror(\"\u041e\u0448\u0438\u0431\u043a\u0430\", f\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430: {e}\") <\/code><\/pre>\n<p>3 \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 # \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u0438\u00a0\u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u00ab\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c\u00bb def on_submit(self) \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0432\u044b\u0431\u043e\u0440\u0430 \u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u0440\u0438\u00a0\u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 \u043f\u0440\u043e\u043c\u043f\u0442\u0430<\/p>\n<pre><code class=\"python\"># \u0412\u044b\u0431\u043e\u0440 \u043c\u043e\u0434\u0435\u043b\u0438 \u0438 \u0432\u044b\u0437\u043e\u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438                 if self.gpt_model_uri_get in [\"gpt-4o-mini\", \"gpt-4o\"]:             self.answer_from_proxiapi(entered_text, system_message, user_temperature, self.gpt_model_uri_get)         else:             self.answer_from_yandex_gpt(entered_text, system_message, user_temperature, self.default_folder, self.api_key) <\/code><\/pre>\n<p> 4.\u00a0\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u00a0\u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\u00a0 \u0432\u0432\u043e\u0434 \u043a\u043b\u044e\u0447\u0430 proxyapi<\/p>\n<pre><code class=\"python\">self.main_menu.add_command(label=\"\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f ProxyAPI\", command=self.show_registration_proxiapi)<\/code><\/pre>\n<p>5.\u00a0\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432\u0432\u043e\u0434\u0430 \u043a\u043b\u044e\u0447\u0430 proxy<\/p>\n<pre><code class=\"python\"># \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u043a\u043d\u0430 \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 ProxiAPI     def show_registration_proxiapi(self):         registration_window = tk.Toplevel(self.root)         self.registration_window_close = registration_window         registration_window.title(\"\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0432 ProxyAPI\")          # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430         tk.Label(registration_window, text=\"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043a\u043b\u044e\u0447 proxyapi\").grid(row=0, column=0, padx=10, pady=10)         self.proxy_key_entry = tk.Text(registration_window, wrap=\"word\", width=40, height=1)              self.proxy_key_entry.bind('&lt;KeyRelease&gt;', lambda event: self.validate_input(event, registration_window))         self.proxy_key_entry.grid(row=1, column=0, padx=10, pady=0)          register_button = tk.Button(registration_window, text=\" \u0412\u043e\u0439\u0442\u0438 \", command=self.register_proxiapi_user)         register_button.grid(row=2, columnspan=2, padx=10, pady=15)          # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u0433\u043e \u043c\u0435\u043d\u044e         context_menu = tk.Menu(registration_window, tearoff=0)         context_menu.add_command(label=\"\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c\", command=lambda: self.copy_text_to_clipboard(self.proxy_key_entry))         context_menu.add_command(label=\"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c\", command=lambda: self.paste_text_from_clipboard(self.proxy_key_entry))         self.proxy_key_entry.bind(\"&lt;Button-3&gt;\", lambda event: context_menu.post(event.x_root, event.y_root)) # \u041f\u0440\u0438\u0432\u044f\u0437\u043a\u0430 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u0433\u043e \u043c\u0435\u043d\u044e \u043a \u043f\u0440\u0430\u0432\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u0435 \u043c\u044b\u0448\u0438          # \u041e\u0431\u043d\u043e\u0432\u043b\u0451\u043d\u043d\u0430\u044f \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044f         registration_window_width = 355         registration_window_height = 120  # \u041d\u043e\u0432\u0430\u044f \u0432\u044b\u0441\u043e\u0442\u0430         registration_window.resizable(False, False)         screen_width = self.root.winfo_screenwidth()         screen_height = self.root.winfo_screenheight()         x = (screen_width - registration_window_width) \/\/ 2         y = (screen_height - registration_window_height) \/\/ 2           registration_window.geometry(f\"{registration_window_width}x{registration_window_height}+{x}+{y}\")          # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438         registration_window.transient(self.root)         registration_window.wait_visibility()         registration_window.grab_set()         registration_window.focus_force()         self.root.wait_window(registration_window) <\/code><\/pre>\n<ol start=\"6\">\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043a\u043b\u044e\u0447\u0430 proxy \u0432 \u0444\u0430\u0439\u043b JSON<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"python\"># \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043a\u043b\u044e\u0447\u0430 ProxiAPI \u0432 \u0444\u0430\u0439\u043b JSON:     def register_proxiapi_user(self):         proxy_api_key = self.proxy_key_entry.get(\"1.0\", \"end-1c\").strip()          if len(proxy_api_key.strip()) &gt; 40:             messagebox.showwarning(\"\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435\", \"\u041f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043a\u043b\u044e\u0447\u0430 ProxyAPI (\u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c 40 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432).\")             return              if not proxy_api_key.strip():             messagebox.showwarning(\"\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435\", \"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043a\u043b\u044e\u0447 ProxyAPI\")             return          self.reg_proxi_apy = proxy_api_key # \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 self.reg_proxi_apy \u043f\u043e\u0442\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0435 ProxyAPI          filename = \"Login_SmartiksGPT.json\"          # \u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430, \u0435\u0441\u043b\u0438 \u0444\u0430\u0439\u043b \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442         if os.path.exists(filename):             try:                 with open(filename, \"r\") as file:                     existing_data = json.load(file)             except json.JSONDecodeError:                 existing_data = {}  # \u0415\u0441\u043b\u0438 \u0444\u0430\u0439\u043b \u043f\u0443\u0441\u0442\u043e\u0439 \u0438\u043b\u0438 \u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0435\u043d, \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u043b\u043e\u0432\u0430\u0440\u044c         else:             existing_data = {}  # \u0415\u0441\u043b\u0438 \u0444\u0430\u0439\u043b \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u043b\u043e\u0432\u0430\u0440\u044c          # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u043a\u043b\u044e\u0447 \u043a \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u0434\u0430\u043d\u043d\u044b\u043c         existing_data[\"self.reg_proxi_apy\"] = self.reg_proxi_apy          # \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u0444\u0430\u0439\u043b         try:             with open(filename, \"w\") as file:                 json.dump(existing_data, file, indent=4)             print(f\"\u041a\u043b\u044e\u0447 ProxyAPI \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0432 JSON \u0444\u0430\u0439\u043b '{filename}'.\")         except Exception as e:             print(f\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0438 \u0444\u0430\u0439\u043b\u0430: {e}\")             messagebox.showerror(\"\u041e\u0448\u0438\u0431\u043a\u0430\", \"\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u043b\u044e\u0447 ProxyAPI.\")             return          # \u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043e\u043a\u043d\u043e \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438         self.registration_window_close.destroy() <\/code><\/pre>\n<p>\u0412\u043e\u0442 \u0438 \u0432\u0441\u0451, \u0434\u0432\u0430 \u0434\u043d\u044f \u0438 \u0433\u043e\u0442\u043e\u0432\u043e. \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0441\u043b\u0430\u0436\u0434\u0430\u0435\u043c\u0441\u044f \u0438\u043c\u043f\u043e\u0440\u0442\u043d\u044b\u043c\u0438 \u043e\u0442\u0432\u0435\u0442\u0430\u043c\u0438 \u043d\u0430\u00a0\u043e\u0442\u0435\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u043c\u043f\u0442\u044b. \u0413\u043e\u0442\u043e\u0432\u044b\u0439 \u0438 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u043a\u043e\u0434 \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0432\u00a0\u0431\u043b\u043e\u043a\u043d\u043e\u0442, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0441\u00a0\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\u043c.py (\u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0443\u00a0\u0432\u0430\u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u041f\u0438\u0442\u043e\u043d\u0430 \u043a\u0430\u043a\u00a0\u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0432 <a href=\"https:\/\/habr.com\/ru\/articles\/809901\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a>) \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 SmartikGPT.py \u0432\u00a0\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0435 UTF-8\u00a0(\u043f\u0440\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0438 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u0443\u044e \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0443) \u0438 \u0432\u0441\u0451 \u0434\u043e\u043b\u0436\u043d\u043e \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. \u041c\u043e\u0436\u043d\u043e \u0434\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u00a0\u0433\u043e\u0442\u043e\u0432\u044b\u0439 exe \u0444\u0430\u0439\u043b, \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439\u00a0\u2014 \u0432\u00a0cmd \u0438\u043b\u0438\u00a0Windows PowerShell.<\/p>\n<pre><code class=\"powershell\">pyinstaller --onefile \u2013noconsole SmartiksGPT.py<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e46\/2f1\/73a\/e462f173a1319ab96721a01d357050c2.JPG\" width=\"653\" height=\"172\"\/><\/figure>\n<p>\u041a\u043e\u0434 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b SmartiksGPT<\/p>\n<pre><code class=\"python\"># \u0418\u043c\u043f\u043e\u0440\u0442 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a import tkinter as tk from tkinter import ttk from tkinter import Menu from tkinter import messagebox  import requests import json import os from transliterate import translit import winsound  import re                        # \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 DraggableWindow - \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043e\u043a\u043d\u043e class DraggableWindow:     def __init__(self, root):         # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u043a\u043d\u0430         self.root = root         self.root.title(\"SmartiksGPT\")                                        # \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430         self.is_dragging = False         initial_width = 838         initial_height = 600         screen_width = root.winfo_screenwidth()         screen_height = root.winfo_screenheight()         x = (screen_width - initial_width) \/\/ 2         y = (screen_height - initial_height) \/\/ 2         self.root.geometry(f\"{initial_width}x{initial_height}+{x}+{y}\")       # \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043e\u043a\u043d\u0430         self.root.option_add('*BorderWidth', 3)         self.root.option_add('*highlightThickness', 0)         self.root.resizable(False, False)                                     # \u0417\u0430\u043f\u0440\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u043e\u043a\u043d\u0430                  # \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u0434\u043b\u044f proxyAPI         self.PROXY_API_URL = \"https:\/\/api.proxyapi.ru\/openai\/v1\/chat\/completions\"          self.create_specialization_data()          # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043c\u0435\u043d\u044e          self.root = root         self.main_menu = tk.Menu(root)         self.info_menu = tk.Menu(self.main_menu, tearoff=0)         self.main_menu.add_cascade(label=\"\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f\", menu=self.info_menu)                 self.main_menu.add_command(label=\"\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f Yandex\", command=self.show_registration_yandex)  # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0443\u043d\u043a\u0442\u0430 \"\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f\"         self.main_menu.add_command(label=\"\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f ProxyAPI\", command=self.show_registration_proxiapi)           self.info_menu.add_command(label=\"\u0420\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e\", command=self.show_guide)         self.info_menu.add_command(label=\"\u041e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435\", command=self.show_about)                self.root.config(menu=self.main_menu)                                           self.gpt_model_uri = tk.StringVar(value=\"yandexgpt\")                       # \u041f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 self.gpt_model_uri \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \"yandexgpt\", \u044d\u0442\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \"modelUri\": f\"gpt:\/\/...\u043b\u043e\u0433\u0438\u043d \u043f\u0430\u043f\u043a\u0438...\/{self.gpt_model_uri_get}         self.gpt_model_uri_get = self.gpt_model_uri.get()                          # \u041f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 self.gpt_model_uri_get \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 self.gpt_model_uri (\u043e\u0447\u0438\u0449\u0430\u0435\u043c \u043e\u0442 \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0445 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 tk.StringVar \u0447\u0442\u043e \u0431\u044b \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0435\"modelUri\": f\"gpt:\/\/...\u043b\u043e\u0433\u0438\u043d \u043f\u0430\u043f\u043a\u0438...\/{self.gpt_model_uri_get})          self.description_text = \"\"                                                 # \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 self.description_text \u043f\u0443\u0441\u0442\u043e\u0435                  self.system_message = \"\u0422\u044b \u0443\u043c\u043d\u044b\u0439 \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442\"                  self.selected_value = tk.StringVar()                                       # \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043a\u0440\u0435\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438                  self.selected_value.set(\"0.6\")                                             # \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u0440\u0435\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e          self.selected_specialization = tk.StringVar(value=\"\u0421\u043f\u0438\u0441\u043e\u043a \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439\")  # \u041f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 self.selected_specialization \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 value=\"\u0421\u043f\u0438\u0441\u043e\u043a \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439\"          # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0443 \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442 selected_specialization         self.selected_specialization = tk.StringVar(root)         self.selected_specialization.set(\"\u0421\u043f\u0438\u0441\u043e\u043a \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439\")          # \u0412\u0438\u0434\u0436\u0435\u0442 \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430         self.result_label = tk.Text(self.root, wrap=\"word\", width=100, height=20, padx=5, state='disabled')         self.result_label.grid(row=0, column=0, columnspan=10, sticky=\"ew\", pady=2)          # \u041c\u0435\u0442\u043a\u0430 \u0434\u043b\u044f \u0432\u0432\u043e\u0434\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f         self.entry_label = tk.Label(self.root, text=\"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 :\")                                       # C\u043e\u0437\u0434\u0430\u0451\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 tk.Label (\u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0435\u043a\u0441\u0442) \u0438 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0435\u043c\u0443 \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 self.entry_label         self.entry_label.grid(row=1, column=0, padx=5, pady=10)          # \u0412\u0438\u0434\u0436\u0435\u0442 \u0434\u043b\u044f \u0432\u0432\u043e\u0434\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c         self.entry = tk.Text(self.root, wrap=\"word\", width=70, height=5, padx=2)                                 # C\u043e\u0437\u0434\u0430\u0451\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 tk.Text (\u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u0432\u0438\u0434\u0436\u0435\u0442) \u0438 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0435\u043c\u0443 \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 self.entry, wrap=\"word\" \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442  \u0447\u0442\u043e \u0442\u0435\u043a\u0441\u0442 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043f\u043e \u0441\u043b\u043e\u0432\u0430\u043c           self.entry.grid(row=1, column=1, columnspan=5, pady=10, padx=10, sticky=\"ew\")         self.entry_context_menu = tk.Menu(root, tearoff=0)         self.entry_context_menu.add_command(label=\"\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c\", command=self.copy_entry_text)         self.entry_context_menu.add_command(label=\"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c\", command=self.paste_entry_text)         self.entry.bind(\"&lt;Button-3&gt;\", self.show_entry_context_menu)          # \u041a\u043d\u043e\u043f\u043a\u0430 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f         self.submit_button = tk.Button(self.root, text=\"\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c\", command=self.on_submit)         self.submit_button.grid(row=1, column=6, pady=5)          # \u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u043b\u0430\u0432\u0438\u0448 Enter \u0438 Shift-Enter \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f         self.entry.bind(\"&lt;Return&gt;\", self.handle_enter_key)         self.entry.bind(\"&lt;Shift-Return&gt;\", self.handle_shift_enter_key)         self.entry.focus_set()          # \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u0435 \u043c\u0435\u043d\u044e \u0434\u043b\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430         self.context_menu = tk.Menu(root, tearoff=0)         self.context_menu.add_command(label=\"\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c\", command=self.copy_text)         self.result_label.bind(\"&lt;Button-3&gt;\", self.show_context_menu)          # \u041a\u043d\u043e\u043f\u043a\u0430 \u0438 \u0432\u0438\u0434\u0436\u0435\u0442 \u0434\u043b\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438         self.specialization_button = tk.Button(self.root, text=\"\u0421\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\", command=self.show_specialization_popup)         self.specialization_button.grid(row=2, column=0, pady=5, padx=15, sticky=\"w\")         self.specialization_widget = tk.Text(self.root, wrap=\"word\", width=40, height=1, padx=2, state='disabled')         self.specialization_widget.grid(row=2, column=1, pady=5, padx=0, sticky=\"w\")          # \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0442\u0435\u043a\u0441\u0442\u0430 \"\u0410\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442\" \u0432 \u0432\u0438\u0434\u0436\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438         self.specialization_widget.config(state='normal')  # \u0412\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0440\u0435\u0436\u0438\u043c \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f         self.specialization_widget.insert(tk.END, \"\u0410\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442\")         self.specialization_widget.config(state='disabled')  # \u0417\u0430\u043d\u043e\u0432\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0440\u0435\u0436\u0438\u043c \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f          # \u041a\u043d\u043e\u043f\u043a\u0430 \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043a\u0440\u0435\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438         self.creativity_button = tk.Button(self.root, text=\"\u041a\u0440\u0435\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c\", command=self.show_creativity_popup)         self.creativity_button.grid(row=2, column=2, pady=5, padx=5, sticky=\"e\")          # \u0412\u0438\u0434\u0436\u0435\u0442 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0447\u0438\u0441\u043b\u043e\u0432\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043a\u0440\u0435\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438         self.numbers_widget = tk.Text(self.root, wrap=\"word\", width=3, height=1, state='disabled')         self.numbers_widget.grid(row=2, column=3, pady=5, padx=15, sticky=\"w\")          # \u041a\u043d\u043e\u043f\u043a\u0430 \u0434\u043b\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u0431\u0435\u0441\u0435\u0434\u044b         self.clear_button = tk.Button(self.root, text=\"\u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0431\u0435\u0441\u0435\u0434\u0443\", command=self.clear_result_label)         self.clear_button.grid(row=2, column=6, pady=5, padx=5, sticky=\"w\")          # \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0432\u0438\u0434\u0436\u0435\u0442 \u0441 \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043e\u043a\u043d\u0430         self.update_numbers_widget()          # \u0421\u043b\u043e\u0432\u0430\u0440\u044c \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438         self.specialization_data = {}          # \u0412\u0438\u0434\u0436\u0435\u0442 \u0412\u044b\u0431\u043e\u0440 \u043c\u043e\u0434\u0435\u043b\u0438 YandexGPT         self.model_selection_frame = tk.Frame(self.root)         self.model_selection_frame.grid(row=3, column=0, columnspan=7, pady=10, padx=10, sticky=\"w\")          tk.Label(self.model_selection_frame, text=\"\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c:\", anchor=\"w\").grid(row=0, column=0, sticky=\"w\")          tk.Radiobutton(self.model_selection_frame,text=\"YandexGPT\",variable=self.gpt_model_uri,value=\"yandexgpt\",command=self.update_gpt_model_uri).grid(row=0, column=1, padx=5, sticky=\"w\")         tk.Radiobutton(self.model_selection_frame,text=\"YandexGPT-lite\",variable=self.gpt_model_uri,value=\"yandexgpt-lite\",command=self.update_gpt_model_uri).grid(row=0, column=2, padx=5, sticky=\"w\")         tk.Radiobutton(self.model_selection_frame,text=\"GPT-4o mini\",variable=self.gpt_model_uri,value=\"gpt-4o-mini\",command=self.update_gpt_model_uri).grid(row=0, column=4, padx=5, sticky=\"w\")         tk.Radiobutton(self.model_selection_frame,text=\"GPT-4o\",variable=self.gpt_model_uri,value=\"gpt-4o\",command=self.update_gpt_model_uri).grid(row=0, column=5, padx=5, sticky=\"w\")          # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0448\u0438\u0440\u0438\u043d\u044b \u0434\u043b\u044f \u043f\u0435\u0440\u0432\u043e\u0439 \u043a\u043e\u043b\u043e\u043d\u043a\u0438         self.root.grid_columnconfigure(0, weight=1)         self.root.grid_columnconfigure(1, weight=0)          default_folder, api_key = self.read_login_credentials('Login_SmartiksGPT.json') # \u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 Login_SmartiksGPT.json \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 default_folder \u0438 api_key         if default_folder is not None and api_key is not None:             print(\"\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u044b:\")             print(\"Default Folder:\", default_folder)             print(\"API Key:\", api_key)         else:             messagebox.showwarning(\"\u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435\", \"\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 YandexGPT API \u0438 \u0432\u0432\u0435\u0441\u0442\u0438 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0434\u0430\u043d\u043d\u044b\u0435 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 - \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 default folder \u0438 API \u043a\u043b\u044e\u0447\")   # \u0421\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0435\u0441\u043b\u0438 \u043d\u0435\u0442 \u0444\u0430\u0439\u043b\u0430 \u0441 default_folder \u0438 api_key             print(\"\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0444\u0430\u0439\u043b\u0430.\")      # \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 self.gpt_model_uri_get \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0438 yandexgpt \u0438\u043b\u0438 yandexgpt-lite     def update_gpt_model_uri(self):         #self.gpt_model_uri.set(value)                              # \u041f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 self.gpt_model_uri \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 tk.Radiobutton         self.gpt_model_uri_get = self.gpt_model_uri.get()          # \u041f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 self.gpt_model_uri_get \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 self.gpt_model_uri (\u043e\u0447\u0438\u0449\u0430\u0435\u043c \u043e\u0442 \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0445 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 tk.StringVar \u0447\u0442\u043e \u0431\u044b \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0435\"modelUri\": f\"gpt:\/\/...\u043b\u043e\u0433\u0438\u043d \u043f\u0430\u043f\u043a\u0438...\/{self.gpt_model_uri_get})         print(f\"\u0412\u044b\u0431\u0440\u0430\u043d\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c: {self.gpt_model_uri.get()}\")      # \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u043a\u043d\u0430 \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 ProxyAPI     def show_registration_proxiapi(self):         registration_window = tk.Toplevel(self.root)         self.registration_window_close = registration_window         registration_window.title(\"\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0432 ProxyAPI\")          # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430         tk.Label(registration_window, text=\"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043a\u043b\u044e\u0447 proxyapi\").grid(row=0, column=0, padx=10, pady=10)         self.proxy_key_entry = tk.Text(registration_window, wrap=\"word\", width=40, height=1)              self.proxy_key_entry.bind('&lt;KeyRelease&gt;', lambda event: self.validate_input(event, registration_window))         self.proxy_key_entry.grid(row=1, column=0, padx=10, pady=0)           register_button = tk.Button(registration_window, text=\" \u0412\u043e\u0439\u0442\u0438 \", command=self.register_proxiapi_user)         register_button.grid(row=2, columnspan=2, padx=10, pady=15)          # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u0433\u043e \u043c\u0435\u043d\u044e         context_menu = tk.Menu(registration_window, tearoff=0)         context_menu.add_command(label=\"\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c\", command=lambda: self.copy_text_to_clipboard(self.proxy_key_entry))         context_menu.add_command(label=\"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c\", command=lambda: self.paste_text_from_clipboard(self.proxy_key_entry))         self.proxy_key_entry.bind(\"&lt;Button-3&gt;\", lambda event: context_menu.post(event.x_root, event.y_root)) # \u041f\u0440\u0438\u0432\u044f\u0437\u043a\u0430 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u0433\u043e \u043c\u0435\u043d\u044e \u043a \u043f\u0440\u0430\u0432\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u0435 \u043c\u044b\u0448\u0438          # \u041e\u0431\u043d\u043e\u0432\u043b\u0451\u043d\u043d\u0430\u044f \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044f         registration_window_width = 355         registration_window_height = 120  # \u041d\u043e\u0432\u0430\u044f \u0432\u044b\u0441\u043e\u0442\u0430         registration_window.resizable(False, False)         screen_width = self.root.winfo_screenwidth()         screen_height = self.root.winfo_screenheight()         x = (screen_width - registration_window_width) \/\/ 2         y = (screen_height - registration_window_height) \/\/ 2           registration_window.geometry(f\"{registration_window_width}x{registration_window_height}+{x}+{y}\")          # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438         registration_window.transient(self.root)         registration_window.wait_visibility()         registration_window.grab_set()         registration_window.focus_force()         self.root.wait_window(registration_window)      # \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043a\u043b\u044e\u0447\u0430 ProxyAPI \u0432 \u0444\u0430\u0439\u043b JSON:     def register_proxiapi_user(self):         proxy_api_key = self.proxy_key_entry.get(\"1.0\", \"end-1c\").strip()          if len(proxy_api_key.strip()) &gt; 40:             messagebox.showwarning(\"\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435\", \"\u041f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043a\u043b\u044e\u0447\u0430 ProxyAPI (\u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c 40 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432).\")             return              if not proxy_api_key.strip():             messagebox.showwarning(\"\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435\", \"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043a\u043b\u044e\u0447 ProxyAPI\")             return          self.reg_proxi_apy = proxy_api_key # \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 self.reg_proxi_apy \u043f\u043e\u0442\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0435 ProxyAPI          filename = \"Login_SmartiksGPT.json\"          # \u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430, \u0435\u0441\u043b\u0438 \u0444\u0430\u0439\u043b \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442         if os.path.exists(filename):             try:                 with open(filename, \"r\") as file:                     existing_data = json.load(file)             except json.JSONDecodeError:                 existing_data = {}  # \u0415\u0441\u043b\u0438 \u0444\u0430\u0439\u043b \u043f\u0443\u0441\u0442\u043e\u0439 \u0438\u043b\u0438 \u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0435\u043d, \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u043b\u043e\u0432\u0430\u0440\u044c         else:             existing_data = {}  # \u0415\u0441\u043b\u0438 \u0444\u0430\u0439\u043b \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u043b\u043e\u0432\u0430\u0440\u044c          # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u043a\u043b\u044e\u0447 \u043a \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u0434\u0430\u043d\u043d\u044b\u043c         existing_data[\"self.reg_proxi_apy\"] = self.reg_proxi_apy          # \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u0444\u0430\u0439\u043b         try:             with open(filename, \"w\") as file:                 json.dump(existing_data, file, indent=4)             print(f\"\u041a\u043b\u044e\u0447 ProxyAPI \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0432 JSON \u0444\u0430\u0439\u043b '{filename}'.\")         except Exception as e:             print(f\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0438 \u0444\u0430\u0439\u043b\u0430: {e}\")             messagebox.showerror(\"\u041e\u0448\u0438\u0431\u043a\u0430\", \"\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u043b\u044e\u0447 ProxyAPI.\")             return          # \u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043e\u043a\u043d\u043e \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438         self.registration_window_close.destroy()      # \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u043a\u043d\u0430 \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 Yandex     def show_registration_yandex(self):         registration_window = tk.Toplevel(self.root)         self.registration_window_close = registration_window  # \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e self.registration_window_close \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 def register_user(self) \u0434\u043b\u044f \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438         registration_window.title(\"\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0432 YandexGPT API\")          # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0434\u043b\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438         tk.Label(registration_window, text=\"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 default folder:\").grid(row=0, column=0, padx=10, pady=10)         self.name_entry = tk.Text(registration_window,wrap=\"word\", width=40, height=1)              self.name_entry.bind('&lt;KeyRelease&gt;', lambda event: self.validate_input(event, registration_window))         self.name_entry.grid(row=1, column=0, padx=10, pady=0)          tk.Label(registration_window, text=\"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 API \u043a\u043b\u044e\u0447:\").grid(row=2, column=0, padx=10, pady=10)         self.password_entry = tk.Text(registration_window, wrap=\"word\", width=40, height=1)         self.password_entry.bind('&lt;KeyRelease&gt;', lambda event: self.validate_input(event, registration_window))         self.password_entry.grid(row=3, column=0, padx=10, pady=0)          register_button = tk.Button(registration_window, text=\" \u0412\u043e\u0439\u0442\u0438 \", command=self.register_user)         register_button.grid(row=4, columnspan=2, padx=10, pady=15)          # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u0433\u043e \u043c\u0435\u043d\u044e \u0434\u043b\u044f self.name_entry         name_context_menu = tk.Menu(registration_window, tearoff=0)         name_context_menu.add_command(label=\"\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c\", command=lambda: self.copy_text_to_clipboard(self.name_entry))         name_context_menu.add_command(label=\"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c\", command=lambda: self.paste_text_from_clipboard(self.name_entry))         self.name_entry.bind(\"&lt;Button-3&gt;\", lambda event: name_context_menu.post(event.x_root, event.y_root))          # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u0433\u043e \u043c\u0435\u043d\u044e \u0434\u043b\u044f self.password_entry         password_context_menu = tk.Menu(registration_window, tearoff=0)         password_context_menu.add_command(label=\"\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c\", command=lambda: self.copy_text_to_clipboard(self.password_entry))         password_context_menu.add_command(label=\"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c\", command=lambda: self.paste_text_from_clipboard(self.password_entry))         self.password_entry.bind(\"&lt;Button-3&gt;\", lambda event: password_context_menu.post(event.x_root, event.y_root))         # \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043e\u043a\u043d\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438         registration_window_width = 355         registration_window_height = 194         registration_window.resizable(False, False)  # \u0417\u0430\u043f\u0440\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u043e\u043a\u043d\u0430         screen_width = self.root.winfo_screenwidth()         screen_height = self.root.winfo_screenheight()         x = (screen_width - registration_window_width) \/\/ 2         y = (screen_height - registration_window_height) \/\/ 2           registration_window.geometry(f\"{registration_window_width}x{registration_window_height}+{x}+{y}\")          # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043e\u043a\u043d\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043a\u0430\u043a transient \u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u0435\u0433\u043e \u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435         registration_window.transient(self.root)         registration_window.wait_visibility()  # \u0416\u0434\u0435\u043c, \u043f\u043e\u043a\u0430 \u043e\u043a\u043d\u043e \u0441\u0442\u0430\u043d\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u044b\u043c         registration_window.grab_set_global()  # \u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0444\u043e\u043a\u0443\u0441          # \u0417\u0430\u0445\u0432\u0430\u0442 \u0444\u043e\u043a\u0443\u0441\u0430 \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u043e\u043a\u043d\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438         registration_window.grab_set()         registration_window.focus_force()         self.root.wait_window(registration_window)      # \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0432 \u043e\u043a\u043d\u0435 \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 Json \u0444\u0430\u0439\u043b      def register_user(self):                 # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432         default_folder_reg = self.name_entry.get(\"1.0\", \"end-1c\").strip()         api_key_reg = self.password_entry.get(\"1.0\", \"end-1c\").strip()          # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432         if not default_folder_reg.strip():             messagebox.showwarning(\"\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435\", \"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 default folder\")             return         if len(default_folder_reg.strip()) &gt; 40:             messagebox.showwarning(\"\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435\", \"\u041f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0435 default folder (\u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c 40 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432).\")             return              if not api_key_reg.strip():             messagebox.showwarning(\"\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435\", \"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 API \u043a\u043b\u044e\u0447\")             return         if len(api_key_reg.strip()) &gt; 40:             messagebox.showwarning(\"\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435\", \"\u041f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0432 API \u043a\u043b\u044e\u0447\u0435 (\u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c 40 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432)\")             return          # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u0447\u0442\u043e \u0432\u0441\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u043b\u043e\u0433\u0438\u043d\u0430 \u0438 \u043f\u0430\u0440\u043e\u043b\u044f \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043b\u0430\u0442\u0438\u043d\u0441\u043a\u0438\u043c\u0438 \u0431\u0443\u043a\u0432\u0430\u043c\u0438 \u0438\u043b\u0438 \u0446\u0438\u0444\u0440\u0430\u043c\u0438         if not default_folder_reg.isalnum() or not default_folder_reg.isascii():             messagebox.showwarning(\"\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435\", \"\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 default folder \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043b\u0430\u0442\u0438\u043d\u0441\u043a\u0438\u0435 \u0431\u0443\u043a\u0432\u044b \u0438 \u0446\u0438\u0444\u0440\u044b\")             return         if not api_key_reg.isalnum() or not api_key_reg.isascii():             messagebox.showwarning(\"\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435\", \"API \u043a\u043b\u044e\u0447 \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043b\u0430\u0442\u0438\u043d\u0441\u043a\u0438\u0435 \u0431\u0443\u043a\u0432\u044b \u0438 \u0446\u0438\u0444\u0440\u044b\")             return          self.default_folder = default_folder_reg         self.api_key = api_key_reg          # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0434\u043b\u044f JSON         data = {             \"self.default_folder\": self.default_folder,             \"self.api_key\": self.api_key         }          filename = \"Login_SmartiksGPT.json\"  # \u0421\u043e\u0437\u0434\u0430\u0435\u043c JSON \u0444\u0430\u0439\u043b         with open(filename, \"w\") as file:             json.dump(data, file, indent=4)          print(f\"JSON \u0444\u0430\u0439\u043b '{filename}' \u0441\u043e\u0437\u0434\u0430\u043d \u0443\u0441\u043f\u0435\u0448\u043d\u043e.\")          self.registration_window_close.destroy()                         # \u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043e\u043a\u043d\u043e \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438         # \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432\u0432\u043e\u0434\u0438\u043c\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 (\u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043b\u0430\u0442\u0438\u043d\u0441\u043a\u0438\u0435 \u0438\u043b\u0438 \u0446\u0438\u0444\u0440\u044b)     def validate_input(self, event, registration_window):         key_code = event.keycode                   # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043a\u043e\u0434 \u043a\u043b\u0430\u0432\u0438\u0448\u0438               if key_code == 8 or key_code in {37, 38, 39, 40} or (event.keysym == \"Shift_L\" or event.keysym == \"Shift_R\" or event.keysym == \"Alt_L\" or event.keysym == \"Alt_R\"): # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u044d\u0442\u043e \u043d\u0435 Backspace, \u0441\u0442\u0440\u0435\u043b\u043a\u0438 \u0438\u043b\u0438 Shift \u0438\u043b\u0438 Alt \u0447\u0442\u043e \u0431\u044b \u043d\u0435 \u0431\u044b\u043b\u043e \u043b\u043e\u0436\u043d\u043e\u0433\u043e \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u044f messagebox             return True          new_text = event.widget.get(\"1.0\", \"end-1c\")          max_chars = 40                           # \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432         if len(new_text) &gt;= max_chars:                        return \"break\"                       # \u041e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0432\u0432\u043e\u0434 \u043d\u043e\u0432\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432                  if new_text == \"\":                                                         # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u043d\u0435 \u043f\u0443\u0441\u0442\u043e\u0435             return True                  if new_text and not re.match(r'^[a-zA-Z0-9\\s]*$', new_text):             registration_window.grab_set()             tk.messagebox.showerror(\"\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435\", \"\u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u043b\u0430\u0442\u0438\u043d\u0441\u043a\u0438\u0435 \u0431\u0443\u043a\u0432\u044b \u0438 \u0446\u0438\u0444\u0440\u044b\")             return False               # \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u0430 \u041b\u043e\u0433\u0438\u043d\u0430 \u0438 \u043f\u0430\u0440\u043e\u043b\u044f self.default_folder \u0438 self.api_key     def read_login_credentials(self, file_path):         try:             with open(file_path, 'r') as file:                 data = json.load(file)                 self.default_folder = data.get('self.default_folder')                 self.api_key = data.get('self.api_key')                 self.reg_proxi_apy = data.get('self.reg_proxi_apy')                 return self.default_folder, self.api_key         except FileNotFoundError:             print(f\"\u0424\u0430\u0439\u043b {file_path} \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d.\")             return None, None         except json.JSONDecodeError:             print(f\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0444\u0430\u0439\u043b\u0430 {file_path}.\")             return None, None      # \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0434\u043b\u044f \u043a\u043b\u0430\u0432\u0438\u0448\u0438 Enter     def handle_enter_key(self, event):                  if event.state &amp; 0x1:  # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u0447\u0442\u043e \u043d\u0430\u0436\u0430\u0442\u0430 \u043a\u043b\u0430\u0432\u0438\u0448\u0430 Shift (bitwise AND \u0441 0x1)             self.entry.insert(tk.INSERT, '\\n')  # \u0412\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0438\u043c\u0432\u043e\u043b \u043d\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438         else:             self.on_submit()      def handle_shift_enter_key(self, event):                         self.entry.insert(tk.INSERT, '\\n')      # \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u043e\u043a\u043d\u0430 \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043a\u0440\u0435\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u043e\u043a\u043d\u0435     def show_creativity_popup(self):          popup = tk.Toplevel(self.root)         popup.title(\"\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\")         values = [\"0.0\", \"0.1\", \"0.2\", \"0.3\", \"0.4\", \"0.5\", \"0.6\", \"0.7\", \"0.8\", \"0.9\", \"1.0\"]         dropdown = tk.OptionMenu(popup, self.selected_value, *values)         dropdown.pack(pady=10)         apply_button = tk.Button(popup, text=\"\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c\", command=lambda: self.update_temperature_and_close(popup))         apply_button.pack(pady=10)         # \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u043e\u043a\u043d\u0430         popup_width = 170         popup_height = 100         screen_width = self.root.winfo_screenwidth()         screen_height = self.root.winfo_screenheight()         x = (screen_width - popup_width) \/\/ 2         y = (screen_height - popup_height) \/\/ 2         popup.geometry(f\"{popup_width}x{popup_height}+{x}+{y}\")         popup.transient(self.root)         popup.grab_set()         popup.resizable(width=False, height=False) # \u0411\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u043e\u043a\u043d\u0430         popup.focus_force()  # \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0444\u043e\u043a\u0443\u0441\u0430 (\u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0435 \u043e\u043a\u043d\u043e \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u043c)         self.root.wait_window(popup)      # \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0438\u0434\u0436\u0435\u0442\u0430 \u0441 \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c     def update_numbers_widget(self):                  self.numbers_widget.config(state='normal')         self.numbers_widget.delete(\"1.0\", tk.END)         self.numbers_widget.insert(tk.END, self.selected_value.get())         self.numbers_widget.config(state='disabled')       # \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u043e\u043a\u043d\u0430     def update_temperature_and_close(self, popup):                  self.update_numbers_widget()         popup.destroy()       # \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \"\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c\"     def on_submit(self):         entered_text = self.entry.get(\"1.0\", \"end-1c\").strip()               # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0430 \u0438\u0437 \u0432\u0438\u0434\u0436\u0435\u0442\u0430 self.entry           # \u0415\u0441\u043b\u0438 entered_text \u043f\u0443\u0441\u0442\u043e, \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438\"         if not entered_text:             messagebox.showwarning(\"\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435\", \"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\")             return                  # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0432 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0438         entered_text_previshenie = len(entered_text) - 19000        # \u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u0432\u0448\u0438\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432         if len(entered_text) &gt; 19000:              messagebox.showwarning(\"\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435\", f\"\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0432 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0438 \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u043b\u043e \u043b\u0438\u043c\u0438\u0442 \u043d\u0430 {entered_text_previshenie} \u0448\u0442.\")             return                  if not entered_text:  # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u0447\u0442\u043e \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043d\u0435 \u043f\u0443\u0441\u0442\u043e\u0439             return         user_message = f\" \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c: \\n{entered_text}\\n\"                   # \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e user_message \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c: \\n{entered_text}\\n \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 entered_text \u0438 \u0432\u0441\u0451 \u044d\u0442\u043e \u043e\u0431\u0440\u0430\u043c\u043b\u044f\u0435\u0442\u0441\u044f {} \u0442.\u043a. \u0441\u0442\u043e\u0438\u0442 f         self.insert_to_result_label(user_message)         self.entry.delete(\"1.0\", tk.END)           # \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 system_message \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0430 \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 self.description_text (\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u043c\u043f\u0442\u0430 \u043f\u0440\u0438 \u0432\u044b\u0431\u043e\u0440\u0435 \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439)         if self.description_text:                                            # \u0415\u0441\u043b\u0438 self.description_text \u0438\u0441\u0442\u0438\u043d\u043d\u043e (\u0442\u0430\u043c \u0435\u0441\u0442\u044c \u043a\u0430\u043a\u043e\u043a\u0435 \u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435)             system_message = self.description_text                           # \u0442\u043e system_message \u043f\u0440\u0438\u043c\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 self.system_message = \"\u0422\u044b \u0443\u043c\u043d\u044b\u0439 \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442\"         else:                                                                # \u0418\u043d\u0430\u0447\u0435 (self.description_text \u043f\u0443\u0441\u0442\u043e (\u043b\u043e\u0436\u043d\u043e)             system_message = self.system_message                             # system_message \u043f\u0440\u0438\u043c\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 self.system_message          # \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 temperature \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 answer_from_yandex_gpt         user_temperature_str = self.selected_value.get()         if not user_temperature_str:             return         user_temperature = float(user_temperature_str)                              # \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u0432 \u0447\u0438\u0441\u043b\u043e \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0437\u0430\u043f\u044f\u0442\u043e\u0439 \u0438 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f user_temperature         self.user_temperature = user_temperature                                    # \u041f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f user_temperature \u0432 self.user_temperature               # \u0412\u044b\u0431\u043e\u0440 \u043c\u043e\u0434\u0435\u043b\u0438 \u0438 \u0432\u044b\u0437\u043e\u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438         #selected_model = self.gpt_model_uri.get()                  if self.gpt_model_uri_get in [\"gpt-4o-mini\", \"gpt-4o\"]:             self.answer_from_proxiapi(entered_text, system_message, user_temperature, self.gpt_model_uri_get)         else:             self.answer_from_yandex_gpt(entered_text, system_message, user_temperature, self.default_folder, self.api_key)        # \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u0431\u0435\u0441\u0435\u0434\u044b \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \"\u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c\"     def clear_result_label(self):         self.result_label.config(state='normal')         self.result_label.delete('1.0', tk.END)         self.result_label.config(state='disabled')      # \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u043a\u043d\u0430 \u0431\u0435\u0441\u0435\u0434\u044b \u0441 YandexGPT result_label     def insert_to_result_label(self, message):         self.result_label.config(state='normal')         self.result_label.insert(tk.END, message)         self.result_label.see(tk.END)         self.result_label.config(state='disabled')      # \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043a Yandex GPT     def answer_from_yandex_gpt(self, user_input, system_message, user_temperature, default_folder, api_key):                  prompt = {             \"modelUri\": f\"gpt:\/\/{default_folder}\/{self.gpt_model_uri_get}\",             \"completionOptions\": {                 \"stream\": False,                 \"temperature\": user_temperature,                 \"maxTokens\": \"2000\"             },             \"messages\": [                 {\"role\": \"system\", \"text\": system_message},                 {\"role\": \"user\", \"text\": user_input}             ]         }          #print(\"Prompt temperature:\", prompt[\"completionOptions\"][\"temperature\"])          # \u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043a Yandex GPT         url = \"https:\/\/llm.api.cloud.yandex.net\/foundationModels\/v1\/completion\"         headers = {             \"Content-Type\": \"application\/json\",             \"Authorization\": f\"Api-Key {api_key}\"         }          response = requests.post(url, headers=headers, json=prompt)         result = response.text          result_json = json.loads(result)         assistant_text = result_json['result']['alternatives'][0]['message']['text']         response_temperature = result_json['result']['alternatives'][0]['message'].get('temperature')         if response_temperature is not None:             print(\"Response temperature:\", response_temperature)          # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e\u0431\u044b \u0442\u0435\u043a\u0441\u0442 \u043d\u0435 \u0431\u044b\u043b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e         if not self.result_label.get(\"1.0\", tk.END).strip().endswith(assistant_text):             self.insert_to_result_label(f\"YandexGPT: \\n{assistant_text}\\n\\n\")             # \u0412\u044b\u0432\u043e\u0434\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 system_message \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c         print(\"\u0422\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430:\", prompt[\"completionOptions\"][\"temperature\"])             print(\"\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435:\", system_message)                print(\"\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c:\", self.gpt_model_uri_get)           # \u0412\u044b\u0432\u043e\u0434 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c         #self.print_specialization_data()                  # \u0412\u044b\u0432\u043e\u0434 \u043e\u0442\u0432\u0435\u0442\u0430 \u043e\u0442 YandexGPT \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c         print(result)      # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u043e\u043a\u043d\u0430 (Toplevel) \"\u0421\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\" \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0435\u0433\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430     def show_specialization_popup(self):                  popup = tk.Toplevel(self.root)         popup.title(\"\u0421\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\")                  # \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u0440\u0435\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e         self.selected_value.set(\"0.0\")                  # \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \"\u0421\u043f\u0438\u0441\u043e\u043a \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439\" \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0435         self.selected_specialization.set(\"\u0421\u043f\u0438\u0441\u043e\u043a \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439\")          # \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 specialization_data.pkl         try:             with open(\"specialization_data.json\", \"rb\") as file:                 self.specialization_data = json.load(file)         except FileNotFoundError:             print(\"\u0424\u0430\u0439\u043b specialization_data.json \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d.\")             # \u0415\u0441\u043b\u0438 \u0444\u0430\u0439\u043b \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u043b\u043e\u0432\u0430\u0440\u044c             self.specialization_data = {}             # \u041f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u043c \"\u0421\u043f\u0438\u0441\u043e\u043a \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439\" \u043f\u0440\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0438 \u0444\u0430\u0439\u043b\u0430             self.selected_specialization.set(\"\u0421\u043f\u0438\u0441\u043e\u043a \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439\")          # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 name \u0438\u0437 \u0441\u043b\u043e\u0432\u0430\u0440\u044f self.specialization_data          specialization_keys = [spec['name'] for spec in self.specialization_data.values()]          tk.Label(popup, text=\"\u0421\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\").grid(row=0, column=0, pady=10)          # \u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u043a\u043b\u044e\u0447\u0435\u0439 \u0434\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432         max_key_length = 40         filtered_specialization_keys = [key[:max_key_length] for key in specialization_keys]          # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u0430 OptionMenu \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0441\u043f\u0438\u0441\u043a\u0430 \u043a\u043b\u044e\u0447\u0435\u0439         if filtered_specialization_keys:                                                                                   # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0435\u0441\u0442\u044c \u043b\u0438 \u043a\u0430\u043a\u0438\u0435-\u043b\u0438\u0431\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 filtered_specialization_keys             specialization_dropdown = tk.OptionMenu(popup, self.selected_specialization, *filtered_specialization_keys, command=self.on_specialization_select)    # \u0415\u0441\u043b\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0438\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0440\u043e\u0447\u043a\u0438 \u0438\u0441\u0442\u0438\u043d\u043d\u043e, \u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0432\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a (OptionMenu). self.selected_specialization \u044d\u0442\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f         else:                                                                                                              # \u0415\u0441\u043b\u0438 \u0432 \u0432\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0435\u043c \u0441\u043f\u0438\u0441\u043a\u0435 (\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f filtered_specialization_keys) \u043d\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439             specialization_dropdown = tk.OptionMenu(popup, self.selected_specialization, \"\u041d\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0445\")                     # \u0431\u0443\u0434\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u043f\u0443\u043d\u043a\u0442 \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u043c \"\u041d\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0445\"         specialization_dropdown.grid(row=0, column=1, columnspan=2, padx=25, pady=10, sticky=\"ew\")                         # \u0420\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0432\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0435\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u043d\u0430 \u0441\u0435\u0442\u043a\u0435 \u043e\u043a\u043d\u0430         specialization_dropdown.config(height=1, anchor=\"n\", width=40)                                                     # anchor=\"n\" \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e \u0432\u044b\u0441\u043e\u0442\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u0432\u0438\u0434\u0436\u0435\u0442\u0430 \u0438 \u0441\u043c\u0435\u0449\u0430\u0435\u0442 \u0435\u0433\u043e \u0441\u0432\u0435\u0440\u0445\u0443 \u0432 \u0446\u0435\u043d\u0442\u0440          delete_button = tk.Button(popup, text=\" \u0423\u0434\u0430\u043b\u0438\u0442\u044c \", command=lambda: self.delete_selected_specialization(popup), fg=\"red\", activeforeground=\"red\")         delete_button.grid(row=0, column=3, padx=14, pady=10, sticky=\"e\")          # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u0430 \u0434\u043b\u044f \u0432\u0432\u043e\u0434\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438         tk.Label(popup, text=\"\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435  \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438:\").grid(row=1, column=0, columnspan=7, pady=10)          # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043c\u0435\u0442\u043a\u0438 \u0438 \u0432\u0438\u0434\u0436\u0435\u0442\u0430 \u0434\u043b\u044f \u0432\u0432\u043e\u0434\u0430 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438         tk.Label(popup, text=\"\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435:\").grid(row=2, column=0, padx=5, pady=10)         self.specialization_entry = tk.Text(popup,wrap=\"word\", width=40, height=1, padx=2)         self.specialization_entry.bind(\"&lt;Key&gt;\", self.enforce_maxlength)                # \u041f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c \u043c\u0435\u0442\u043e\u0434 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 (elf.enforce_maxlength) \u043a \u0441\u043e\u0431\u044b\u0442\u0438\u044e Key         self.specialization_entry.grid(row=2, column=1, padx=5, pady=10)         self.specialization_entry.bind(\"&lt;KeyPress-Return&gt;\", lambda e: \"break\")        # \u041e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043a\u043b\u0430\u0432\u0438\u0448\u0443 Enter \u0432 \u0432\u0438\u0434\u0436\u0435\u0442\u0435 \u0447\u0442\u043e \u0431\u044b \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u043b\u043e\u0441\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0421\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438                   # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u0433\u043e \u043c\u0435\u043d\u044e \u0434\u043b\u044f \u0432\u0438\u0434\u0436\u0435\u0442\u0430 specialization_entry         entry_context_menu = Menu(popup, tearoff=0)         entry_context_menu.add_command(label=\"\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c\", command=lambda: self.copy_text_to_clipboard(self.specialization_entry))         entry_context_menu.add_command(label=\"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c\", command=lambda: self.paste_text_from_clipboard(self.specialization_entry))         self.specialization_entry.bind(\"&lt;Button-3&gt;\", lambda event: entry_context_menu.post(event.x_root, event.y_root))          # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043c\u0435\u0442\u043a\u0438 \u0438 \u0432\u0438\u0434\u0436\u0435\u0442\u0430 \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u043a\u0440\u0435\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438         tk.Label(popup, text=\"\u041a\u0440\u0435\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c:\").grid(row=3, column=0, padx=5, pady=10)         creativity_values = [\"0.0\", \"0.1\", \"0.2\", \"0.3\", \"0.4\", \"0.5\", \"0.6\", \"0.7\", \"0.8\", \"0.9\", \"1.0\"]         self.creativity_dropdown = tk.OptionMenu(popup, self.selected_value, *creativity_values)         self.creativity_dropdown.grid(row=3, column=1, padx=5, pady=10)          # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043c\u0435\u0442\u043a\u0438 \u0438 \u0432\u0438\u0434\u0436\u0435\u0442\u0430 \u0434\u043b\u044f \u0432\u0432\u043e\u0434\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438         tk.Label(popup, text=\"\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435:\").grid(row=4, column=0, padx=5, pady=10)         self.description_text_spec = tk.Text(popup, wrap=\"word\", width=40, height=5, padx=2)         self.description_text_spec.grid(row=4, column=1, padx=5, pady=10)          # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u0433\u043e \u043c\u0435\u043d\u044e \u0434\u043b\u044f \u0432\u0438\u0434\u0436\u0435\u0442\u0430 self.description_text_spec         description_context_menu = tk.Menu(popup, tearoff=0)         description_context_menu.add_command(label=\"\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c\", command=lambda: self.copy_text_to_clipboard(self.description_text_spec))         description_context_menu.add_command(label=\"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c\", command=lambda: self.paste_text_from_clipboard(self.description_text_spec))         self.description_text_spec.bind(\"&lt;Button-3&gt;\", lambda event: description_context_menu.post(event.x_root, event.y_root))          # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0430 \u043a \u043d\u0435\u0439 \u043c\u0435\u0442\u043e\u0434\u0430 apply_specialization \u0441 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432         self.apply_button = tk.Button(popup, text=\"\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c\", command=lambda: self.apply_specialization(popup, self.specialization_entry.get(\"1.0\", tk.END), self.description_text_spec))         self.apply_button.grid(row=4, column=3, padx=5, pady=10)          # \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u043e\u043a\u043d\u0430         popup_width = 530         popup_height = 307         popup.resizable(False, False)                        # \u0417\u0430\u043f\u0440\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u043e\u043a\u043d\u0430         screen_width = self.root.winfo_screenwidth()         screen_height = self.root.winfo_screenheight()         x = (screen_width - popup_width) \/\/ 2         y = (screen_height - popup_height) \/\/ 2         popup.geometry(f\"{popup_width}x{popup_height}+{x}+{y}\")          # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u043e\u043a\u043d\u0430 \u043a\u0430\u043a transient \u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u0435\u0433\u043e \u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435         popup.transient(self.root)         popup.wait_visibility()                                                            # \u0416\u0434\u0435\u043c, \u043f\u043e\u043a\u0430 \u043e\u043a\u043d\u043e \u0441\u0442\u0430\u043d\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u044b\u043c         popup.grab_set_global()                                                            # \u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0444\u043e\u043a\u0443\u0441          # \u0417\u0430\u0445\u0432\u0430\u0442 \u0444\u043e\u043a\u0443\u0441\u0430 \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u043e\u043a\u043d\u0430         popup.grab_set()         popup.focus_force()         self.root.wait_window(popup.winfo_toplevel())      # \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0432\u0432\u043e\u0434\u0438\u043c\u044b\u0445 \u0432 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438     def enforce_maxlength(self, event):         max_chars = 40         if len(self.specialization_entry.get(\"1.0\", \"end-1c\")) &gt;= max_chars:             if event.keysym not in [\"BackSpace\", \"Delete\"]:                                 # \u0420\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u043c \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432                 return \"break\"       # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u0437 self.specialization_data     def on_specialization_select(self, specialization):                  specialization_data = self.specialization_data.get(specialization, {})          self.key = specialization_data.get('key', '')              # \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438         self.specialization_entry.delete('1.0', tk.END)  # \u041e\u0447\u0438\u0441\u0442\u043a\u0430 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044f         self.specialization_entry.insert('1.0', specialization_data.get('name', ''))  # \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438              selected_creativity = specialization_data.get('creativity', '')  # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u0440\u0435\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438         self.selected_value.set(selected_creativity)  # \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u043a\u0440\u0435\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0432 \u0432\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0435\u043c \u0441\u043f\u0438\u0441\u043a\u0435              self.description_text_spec.delete('1.0', tk.END)  # \u041e\u0447\u0438\u0441\u0442\u043a\u0430 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044f         self.description_text_spec.insert('1.0', specialization_data.get('description', ''))  # \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438          # \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c  \u0434\u043b\u044f \u043e\u043a\u043d\u0430 \"\u0421\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\"     def copy_text_to_clipboard(self, widget):         selected_text = widget.get(\"sel.first\", \"sel.last\")         self.root.clipboard_clear()         self.root.clipboard_append(selected_text)         self.root.update()       def paste_text_from_clipboard(self, widget):         try:             # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430 \u0432 \u0432\u0438\u0434\u0436\u0435\u0442\u0435             selected_text = widget.get(tk.SEL_FIRST, tk.SEL_LAST)                      # \u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442, \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0435\u0433\u043e             if selected_text:                 widget.delete(tk.SEL_FIRST, tk.SEL_LAST)         except tk.TclError:             # \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043a\u0438, \u0435\u0441\u043b\u0438 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430 \u043d\u0435\u0442             pass          # \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0442\u0435\u043a\u0441\u0442\u0430 \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430 \u043e\u0431\u043c\u0435\u043d\u0430 \u0432 \u0432\u0438\u0434\u0436\u0435\u0442         text_to_paste = self.root.clipboard_get()         widget.insert(tk.INSERT, text_to_paste)          # \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043a\u043d\u043e\u043f\u043a\u0438 \"\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c\" \u0432 \u043e\u043a\u043d\u0435 \"\u0421\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\"     def apply_specialization(self, popup, specialization_name, description_text_spec):         if isinstance(description_text_spec, tk.Text):                 # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 description_text_spec \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0430 tk.Text. \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u0442\u0430\u043a, \u0442\u043e \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442\u0441\u044f \u0442\u0435\u043a\u0441\u0442 \u0438\u0437 \u0432\u0438\u0434\u0436\u0435\u0442\u0430 tk.Text \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 system_message             system_message = description_text_spec.get(\"1.0\", tk.END).strip()         else:                                                     # \u0415\u0441\u043b\u0438 \u043d\u0435\u0442, \u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 description_text_spec             system_message = str(description_text_spec).strip()            variable_name = specialization_name[:40]                  # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 variable_name, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u0435\u0440\u0432\u044b\u0435 40 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0438\u0437 \u0441\u0442\u0440\u043e\u043a\u0438 specialization_name. \u042d\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.                  formatted_text = specialization_name                      # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 formatted_text, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 specialization_name          # \u0415\u0441\u043b\u0438 specialization_name \u043f\u0443\u0441\u0442\u043e, \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438\"         if not specialization_name.strip():                                                # strip() \u043e\u0447\u0438\u0449\u0430\u0435\u0442 specialization_name \u043e\u0442 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043f\u0440\u043e\u0431\u0435\u043b\u0430 \u0438 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u0441\u0442\u0440\u043e\u043a\u0438 \u0434\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0443\u0441\u043b\u043e\u0432\u0438\u044f             messagebox.showwarning(\"\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435\", \"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438\")             return          # \u0415\u0441\u043b\u0438 system_message \u043f\u0443\u0441\u0442\u043e, \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438\"         if not system_message:             messagebox.showwarning(\"\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435\", \"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438\")             return                  # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0432 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0438 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438         if len(specialization_name.strip()) &gt; 40:              messagebox.showwarning(\"\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435\", \"\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0432 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0438 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u0435\u0432\u044b\u0441\u0435\u043b\u043e 40 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432\")             return                  # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0432 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438         system_message_previshenie = len(system_message) - 3800        # \u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043f\u0440\u0435\u0432\u044b\u0441\u0435\u0432\u0448\u0438\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432         if len(system_message) &gt; 3800:              messagebox.showwarning(\"\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435\", f\"\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0432 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u043b\u043e \u043b\u0438\u043c\u0438\u0442 \u043d\u0430 {system_message_previshenie} \u0448\u0442.\")             return          self.specialization_widget.config(state='normal')         # \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0432\u0438\u0434\u0436\u0435\u0442\u0430 self.specialization_widget \u0432 'normal' (\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f)         self.specialization_widget.delete(\"1.0\", tk.END)          # \u041e\u0447\u0438\u0441\u0442\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0432\u0438\u0434\u0436\u0435\u0442\u0430 self.specialization_widget \u0441 \u043d\u0430\u0447\u0430\u043b\u0430 (\u0441\u0442\u0440\u043e\u043a\u0430 \"1.0\") \u0434\u043e \u043a\u043e\u043d\u0446\u0430 (tk.END)         self.specialization_widget.insert(tk.END, formatted_text) # \u0412\u0441\u0442\u0430\u0432\u043a\u0430  \u0442\u0435\u043a\u0441\u0442\u0430 \u0438\u0437 formatted_text \u0432 \u0432\u0438\u0434\u0436\u0435\u0442 self.specialization_widget \u0432 \u043a\u043e\u043d\u0435\u0446 (tk.END)         self.specialization_widget.config(state='disabled')       # \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0432\u0438\u0434\u0436\u0435\u0442\u0430 self.specialization_widget \u0432 'disabled' (\u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f)          # \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c user_temperature \u0438\u0437 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043a\u0440\u0435\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438         user_temperature_str = self.selected_value.get()          # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 self.selected_value \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0435\u0433\u043e \u0432 user_temperature_str         if user_temperature_str:                                  # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u0447\u0442\u043e user_temperature_str \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439             self.user_temperature = float(user_temperature_str)   # \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 user_temperature_str \u0432 \u0447\u0438\u0441\u043b\u043e \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0437\u0430\u043f\u044f\u0442\u043e\u0439 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0432 self.user_temperature          self.update_numbers_widget()                              # \u0412\u044b\u0437\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u0430 update_numbers_widget \u0434\u043b\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0447\u0438\u0441\u043b\u043e\u0432\u043e\u0433\u043e \u0432\u0438\u0434\u0436\u0435\u0442\u0430         #user_input = \"\u041f\u0440\u0438\u0432\u0435\u0442\"                                     # \u041f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 user_input \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \"\u041f\u0440\u0438\u0432\u0435\u0442\" \u0447\u0442\u043e \u0431\u044b \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 (\u043f\u0440\u043e\u043c\u043f\u0442\u0430) \u043a YandexGPT \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u043b\u0441\u044f \u0437\u0430\u043f\u0440\u043e\u0441 \u043e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b \u043e\u0442\u0432\u0435\u0442 \u043e\u0442 YandexGPT, \u0435\u0441\u043b\u0438 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0432\u0435\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0430 \u0441 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435\u043c \u043e\u0442\u0432\u0435\u0442\u0430 (result)                  # \u041f\u0435\u0440\u0435\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0438\u0437 \u0432\u0438\u0434\u0436\u0435\u0442\u0430 \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e \u0431\u044b \u043f\u0440\u043e\u043c\u043f\u0442 (system_message) \u043d\u0435 \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u043b\u0441\u044f \u043d\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438\u043b\u0438 \u043d\u0435 \u043e\u0441\u0442\u0430\u0432\u0430\u043b\u0441\u044f \u043e\u0442\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0431\u043e\u0440\u0430 \u0438\u0437 \u0421\u043f\u0438\u0441\u043a\u0430 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439         self.description_text_value = description_text_spec.get(\"1.0\", tk.END).strip() # \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0438\u0437 \u0432\u0438\u0434\u0436\u0435\u0442\u0430 \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0432 \u0442\u0435\u043a\u0441\u0442           self.system_message = self.description_text_value                         # \u041f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0438\u0435 self.description_text_value \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e self.system_message (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \"\u041e\u0442\u0432\u0435\u0447\u0430\u0439 \u043a\u0430\u043a \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442\")         self.description_text = self.system_message                               # \u041f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0435 self.system_message \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 self.description_text (\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0431\u043e\u0440\u0430 \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439)           # \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043a yandex_gpt \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \"\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c\"         #self.answer_from_yandex_gpt(user_input, self.description_text_value, self.user_temperature) # \u0412\u044b\u0437\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u0430 answer_from_yandex_gpt \u0441 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 user_input, system_message \u0438 self.user_temperature                  # \u0423\u0431\u0438\u0440\u0430\u0435\u0442 \\n (\u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u0441\u0442\u0440\u043e\u043a\u0438) \u0438\u0437 key  name (\u043e\u0442\u043a\u0443\u0434\u0430 \u043e\u043d\u0438 \u0442\u0430\u043c \u0431\u0435\u0440\u0443\u0442\u0441\u044f \u043d\u0435 \u0432\u044b\u044f\u0441\u043d\u0438\u043b)         variable_name = variable_name.strip()         specialization_name = specialization_name.strip()          # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u043b\u0438 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u0430\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441 \u043a\u0430\u043a\u0438\u043c-\u043b\u0438\u0431\u043e \u043a\u043b\u044e\u0447\u043e\u043c \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u0435         if self.selected_specialization.get() in self.specialization_data.keys():             del self.specialization_data[self.selected_specialization.get()]  # \u0415\u0441\u043b\u0438 \u0434\u0430, \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u044d\u0442\u043e\u0442 \u043a\u043b\u044e\u0447 \u0438 \u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0441\u043b\u043e\u0432\u0430\u0440\u044f          # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u044c self.specialization_data \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c variable_name \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043a\u043b\u044e\u0447\u0430         self.specialization_data[variable_name] = {             \"name\": specialization_name,             \"description\": system_message,             \"creativity\": self.user_temperature         }          self.save_specialization_data()                    # \u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 \u0444\u0430\u0439\u043b \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c \u0436\u0451\u0441\u0442\u043a\u043e\u043c \u0434\u0438\u0441\u043a\u0435          popup.destroy()                                    # \u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0435 \u043e\u043a\u043d\u043e       # \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438     def delete_selected_specialization(self, popup):         if self.selected_specialization.get() in self.specialization_data.keys():             del self.specialization_data[self.selected_specialization.get()]          else:             print(\"\u0412\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0435\u0442 \u0432 \u0434\u0430\u043d\u043d\u044b\u0445\")                  self.save_specialization_data()          popup.destroy()               # \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u0433\u043e \u043c\u0435\u043d\u044e \u0434\u043b\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430     def show_context_menu(self, event):                  self.context_menu.post(event.x_root, event.y_root)               # \u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430     def copy_text(self):                  selected_text = self.result_label.get(\"sel.first\", \"sel.last\")         self.root.clipboard_clear()         self.root.clipboard_append(selected_text)         self.root.update()               # \u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u0433\u043e \u043c\u0435\u043d\u044e \u0434\u043b\u044f \u0432\u0432\u043e\u0434\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f     def show_entry_context_menu(self, event):                  self.entry_context_menu.post(event.x_root, event.y_root)       # \u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430 \u0432\u0432\u043e\u0434\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f     def copy_entry_text(self):             selected_text = self.entry.get(\"sel.first\", \"sel.last\")         self.root.clipboard_clear()         self.root.clipboard_append(selected_text)         self.root.update()       def paste_entry_text(self):         try:             # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430 \u0432 \u0432\u0438\u0434\u0436\u0435\u0442\u0435             selected_text = self.entry.get(tk.SEL_FIRST, tk.SEL_LAST)             # \u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442, \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0435\u0433\u043e             if selected_text:                 self.entry.delete(tk.SEL_FIRST, tk.SEL_LAST)         except tk.TclError:             # \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043a\u0438, \u0435\u0441\u043b\u0438 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430 \u043d\u0435\u0442             pass             # \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0442\u0435\u043a\u0441\u0442\u0430 \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430 \u043e\u0431\u043c\u0435\u043d\u0430 \u0432 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043a\u0443\u0440\u0441\u043e\u0440\u0430 \u0432 \u0432\u0438\u0434\u0436\u0435\u0442 \u0432\u0432\u043e\u0434\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f         text_to_paste = self.root.clipboard_get()         self.entry.insert(tk.INSERT, text_to_paste)       # \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u0442\u0435\u043a\u0441\u0442\u0430 \u0432 \u043b\u0430\u0442\u0438\u043d\u0438\u0446\u0443     def transliterate_to_latin(self, text):                return translit(text, 'ru', reversed=True)       # \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 \u0432 \u0444\u0430\u0439\u043b JSON \u043d\u0430 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440     def save_specialization_data(self, filename=\"specialization_data.json\"):         try:             with open(filename, \"w\") as file:                 json.dump(self.specialization_data, file)             print(f\"\u0421\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0430 \u0432 \u0444\u0430\u0439\u043b\u0435: {filename}\")         except Exception as e:             print(f\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0438 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438: {e}\")       # \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u0445 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 JSON     def load_specialization_data(self, filename=\"specialization_data.json\"):         try:             with open(filename, \"r\") as file:                 self.specialization_data = json.load(file)             print(f\"\u0421\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u0430 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430: {filename}\")         except FileNotFoundError:             print(\"\u0424\u0430\u0439\u043b specialization_data.json \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d.\")             self.specialization_data = {}         except Exception as e:                 print(f\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430: {e}\")       # \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f JSON \u0444\u0430\u0439\u043b\u0430 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0435     def create_specialization_data(self):         filename = \"specialization_data.json\"         if os.path.exists(filename):                                           # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0444\u0430\u0439\u043b\u0430             print(\"\u0424\u0430\u0439\u043b \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442. \u041f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430.\")             return         # \u0414\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 JSON \u0444\u0430\u0439\u043b \u0421\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438         specialization_data_new = {             \"\u041f\u0435\u0440\u0435\u0432\u043e\u0434\u0447\u0438\u043a \u0441 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u0433\u043e \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a\": {                 \"name\": \"\u041f\u0435\u0440\u0435\u0432\u043e\u0434\u0447\u0438\u043a \u0441 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u0433\u043e \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a\",             \"description\": \"\u041f\u0435\u0440\u0435\u0432\u043e\u0434\u0438 \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\",                 \"creativity\": 0.6             },             \"\u0418\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u0448\u0438\u0431\u043e\u043a\": {                 \"name\": \"\u0418\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u0448\u0438\u0431\u043e\u043a\",                 \"description\": \"\u0418\u0441\u043f\u0440\u0430\u0432\u044c \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435, \u043e\u0440\u0444\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0438 \u043f\u0443\u043d\u043a\u0442\u0443\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 \u0442\u0435\u043a\u0441\u0442\u0435. \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0439 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0441\u043b\u043e\u0432.\",                 \"creativity\": 0.0             },             \"\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0442\u043e\u0432\u0430\u0440\u0430\": {                 \"name\": \"\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0442\u043e\u0432\u0430\u0440\u0430\",                 \"description\": \"\u0422\u044b \u2014 \u043c\u0430\u0440\u043a\u0435\u0442\u043e\u043b\u043e\u0433. \u041d\u0430\u043f\u0438\u0448\u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u043e\u0432\u0430\u0440\u0430 \u0434\u043b\u044f \u043c\u0430\u0440\u043a\u0435\u0442\u043f\u043b\u0435\u0439\u0441\u0430. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0442\u043e\u0432\u0430\u0440\u0430, \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e \u0438 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0441\u043b\u043e\u0432\u0430.\",                 \"creativity\": 0.0             },             \"\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0440\u0435\u043a\u043b\u0430\u043c\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f\": {                 \"name\": \"\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0440\u0435\u043a\u043b\u0430\u043c\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f\",                 \"description\": \"\u0422\u044b \u2014 \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u0430\u0440\u043a\u0435\u0442\u043e\u043b\u043e\u0433 \u0441 \u043e\u043f\u044b\u0442\u043e\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0432\u044b\u0441\u043e\u043a\u043e\u043a\u043e\u043d\u0432\u0435\u0440\u0441\u0438\u043e\u043d\u043d\u043e\u0439 \u0440\u0435\u043a\u043b\u0430\u043c\u044b. \u0414\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0440\u0435\u043a\u043b\u0430\u043c\u043d\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430 \u0442\u044b \u0438\u0437\u0443\u0447\u0430\u0435\u0448\u044c \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0443\u044e \u0446\u0435\u043b\u0435\u0432\u0443\u044e \u0430\u0443\u0434\u0438\u0442\u043e\u0440\u0438\u044e \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u0435\u0448\u044c \u0440\u0435\u043a\u043b\u0430\u043c\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u043e\u0431\u0440\u0430\u0449\u0430\u043b\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u043a \u044d\u0442\u043e\u0439 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0430\u0443\u0434\u0438\u0442\u043e\u0440\u0438\u0438. \u041d\u0430\u043f\u0438\u0448\u0438 \u0440\u0435\u043a\u043b\u0430\u043c\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432\/\u0443\u0441\u043b\u0443\u0433. \u0421\u043e\u0437\u0434\u0430\u0439 \u0442\u0435\u043a\u0441\u0442 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0441 \u043f\u0440\u0438\u0432\u043b\u0435\u043a\u0430\u044e\u0449\u0438\u043c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c \u0438 \u0443\u0431\u0435\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043f\u0440\u0438\u0437\u044b\u0432\u043e\u043c \u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0431\u0443\u0436\u0434\u0430\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043a \u0446\u0435\u043b\u0435\u0432\u043e\u043c\u0443 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044e.\",                 \"creativity\": 0.0             },             \"\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0430 \u043e\u0442\u0437\u044b\u0432 \u043a\u043b\u0438\u0435\u043d\u0442\u0430\": {                 \"name\": \"\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0430 \u043e\u0442\u0437\u044b\u0432 \u043a\u043b\u0438\u0435\u043d\u0442\u0430\",                 \"description\": \"\u0422\u044b \u2014 \u043a\u043e\u043c\u043c\u044c\u044e\u043d\u0438\u0442\u0438-\u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0448\u044c \u0441 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0439 \u0441\u0432\u044f\u0437\u044c\u044e \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u043d\u0430 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u044b \u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438. \u041d\u0430\u043f\u0438\u0448\u0438 \u0432\u0435\u0436\u043b\u0438\u0432\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u043e\u0442\u0437\u044b\u0432 \u043f\u043e\u043a\u0443\u043f\u0430\u0442\u0435\u043b\u044f \u0432 \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435.\",                 \"creativity\": 0.0             },             \"\u041f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u043d\u0438\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u043e\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u0430\": {                 \"name\": \"\u041f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u043d\u0438\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u043e\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u0430\",                 \"description\": \"\u0422\u044b \u2014 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438. \u041f\u0435\u0440\u0435\u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u0443\u0439 \u043e\u0442\u0432\u0435\u0442 \u0442\u0430\u043a, \u0431\u0443\u0434\u0442\u043e \u043e\u043d \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438.\",                 \"creativity\": 0.0             },             \"\u041a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0439\": {                 \"name\": \"\u041a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0439\",                 \"description\": \"\u041a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0439 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0432 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0443\u044e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e. \u041a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438: \u0421\u0442\u0430\u0442\u0443\u0441 \u0437\u0430\u043a\u0430\u0437\u0430, \u0412\u043e\u0437\u0432\u0440\u0430\u0442 \u0438 \u043e\u0431\u043c\u0435\u043d \u0442\u043e\u0432\u0430\u0440\u043e\u0432, \u0425\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0438 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430, \u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u0414\u0440\u0443\u0433\u043e\u0435. \u0412 \u043e\u0442\u0432\u0435\u0442\u0435 \u0443\u043a\u0430\u0436\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e.\",                 \"creativity\": 0.0             },             \"\u0420\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u0435 \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439\": {                 \"name\": \"\u0420\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u0435 \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439\",                 \"description\": \"\u041d\u0430\u0439\u0434\u0438 \u0432\u0441\u0435 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044b\u0435 \u0434\u0430\u0442\u044b \u0438 \u0432\u0440\u0435\u043c\u044f \u0432 \u0442\u0435\u043a\u0441\u0442\u0435. \u0412\u044b\u0432\u0435\u0434\u0438 \u0438\u0445, \u043a\u0430\u0436\u0434\u044b\u0439 \u0441 \u043d\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438. \u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430: 22-01-2019 17:00 \u0417\u0430\u0432\u0442\u0440\u0430 18:15 \u0412\u0447\u0435\u0440\u0430 \u0415\u0441\u043b\u0438 \u0432 \u0442\u0435\u043a\u0441\u0442\u0435 \u043d\u0435\u0442 \u0434\u0430\u0442, \u0432\u0435\u0440\u043d\u0438 0.\",                 \"creativity\": 0.0             },             \"\u041d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0447\u0438\u0441\u0435\u043b \u0438 \u0434\u0430\u0442\": {                 \"name\": \"\u041d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0447\u0438\u0441\u0435\u043b \u0438 \u0434\u0430\u0442\",                 \"description\": \"\u041f\u0435\u0440\u0435\u043f\u0438\u0448\u0438 \u0442\u0435\u043a\u0441\u0442, \u0437\u0430\u043c\u0435\u043d\u044f\u044f \u0432\u0441\u0435 \u0447\u0438\u0441\u043b\u0430 \u0446\u0438\u0444\u0440\u0430\u043c\u0438.\",                 \"creativity\": 0.0             },             \"\u041a\u0440\u0430\u0442\u043a\u0438\u0439 \u043f\u0435\u0440\u0435\u0441\u043a\u0430\u0437 \u0441\u0442\u0430\u0442\u044c\u0438\": {                 \"name\": \"\u041a\u0440\u0430\u0442\u043a\u0438\u0439 \u043f\u0435\u0440\u0435\u0441\u043a\u0430\u0437 \u0441\u0442\u0430\u0442\u044c\u0438\",                 \"description\": \"\u0412\u044b\u0434\u0435\u043b\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043c\u044b\u0441\u043b\u0438 \u0438\u0437 \u0441\u0442\u0430\u0442\u044c\u0438.\",                 \"creativity\": 0.0             },             \"\u0410\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442\": {                 \"name\": \"\u0410\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442\",                 \"description\": \"\u0422\u044b \u0443\u043c\u043d\u044b\u0439 \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442\",                 \"creativity\": 0.6             },             \"\u041c\u0430\u0440\u043a\u0435\u0442\u0438\u043d\u0433\u043e\u0432\u044b\u0439 \u0442\u0435\u043a\u0441\u0442\": {                 \"name\": \"\u041c\u0430\u0440\u043a\u0435\u0442\u0438\u043d\u0433\u043e\u0432\u044b\u0439 \u0442\u0435\u043a\u0441\u0442\",                 \"description\": \"\u0422\u044b \u2014 \u043e\u043f\u044b\u0442\u043d\u044b\u0439 \u043a\u043e\u043f\u0438\u0440\u0430\u0439\u0442\u0435\u0440. \u041d\u0430\u043f\u0438\u0448\u0438 \u043c\u0430\u0440\u043a\u0435\u0442\u0438\u043d\u0433\u043e\u0432\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u0432\u0438\u0434\u0430 \u0442\u0435\u043a\u0441\u0442\u0430 \u0438 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0442\u0435\u043c\u044b.\",                 \"creativity\": 0.0             },             \"\u0428\u0435\u0444-\u043f\u043e\u0432\u0430\u0440\": {                 \"name\": \"\u0428\u0435\u0444-\u043f\u043e\u0432\u0430\u0440\",                 \"description\": \"\u042f \u0445\u043e\u0447\u0443, \u0447\u0442\u043e\u0431\u044b \u0442\u044b \u0431\u044b\u043b \u043c\u043e\u0438\u043c \u043b\u0438\u0447\u043d\u044b\u043c \u0448\u0435\u0444-\u043f\u043e\u0432\u0430\u0440\u043e\u043c. \u042f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0442\u0435\u0431\u0435 \u043e \u0441\u0432\u043e\u0438\u0445 \u0434\u0438\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0435\u043d\u0438\u044f\u0445 \u0438 \u0430\u043b\u043b\u0435\u0440\u0433\u0438\u044f\u0445, \u0430 \u0442\u044b \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u0448\u044c \u043c\u043d\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0446\u0435\u043f\u0442\u044b. \u0412 \u043e\u0442\u0432\u0435\u0442\u0435 \u0442\u044b \u0434\u043e\u043b\u0436\u0435\u043d \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435 \u0440\u0435\u0446\u0435\u043f\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u044b \u043f\u043e\u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0448\u044c, \u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435. \u041d\u0435 \u043f\u0438\u0448\u0438 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0439.\",                 \"creativity\": 0.5             },             \"\u0422\u043e\u043b\u043a\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0441\u043d\u043e\u0432\": {                 \"name\": \"\u0422\u043e\u043b\u043a\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0441\u043d\u043e\u0432\",                 \"description\": \"\u042f \u0445\u043e\u0447\u0443, \u0447\u0442\u043e\u0431\u044b \u0442\u044b \u0432\u044b\u0441\u0442\u0443\u043f\u0438\u043b \u0432 \u0440\u043e\u043b\u0438 \u0442\u043e\u043b\u043a\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441\u043d\u043e\u0432. \u042f \u0434\u0430\u043c \u0442\u0435\u0431\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043c\u043e\u0438\u0445 \u0441\u043d\u043e\u0432, \u0430 \u0442\u044b \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0448\u044c \u0442\u043e\u043b\u043a\u043e\u0432\u0430\u043d\u0438\u044f, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u0445 \u0438 \u0442\u0435\u043c\u0430\u0445, \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0432\u043e \u0441\u043d\u0435. \u041d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u043b\u0438\u0447\u043d\u044b\u0445 \u043c\u043d\u0435\u043d\u0438\u0439 \u0438\u043b\u0438 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043e \u0441\u043d\u043e\u0432\u0438\u0434\u0446\u0435. \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u0438, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438.\",                 \"creativity\": 0.8             },             \"\u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0438\u0434\u0435\u0439 \u0434\u043b\u044f \u0441\u0442\u0430\u0440\u0442\u0430\u043f\u0430\": {                 \"name\": \"\u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0438\u0434\u0435\u0439 \u0434\u043b\u044f \u0441\u0442\u0430\u0440\u0442\u0430\u043f\u0430\",                 \"description\": \"\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0439\u0442\u0435 \u0438\u0434\u0435\u0438 \u0434\u043b\u044f \u0441\u0442\u0430\u0440\u0442\u0430\u043f\u043e\u0432, \u043e\u0441\u043d\u043e\u0432\u044b\u0432\u0430\u044f\u0441\u044c \u043d\u0430 \u043f\u043e\u0436\u0435\u043b\u0430\u043d\u0438\u044f\u0445 \u043b\u044e\u0434\u0435\u0439. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043e\u0433\u0434\u0430 \u044f \u0433\u043e\u0432\u043e\u0440\u044e: \\\"\u042f \u0431\u044b \u0445\u043e\u0442\u0435\u043b, \u0447\u0442\u043e\u0431\u044b \u0432 \u043c\u043e\u0451\u043c \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u043c \u0433\u043e\u0440\u043e\u0434\u043a\u0435 \u0431\u044b\u043b \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0439 \u0446\u0435\u043d\u0442\u0440\\\", \u0432\u044b \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0435 \u0431\u0438\u0437\u043d\u0435\u0441-\u043f\u043b\u0430\u043d \u0434\u043b\u044f \u0441\u0442\u0430\u0440\u0442\u0430\u043f\u0430, \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0438\u0439 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0438\u0434\u0435\u0438, \u043a\u0440\u0430\u0442\u043a\u0443\u044e \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0443 \u0446\u0435\u043b\u0435\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0446\u0435\u043d\u043d\u043e\u0441\u0442\u043d\u044b\u0435 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043a\u0430\u043d\u0430\u043b\u044b \u043f\u0440\u043e\u0434\u0430\u0436 \u0438 \u043c\u0430\u0440\u043a\u0435\u0442\u0438\u043d\u0433\u0430, \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0438 \u0434\u043e\u0445\u043e\u0434\u043e\u0432, \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0437\u0430\u0442\u0440\u0430\u0442, \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u043f\u0430\u0440\u0442\u043d\u0451\u0440\u043e\u0432, \u044d\u0442\u0430\u043f\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0438\u0434\u0435\u0438, \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 1 \u0433\u043e\u0434\u0430 \u0438 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0431\u0438\u0437\u043d\u0435\u0441-\u0437\u0430\u0434\u0430\u0447\u0438, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435.\",                 \"creativity\": 0.9             }         }          with open(filename, \"w\", encoding=\"utf-8\") as file:                         # \u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 JSON \u0444\u0430\u0439\u043b             json.dump(specialization_data_new, file, ensure_ascii=False, indent=4)  # ensure_ascii=False \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u043d\u0435-ASCII, indent=4 \u0437\u0430\u0434\u0430\u0435\u0442 \u043e\u0442\u0441\u0442\u0443\u043f \u0432 4 \u043f\u0440\u043e\u0431\u0435\u043b\u0430 \u0434\u043b\u044f \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u043b\u0443\u0447\u0448\u0435\u0439 \u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0441\u0442\u0438         print(f\"JSON \u0444\u0430\u0439\u043b '{filename}' \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d.\")                 def show_guide(self):         guide_window = tk.Toplevel(self.root)         guide_window.title(\"\u0420\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e\")          # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0432\u0438\u0434\u0436\u0435\u0442 tk.Text         self.guide_text = tk.Text(guide_window, wrap=\"word\", padx=7)         self.guide_text.insert(\"1.0\", \"\"\"  SmartiksGPT \u044d\u0442\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043c\u043e\u0434\u0435\u043b\u0438 \u0418\u0418  YandexGPT \u0438 OpenAI gpt-4o  \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 (system massage, \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u00ab\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438\u00bb) \u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f temperature (\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u00ab\u041a\u0440\u0435\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c\u00bb). \u0418\u0437\u043c\u0435\u043d\u044f\u044f \u00ab\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438\u00bb \u0438 \u00ab\u041a\u0440\u0435\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c\u00bb, \u0432\u044b \u0432 \u0448\u0438\u0440\u043e\u043a\u0438\u0445 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0438 \u0440\u0435\u0433\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 YandexGPT.   SmartiksGPT \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0430 \u0434\u043b\u044f \u0442\u0432\u043e\u0440\u0447\u0435\u0441\u0442\u0432\u0430 \u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u043d\u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0442\u0432\u0435\u0442\u044b \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u044b, \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0432\u043e\u0440\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435, \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0442\u0438\u0445, \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0443\u0442\u0438\u043d\u043d\u044b\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u0438 \u043c\u043d\u043e\u0433\u043e\u0435 \u0434\u0440\u0443\u0433\u043e\u0435 \u0447\u0442\u043e \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0442\u044c \u0438\u043b\u0438 \u0443\u0436\u0435 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b\u0438 \u0434\u0440\u0443\u0433\u0438\u0435. \u041f\u0440\u043e\u0431\u0443\u0439\u0442\u0435, \u043f\u043e\u043b\u0443\u0447\u0430\u0439\u0442\u0435 \u043e\u043f\u044b\u0442 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043d\u043e\u0432\u0435\u0439\u0448\u0435\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 \u0418\u0418 YandexGPT.   \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043a \u043c\u043e\u0434\u0435\u043b\u0438 (YandexGPT) \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 system massage (\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u044d\u0442\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438) + \u0442\u0435\u043a\u0441\u0442 \u0432\u0430\u0448\u0435\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u044b \u0432\u0432\u043e\u0434\u0438\u0442\u0435 \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u043e\u043a\u043d\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0438 temperature (\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u044d\u0442\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0440\u0435\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c). \u0412 system massage (\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438) \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c: \u2022\u041a\u0440\u0430\u0442\u043a\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: \u0442\u044b \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u043f\u043e \u043f\u0440\u043e\u0434\u0430\u0436\u0430\u043c, \u0442\u044b \u0431\u044b\u0432\u0430\u043b\u044b\u0439 \u043c\u043e\u0440\u044f\u043a, \u0442\u044b \u0434\u0435\u0442\u0441\u043a\u0438\u0439 \u0441\u043a\u0430\u0437\u043e\u0447\u043d\u0438\u043a \u0438 \u0442. \u0434. \u0438 \u0442.\u043f.) \u2022\u041b\u0438\u0447\u043d\u044b\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u043c\u043e\u0434\u0435\u043b\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: \u0442\u044b \u0443\u043c\u043d\u044b\u0439, \u0442\u044b \u0433\u0435\u043d\u0438\u0439, \u0442\u044b \u0441\u043c\u0435\u043b\u044b\u0439 \u0442\u044b \u0433\u043e\u0440\u0434\u044b\u0439 \u0438 \u0442. \u0434.) \u2022\u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0438\u043b\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0432\u044b \u0445\u043e\u0442\u0435\u043b\u0438 \u0431\u044b, \u0447\u0442\u043e\u0431\u044b \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043b\u0430 \u043c\u043e\u0434\u0435\u043b\u044c (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043e\u0442\u0432\u0435\u0447\u0430\u0439 \u043a\u0440\u0430\u0442\u043a\u043e, \u043e\u0442\u0432\u0435\u0447\u0430\u0439 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e, \u043d\u0435 \u0443\u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0439 \u0441\u043b\u043e\u0432\u0430 \u0432 \u043f\u0440\u0435\u0432\u043e\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0435\u043f\u0435\u043d\u0438 \u0438 \u0442. \u0434.) \u2022\u0414\u0430\u043d\u043d\u044b\u0435 \u0438\u043b\u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u043b\u044f \u043c\u043e\u0434\u0435\u043b\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u0430\u043a\u0438\u0435 \u043b\u0438\u0431\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u044b (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: \u0412\u0441\u0435 \u0434\u0430\u0442\u044b \u0438 \u0444\u0430\u043c\u0438\u043b\u0438\u0438 \u0438\u0437 \u0441\u0442\u0430\u0442\u044c\u0438 \u0441\u043e\u0431\u0435\u0440\u0438 \u0432 \u043e\u0434\u043d\u043e \u043c\u0435\u0441\u0442\u043e \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: \u0414\u0430\u0442\u044b:  \u0424\u0430\u043c\u0438\u043b\u0438\u0438:       \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043e \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0442\u043e \u0435\u0441\u0442\u044c \u0435\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0447\u0442\u043e \u0431\u044b \u043c\u043e\u0434\u0435\u043b\u044c \u043e\u0442\u0432\u0435\u0447\u0430\u043b\u0430 \u0432\u0430\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043d\u0435 \u0432\u0432\u043e\u0434\u0438\u0442\u044c \u0441\u0432\u043e\u0438 \u043f\u043e\u0436\u0435\u043b\u0430\u043d\u0438\u044f \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0432\u044b \u0438\u0445 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442\u0435 \u0432 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438 \u043e\u043d\u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043f\u0440\u0438 \u0432\u0430\u0448\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0434 \u0432\u0430\u0448\u0438\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438: \u00ab\u041f\u0435\u0440\u0435\u0432\u043e\u0434\u0438 \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u00bb,  \u0432\u0430\u0448 \u0442\u0435\u043a\u0441\u0442 : I'm sitting at my computer \u0434\u043b\u044f \u043c\u043e\u0434\u0435\u043b\u0438 \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442\u044c \u0442\u0430\u043a : \u00ab\u041f\u0435\u0440\u0435\u0432\u043e\u0434\u0438 \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f I'm sitting at my computer\u00bb \u0438 \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 : \u00ab\u042f \u0441\u0438\u0436\u0443 \u0437\u0430 \u0441\u0432\u043e\u0438\u043c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043e\u043c\u00bb. \u041f\u043e \u0441\u0443\u0442\u0438 \"\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438\" (system massage) \u044d\u0442\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0434\u043b\u044f GPT \u043c\u043e\u0434\u0435\u043b\u0438 \u0442.\u0435. \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c.    \u0414\u043b\u044f \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u043e\u0434\u0431\u043e\u0440\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u00ab\u0410\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u00bb \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0442\u0430\u043c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 system massage \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u00ab\u0422\u044b \u0443\u043c\u043d\u044b\u0439 \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u00bb, \u0442\u0430\u043a \u0436\u0435 \u00ab\u0410\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u00bb \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043b\u044f \u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441 YandexGPT.   \u0412 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u0435\u0441\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043d\u0430\u0436\u0430\u0432 \u043a\u043d\u043e\u043f\u043a\u0443 \u00ab\u0421\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u00bb \u0438 \u0432\u044b\u0431\u0440\u0430\u0432 \u0432 \u0432\u0438\u0434\u0436\u0435\u0442\u0435 \u0441 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u00ab\u0421\u043f\u0438\u0441\u043e\u043a \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439\u00bb. \u0422\u0430\u043a \u0436\u0435 \u0432 \u044d\u0442\u043e\u043c \u043e\u043a\u043d\u0435 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0432\u043d\u0435\u0441\u044f \u0441\u0432\u043e\u0451 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0432 \u043d\u0443\u0436\u043d\u044b\u0435 \u043f\u043e\u043b\u044f \u0442\u0430\u043a \u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043a\u0440\u0435\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 0.0) \u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043a\u043d\u043e\u043f\u043a\u0438 \u00ab\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c\u00bb \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0435\u0451 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u043e\u0431\u0449\u0435\u043d\u0438\u0438 \u0441 \u043c\u043e\u0434\u0435\u043b\u044c\u044e \u0438 \u044d\u0442\u0430 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u0444\u0430\u0439\u043b\u0435. \u0422\u0430\u043a \u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0435 \u0421\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.   \u0415\u0441\u043b\u0438 \u0432\u044b \u0437\u0430\u0434\u0430\u0451\u0442\u0435 \u0432\u043e\u043f\u0440\u043e\u0441 \u043c\u043e\u0434\u0435\u043b\u0438 (YandexGPT)  \u0438  \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0435 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u043d\u0435\u0433\u043e \u0442\u043e \u044d\u0442\u043e \u043d\u0435 \u0437\u043d\u0430\u0447\u0438\u0442 \u0447\u0442\u043e \u043e\u043d\u0430 \u0434\u0430\u0451\u0442 \u0432\u0430\u043c \u043e\u0442\u0432\u0435\u0442,  \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0443\u044e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0441\u043b\u043e\u0432 (\u0442\u043e\u043a\u0435\u043d\u043e\u0432) \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u043b\u043e\u0436\u0435\u043d\u044b \u0432 \u0435\u0451 \u043c\u043e\u0434\u0435\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0442\u0435\u043a\u0441\u0442  \u0434\u043b\u044f \u0441\u0442\u0430\u0440\u0442\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b \u0435\u0439 \u043f\u0440\u0438\u0441\u043b\u0430\u043b\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 system massage (\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438) \u0438 \u0432\u0430\u0448\u0435\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430 \u0432\u0432\u0435\u0434\u0451\u043d\u043d\u043e\u0433\u043e  \u0432 \u043e\u043a\u043d\u043e \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u043c\u043e\u0434\u0435\u043b\u044c \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443 \u0432\u043e\u043f\u0440\u043e\u0441-\u043e\u0442\u0432\u0435\u0442 \u043e\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0442\u0435\u043a\u0441\u0442\u0430 \u043f\u043e\u0441\u043b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u0442 \u0432\u0430\u0441, \u043d\u043e \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u043e\u0441\u043b\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432  \u0447\u0430\u0441\u0442\u043e \u0438\u0434\u0443\u0442 \u043e\u0442\u0432\u0435\u0442\u044b (\u0432 \u0442\u0435\u043a\u0441\u0442\u0430\u0445 \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u043d\u0430 \u0443\u0447\u0438\u043b\u0430\u0441\u044c) \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0435 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0432\u0430\u0448 \u0432\u043e\u043f\u0440\u043e\u0441, \u044d\u0442\u0443 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u0443\u044e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 GPT \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u0447\u0442\u043e \u0431\u044b \u0432 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0435 \u0434\u043b\u044f \u0432\u0430\u0441 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438.     \u0412\u0430\u0440\u0438\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c (\u0438\u0437\u043c\u0435\u043d\u0447\u0438\u0432\u043e\u0441\u0442\u044c) \u043e\u0442\u0432\u0435\u0442\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u043a\u0440\u0435\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 (\u043e\u0442 0 \u0434\u043e 1.0) \u0442.\u0435. \u043f\u0440\u0438 \u043a\u0440\u0435\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 = 0 \u043d\u0430 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e \u0436\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439 \u043e\u0442\u0432\u0435\u0442, \u0430 \u043f\u0440\u0438 \u043a\u0440\u0435\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 1.0 \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0440\u0430\u0437\u043d\u044b\u0435 \u043e\u0442\u0432\u0435\u0442\u044b \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u043f\u043e \u0441\u043c\u044b\u0441\u043b\u0443 \u043d\u043e \u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u043e \u0441\u043b\u043e\u0432\u0435\u0441\u043d\u043e\u043c\u0443 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044e. \u0422\u0430\u043a \u0436\u0435 \u0447\u0435\u043c \u0432\u044b\u0448\u0435 \u043a\u0440\u0435\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0442\u0435\u043c \u0432\u044b\u0448\u0435 \u0440\u0438\u0441\u043a \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0442\u0432\u0435\u0442\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0433\u0430\u043b\u043b\u044e\u0446\u0438\u043d\u0430\u0446\u0438\u044e \u044d\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u0442\u0435\u043a\u0441\u0442 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b\u0430 \u0438\u043b\u0438 \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442  \u0444\u0430\u043a\u0442\u0430\u043c.  \u0412\u0430\u0440\u0438\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043e\u043f\u044b\u0442\u043d\u044b\u043c \u043f\u0443\u0442\u0451\u043c \u0438 \u0438\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u0436\u0435\u043b\u0430\u0435\u043c\u043e\u0433\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u043b\u044f \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u043f\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u043c \u043e \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0435 \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c 0, \u0430 \u043f\u0440\u0438 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438  \u0442\u0435\u043a\u0441\u0442\u0430 \u043d\u0430 \u0442\u0432\u043e\u0440\u0447\u0435\u0441\u043a\u0443\u044e \u0442\u0435\u043c\u0443 0.8 \u2013 1.0, \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 0,6 \u0434\u0430\u043b\u044c\u0448\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0439\u0442\u0435.      \u041f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u043a\u0440\u0435\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u043e\u043a\u043d\u0435 \u043d\u043e \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u044d\u0442\u0430 \u043a\u0440\u0435\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0432 \u0444\u0430\u0439\u043b\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f, \u0447\u0442\u043e \u0431\u044b \u0435\u0451 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u044b\u0437\u043e\u0432\u0438\u0442\u0435 \u043e\u043a\u043d\u043e \u00ab\u0421\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u00bb - \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043d\u0443\u0436\u043d\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 \u043d\u0443\u0436\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u0442\u043e\u043c  \u043d\u0430\u0436\u043c\u0438\u0442\u0435 \u043a\u043d\u043e\u043f\u043a\u0443 \u00ab\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c\u00bb \u0442\u0430\u043a \u0436\u0435 \u0442\u0430\u043c \u043c\u043e\u0436\u0435\u0442\u0435 \u043c\u0435\u043d\u044f\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 (system massage) \u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0438 \u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043a\u043d\u043e\u043f\u043a\u0438 \u00ab\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c\u00bb \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0438 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u0435, \u0438 \u043e\u043d\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u0444\u0430\u0439\u043b\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439, \u0442.\u0435. \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e \u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043c\u043e\u0434\u0435\u043b\u044c\u044e \u0438 \u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043a\u043d\u043e\u043f\u043a\u0438 \u00ab\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c\u00bb \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u0444\u0430\u0439\u043b \u0438 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0443\u0436\u0435 \u0438\u0434\u0451\u0442 \u0441 \u043e\u0431\u043d\u043e\u0432\u043b\u0451\u043d\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.     \u041d\u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u044c YandexGPT \u043d\u0435 \u043f\u043e\u043c\u043d\u0438\u0442 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440\u0430, \u0442\u043e \u0435\u0441\u0442\u044c \u043e \u0447\u0451\u043c \u0432\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0438 \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u0445,  \u044d\u0442\u043e \u043d\u0430\u0434\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0432\u0430\u0448\u0438\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 (system massage) \u0438 \u044d\u0442\u043e \u043d\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0438\u043b\u0438 \u0441\u043b\u0430\u0431\u043e\u0441\u0442\u044c YandexGPT \u044d\u0442\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u043b\u044e\u0431\u043e\u0439 GPT \u043c\u043e\u0434\u0435\u043b\u0438, \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e \u0431\u044b \u043c\u043e\u0434\u0435\u043b\u044c \u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u043c\u043d\u0438\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440\u0430 \u0435\u0439 \u043d\u0430\u0434\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u043c\u0438 \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043f\u0440\u0438 \u043d\u043e\u0432\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u0443\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u043d\u043e\u0432\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435, \u043d\u043e \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0439 \u043e\u0431\u0432\u044f\u0437\u043a\u0438 \u043c\u043e\u0434\u0435\u043b\u0438 \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0445 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430\u0445 \u0434\u043b\u044f \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.  \u0412\u043d\u0438\u0437\u0443 \u043e\u043a\u043d\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0438\u0441\u043f\u043b\u044c\u0437\u0443\u0435\u043c\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c YandexGPT \u0438\u043b\u0438 YandexGPT-lite. YandexGPT \u0431\u043e\u043b\u0435\u0435 \u043c\u043e\u0449\u043d\u0430\u044f, \u043d\u043e \u043e\u043d\u0430 \u0442\u0430\u0440\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u0447\u0435\u0442\u044b\u0440\u0435 \u0440\u0430\u0437\u0430 \u0434\u043e\u0440\u043e\u0436\u0435.                                   \u041f\u0440\u0438 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0439 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 (system massage) \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0439\u0442\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0438: \u2022\u041e\u0442\u0434\u0435\u043b\u044f\u0439\u0442\u0435 \u0442\u0435\u043a\u0441\u0442 \u043e\u0442 \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:  \u0425\u0443\u0436\u0435 - \u0420\u0435\u0437\u044e\u043c\u0438\u0440\u0443\u0439\u0442\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u043d\u0438\u0436\u0435 \u0442\u0435\u043a\u0441\u0442 \u0432 \u0432\u0438\u0434\u0435 \u0441\u0432\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0432\u0430\u0436\u043d\u044b\u0445 \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432 (\u0434\u0430\u043b\u0435\u0435 \u0432\u0430\u0448 \u0442\u0435\u043a\u0441\u0442).  \u041b\u0443\u0447\u0448\u0435 - \u0420\u0435\u0437\u044e\u043c\u0438\u0440\u0443\u0439\u0442\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u043d\u0438\u0436\u0435 \u0442\u0435\u043a\u0441\u0442 \u0432 \u0432\u0438\u0434\u0435 \u0441\u0432\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0432\u0430\u0436\u043d\u044b\u0445 \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432.  \u0422\u0435\u043a\u0441\u0442:  (\u0437\u0434\u0435\u0441\u044c \u0432\u0430\u0448 \u0442\u0435\u043a\u0441\u0442)  \u2022\u0411\u0443\u0434\u044c\u0442\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b, \u043e\u043f\u0438\u0441\u0430\u0442\u0435\u043b\u044c\u043d\u044b \u0438 \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b \u0432 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0438 \u0436\u0435\u043b\u0430\u0435\u043c\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430, \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u0444\u043e\u0440\u043c\u0430\u0442\u0430, \u0441\u0442\u0438\u043b\u044f \u0438 \u0442. \u0414 \u0425\u0443\u0436\u0435 - \u041d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u0441\u0442\u0438\u0445\u043e\u0442\u0432\u043e\u0440\u0435\u043d\u0438\u0435 \u043e \u043f\u0440\u0438\u0440\u043e\u0434\u0435. \u041b\u0443\u0447\u0448\u0435 - \u041d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0435 \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u043b\u044f\u044e\u0449\u0435\u0435 \u0441\u0442\u0438\u0445\u043e\u0442\u0432\u043e\u0440\u0435\u043d\u0438\u0435 \u043e \u043f\u0440\u0438\u0440\u043e\u0434\u0435, \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u043d\u043e\u0435 \u0442\u0430\u0439\u0433\u0435 \u0438 \u0432\u0435\u043b\u0438\u043a\u0438\u043c \u0440\u0435\u043a\u0430\u043c \u0420\u043e\u0441\u0441\u0438\u0438 \u0432 \u0441\u0442\u0438\u043b\u0435 \u0410. \u0421. \u041f\u0443\u0448\u043a\u0438\u043d\u0430 \u2022\u0421\u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u0443\u0439\u0442\u0435 \u0436\u0435\u043b\u0430\u0435\u043c\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0432\u044b\u0432\u043e\u0434\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0425\u0443\u0436\u0435 - \u0418\u0437\u0432\u043b\u0435\u043a\u0438\u0442\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438, \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044b\u0435 \u0432 \u0442\u0435\u043a\u0441\u0442\u0435 \u043d\u0438\u0436\u0435. \u0418\u0437\u0432\u043b\u0435\u043a\u0438\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 4 \u0442\u0438\u043f\u0430 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439: \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0439, \u0438\u043c\u0435\u043d\u0430 \u043b\u044e\u0434\u0435\u0439, \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u044b \u0438 \u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0438.\u0422\u0435\u043a\u0441\u0442: { \u0432\u0430\u0448 \u0442\u0435\u043a\u0441\u0442} \u041b\u0443\u0447\u0448\u0435 - \u0418\u0437\u0432\u043b\u0435\u043a\u0438\u0442\u0435 \u0432\u0430\u0436\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044b\u0435 \u0432 \u0442\u0435\u043a\u0441\u0442\u0435 \u043d\u0438\u0436\u0435. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u0437\u0432\u043b\u0435\u043a\u0438\u0442\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0439, \u0437\u0430\u0442\u0435\u043c \u0438\u0437\u0432\u043b\u0435\u043a\u0438\u0442\u0435 \u0438\u043c\u0435\u043d\u0430 \u0432\u0441\u0435\u0445 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432, \u0437\u0430\u0442\u0435\u043c \u0438\u0437\u0432\u043b\u0435\u043a\u0438\u0442\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0442\u0435\u043c\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044e, \u0438, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u0438\u0437\u0432\u043b\u0435\u043a\u0438\u0442\u0435 \u043e\u0431\u0449\u0438\u0435, \u0432\u0441\u0435\u043e\u0431\u044a\u0435\u043c\u043b\u044e\u0449\u0438\u0435 \u0442\u0435\u043c\u044b  \u0416\u0435\u043b\u0430\u0435\u043c\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0439: -||- \u0418\u043c\u0435\u043d\u0430 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432: -||- \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0442\u0435\u043c\u044b: -||- \u041e\u0431\u0449\u0438\u0435 \u0442\u0435\u043c\u044b: -||-  \u0422\u0435\u043a\u0441\u0442: {\u0432\u0430\u0448 \u0442\u0435\u043a\u0441\u0442}  \u2022\u0421\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437\u043c\u044b\u0442\u044b\u0445 \u0438 \u043d\u0435\u0442\u043e\u0447\u043d\u044b\u0445 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0439. \u0425\u0443\u0436\u0435 - \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u043c, \u0432\u0441\u0435\u0433\u043e \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445, \u0438 \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e. \u041b\u0443\u0447\u0448\u0435 - \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430 \u0434\u043e\u043b\u0436\u043d\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u0442\u044c \u0438\u0437 3-5 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0439.      \u0421\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 (\u043f\u0440\u043e\u043c\u043f\u0442\u043e\u0432) \u044d\u0442\u043e \u0442\u043e\u043d\u043a\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0438 \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0437\u0432\u0430\u0442\u044c \u0442\u0432\u043e\u0440\u0447\u0435\u0441\u0442\u0432\u043e\u043c, \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u043a\u0440\u0435\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u043c\u043e\u0436\u0435\u0442 \u0441\u0438\u043b\u044c\u043d\u043e \u043f\u043e\u0432\u043b\u0438\u044f\u0442\u044c \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.                                                         \u0421\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f:    \u0414\u043b\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u043d\u0430 \u043d\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 \u043e\u043a\u043e\u0448\u043a\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043d\u0430\u0436\u043c\u0438\u0442\u0435 \u00abShift\u00bb \u0438 \u043d\u0435 \u043e\u0442\u043f\u0443\u0441\u043a\u0430\u044f \u0435\u0451 \u043a\u043b\u0430\u0432\u0438\u0448\u0443 \u00ab\u0412\u0432\u043e\u0434\u00bb (\u00abEnter\u00bb).   \u0414\u043b\u044f \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0442\u0435\u043a\u0441\u0442\u0430 \u0432 \u043e\u043a\u043d\u0435 \u043d\u0430\u0432\u0435\u0434\u0438\u0442\u0435 \u043c\u044b\u0448\u043a\u0443 \u043d\u0430 \u043e\u043a\u043e\u0448\u043a\u043e \u0438 \u043a\u043e\u043b\u0451\u0441\u0438\u043a\u043e\u043c \u043f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0439\u0442\u0435 \u0442\u0435\u043a\u0441\u0442.      specialization_data.json  -  \u042d\u0442\u043e \u0444\u0430\u0439\u043b \u0433\u0434\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b.   Login_SmartiksGPT.json - \u044d\u0442\u043e \u0444\u0430\u0439\u043b \u0433\u0434\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 default folder \u0438 API \u043a\u043b\u044e\u0447                                     \u0418\u043d\u0441\u0442\u0443\u043a\u0446\u0438\u044f \u043f\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 default folder \u0438 \u043a\u043b\u044e\u0447\u0430 API \u0417\u0430\u0440\u0435\u0433\u0435\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u042f\u043d\u0434\u0435\u043a\u0441\u0435 \u2192 \u0437\u0430\u0439\u0442\u0438 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 https:\/\/cloud.yandex.ru\/ru\/services\/yandexgpt \u2192  \u041d\u0430\u0436\u0430\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0443 \"\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441\" (\u043e\u0442\u043a\u0440\u043e\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 https:\/\/console.cloud.yandex.ru\/folders\/) \u2192  \u0432\u0432\u0435\u0440\u0445\u0443 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u043f\u043a\u0438 (\u043f\u0440\u0438\u043c\u0435\u0440 - b1gzvco24o5932ufhx5o) \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 default folder \u2192  \u0432\u0432\u0435\u0440\u0445\u0443 \u0441\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u0436\u0430\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0443 \"\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441\u043d\u044b\u0439 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\" \u2192 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441\u043d\u044b\u0439 \u0430\u043a\u043a\u0430\u0443\u043d\u0442 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043b\u044e\u0447 API (\u043f\u0440\u0438\u043c\u0435\u0440 - AQCN9cmr7nfdO6RqB4jv1u43lR1q2av4pyQCwZrL).  \u0412\u0435\u0440\u0441\u0438\u044f 1.1 - \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a gpt4o \u0438 gpt4o-mini          \u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043f\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044e \u043a\u043b\u044e\u0447\u0430 \u043f\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0443 \u043a gpt4o \u0438 gpt4o-mini \u0447\u0435\u0440\u0435\u0437 proxyapi.ru \u0417\u0430\u0445\u043e\u0434\u0438\u043c \u043d\u0430 \u0441\u0430\u0439\u0442 proxyapi.ru \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c\u0441\u044f, \u043e\u043f\u043b\u0430\u0447\u0438\u0432\u0430\u0435\u043c, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043a\u043b\u044e\u0447 API \u0438 \u0432\u0432\u043e\u0434\u0438\u043c \u0435\u0433\u043e \u0432 \u043e\u043a\u043d\u043e \"\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0432 ProxyAPI\"                          \u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438 \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e YandexGPT API - https:\/\/cloud.yandex.ru\/ru\/docs\/yandexgpt\/ \u0421\u0442\u0430\u0442\u044c\u044f \u043f\u0440\u043e Yandex Cloud - https:\/\/habr.com\/ru\/companies\/yandex_cloud_and_infra\/articles\/760252\/        \"\"\")         # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u0433\u043e \u043c\u0435\u043d\u044e \"\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c\" \u0434\u043b\u044f \u0420\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u0430          self.context_menu_guide = Menu(self.guide_text, tearoff=0)         self.context_menu_guide.add_command(label=\"\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c\", command=self.copy_text_show_guide)         self.guide_text.bind(\"&lt;Button-3&gt;\", self.context_menu_guide_vizov)   # \u041f\u0440\u0438\u0432\u044f\u0437\u043a\u0430 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u0433\u043e \u043c\u0435\u043d\u044e \u043a \u0432\u0438\u0434\u0436\u0435\u0442\u0443 Text          self.guide_text.pack(expand=True, fill=\"both\", padx=0, pady=0)      # \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0448\u0438\u0440\u0438\u043d\u044b \u043e\u043a\u0430\u043d\u0442\u043e\u0432\u043a\u0438 \u043e\u043a\u043d\u0430         self.guide_text.config(state=\"disabled\")                            # \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u043f\u0440\u0435\u0442\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0430                  # \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u043e\u043a\u043d\u0430         popup_width = 600         popup_height = 600         guide_window.resizable(False, False)  # \u0417\u0430\u043f\u0440\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u043e\u043a\u043d\u0430         screen_width = self.root.winfo_screenwidth()         screen_height = self.root.winfo_screenheight()         x = (screen_width - popup_width) \/\/ 2         y = (screen_height - popup_height) \/\/ 2         guide_window.geometry(f\"{popup_width}x{popup_height}+{x}+{y}\")          # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u043e\u043a\u043d\u0430 \u043a\u0430\u043a transient \u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u0435\u0433\u043e \u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435         guide_window.transient(self.root)         guide_window.wait_visibility()  # \u0416\u0434\u0435\u043c, \u043f\u043e\u043a\u0430 \u043e\u043a\u043d\u043e \u0441\u0442\u0430\u043d\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u044b\u043c         guide_window.grab_set_global()  # \u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0444\u043e\u043a\u0443\u0441          # \u0417\u0430\u0445\u0432\u0430\u0442 \u0444\u043e\u043a\u0443\u0441\u0430 \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u043e\u043a\u043d\u0430         guide_window.grab_set()         guide_window.focus_force()         self.root.wait_window(guide_window.winfo_toplevel())           # \u0424\u0443\u043d\u043a\u0446\u0438\u044f messagebox \"\u041e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435\"     def show_about(self):         winsound.Beep(37, 1)  # \u041e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0437\u0432\u0443\u043a \u0432 messagebox  \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u044f \u0437\u0432\u0443\u043a \u0441 \u0447\u0430\u0441\u0442\u043e\u0442\u043e\u0439 2 \u0413\u0446 \u0438 1 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u0443         messagebox.showinfo(\"\u041e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435\", \"    SmartiksGPT v. 1.1  2024 \u0433\u043e\u0434    \\n \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a YandexGPT \u0438 GPT-4o  \\n \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a smartiksgpt@mail.ru\")        # \u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u0433\u043e \u043c\u0435\u043d\u044e \"\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c\" \u0432 \u0420\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u0435 def context_menu_guide_vizov \u0438 def copy_text_show_guide     def context_menu_guide_vizov(self, event):                  self.context_menu_guide.post(event.x_root, event.y_root)          def copy_text_show_guide(self):                  selected_text = self.guide_text.get(\"sel.first\", \"sel.last\")         self.root.clipboard_clear()         self.root.clipboard_append(selected_text)         self.root.update()      # \u0417\u0430\u043f\u0440\u043e\u0441 \u043a ChatGPT \u0447\u0435\u0440\u0435\u0437 ProxiAPI     def answer_from_proxiapi(self, user_input, system_message, user_temperature, model):          # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043a\u043b\u044e\u0447\u0430 ProxiAPI         if not self.reg_proxi_apy or not self.reg_proxi_apy.strip():             messagebox.showwarning(\"\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435\", \"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043a\u043b\u044e\u0447 \u043a ProxiAPI\")             return          prompt = {             \"model\": model,             \"messages\": [                 {\"role\": \"system\", \"content\": system_message},                 {\"role\": \"user\", \"content\": user_input}             ],             \"temperature\": user_temperature,             \"max_tokens\": 2000         }          url = \"https:\/\/api.proxyapi.ru\/openai\/v1\/chat\/completions\"         headers = {             \"Content-Type\": \"application\/json\",             \"Authorization\": f\"Bearer {self.reg_proxi_apy}\"         }          try:             response = requests.post(url, headers=headers, json=prompt)             response.raise_for_status()  # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u0442\u0430\u0442\u0443\u0441\u0430 HTTP-\u0437\u0430\u043f\u0440\u043e\u0441\u0430             result = response.json()              assistant_text = result.get(\"choices\", [{}])[0].get(\"message\", {}).get(\"content\", \"\u041e\u0448\u0438\u0431\u043a\u0430: \u041e\u0442\u0432\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\")             self.insert_to_result_label(f\" GPT: \\n{assistant_text}\\n\\n\")         except requests.exceptions.RequestException as e:             messagebox.showerror(\"\u041e\u0448\u0438\u0431\u043a\u0430\", f\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430: {e}\")  # \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0431\u043b\u043e\u043a, \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0438 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 DraggableWindow if __name__ == \"__main__\":     root = tk.Tk()                 # C\u043e\u0437\u0434\u0430\u0435\u0442 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 Tk \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043e\u043a\u043d\u043e     app = DraggableWindow(root)    # C\u043e\u0437\u0434\u0430\u0435\u0442 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 DraggableWindow \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u0435\u043c\u0443 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043e\u043a\u043d\u043e root     root.mainloop()                # \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 Tkinter, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0436\u0438\u0434\u0430\u0435\u0442 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043e\u043a, \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043c\u044b\u0448\u0438) \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e     <\/code><\/pre>\n<p>\u0418 \u043d\u0430\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u043a \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u043d\u0430\u0448\u0435 \u0442\u0432\u043e\u0440\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c\u00a0\u2014 \u00ab\u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e 6\u00a0\u0444\u0435\u0432\u0440\u0430\u043b\u044f 2023\u00a0\u0433\u043e\u0434\u0430\u00bb, \u0435\u0441\u043b\u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u0441\u0442\u0430\u0440\u0435\u043d\u044c\u043a\u0430\u044f \u0438 \u043e\u0442\u0441\u0442\u0430\u043b\u0430\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u0430\u043a\u00a0ChatGPT 3.5,\u00a0\u0442\u043e \u043e\u043d\u0430 \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0430\u00a0\u044d\u0442\u043e\u0442 \u0432\u043e\u043f\u0440\u043e\u0441 \u043d\u0435\u00a0\u0437\u043d\u0430\u0435\u0442, \u0430\u00a0\u043d\u0430\u0448\u0430 \u043c\u043e\u043b\u043e\u0434\u0430\u044f \u0438 \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441\u0438\u0432\u043d\u0430\u044f gpt-4o \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0442\u0432\u0435\u0442 \u043d\u0430\u00a0\u044d\u0442\u043e\u0442 \u0432\u043e\u043f\u0440\u043e\u0441 \u0437\u043d\u0430\u0435\u0442 \u0432\u0435\u0434\u044c \u043e\u043d\u0430 \u0440\u043e\u0434\u0438\u043b\u0430\u0441\u044c \u043f\u043e\u0437\u0436\u0435, \u0430\u00a0\u0432\u0441\u0451 \u0447\u0442\u043e\u00a0\u0431\u044b\u043b\u043e \u0434\u043e\u00a0\u0440\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043e\u043d\u0430 \u0437\u043d\u0430\u0435\u0442. \u0422\u0430\u043a\u00a0\u0436\u0435 \u043f\u043e\u0438\u0433\u0440\u0430\u0435\u043c\u0441\u044f \u043a\u0440\u0435\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c\u044e (\u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u043e\u0439) \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u0447\u0442\u043e\u00a0\u0431\u044b \u0443\u0431\u0435\u0434\u0438\u0442\u0441\u044f \u0447\u0442\u043e\u00a0\u043e\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442. \u0412\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c 0.0\u00a0\u0442\u043e\u0433\u0434\u0430 \u043d\u0430\u00a0\u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442\u00a0\u0436\u0435 \u0432\u043e\u043f\u0440\u043e\u0441 \u0431\u0443\u0434\u0435\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 (\u043f\u0440\u0430\u0432\u0434\u0430 \u043a\u0430\u043a\u00a0\u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 \u043f\u043e\u0447\u0435\u043c\u0443 \u0442\u043e \u043d\u0435\u00a0\u0432\u0441\u0435\u0433\u0434\u0430), \u043f\u043e\u0442\u043e\u043c \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c 1.0\u00a0\u0442\u043e\u0433\u0434\u0430 \u043f\u043e\u0439\u0434\u0443\u0442 \u043e\u0442\u0432\u0435\u0442\u044b \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u043f\u043e\u00a0\u0441\u043c\u044b\u0441\u043b\u0443, \u043d\u043e\u00a0\u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u043e\u00a0\u043d\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044e, \u043d\u0430\u00a0\u044d\u0442\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u0432\u044b\u0448\u0435 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0441\u0432\u0430\u043b\u0438\u0442\u044c\u0441\u044f \u043c\u043e\u0434\u0435\u043b\u0438 \u0432\u00a0\u0433\u0430\u043b\u043b\u044e\u0446\u0438\u043d\u0430\u0446\u0438\u044e.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f1f\/39b\/7eb\/f1f39b7eb17143377eb11f3766cd10ab.png\" width=\"974\" height=\"737\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f1f\/39b\/7eb\/f1f39b7eb17143377eb11f3766cd10ab.png\"\/><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bda\/7de\/d99\/bda7ded996cf9fa464d1c2f1647ee9b8.png\" width=\"974\" height=\"728\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/bda\/7de\/d99\/bda7ded996cf9fa464d1c2f1647ee9b8.png\"\/><\/figure>\n<p>\u041f\u043e\u0437\u0434\u0440\u0430\u0432\u043b\u044f\u044e \u0432\u0441\u0435\u0445 \u0441 \u041d\u043e\u0432\u044b\u043c 2025 \u0433\u043e\u0434\u043e\u043c. \u0412\u0441\u0435\u043c \u043c\u0438\u0440\u0430 \u0438 \u0434\u043e\u0431\u0440\u0430.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/871732\/\"> https:\/\/habr.com\/ru\/articles\/871732\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0417\u0430\u043f\u0438\u043b\u0438\u043b \u044f \u0432\u00a0\u0442\u043e\u043c \u0433\u043e\u0434\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430\u00a0Python \u043f\u043e\u00a0\u0434\u043e\u0441\u0442\u0443\u043f\u0443 \u043a\u00a0YandexGPT \u0447\u0435\u0440\u0435\u0437 API, \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u043e\u0442 \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c\u00a0\u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u043f\u043e\u043f\u0438\u043b\u0438\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a\u00a0gpt-4o \u0438 gpt-4o\u2011mini \u0437\u0430\u043e\u0434\u043d\u043e.<\/p>\n<p>\u0427\u0435\u043c \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u0430 \u044d\u0442\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u00a0\u2014 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u00a0\u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u043c\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c\u0438 (\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u00ab\u0421\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u00bb), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0430\u043c\u043e\u043c\u0443, \u0438 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u043e\u0439 (\u00ab\u041a\u0440\u0435\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c\u00bb) \u043a\u00a0YandexGPT \u0438 OpenAI gpt-4o \u043c\u0438\u043d\u0443\u044f \u0438\u0445 \u043f\u0440\u043e\u043c\u043f\u0442\u044b \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043f\u043b\u044e\u0441 \u043d\u0435\u00a0\u043d\u0430\u0434\u043e \u043f\u043b\u0430\u0442\u0438\u0442\u044c \u0437\u0430\u00a0\u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0443 \u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u00a0\u043d\u0430\u0434\u043e\u0431\u043d\u043e\u0441\u0442\u0438, \u043f\u043b\u044e\u0441 \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u00a0GPT \u043c\u043e\u0434\u0435\u043b\u044f\u043c\u0438.<\/p>\n<p>\u0427\u0442\u043e\u00a0\u0431\u044b \u043d\u0435\u00a0\u0437\u0430\u043c\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u043e\u0439 \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a\u00a0OpenAI \u0447\u0435\u0440\u0435\u0437 VPN \u0438 \u043e\u043f\u043b\u0430\u0442\u043e\u0439 \u0435\u0449\u0451 \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e \u0447\u0442\u043e\u00a0\u043d\u0430\u0445\u043e\u0434\u0438\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u043f\u043e\u043f\u0440\u043e\u0449\u0435, \u0437\u0430\u0431\u0438\u0432\u0430\u0435\u043c \u0432\u00a0\u043f\u043e\u0438\u0441\u043a\u0435 \u00ab\u0434\u043e\u0441\u0442\u0443\u043f \u043a\u00a0gpt-4o \u0447\u0435\u0440\u0435\u0437 proxy\u00bb \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0441\u0435\u0440\u0432\u0438\u0441\u00a0\u2014 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c\u0441\u044f, \u043e\u043f\u043b\u0430\u0447\u0438\u0432\u0430\u0435\u043c, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043a\u043b\u044e\u0447 API \u0438 \u0432\u0441\u0451, \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0430 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u00a0\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0438 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u043c \u0441\u0447\u0430\u0441\u0442\u044c\u0435.<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u0414\u0435\u043b\u0430\u0435\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u00a0 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435:<\/p>\n<p> 1.\u00a0\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0440\u0430\u0434\u0438\u043e\u043a\u043d\u043e\u043f\u043a\u0438 \u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441<\/p>\n<pre><code class=\"python\">tk.Radiobutton(self.model_selection_frame,text=\"GPT-4o mini\",variable=self.gpt_model_uri,value=\"gpt-4o-mini\",command=self.update_gpt_model_uri).grid(row=0, column=4, padx=5, sticky=\"w\") tk.Radiobutton(self.model_selection_frame,text=\"GPT-4o\",variable=self.gpt_model_uri,value=\"gpt-4o\",command=self.update_gpt_model_uri).grid(row=0, column=5, padx=5, sticky=\"w\")<\/code><\/pre>\n<p>2. \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043a OpenAI \u0447\u0435\u0440\u0435\u0437 proxy<\/p>\n<pre><code class=\"python\"># \u0417\u0430\u043f\u0440\u043e\u0441 \u043a ChatGPT \u0447\u0435\u0440\u0435\u0437 ProxiAPI     def answer_from_proxiapi(self, user_input, system_message, user_temperature, model):          # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043a\u043b\u044e\u0447\u0430 ProxiAPI         if not self.reg_proxi_apy or not self.reg_proxi_apy.strip():             messagebox.showwarning(\"\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435\", \"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043a\u043b\u044e\u0447 \u043a ProxyAPI\")             return                prompt = {             \"model\": model,             \"messages\": [                 {\"role\": \"system\", \"content\": system_message},                 {\"role\": \"user\", \"content\": user_input}             ],             \"temperature\": user_temperature,             \"max_tokens\": 64000         }          url = \"https:\/\/api.proxyapi.ru\/openai\/v1\/chat\/completions\"         headers = {             \"Content-Type\": \"application\/json\",             \"Authorization\": f\"Bearer {self.reg_proxi_apy}\"         }          try:             response = requests.post(url, headers=headers, json=prompt)             response.raise_for_status()  # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u0442\u0430\u0442\u0443\u0441\u0430 HTTP-\u0437\u0430\u043f\u0440\u043e\u0441\u0430             result = response.json()              assistant_text = result.get(\"choices\", [{}])[0].get(\"message\", {}).get(\"content\", \"\u041e\u0448\u0438\u0431\u043a\u0430: \u041e\u0442\u0432\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\")             self.insert_to_result_label(f\" GPT: \\n{assistant_text}\\n\\n\")         except requests.exceptions.RequestException as e:             messagebox.showerror(\"\u041e\u0448\u0438\u0431\u043a\u0430\", f\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430: {e}\") <\/code><\/pre>\n<p>3 \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 # \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u0438\u00a0\u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u00ab\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c\u00bb def on_submit(self) \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0432\u044b\u0431\u043e\u0440\u0430 \u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u0440\u0438\u00a0\u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 \u043f\u0440\u043e\u043c\u043f\u0442\u0430<\/p>\n<pre><code class=\"python\"># \u0412\u044b\u0431\u043e\u0440 \u043c\u043e\u0434\u0435\u043b\u0438 \u0438 \u0432\u044b\u0437\u043e\u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438                 if self.gpt_model_uri_get in [\"gpt-4o-mini\", \"gpt-4o\"]:             self.answer_from_proxiapi(entered_text, system_message, user_temperature, self.gpt_model_uri_get)         else:             self.answer_from_yandex_gpt(entered_text, system_message, user_temperature, self.default_folder, self.api_key) <\/code><\/pre>\n<p> 4.\u00a0\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u00a0\u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\u00a0 \u0432\u0432\u043e\u0434 \u043a\u043b\u044e\u0447\u0430 proxyapi<\/p>\n<pre><code class=\"python\">self.main_menu.add_command(label=\"\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f ProxyAPI\", command=self.show_registration_proxiapi)<\/code><\/pre>\n<p>5.\u00a0\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432\u0432\u043e\u0434\u0430 \u043a\u043b\u044e\u0447\u0430 proxy<\/p>\n<pre><code class=\"python\"># \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u043a\u043d\u0430 \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 ProxiAPI     def show_registration_proxiapi(self):         registration_window = tk.Toplevel(self.root)         self.registration_window_close = registration_window         registration_window.title(\"\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0432 ProxyAPI\")          # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430         tk.Label(registration_window, text=\"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043a\u043b\u044e\u0447 proxyapi\").grid(row=0, column=0, padx=10, pady=10)         self.proxy_key_entry = tk.Text(registration_window, wrap=\"word\", width=40, height=1)              self.proxy_key_entry.bind('&lt;KeyRelease&gt;', lambda event: self.validate_input(event, registration_window))         self.proxy_key_entry.grid(row=1, column=0, padx=10, pady=0)          register_button = tk.Button(registration_window, text=\" \u0412\u043e\u0439\u0442\u0438 \", command=self.register_proxiapi_user)         register_button.grid(row=2, columnspan=2, padx=10, pady=15)          # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u0433\u043e \u043c\u0435\u043d\u044e         context_menu = tk.Menu(registration_window, tearoff=0)         context_menu.add_command(label=\"\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c\", command=lambda: self.copy_text_to_clipboard(self.proxy_key_entry))         context_menu.add_command(label=\"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c\", command=lambda: self.paste_text_from_clipboard(self.proxy_key_entry))         self.proxy_key_entry.bind(\"&lt;Button-3&gt;\", lambda event: context_menu.post(event.x_root, event.y_root)) # \u041f\u0440\u0438\u0432\u044f\u0437\u043a\u0430 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u0433\u043e \u043c\u0435\u043d\u044e \u043a \u043f\u0440\u0430\u0432\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u0435 \u043c\u044b\u0448\u0438          # \u041e\u0431\u043d\u043e\u0432\u043b\u0451\u043d\u043d\u0430\u044f \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044f         registration_window_width = 355         registration_window_height = 120  # \u041d\u043e\u0432\u0430\u044f \u0432\u044b\u0441\u043e\u0442\u0430         registration_window.resizable(False, False)         screen_width = self.root.winfo_screenwidth()         screen_height = self.root.winfo_screenheight()         x = (screen_width - registration_window_width) \/\/ 2         y = (screen_height - registration_window_height) \/\/ 2           registration_window.geometry(f\"{registration_window_width}x{registration_window_height}+{x}+{y}\")          # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438         registration_window.transient(self.root)         registration_window.wait_visibility()         registration_window.grab_set()         registration_window.focus_force()         self.root.wait_window(registration_window) <\/code><\/pre>\n<ol start=\"6\">\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043a\u043b\u044e\u0447\u0430 proxy \u0432 \u0444\u0430\u0439\u043b JSON<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"python\"># \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043a\u043b\u044e\u0447\u0430 ProxiAPI \u0432 \u0444\u0430\u0439\u043b JSON:     def register_proxiapi_user(self):         proxy_api_key = self.proxy_key_entry.get(\"1.0\", \"end-1c\").strip()          if len(proxy_api_key.strip()) &gt; 40:             messagebox.showwarning(\"\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435\", \"\u041f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043a\u043b\u044e\u0447\u0430 ProxyAPI (\u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c 40 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432).\")             return              if not proxy_api_key.strip():             messagebox.showwarning(\"\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435\", \"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043a\u043b\u044e\u0447 ProxyAPI\")             return          self.reg_proxi_apy = proxy_api_key # \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 self.reg_proxi_apy \u043f\u043e\u0442\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0435 ProxyAPI          filename = \"Login_SmartiksGPT.json\"          # \u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430, \u0435\u0441\u043b\u0438 \u0444\u0430\u0439\u043b \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442         if os.path.exists(filename):             try:                 with open(filename, \"r\") as file:                     existing_data = json.load(file)             except json.JSONDecodeError:                 existing_data = {}  # \u0415\u0441\u043b\u0438 \u0444\u0430\u0439\u043b \u043f\u0443\u0441\u0442\u043e\u0439 \u0438\u043b\u0438 \u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0435\u043d, \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u043b\u043e\u0432\u0430\u0440\u044c         else:             existing_data = {}  # \u0415\u0441\u043b\u0438 \u0444\u0430\u0439\u043b \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u043b\u043e\u0432\u0430\u0440\u044c          # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u043a\u043b\u044e\u0447 \u043a \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u0434\u0430\u043d\u043d\u044b\u043c         existing_data[\"self.reg_proxi_apy\"] = self.reg_proxi_apy          # \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u0444\u0430\u0439\u043b         try:             with open(filename, \"w\") as file:                 json.dump(existing_data, file, indent=4)             print(f\"\u041a\u043b\u044e\u0447 ProxyAPI \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0432 JSON \u0444\u0430\u0439\u043b '{filename}'.\")         except Exception as e:             print(f\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0438 \u0444\u0430\u0439\u043b\u0430: {e}\")             messagebox.showerror(\"\u041e\u0448\u0438\u0431\u043a\u0430\", \"\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u043b\u044e\u0447 ProxyAPI.\")             return          # \u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043e\u043a\u043d\u043e \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438         self.registration_window_close.destroy() <\/code><\/pre>\n<p>\u0412\u043e\u0442 \u0438 \u0432\u0441\u0451, \u0434\u0432\u0430 \u0434\u043d\u044f \u0438 \u0433\u043e\u0442\u043e\u0432\u043e. \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0441\u043b\u0430\u0436\u0434\u0430\u0435\u043c\u0441\u044f \u0438\u043c\u043f\u043e\u0440\u0442\u043d\u044b\u043c\u0438 \u043e\u0442\u0432\u0435\u0442\u0430\u043c\u0438 \u043d\u0430\u00a0\u043e\u0442\u0435\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u043c\u043f\u0442\u044b. \u0413\u043e\u0442\u043e\u0432\u044b\u0439 \u0438 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u043a\u043e\u0434 \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0432\u00a0\u0431\u043b\u043e\u043a\u043d\u043e\u0442, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0441\u00a0\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\u043c.py (\u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0443\u00a0\u0432\u0430\u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u041f\u0438\u0442\u043e\u043d\u0430 \u043a\u0430\u043a\u00a0\u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0432 <a href=\"https:\/\/habr.com\/ru\/articles\/809901\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a>) \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 SmartikGPT.py \u0432\u00a0\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0435 UTF-8\u00a0(\u043f\u0440\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0438 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u0443\u044e \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0443) \u0438 \u0432\u0441\u0451 \u0434\u043e\u043b\u0436\u043d\u043e \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. \u041c\u043e\u0436\u043d\u043e \u0434\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u00a0\u0433\u043e\u0442\u043e\u0432\u044b\u0439 exe \u0444\u0430\u0439\u043b, \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439\u00a0\u2014 \u0432\u00a0cmd \u0438\u043b\u0438\u00a0Windows PowerShell.<\/p>\n<pre><code class=\"powershell\">pyinstaller --onefile \u2013noconsole SmartiksGPT.py<\/code><\/pre>\n<figure class=\"full-width\"><\/figure>\n<p>\u041a\u043e\u0434 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b SmartiksGPT<\/p>\n<pre><code class=\"python\"># \u0418\u043c\u043f\u043e\u0440\u0442 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a import tkinter as tk from tkinter import ttk from tkinter import Menu from tkinter import messagebox  import requests import json import os from transliterate import translit import winsound  import re                        # \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 DraggableWindow - \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043e\u043a\u043d\u043e class DraggableWindow:     def __init__(self, root):         # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u043a\u043d\u0430         self.root = root         self.root.title(\"SmartiksGPT\")                                        # \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430         self.is_dragging = False         initial_width = 838         initial_height = 600         screen_width = root.winfo_screenwidth()         screen_height = root.winfo_screenheight()         x = (screen_width - initial_width) \/\/ 2         y = (screen_height - initial_height) \/\/ 2         self.root.geometry(f\"{initial_width}x{initial_height}+{x}+{y}\")       # \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043e\u043a\u043d\u0430         self.root.option_add('*BorderWidth', 3)         self.root.option_add('*highlightThickness', 0)         self.root.resizable(False, False)                                     # \u0417\u0430\u043f\u0440\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u043e\u043a\u043d\u0430                  # \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u0434\u043b\u044f proxyAPI         self.PROXY_API_URL = \"https:\/\/api.proxyapi.ru\/openai\/v1\/chat\/completions\"          self.create_specialization_data()          # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043c\u0435\u043d\u044e          self.root = root         self.main_menu = tk.Menu(root)         self.info_menu = tk.Menu(self.main_menu, tearoff=0)         self.main_menu.add_cascade(label=\"\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f\", menu=self.info_menu)                 self.main_menu.add_command(label=\"\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f Yandex\", command=self.show_registration_yandex)  # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0443\u043d\u043a\u0442\u0430 \"\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f\"         self.main_menu.add_command(label=\"\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f ProxyAPI\", command=self.show_registration_proxiapi)<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-444190","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/444190","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=444190"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/444190\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=444190"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=444190"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=444190"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}