{"id":466160,"date":"2025-07-06T03:00:12","date_gmt":"2025-07-06T03:00:12","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=466160"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=466160","title":{"rendered":"<span>\u0412\u0435\u0440\u0441\u0442\u0430\u0435\u043c \u0441\u0432\u043e\u0435\u0433\u043e \u0418\u0418 CLI \u0430\u0433\u0435\u043d\u0442\u0430 \u043d\u0430\u2026 GOLANG???<\/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<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b31\/89e\/323\/b3189e323fe8c757d2e902c5af181417.jpg\" width=\"878\" height=\"429\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/b31\/89e\/323\/b3189e323fe8c757d2e902c5af181417.jpg 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b31\/89e\/323\/b3189e323fe8c757d2e902c5af181417.jpg 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0412\u0441\u0435 \u0443\u0436\u0435 \u0441\u043b\u044b\u0448\u0430\u043b\u0438 \u043f\u0440\u043e Gemini CLI, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441 \u043c\u043e\u0449\u043d\u043e\u0439 gemini 2.5  \u043f\u0440\u044f\u043c\u043e \u0438\u0437 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438. \u042d\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u043e, \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u0430\u0441\u0441\u0443 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439. \u041d\u043e \u0447\u0442\u043e, \u0435\u0441\u043b\u0438 \u043c\u044b \u0437\u0430\u0445\u043e\u0442\u0438\u043c \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0430 \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a \u043e\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438\u0437\u043d\u0443\u0442\u0440\u0438? \u0410 \u0435\u0441\u043b\u0438 \u0443 \u043d\u0430\u0441 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435\u0442\u0443 VPN \u0434\u043b\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0433\u0443\u0433\u043b\u0430? \u0418\u043b\u0438, \u0447\u0442\u043e \u0435\u0449\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435, \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439, \u043f\u0443\u0441\u0442\u044c \u0438 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0439, \u0430\u043d\u0430\u043b\u043e\u0433? \u0427\u0435\u043c \u043c\u044b \u0445\u0443\u0436\u0435? \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0432\u0435\u0440\u0441\u0442\u0430\u0435\u043c \u0441\u0432\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043d\u0430&#8230; GOLANG?<\/p>\n<p>\u0414\u0430, \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a. \u041c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u043d-\u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043c\u0435\u043d\u0438\u0442 \u0441\u043e\u0431\u043e\u0439 \u0432\u0441\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 CLI. \u041d\u0430\u0448\u0430 \u0446\u0435\u043b\u044c \u2014 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442, \u043f\u043e\u0433\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0440\u0443\u0436\u0438\u0442\u044c Go, \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u0438 \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u044f\u0437\u044b\u043a\u043e\u0432\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c. <\/p>\n<p>\u041c\u043e\u044f \u0438\u0434\u0435\u044f \u043f\u0440\u043e\u0441\u0442\u0430: \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e CLI-\u0430\u0433\u0435\u043d\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u0443\u0448\u0430\u0442\u044c \u043d\u0430\u0448\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a AI \u0437\u0430 \u0441\u043e\u0432\u0435\u0442\u043e\u043c \u0438\u043b\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439, \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0442\u044c \u044d\u0442\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u043d\u0430\u043c \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u0430 \u0437\u0430\u0442\u0435\u043c, \u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0435\u0451 \u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u0415\u0441\u043b\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f \u043e\u0448\u0438\u0431\u043a\u043e\u0439, AI \u043f\u043e\u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u043f\u043e\u0448\u043b\u043e \u043d\u0435 \u0442\u0430\u043a, \u0438 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u0442 \u0440\u0435\u0448\u0435\u043d\u0438\u0435. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0430\u043c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442\u044b, \u043d\u043e \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0443\u0442\u0438\u043d\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438, \u043d\u0435 \u0432\u044b\u0445\u043e\u0434\u044f \u0438\u0437 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0435\u043d \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0441\u043b\u0435\u0434\u0438\u0442\u044c \u0437\u0430 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u043c\u0438 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430\u043c\u0438, \u0431\u0443\u0434\u0443 \u043f\u0440\u0438\u0437\u043d\u0430\u0442\u0435\u043b\u0435\u043d \u0437\u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0443 \u043d\u0430 \u043c\u043e\u0439 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c-\u043a\u0430\u043d\u0430\u043b. \u0422\u0430\u043c \u044f \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u044e \u043f\u043e\u043b\u0435\u0437\u043d\u044be \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435, \u0440\u0430\u0437\u0431\u043e\u0440\u044b \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0439, \u0441\u043e\u0432\u0435\u0442\u044b \u043a\u0430\u043a \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0438\u0432\u043d\u044b\u043c \u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435 \u043e\u0442\u0431\u043e\u0440\u043d\u044b\u0435 \u043c\u0435\u043c\u044b:\u00a0<a href=\"https:\/\/t.me\/nullPointerDotEXE\" rel=\"noopener noreferrer nofollow\">https:\/\/t.me\/nullPointerDotEXE<\/a>.  <\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>github.com\/fatih\/color<\/code> \u0434\u043b\u044f \u043a\u0440\u0430\u0441\u0438\u0432\u043e\u0433\u043e \u0432\u044b\u0432\u043e\u0434\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0440\u0430\u0437\u0443 \u0441\u0434\u0435\u043b\u0430\u0439\u0442\u0435 <code>go get github.com\/fatih\/color<\/code><\/p>\n<h2>\u0428\u0430\u0433 1. \u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c\u0441\u044f<\/h2>\n<pre><code class=\"go\">var ( successColor = color.New(color.FgGreen).Add(color.Bold).SprintFunc() borderColor  = color.New(color.FgWhite).Add(color.Bold).SprintFunc() labelColor   = color.New(color.FgHiWhite).Add(color.Bold).SprintFunc() aiColor      = color.New(color.FgHiCyan).Add(color.Bold).SprintFunc() errorColor   = color.New(color.FgRed).Add(color.Bold).SprintFunc() ) <\/code><\/pre>\n<p>\u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445. \u042d\u0442\u043e \u043d\u0435 \u0431\u043e\u043b\u0435\u0435, \u0447\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0438 \u0442\u0435\u043a\u0441\u0442\u0430. \u041c\u044b \u0436\u0435 \u043f\u0438\u0448\u0435\u043c \u0430\u043d\u0430\u043b\u043e\u0433 gemini, \u0432\u0435\u0434\u044c \u0442\u0430\u043a? \u041d\u0443 \u0432\u043e\u0442 \u0438 \u0442\u0435\u043a\u0441\u0442 \u0431\u0443\u0434\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u0442\u043e\u0436\u0435 \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u043c. <\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0443 \u043d\u0430\u0441 \u0438\u0434\u0443\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438. \u041c\u043e\u0434\u0435\u043b\u044c\u043a\u0438 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0435, \u043d\u043e \u043d\u0435 \u0441\u0430\u043c\u044b\u0435 \u0441\u043b\u0430\u0431\u044b\u0435. \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0442\u0443\u0442 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e qwen3 \u043d\u0430 30b \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432. Api \u043a\u043b\u044e\u0447 \u044f \u043f\u043e\u043a\u0430\u0436\u0443 \u043a\u0430\u043a \u043f\u043e\u0437\u0436\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u0430 openrouter. <\/p>\n<pre><code class=\"go\">const ( systemPromptBase            = \"\u0412\u043e\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442:\\n\" simpleChatPromptTemplate    = \"\u0422\u044b \u2014 AI-\u0430\u0433\u0435\u043d\u0442. \u041e\u0442\u0432\u0435\u0442\u044c \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u043e\u0441\u043d\u043e\u0432\u044b\u0432\u0430\u044f\u0441\u044c \u043d\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0435\u0441\u0442\u044c. \u041d\u0418\u041a\u041e\u0413\u0414\u0410 \u041d\u0415 \u0418\u0421\u041f\u041e\u041b\u042c\u0417\u0423\u0419 \u0421\u041c\u0410\u0419\u041b\u0418\u041a\u0418. \u0432\u043e\u0442 \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439: %v\" commandGenPromptTemplate    = \"\u0422\u044b \u2014 AI-\u0430\u0433\u0435\u043d\u0442. \u0422\u0432\u043e\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u2014 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0434\u043b\u044f PowerShell \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\u041e\u0442\u0432\u0435\u0447\u0430\u0439 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439, \u0431\u0435\u0437 \u043b\u0438\u0448\u043d\u0438\u0445 \u0441\u043b\u043e\u0432, \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0439 \u0438 markdown-\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0422\u043e\u043b\u044c\u043a\u043e \u0433\u043e\u043b\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430. \u041d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439 \u0441\u043c\u0430\u0439\u043b\u0438\u043a\u0438. \u0421\u0442\u0430\u0440\u0430\u0439\u0441\u044f \u0433\u0435\u043d\u0435\u0440\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0432\u044b\u0432\u043e\u0434\u044f\u0442 \u043e\u0447\u0435\u043d\u044c \u0434\u043b\u0438\u043d\u043d\u044b\u0439 \u043b\u043e\u0433. \u0418 \u0432\u043e\u0442 \u043d\u0430\u0448\u0438 \u043f\u0440\u043e\u0448\u043b\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f: %v\" errorAnalysisPromptTemplate = \"\u041f\u0440\u043e\u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0439 \u043e\u0448\u0438\u0431\u043a\u0443 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u044b PowerShell \u0438 \u043e\u0431\u044a\u044f\u0441\u043d\u0438 \u043f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0447\u0442\u043e \u043f\u043e\u0448\u043b\u043e \u043d\u0435 \u0442\u0430\u043a. \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441: '%s'. \u041a\u043e\u043c\u0430\u043d\u0434\u0430: '%s'. \u041e\u0448\u0438\u0431\u043a\u0430: '%s'\" summaryPromptTemplate       = \"\u041a\u0440\u0430\u0442\u043a\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u043e\u0441\u043d\u043e\u0432\u044b\u0432\u0430\u044f\u0441\u044c \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441: '%s'. \u0412\u044b\u0432\u043e\u0434 \u043a\u043e\u043c\u0430\u043d\u0434\u044b: '%s'\" )<\/code><\/pre>\n<p>\u041d\u0443 \u0442\u0443\u0442 \u0441\u0430\u043c\u0438 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0435\u0442\u0435 \u0442\u0435\u043a\u0441\u0442\u044b. 1 \u043f\u0440\u043e\u043c\u043f\u0442 \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u043f\u043a. \u042d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u0431\u0440\u0430\u0442\u044c, \u043d\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442\u0435 \u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0433\u043e \u0430\u0433\u0435\u043d\u0442\u0430 \u043f\u043e\u0434 mac os \u0438\u043b\u0438 linux, \u0442\u043e \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u043a\u0435 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043c\u0430\u043d\u0434 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e. 2 \u043f\u0440\u043e\u043c\u043f\u0442 \u0434\u043b\u044f \u0440\u0435\u0436\u0438\u043c\u0430 \u0447\u0430\u0442\u0430. 3 \u0434\u043b\u044f \u0430\u0433\u0435\u043d\u0442\u0430. 4 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043e\u0448\u0438\u0431\u043e\u043a \u0438 5 \u0434\u043b\u044f \u043e\u0442\u0447\u0435\u0442\u043e\u0432. <\/p>\n<p>\u0418\u0434\u0435\u043c \u0434\u0430\u043b\u0435\u0435<\/p>\n<pre><code class=\"go\">type Message struct { Role    string `json:\"role\"` Content string `json:\"content\"` }  type App struct { APIKey     string APIUrl     string Model      string MaxRetries int Client     *http.Client Reader     *bufio.Reader History    []Message }  type APIRequest struct { Model    string    `json:\"model\"` Messages []Message `json:\"messages\"` }  type APIResponse struct { Choices []Choice `json:\"choices\"` }  type Choice struct { Message ResponseMessage `json:\"message\"` }  type ResponseMessage struct { Content string `json:\"content\"` }<\/code><\/pre>\n<p><strong>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043a\u0438.<\/strong> <\/p>\n<p>\u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u0438. \u0412\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 API \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438. \u0410 \u0432\u043e\u0442 app \u0434\u043b\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0413\u043e\u0440\u043e\u0434\u0438\u0442\u044c DI, \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0438 \u043f\u0440\u043e\u0447\u0438\u0439 \u043e\u0432\u0435\u0440\u0445\u0435\u0434 \u0432 <strong>\u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435<\/strong> \u044f \u043d\u0435 \u0431\u0443\u0434\u0443. \u0421\u0435\u0439\u0447\u0430\u0441 \u0443 \u043d\u0430\u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043b\u0430\u0439\u0442\u043e\u0432\u0430\u044f CLI&#8217;\u043a\u0430 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0434\u0435\u043d\u044c. <\/p>\n<p>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043a\u0443 App \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u043e\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c. <\/p>\n<pre><code class=\"go\">func NewApp() *App {  return &amp;App{ APIKey:     \"\u0430\u043f\u0438 \u043a\u043b\u044e\u0447\", APIUrl:     \"https:\/\/openrouter.ai\/api\/v1\/chat\/completions\", Model:      \"qwen\/qwen3-30b-a3b:free\", MaxRetries: 5, Client: &amp;http.Client{ Timeout: 60 * time.Second, \/\/\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435 \u0441\u0430\u043c\u043e\u0439 \u0431\u044b\u0441\u0442\u0440\u043e\u0439 }, Reader: bufio.NewReader(os.Stdin), History: []Message{ { Role:    \"system\", Content: systemPromptBase + getSystemInfo(), }, }, } }<\/code><\/pre>\n<p>\u041d\u043e \u0437\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u0435: <strong>\u041d\u0418\u041a\u041e\u0413\u0414\u0410 \u041d\u0415 \u0425\u0410\u0420\u0414\u041a\u041e\u0420\u0414\u0418\u0422\u0415 \u0410\u041f\u0418 \u041a\u041b\u042e\u0427\u0418! \u0412\u041e\u0422 \u0412\u041e\u041e\u0411\u0429\u0415 \u041d\u0415 \u041d\u0410\u0414\u041e \u0422\u0410\u041a \u0414\u0415\u041b\u0410\u0422\u042c!! <\/strong>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u043f\u0438\u0448\u0435\u043c CLI \u0447\u0438\u0441\u0442\u043e \u0434\u043b\u044f \u044d\u043a\u0441\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u0442\u0430, \u0430 \u043d\u0435 \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u043d. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433 \u0441 env \u044f \u043d\u0435 \u0432\u0438\u0436\u0443 \u0441\u043c\u044b\u0441\u043b\u0430 \u0442\u0443\u0442. \u041d\u043e \u0435\u0441\u043b\u0438 \u0431\u0443\u0434\u0435\u0442\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c, \u0442\u043e <strong>\u041e\u0411\u042f\u0417\u0410\u0422\u0415\u041b\u042c\u041d\u041e \u0412\u042b\u041d\u041e\u0421\u0418\u0422\u0415 \u041a\u041e\u041d\u0424\u0418\u0413\u0423\u0420\u0410\u0426\u0418\u042e \u0418 \u0421\u0410\u041c\u041e\u0415 \u0413\u041b\u0410\u0412\u041d\u041e\u0415 .ENV. <\/strong><\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>getSystemInfo()<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043f\u043a \u044e\u0437\u0435\u0440\u0430. <\/p>\n<pre><code class=\"go\">func getSystemInfo() string { osName := runtime.GOOS currentUser, err := user.Current() username := \"unknown\" if err == nil { username = currentUser.Username } cwd, err := os.Getwd() if err != nil { cwd = \"unknown\" } return fmt.Sprintf( \"System Context:\\n- OS: %s\\n- Shell: PowerShell\\n- User: %s\\n- CWD: %s\\n\", osName, username, cwd, ) }<\/code><\/pre>\n<p>\u0418\u0442\u0430\u043a, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043c API \u043a\u043b\u044e\u0447. \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u0430\u044f, \u0442\u043e \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0441\u043c\u0435\u043b\u043e \u0448\u0430\u0433 2. <\/p>\n<h2>\u0428\u0430\u0433 2. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c API \u043a\u043b\u044e\u0447 \u0434\u043b\u044f \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438 \u043d\u0430 openrouter<\/h2>\n<p>\u041f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043d\u0430 \u0441\u0430\u0439\u0442 <a href=\"https:\/\/openrouter.ai\/sign-in?redirect_url=https%3A%2F%2Fopenrouter.ai%2Fsettings%2Fkeys\" rel=\"noopener noreferrer nofollow\">\u043e\u043f\u0435\u043d\u0440\u043e\u0443\u0442\u0435\u0440\u0430 <\/a>\u0438 \u0432\u043e\u0439\u0434\u0438\u0442\u0435 \u043b\u044e\u0431\u044b\u043c \u0443\u0434\u043e\u0431\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1bb\/e87\/9e3\/1bbe879e3d5186b5e123927dc4bfdcf8.jpg\" width=\"1256\" height=\"911\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/1bb\/e87\/9e3\/1bbe879e3d5186b5e123927dc4bfdcf8.jpg 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1bb\/e87\/9e3\/1bbe879e3d5186b5e123927dc4bfdcf8.jpg 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0432\u0435\u0434\u0438\u0442\u0435 \u043a\u0443\u0440\u0441\u043e\u0440 \u043d\u0430 \u0441\u0432\u043e\u044e \u0438\u043a\u043e\u043d\u043a\u0443. \u0422\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u0432\u043a\u043b\u0430\u0434\u043a\u0430 &#171;keys&#187;. \u0412\u043e\u0442 \u044d\u0442\u043e \u0432\u043e\u0442 \u0432\u0430\u043c \u0442\u0443\u0434\u0430 \u0432\u043e\u0442. <\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/6bf\/740\/cf4\/6bf740cf4f83bbb7398402929df2863b.jpg\" width=\"772\" height=\"512\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/6bf\/740\/cf4\/6bf740cf4f83bbb7398402929df2863b.jpg 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/6bf\/740\/cf4\/6bf740cf4f83bbb7398402929df2863b.jpg 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0435 \u043a\u043b\u044e\u0447, \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442\u0435 \u0438 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0435. <\/p>\n<p>\u0421\u043b\u043e\u0436\u043d\u043e? \u041d\u0435 \u0434\u0443\u043c\u0430\u044e. <\/p>\n<h2>\u0428\u0430\u0433 3. \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430. <\/h2>\n<p>C\u0435\u0440\u0434\u0446\u0435 \u043d\u0430\u0448\u0435\u0439 \u0443\u0442\u0438\u043b\u0438\u0442\u044b, \u0431\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043e\u043d\u043e \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0445\u043e\u0442\u044c \u043a\u0430\u043a-\u0442\u043e. \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0442\u0438\u043f\u0438\u0447\u043d\u0430\u044f \u0438 \u043f\u0440\u043e\u0441\u0442\u0430\u044f. \u041e\u043d\u0430 \u0434\u0435\u043b\u0430\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441 \u043a API \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0442\u0432\u0435\u0442.  \u042d\u0442\u043e \u044f\u0434\u0440\u043e \u043b\u043e\u0433\u0438\u043a\u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0432\u043d\u0435\u0448\u043d\u0438\u043c API \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0442\u0435\u043a\u0441\u0442\u0430.  <\/p>\n<pre><code class=\"go\">func (a *App) GenerateContent(messages []Message) (string, error) { \/\/ \u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0442\u0435\u043b\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0441 \u043c\u043e\u0434\u0435\u043b\u044c\u044e \u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438 reqBody := APIRequest{ Model:    a.Model, Messages: messages, }  \/\/ \u0421\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0442\u0435\u043b\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0432 JSON bodyBytes, err := json.Marshal(reqBody) if err != nil { return \"\", fmt.Errorf(\"\u043e\u0448\u0438\u0431\u043a\u0430 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f JSON: %w\", err) }  \/\/ \u0421\u043e\u0437\u0434\u0430\u0451\u043c HTTP POST-\u0437\u0430\u043f\u0440\u043e\u0441 \u043a API req, err := http.NewRequest(\"POST\", a.APIUrl, bytes.NewBuffer(bodyBytes)) if err != nil { return \"\", fmt.Errorf(\"\u043e\u0448\u0438\u0431\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430: %w\", err) }  \/\/ \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438: \u0442\u0438\u043f \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430 \u0438 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f req.Header.Set(\"Content-Type\", \"application\/json\") req.Header.Set(\"Authorization\", \"Bearer \"+a.APIKey)  \/\/ \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043e\u0442\u0432\u0435\u0442 resp, err := a.Client.Do(req) if err != nil { return \"\", fmt.Errorf(\"\u043e\u0448\u0438\u0431\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430: %w\", err) } defer resp.Body.Close()  \/\/ \u0427\u0438\u0442\u0430\u0435\u043c \u0442\u0435\u043b\u043e \u043e\u0442\u0432\u0435\u0442\u0430 respBytes, err := io.ReadAll(resp.Body) if err != nil { return \"\", fmt.Errorf(\"\u043e\u0448\u0438\u0431\u043a\u0430 \u0447\u0442\u0435\u043d\u0438\u044f \u043e\u0442\u0432\u0435\u0442\u0430: %w\", err) }  \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043f\u043e \u0441\u0442\u0430\u0442\u0443\u0441-\u043a\u043e\u0434\u0443 if resp.StatusCode != http.StatusOK { return \"\", fmt.Errorf(\"API \u0432\u0435\u0440\u043d\u0443\u043b \u043e\u0448\u0438\u0431\u043a\u0443 (\u0441\u0442\u0430\u0442\u0443\u0441 %d): %s\", resp.StatusCode, string(respBytes)) }  \/\/ \u0414\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u043c JSON-\u043e\u0442\u0432\u0435\u0442 \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 var result APIResponse if err := json.Unmarshal(respBytes, &amp;result); err != nil { return \"\", fmt.Errorf(\"\u043e\u0448\u0438\u0431\u043a\u0430 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0442\u0432\u0435\u0442\u0430: %w\", err) }  \/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u0430, \u0435\u0441\u043b\u0438 \u043e\u043d \u0435\u0441\u0442\u044c if len(result.Choices) &gt; 0 &amp;&amp; result.Choices[0].Message.Content != \"\" { return result.Choices[0].Message.Content, nil }  \/\/ \u0415\u0441\u043b\u0438 \u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d \u2014 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043e\u0448\u0438\u0431\u043a\u0443 return \"\", fmt.Errorf(\"API \u043d\u0435 \u0432\u0435\u0440\u043d\u0443\u043b \u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u0432 \u043e\u0442\u0432\u0435\u0442\u0435\") }<\/code><\/pre>\n<h2>\u0428\u0430\u0433 4. \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043e\u0442 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438. <\/h2>\n<p>\u041d\u0430\u043f\u0438\u0448\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0441\u043b\u043e\u0432\u0430 \u0432 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435. <\/p>\n<pre><code class=\"go\">func executeCommand(cmdStr string) (string, error) { cmd := exec.Command(\"powershell\", \"-NoProfile\", \"-Command\", cmdStr) output, err := cmd.CombinedOutput() \/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0432\u044b\u0432\u043e\u0434 \u0432 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0442.\u043a. \u0442\u0430\u043c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0442\u0435\u043a\u0441\u0442 \u043e\u0448\u0438\u0431\u043a\u0438 return strings.ToValidUTF8(string(output), \"\"), err }<\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>executeCommand<\/code> \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0447\u0435\u0440\u0435\u0437 PowerShell, \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0432\u0435\u0441\u044c \u0432\u044b\u0432\u043e\u0434 (\u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0438), \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0435\u0433\u043e \u0432 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u0443\u044e UTF-8 \u0441\u0442\u0440\u043e\u043a\u0443 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439 (\u0435\u0441\u043b\u0438 \u043e\u043d\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430). \u0414\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0430\u0441\u044c \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439, \u0442\u0435\u043a\u0441\u0442 \u0435\u0451 \u0432\u044b\u0432\u043e\u0434\u0430 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u2014 \u044d\u0442\u043e \u0432\u0430\u0436\u043d\u043e \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e. \u0415\u0441\u043b\u0438 \u0432 \u0432\u044b\u0432\u043e\u0434\u0435 \u0431\u0443\u0434\u0435\u0442 \u043a\u0438\u0440\u0438\u043b\u043b\u0438\u0446\u0430, \u0442\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0431\u0443\u0434\u0443\u0442 \u0431\u0438\u0442\u044b\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u043c \u0432\u0441\u0435 \u0432 UTF8. <\/p>\n<p>\u0412 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a \u044d\u0442\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u0438\u0434\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438. \u0417\u0430\u0447\u0435\u043c? \u042f \u043e\u0442\u0432\u0435\u0447\u0443 \u0437\u0430\u0447\u0435\u043c. \u0425\u043e\u0442\u044c \u043c\u044b \u0432 \u043f\u0440\u043e\u043c\u043f\u0442\u0435 \u044f\u0432\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c, \u0447\u0442\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u043d\u0430\u0434\u043e \u0441\u0440\u0430\u0437\u0443, \u043d\u043e \u043e\u0442 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438 \u043c\u044b \u043d\u0435 \u043b\u0438\u0448\u0435\u043d\u044b. \u041d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0431\u044b\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u0438\u0437-\u0437\u0430 \u0434\u043b\u0438\u043d\u044b \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043f\u0435\u0440\u0435\u0441\u0442\u0440\u0430\u0445\u043e\u0432\u044b\u0432\u0430\u0435\u043c\u0441\u044f. <\/p>\n<pre><code class=\"go\">func cleanCommand(cmdStr string) string { cmdStr = strings.TrimPrefix(cmdStr, \"```powershell\") cmdStr = strings.TrimPrefix(cmdStr, \"```bash\") cmdStr = strings.TrimPrefix(cmdStr, \"```\") cmdStr = strings.TrimSuffix(cmdStr, \"```\") cmdStr = strings.TrimPrefix(cmdStr, \"\u041a\u043e\u043c\u0430\u043d\u0434\u0430: \") cmdStr = strings.TrimPrefix(cmdStr, \"Command: \")  \/\/ \u0411\u043e\u043b\u0435\u0435 \u043d\u0430\u0434\u0435\u0436\u043d\u043e\u0435 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0438\u0437 `powershell -command \"...\"` if strings.HasPrefix(strings.ToLower(cmdStr), \"powershell -command \") { firstQuote := strings.Index(cmdStr, \"\\\"\") lastQuote := strings.LastIndex(cmdStr, \"\\\"\") if firstQuote != -1 &amp;&amp; lastQuote &gt; firstQuote { cmdStr = cmdStr[firstQuote+1 : lastQuote] } } return strings.TrimSpace(cmdStr) }<\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>cleanCommand<\/code> \u043e\u0447\u0438\u0449\u0430\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043e\u0442 \u043b\u0438\u0448\u043d\u0435\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043e\u0431\u0451\u0440\u0442\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u043b\u0438 \u0431\u044b\u0442\u044c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c\u044e. \u041e\u043d\u0430 \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u044b \u0432\u0440\u043e\u0434\u0435 <code>powershell`, bash, \"\u041a\u043e\u043c\u0430\u043d\u0434\u0430: \", \"Command: \", \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u0431\u0440\u0435\u0437\u0430\u0435\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u044e\u0449\u0438\u0435 <\/code>&#171;&#171;.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 <code>powershell -command \"...\"<\/code>, \u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u0430\u0432\u044b\u0447\u0435\u043a. \u0412 \u0438\u0442\u043e\u0433\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0447\u0438\u0441\u0442\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430, \u0433\u043e\u0442\u043e\u0432\u0430\u044f \u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044e.<\/p>\n<h2>\u0428\u0430\u0433 5. \u041f\u0438\u0448\u0435\u043c \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u043a\u0440\u0430\u0441\u0438\u0432\u043e\u0433\u043e \u0432\u044b\u0432\u043e\u0434\u0430<\/h2>\n<p>\u0422\u0443\u0442 \u044f \u043f\u0440\u044f\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0437\u0430\u043e\u0441\u0442\u0440\u044f\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0435 \u0431\u0443\u0434\u0443. \u0412 \u0446\u0435\u043b\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0438 \u0431\u0435\u0437 \u044d\u0442\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043d\u043e \u0442\u043a \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c \u0441\u0432\u043e\u044e gemini CLI, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u0420\u043e\u0441\u0441\u0438\u0438, \u0442\u043e \u0431\u0435\u0437 \u043d\u0438\u0445 \u043d\u0435 \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c. <\/p>\n<p>\u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u044b\u0432\u043e\u0434\u0430 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0439 \u043d\u0430\u0434\u043f\u0438\u0441\u0438 CLI AGENT. <\/p>\n<pre><code class=\"go\">func printHeader() { var asciiHeader = []string{ \"  \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2557     \u2588\u2588\u2557     \u2588\u2588\u2588\u2588\u2588\u2557  \u2588\u2588\u2588\u2588\u2588\u2588\u2557  \u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2557   \u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\", \"  \u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255d\u2588\u2588\u2551     \u2588\u2588\u2551    \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255d \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255d\u2588\u2588\u2588\u2588\u2557  \u2588\u2588\u2551\u255a\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255d\", \"  \u2588\u2588\u2551     \u2588\u2588\u2551     \u2588\u2588\u2551    \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2551  \u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2557  \u2588\u2588\u2554\u2588\u2588\u2557 \u2588\u2588\u2551   \u2588\u2588\u2551   \", \"  \u2588\u2588\u2551     \u2588\u2588\u2551     \u2588\u2588\u2551    \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551\u2588\u2588\u2551   \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u255d  \u2588\u2588\u2551\u255a\u2588\u2588\u2557\u2588\u2588\u2551   \u2588\u2588\u2551   \", \"  \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2551    \u2588\u2588\u2551  \u2588\u2588\u2551\u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d\u2588\u2588\u2551  \u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2551   \u2588\u2588\u2551   \", \"  \u255a\u2550\u2550\u2550\u2550\u2550\u2550\u255d\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u255d\u255a\u2550\u255d    \u255a\u2550\u255d  \u255a\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u255d  \u255a\u2550\u255d\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u255d\u255a\u2550\u255d  \u255a\u2550\u2550\u2550\u255d   \u255a\u2550\u255d   \", \"                                                                            \", \"                             (by oyminirole)                                \", } colors := []*color.Color{ color.New(color.FgHiCyan), color.New(color.FgCyan), color.New(color.FgHiBlue), color.New(color.FgBlue), color.New(color.FgHiMagenta), color.New(color.FgMagenta), }  for _, line := range asciiHeader { lineLength := len(line) step := float64(len(colors)) \/ float64(lineLength)  for i, char := range line { colorIndex := int(float64(i) * step) if colorIndex &gt;= len(colors) { colorIndex = len(colors) - 1 } colors[colorIndex].Printf(\"%c\", char) } fmt.Println() }  color.New(color.FgHiCyan).Add(color.Bold).Println(\"\\n\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f:\") fmt.Println(\" \u2022 \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u043f\u0435\u0440\u0435\u0434 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c \\\"!\\\" \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u044b, \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u0437\u0430\u043f\u0440\u043e\u0441. \u041f\u0440\u0438\u043c\u0435\u0440: !\u041a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0430\u043f\u043a\u0443?\") fmt.Println(\" \u2022 \u0414\u043b\u044f \u0440\u0435\u0436\u0438\u043c\u0430 \u0430\u0433\u0435\u043d\u0442\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u0437\u0430\u043f\u0440\u043e\u0441 \u0431\u0435\u0437 !. \u0410\u0433\u0435\u043d\u0442 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0441 \u043e\u0442\u0447\u0435\u0442\u0430\u043c\u0438.\") fmt.Println(\" \u2022 \u0414\u043b\u044f \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043d\u0430\u0436\u043c\u0438\u0442\u0435 Ctrl+C \u0438\u043b\u0438 \u0437\u0430\u043a\u0440\u043e\u0439\u0442\u0435 \u043e\u043a\u043d\u043e \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430.\") fmt.Println(strings.Repeat(\"\u2500\", 70)) }<\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>printHeader<\/code> \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0439 ASCII-\u0431\u0430\u043d\u043d\u0435\u0440 \u0441 \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442\u043d\u043e\u0439 \u0446\u0432\u0435\u0442\u043e\u0432\u043e\u0439 \u0437\u0430\u043b\u0438\u0432\u043a\u043e\u0439, \u0430 \u0437\u0430\u0442\u0435\u043c \u2014 \u043a\u0440\u0430\u0442\u043a\u0443\u044e \u0441\u043f\u0440\u0430\u0432\u043a\u0443 \u043f\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e CLI-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430.<\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u043d\u0430 \u043f\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u043e \u043f\u0435\u0447\u0430\u0442\u0430\u0435\u0442 \u043b\u043e\u0433\u043e\u0442\u0438\u043f \u0441 \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c\u043e\u043c (oyminirole \u044d\u0442\u043e \u044f \u043a\u0441\u0442\u0430), \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043f\u043b\u0430\u0432\u043d\u044b\u0439 \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442 \u0438\u0437 \u0448\u0435\u0441\u0442\u0438 \u0446\u0432\u0435\u0442\u043e\u0432. \u0417\u0430\u0442\u0435\u043c \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f: \u043a\u0430\u043a \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441\u044b (<code>!<\/code>), \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0436\u0438\u043c \u0430\u0433\u0435\u043d\u0442\u0430 \u0438 \u043a\u0430\u043a \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u0412\u0441\u0451 \u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u043e \u0432 \u0441\u0442\u0438\u043b\u0435 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 CLI-\u043f\u043e\u043c\u043e\u0449\u0438.<\/p>\n<p>\u041a\u0443\u0434\u0430 \u0436\u0435 \u0431\u0435\u0437 \u0441\u043f\u0438\u043d\u0435\u0440\u0430. <\/p>\n<pre><code class=\"go\">func startSpinner(text string) chan bool { stop := make(chan bool) go func() { frames := []string{\"\u280b\", \"\u2819\", \"\u2839\", \"\u2838\", \"\u283c\", \"\u2834\", \"\u2826\", \"\u2827\", \"\u2807\"} i := 0 for { select { case &lt;-stop: fmt.Print(\"\\r\\033[K\") \/\/\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043e\u0447\u0438\u0441\u0442\u043a\u0443 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435 return default: fmt.Print(\"\\r\\033[K\") \/\/\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043e\u0447\u0438\u0441\u0442\u043a\u0443 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435 fmt.Print(text + \" \") color.New(color.FgHiCyan).Add(color.Bold).Printf(frames[i%len(frames)]) time.Sleep(100 * time.Millisecond) i++ } } }() return stop }<\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>startSpinner<\/code> \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0441\u043f\u0438\u043d\u043d\u0435\u0440 (\u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438) \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0435, \u0447\u0442\u043e\u0431\u044b \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0438\u0434\u0451\u0442 \u0444\u043e\u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043e\u0442\u0432\u0435\u0442\u0430).<\/p>\n<p>\u0421\u043f\u0438\u043d\u043d\u0435\u0440 \u043a\u0440\u0443\u0442\u0438\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438, \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0438\u0437 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 <code>frames<\/code> (\u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0442\u0438\u043f\u0430 <code>\u280b<\/code>, <code>\u2819<\/code> \u0438 \u0442.\u0434.). \u041a\u0430\u0436\u0434\u044b\u0435 100 \u043c\u0441 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u0434\u0440, \u043f\u043e\u043a\u0430 \u0432 \u043a\u0430\u043d\u0430\u043b <code>stop<\/code> \u043d\u0435 \u043f\u0440\u0438\u0434\u0451\u0442 \u0441\u0438\u0433\u043d\u0430\u043b \u2014 \u0442\u043e\u0433\u0434\u0430 \u0441\u043f\u0438\u043d\u043d\u0435\u0440 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043e\u0447\u0438\u0449\u0430\u0435\u0442\u0441\u044f.<\/p>\n<p>\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0439 \u043a\u0430\u043d\u0430\u043b <code>chan bool<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e \u0438\u0437\u0432\u043d\u0435. <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0445 \u043e\u0442\u0432\u0435\u0442\u043e\u0432<\/p>\n<pre><code class=\"go\">func printResultBox(commandOutput, aiSummary string, makeAnalize bool) { width := 80  fmt.Printf(\" %s\\n\", successColor(\"\u256d\u2500[ \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 ]\"+strings.Repeat(\"\u2500\", width-16))) fmt.Printf(\" %s %s\\n\", borderColor(\"\u2502\"), labelColor(\"\u0412\u044b\u0432\u043e\u0434 \u043a\u043e\u043c\u0430\u043d\u0434\u044b:\")) for _, line := range strings.Split(strings.TrimSpace(commandOutput), \"\\n\") { fmt.Printf(\" %s   %s\\n\", borderColor(\"\u2502\"), line) } if makeAnalize &amp;&amp; aiSummary != \"\" { fmt.Printf(\" %s %s\\n\", borderColor(\"\u2502\"), borderColor(strings.Repeat(\"\u00b7\", width-4))) fmt.Printf(\" %s %s\\n\", borderColor(\"\u2502\"), aiColor(\"\u0410\u043d\u0430\u043b\u0438\u0437 AI:\")) for _, line := range strings.Split(strings.TrimSpace(aiSummary), \"\\n\") { fmt.Printf(\" %s   %s\\n\", borderColor(\"\u2502\"), aiColor(line)) } } fmt.Printf(\" %s\\n\", successColor(\"\u2570\"+strings.Repeat(\"\u2500\", width-2))) }  func printErrorBox(errorOutput, aiAnalysis string) { width := 80  fmt.Printf(\" %s\\n\", errorColor(\"\u256d\u2500[ \u2717 \u041e\u0448\u0438\u0431\u043a\u0430 ]\"+strings.Repeat(\"\u2500\", width-16))) fmt.Printf(\" %s %s\\n\", borderColor(\"\u2502\"), labelColor(\"\u041b\u043e\u0433 \u043e\u0448\u0438\u0431\u043a\u0438:\")) for _, line := range strings.Split(strings.TrimSpace(errorOutput), \"\\n\") { fmt.Printf(\" %s   %s\\n\", borderColor(\"\u2502\"), errorColor(line)) } if aiAnalysis != \"\" { fmt.Printf(\" %s %s\\n\", borderColor(\"\u2502\"), borderColor(strings.Repeat(\"\u00b7\", width-4))) fmt.Printf(\" %s %s\\n\", borderColor(\"\u2502\"), aiColor(\"\u0410\u043d\u0430\u043b\u0438\u0437 AI:\")) for _, line := range strings.Split(strings.TrimSpace(aiAnalysis), \"\\n\") { fmt.Printf(\" %s   %s\\n\", borderColor(\"\u2502\"), aiColor(line)) } } fmt.Printf(\" %s\\n\", errorColor(\"\u2570\"+strings.Repeat(\"\u2500\", width-2))) }<\/code><\/pre>\n<p>\u0417\u043d\u0430\u044e, \u0447\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043e\u0447\u0435\u043d\u044c \u0441\u0442\u0440\u0430\u0448\u043d\u043e, \u043d\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u0442\u0440\u0430\u0448\u043d\u043e\u0433\u043e \u043e\u043d\u0438 \u043d\u0435 \u0434\u0435\u043b\u0430\u044e\u0442. \u0417\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0442\u044c \u0432\u0430\u043c \u044d\u0442\u043e \u043d\u0435 \u043d\u0430\u0434\u043e. \u042d\u0442\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <strong>\u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0432\u043e\u0434\u044f\u0442 \u043a\u0440\u0430\u0441\u0438\u0432\u043e \u0442\u0435\u043a\u0441\u0442 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c<\/strong>. <\/p>\n<h2>\u0428\u0430\u0433 6. \u041f\u0438\u0448\u0435\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443<\/h2>\n<p>\u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u043d\u0430\u0438\u043c\u0435\u043d\u0435\u0435 \u0441\u0442\u0440\u0430\u0448\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. <\/p>\n<pre><code class=\"go\">\/\/ handleSimpleChat \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0447\u0430\u0442\u0430. func (a *App) handleSimpleChat(userInput string) { spinner := startSpinner(\"\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f...\")   prompt := []Message{ {Role: \"system\", Content: fmt.Sprintf(simpleChatPromptTemplate, a.History)}, {Role: \"user\", Content: strings.TrimPrefix(userInput, \"!\")}, }  response, err := a.GenerateContent(prompt) if err != nil { printErrorBox(fmt.Sprintf(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0442\u0432\u0435\u0442\u0430:\\n%v\", err), \"\") return } spinner &lt;- true printResultBox(response, \"\", false)  }<\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>handleSimpleChat<\/code> \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0432\u0432\u043e\u0434 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0447\u0430\u0442\u0430 (\u0432\u043e\u043f\u0440\u043e\u0441-\u043e\u0442\u0432\u0435\u0442) \u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.<\/p>\n<h4>\u0427\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u043f\u043e \u0448\u0430\u0433\u0430\u043c:<\/h4>\n<ol>\n<li>\n<p><strong>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0441\u043f\u0438\u043d\u043d\u0435\u0440<\/strong> \u0441 \u043f\u043e\u0434\u043f\u0438\u0441\u044c\u044e &#171;\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f&#8230;&#187;, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0438\u0434\u0451\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>\u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u043f\u0440\u043e\u043c\u043f\u0442<\/strong> \u0434\u043b\u044f \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438:<\/p>\n<ul>\n<li>\n<p>\u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0441 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u043c <code>simpleChatPromptTemplate<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u043e\u0431\u0449\u0435\u043d\u0438\u044f (<code>a.History<\/code>);<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 (\u0432\u0432\u043e\u0434 \u0431\u0435\u0437 <code>!<\/code> \u0432 \u043d\u0430\u0447\u0430\u043b\u0435).<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>\u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <\/strong><code><strong>GenerateContent<\/strong><\/code> \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043e\u0442\u0432\u0435\u0442\u0430 \u043e\u0442 AI.<\/p>\n<\/li>\n<li>\n<p><strong>\u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443<\/strong>, \u0435\u0441\u043b\u0438 \u043e\u043d\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u2014 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0435\u0451 \u0432 \u0432\u0438\u0434\u0435 \u043a\u0440\u0430\u0441\u043d\u043e\u0439 \u0440\u0430\u043c\u043a\u0438.<\/p>\n<\/li>\n<li>\n<p><strong>\u041e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0441\u043f\u0438\u043d\u043d\u0435\u0440<\/strong>, \u0435\u0441\u043b\u0438 \u0432\u0441\u0451 \u043f\u0440\u043e\u0448\u043b\u043e \u0443\u0441\u043f\u0435\u0448\u043d\u043e.<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u0435\u0447\u0430\u0442\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442<\/strong> \u0432 \u043a\u0440\u0430\u0441\u0438\u0432\u043e\u0439 \u0440\u0430\u043c\u043a\u0435 (<code>printResultBox<\/code>).<\/p>\n<\/li>\n<\/ol>\n<p>\u0418\u0442\u043e\u0433: \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0447\u0430\u0442-\u0440\u0435\u0436\u0438\u043c, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0441\u0432\u043e\u0439 \u0432\u043e\u043f\u0440\u043e\u0441 \u0441 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0435\u0439 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0438 \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u043c \u0432\u044b\u0432\u043e\u0434\u043e\u043c. \u041d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e. <\/p>\n<p>\u0418\u0434\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435. \u0412\u043e\u0442 \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u043c \u043a \u0441\u0430\u043c\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0435 \u0430\u0433\u0435\u043d\u0442\u0430. \u041d\u043e \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u0430\u043d\u0434. <\/p>\n<pre><code class=\"go\">func (a *App) askForConfirmation(command string) bool { fmt.Print(\"\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443? [y\/n]: \", aiColor(command), \"\\n&gt; \")  confirmInput, _ := a.Reader.ReadString('\\n') confirmInput = strings.ToLower(strings.TrimSpace(confirmInput)) fmt.Print(\"\\033[2A\\033[J\") return confirmInput == \"y\" || confirmInput == \"yes\" }<\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>askForConfirmation<\/code> \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <code>true<\/code>, \u0435\u0441\u043b\u0438 \u043e\u0442\u0432\u0435\u0442 \u2014 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439. \u0422\u0430\u043a \u0436\u0435 \u043e\u043d\u0430 <strong>\u043e\u0447\u0438\u0449\u0430\u0435\u0442 2 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432\u0432\u0435\u0440\u0445<\/strong> (<code>\\033[2A<\/code>) \u0438 <strong>\u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u0438\u0445 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435<\/strong> (<code>\\033[J<\/code>), \u0447\u0442\u043e\u0431\u044b \u0443\u0431\u0440\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u044b \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0438\u0437 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430.  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u0430\u043c \u0430\u0433\u0435\u043d\u0442. <\/p>\n<pre><code class=\"go\">func (a *App) handleCommandMode(userInput string) { currentTurnHistory := make([]Message, len(a.History)) copy(currentTurnHistory, a.History) currentTurnHistory = append(currentTurnHistory, Message{Role: \"user\", Content: userInput})  var lastError string for i := 0; i &lt; a.MaxRetries; i++ {  spinnerGen := startSpinner(\"\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u044b...\") prompt := []Message{ {Role: \"system\", Content: fmt.Sprintf(commandGenPromptTemplate, currentTurnHistory)}, {Role: \"user\", Content: userInput}, } command, err := a.GenerateContent(prompt) spinnerGen &lt;- true  if err != nil { printErrorBox(fmt.Sprintf(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b:\\n%v\", err), \"\") return } command = cleanCommand(command)  \/\/ 2. \u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u043e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f if !a.askForConfirmation(command) { log.Println(\"\u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u043e\u0442\u043c\u0435\u043d\u0435\u043d\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c.\") return } currentTurnHistory = append(currentTurnHistory, Message{Role: \"assistant\", Content: command})  \/\/ 3. \u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b spinnerExec := startSpinner(\"\u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435...\")  output, err := executeCommand(command)       spinnerExec &lt;- true  if err != nil {  currentTurnHistory = append(currentTurnHistory, Message{Role: \"console error\", Content: output}) lastError = output time.Sleep(time.Second) continue \/\/ \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 }  \/\/ 4. \u0423\u0441\u043f\u0435\u0448\u043d\u043e\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0438 \u043f\u043e\u0434\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0438\u0442\u043e\u0433\u043e\u0432 spinnerSummary := startSpinner(\"\u0413\u043e\u0442\u043e\u0432\u043b\u044e \u043e\u0442\u0447\u0435\u0442...\") summaryPrompt := []Message{{Role: \"user\", Content: fmt.Sprintf(summaryPromptTemplate, userInput, output)}} aiSummary, err := a.GenerateContent(summaryPrompt) if err != nil { log.Println(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0442\u0447\u0435\u0442\u0430: \", errorColor(err)) } spinnerSummary &lt;- true  printResultBox(output, aiSummary, true) currentTurnHistory = append(currentTurnHistory, Message{Role: \"AI\", Content: aiSummary})  a.History = currentTurnHistory \/\/ \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0439 \u0434\u0438\u0430\u043b\u043e\u0433 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0438\u0441\u0442\u043e\u0440\u0438\u044e return                         \/\/ \u0423\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0438, \u0432\u044b\u0445\u043e\u0434\u0438\u043c \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 }  \/\/ 5. \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430, \u0435\u0441\u043b\u0438 \u0432\u0441\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u043f\u0440\u043e\u0432\u0430\u043b\u0438\u043b\u0438\u0441\u044c spinnerAnalysis := startSpinner(\"\u0410\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044e \u043e\u0448\u0438\u0431\u043a\u0438...\")  analysisPrompt := []Message{{Role: \"user\", Content: fmt.Sprintf(errorAnalysisPromptTemplate, userInput, \"N\/A\", lastError)}} aiAnalysis, _ := a.GenerateContent(analysisPrompt) spinnerAnalysis &lt;- true  printErrorBox(fmt.Sprintf(\"\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u043f\u043e\u0441\u043b\u0435 %d \u043f\u043e\u043f\u044b\u0442\u043e\u043a.\", a.MaxRetries), aiAnalysis) }<\/code><\/pre>\n<p>\u0421\u043e\u0433\u043b\u0430\u0441\u0435\u043d, \u043f\u0443\u0433\u0430\u0435\u0442. \u041c\u0435\u0442\u043e\u0434 <code>handleCommandMode<\/code> \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 <strong>\u0440\u0435\u0436\u0438\u043c \u0430\u0433\u0435\u043d\u0442\u0430<\/strong>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u043f\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u0443, \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0435\u0451 \u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442, \u0430 \u0437\u0430\u0442\u0435\u043c \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u043a\u0440\u0430\u0442\u043a\u0438\u0439 \u043e\u0442\u0447\u0451\u0442 \u0438\u043b\u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0438 \u043f\u0440\u0438 \u043d\u0435\u0443\u0434\u0430\u0447\u0435.<\/p>\n<h4>\u041f\u043e\u0448\u0430\u0433\u043e\u0432\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430<\/h4>\n<ol>\n<li>\n<p><strong>\u0421\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u043a\u043e\u043f\u0438\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439<\/strong> \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0447\u0430\u0442\u0430, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0439 \u0441\u0435\u0441\u0441\u0438\u0438, \u043d\u0435 \u0432\u043b\u0438\u044f\u044f \u043d\u0430 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0443\u044e \u0438\u0441\u0442\u043e\u0440\u0438\u044e. \u042d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0437\u0430\u0431\u0438\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442.<\/p>\n<\/li>\n<li>\n<p><strong>\u0417\u0430\u043f\u0443\u0441\u043a \u0434\u043e <\/strong><code><strong>MaxRetries<\/strong><\/code><strong> \u043f\u043e\u043f\u044b\u0442\u043e\u043a<\/strong>:<\/p>\n<ul>\n<li>\n<p><strong>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u044b<\/strong>: \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u043f\u0440\u043e\u043c\u043f\u0442 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0432\u0432\u043e\u0434\u0430. \u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u043f\u0438\u043d\u043d\u0435\u0440.<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435<\/strong>: \u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u043c\u043e\u0436\u043d\u043e \u043b\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443. \u041f\u0440\u0438 \u043e\u0442\u043a\u0430\u0437\u0435 \u2014 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443.<\/p>\n<\/li>\n<li>\n<p><strong>\u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b<\/strong>: \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0432 PowerShell, \u0441 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0435\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f. \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 \u2014 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f, \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u043f\u0430\u0443\u0437\u0430 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u043f\u043e\u043f\u044b\u0442\u043a\u0430.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>\u0415\u0441\u043b\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e<\/strong>:<\/p>\n<ul>\n<li>\n<p>\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f <strong>\u043a\u0440\u0430\u0442\u043a\u0438\u0439 AI-\u043e\u0442\u0447\u0451\u0442<\/strong> \u043f\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u0432\u043e\u0434 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0438 \u043e\u0442\u0447\u0451\u0442 \u043a\u0440\u0430\u0441\u0438\u0432\u043e \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 <code>printResultBox<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0412\u0441\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u0440\u0430\u0443\u043d\u0434\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u043e\u0431\u0449\u0443\u044e \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>\u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u043f\u0440\u043e\u0432\u0430\u043b\u0438\u043b\u0438\u0441\u044c<\/strong>:<\/p>\n<ul>\n<li>\n<p>\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f <strong>\u0430\u043d\u0430\u043b\u0438\u0437 \u043e\u0448\u0438\u0431\u043a\u0438<\/strong> (AI \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442, \u043f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c).<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0440\u0430\u0441\u043d\u0430\u044f \u0440\u0430\u043c\u043a\u0430 \u0441 \u0447\u0438\u0441\u043b\u043e\u043c \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u044b\u0445 \u043f\u043e\u043f\u044b\u0442\u043e\u043a \u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u043e\u043c.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<h4>\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 CLI<\/h4>\n<p>\u042d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u2014 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 CLI-\u0430\u0433\u0435\u043d\u0442\u0430. \u041e\u043d \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u0432\u0432\u043e\u0434 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443, \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435, \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0438 \u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u043e\u0441\u043c\u044b\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u043e\u0442\u0447\u0451\u0442\u044b, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044f \u0432\u044b\u0441\u043e\u043a\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u043e\u0441\u0442\u0438 \u0438 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438.<\/p>\n<h2>\u0428\u0430\u0433 7. \u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0432\u0441\u0435 \u0432 \u0435\u0434\u0438\u043d\u043e\u0435 \u0446\u0435\u043b\u043e\u0435. <\/h2>\n<p>\u0412\u0441\u0435 \u0441\u0430\u043c\u043e\u0435 \u0441\u0442\u0440\u0430\u0448\u043d\u043e\u0435 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0437\u0430\u0434\u0438. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043e\u0431\u0435\u0440\u0435\u043c \u043d\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. <\/p>\n<pre><code class=\"go\">func isCommandPrefixed(input string) bool { return strings.HasPrefix(strings.ToLower(strings.TrimSpace(input)), \"!\") }  func (a *App) Run() { printHeader() \/\/\u0434\u0430, \u044d\u0442\u043e \u043d\u0430\u0448 \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a  for { fmt.Println(\"\u256d\u2500\" + strings.Repeat(\"\u2500\", 66)) color.New(color.FgHiWhite).Print(\"\u2502 &gt; \u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0437\u0430\u043f\u0440\u043e\u0441: \") userInput, _ := a.Reader.ReadString('\\n') color.New(color.FgHiWhite).Println(\"\u2570\" + strings.Repeat(\"\u2500\", 65)) userInput = strings.TrimSpace(userInput)  if userInput == \"\" { continue }  if isCommandPrefixed(userInput) { a.handleSimpleChat(userInput) } else { a.handleCommandMode(userInput) } } }  func main() { app := NewApp() defer app.Client.CloseIdleConnections() \/\/ \u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 app.Run() }<\/code><\/pre>\n<h4>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0432\u0432\u043e\u0434\u0430<\/h4>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u0446\u0438\u043a\u043b \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u0432\u044b\u0432\u043e\u0434\u0430 \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u0440\u0430\u043c\u043a\u0438 \u0438 \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u044f \u043a\u043e \u0432\u0432\u043e\u0434\u0443 (<code> &gt; \u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0437\u0430\u043f\u0440\u043e\u0441:<\/code>). \u0412\u0432\u0435\u0434\u0451\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u043e\u0447\u0438\u0449\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u043f\u0440\u043e\u0431\u0435\u043b\u043e\u0432 \u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f:<\/p>\n<ul>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u0432\u043e\u0441\u043a\u043b\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u043a\u0430 <code>!<\/code> \u2014 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0432\u043e\u0441\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0435\u0451 \u043a\u0430\u043a <strong>\u0432\u043e\u043f\u0440\u043e\u0441 \u0438\u043b\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435<\/strong> \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u043d\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0432 <code>handleSimpleChat<\/code>. \u042d\u0442\u043e \u0440\u0435\u0436\u0438\u043c \u0434\u0438\u0430\u043b\u043e\u0433\u0430 \u0441 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c\u044e \u0431\u0435\u0437 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u0430\u043d\u0434.<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 <code>!<\/code> \u2014 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0445\u043e\u0447\u0435\u0442 <strong>\u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443<\/strong>, \u0438 \u0437\u0430\u043f\u0443\u0441\u043a \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 <code>handleCommandMode<\/code>. \u0412 \u044d\u0442\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u0443, \u0437\u0430\u0442\u0435\u043c \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0435\u0451 \u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u043a\u0440\u0430\u0442\u043a\u0438\u0439 \u043e\u0442\u0447\u0451\u0442.<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0447\u0451\u0442\u043a\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0442\u044c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0435 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043e\u043f\u0430\u0441\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f.<\/p>\n<h4>\u0413\u043b\u0430\u0432\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/h4>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>Run<\/code> \u0437\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 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0432\u0432\u043e\u0434\u0430, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044f \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 CLI-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430. \u041f\u0435\u0440\u0435\u0434 \u044d\u0442\u0438\u043c \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f ASCII-\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a. \u041a\u0430\u0436\u0434\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0440\u0435\u0436\u0438\u043c, \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0435\u0433\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b.<\/p>\n<h4>\u0417\u0430\u043f\u0443\u0441\u043a \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435<\/h4>\n<p>\u0422\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u2014 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>main<\/code> \u2014 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 <code>App<\/code> \u0441 \u043f\u0440\u0435\u0434\u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 (HTTP-\u043a\u043b\u0438\u0435\u043d\u0442, \u0438\u0441\u0442\u043e\u0440\u0438\u044f, \u0432\u0432\u043e\u0434 \u0438 \u0442.\u0434.) \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0446\u0438\u043a\u043b. \u041f\u0440\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f HTTP-\u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0447\u0435\u0440\u0435\u0437 <code>defer<\/code>, \u0447\u0442\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0432\u0430\u0436\u043d\u043e \u043f\u0440\u0438 \u0447\u0430\u0441\u0442\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 API.<\/p>\n<h4>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442<\/h4>\n<p>\u0418\u0442\u043e\u0433\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u043d\u0442\u0443\u0438\u0442\u0438\u0432\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0439 CLI-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u0433\u0434\u0435:<\/p>\n<ul>\n<li>\n<p><code>!\u041a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0430\u043f\u043a\u0443?<\/code> \u2192 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0442\u0432\u0435\u0442 \u0418\u0418;<\/p>\n<\/li>\n<li>\n<p><code>\u0441\u043e\u0437\u0434\u0430\u0439 \u043c\u043d\u0435 \u043f\u0430\u043f\u043a\u0443 \u043d\u0430 \u0440\u0430\u0431\u043e\u0447\u0435\u043c \u0441\u0442\u043e\u043b\u0435<\/code> \u2192 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0443, \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u043e\u044f\u0441\u043d\u044f\u0435\u0442\u0441\u044f.<\/p>\n<\/li>\n<\/ul>\n<h2>\u0428\u0430\u0433 7. \u0412\u043e\u0441\u0445\u0438\u0449\u0430\u0435\u043c\u0441\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c. <\/h2>\n<p>\u041f\u043e\u0437\u0434\u0440\u0430\u0432\u043b\u044f\u044e, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u0438 \u043a\u0440\u0430\u0441\u0438\u0432\u0443\u044e CLI&#8217;\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0434\u0443\u0448\u0435 \u0443\u0434\u043e\u0431\u043d\u043e, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044f \u043d\u043e\u0432\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b. \u041f\u0440\u0438\u0447\u0435\u043c \u0441 \u043d\u0435\u043f\u043b\u043e\u0445\u0438\u043c\u0438 \u0444\u0438\u0448\u043a\u0430\u043c\u0438. \u0423 \u043d\u0430\u0441 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442 \u0441\u0430\u043c\u043e\u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u044e \u0438 \u0447\u0438\u043d\u0438\u0442 \u043e\u0448\u0438\u0431\u043a\u0438. \u0427\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043b\u0443\u0447\u0448\u0435? <\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/95d\/a56\/e2c\/95da56e2c06a313ee89f2de2168f6d66.jpg\" width=\"1280\" height=\"633\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/95d\/a56\/e2c\/95da56e2c06a313ee89f2de2168f6d66.jpg 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/95d\/a56\/e2c\/95da56e2c06a313ee89f2de2168f6d66.jpg 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041d\u0443 \u0438 \u0435\u0449\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0447\u0438\u043a: <\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/193\/364\/d91\/193364d91766985b364d66c4859440ec.jpg\" width=\"1280\" height=\"807\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/193\/364\/d91\/193364d91766985b364d66c4859440ec.jpg 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/193\/364\/d91\/193364d91766985b364d66c4859440ec.jpg 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041a\u043e\u043c\u0430\u043d\u0434\u044b \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0438 \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0435. \u0421\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0434\u043d\u044f\u0442\u044c \u0434\u043e\u043a\u0435\u0440 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b, \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u044b \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u043d\u0438\u0445 \u043a\u043e\u0434, \u043f\u0440\u043e\u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043d\u043d\u0443 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0432\u0430\u0448\u0435\u043c \u043f\u043a, \u043d\u0430\u0439\u0442\u0438 \u0432\u0441\u044f\u043a\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0436\u0440\u0443\u0442 \u043f\u0430\u043c\u044f\u0442\u044c \u0438 \u0442\u0434. <\/p>\n<p>\u041d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432\u044b\u0448\u043b\u043e \u043a\u0440\u0430\u0439\u043d\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c \u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c. <\/p>\n<p><strong>\u0421\u043e\u0440\u0438, \u0447\u0442\u043e \u043d\u0435 \u0432\u044b\u043b\u043e\u0436\u0438\u043b \u043f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u043d\u0430 \u0433\u0438\u0442\u0445\u0430\u0431. \u041f\u043e\u0437\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044e, \u0432\u0441\u0435 \u0440\u0430\u0441\u043f\u0438\u0448\u0443, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0443 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435\u0442\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0443 \u043c\u0435\u043d\u044f. \u041d\u043e \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c \u0442\u043e\u0436\u0435 \u0445\u043e\u0447\u0435\u0442\u0441\u044f. <\/strong>\u041d\u0430 \u0433\u0438\u0442\u0445\u0430\u0431 \u0443\u0436\u0435 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u0443\u044e \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0441 env \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0430\u043c\u0438, \u0430 \u0442\u0430\u043a \u0436\u0435 \u0447\u0443\u0442\u044c \u0434\u043e\u043f\u0438\u043b\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b. \u041d\u043e \u0432 \u0446\u0435\u043b\u043e\u043c \u0432\u0441\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b \u044f \u0432\u0430\u043c \u043f\u043e\u043a\u0430\u0437\u0430\u043b. <\/p>\n<p>\u041f\u043e \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u0438 \u0436\u0434\u0443 \u0432\u0430\u0448\u0438\u0445 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432. \u0413\u0443\u0434\u043b\u0430\u043a!<\/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\/925318\/\"> https:\/\/habr.com\/ru\/articles\/925318\/<\/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<figure class=\"full-width\"><\/figure>\n<p>\u0412\u0441\u0435 \u0443\u0436\u0435 \u0441\u043b\u044b\u0448\u0430\u043b\u0438 \u043f\u0440\u043e Gemini CLI, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441 \u043c\u043e\u0449\u043d\u043e\u0439 gemini 2.5  \u043f\u0440\u044f\u043c\u043e \u0438\u0437 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438. \u042d\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u043e, \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u0430\u0441\u0441\u0443 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439. \u041d\u043e \u0447\u0442\u043e, \u0435\u0441\u043b\u0438 \u043c\u044b \u0437\u0430\u0445\u043e\u0442\u0438\u043c \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0430 \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a \u043e\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438\u0437\u043d\u0443\u0442\u0440\u0438? \u0410 \u0435\u0441\u043b\u0438 \u0443 \u043d\u0430\u0441 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435\u0442\u0443 VPN \u0434\u043b\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0433\u0443\u0433\u043b\u0430? \u0418\u043b\u0438, \u0447\u0442\u043e \u0435\u0449\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435, \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439, \u043f\u0443\u0441\u0442\u044c \u0438 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0439, \u0430\u043d\u0430\u043b\u043e\u0433? \u0427\u0435\u043c \u043c\u044b \u0445\u0443\u0436\u0435? \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0432\u0435\u0440\u0441\u0442\u0430\u0435\u043c \u0441\u0432\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043d\u0430&#8230; GOLANG?<\/p>\n<p>\u0414\u0430, \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a. \u041c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u043d-\u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043c\u0435\u043d\u0438\u0442 \u0441\u043e\u0431\u043e\u0439 \u0432\u0441\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 CLI. \u041d\u0430\u0448\u0430 \u0446\u0435\u043b\u044c \u2014 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442, \u043f\u043e\u0433\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0440\u0443\u0436\u0438\u0442\u044c Go, \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u0438 \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u044f\u0437\u044b\u043a\u043e\u0432\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c. <\/p>\n<p>\u041c\u043e\u044f \u0438\u0434\u0435\u044f \u043f\u0440\u043e\u0441\u0442\u0430: \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e CLI-\u0430\u0433\u0435\u043d\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u0443\u0448\u0430\u0442\u044c \u043d\u0430\u0448\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a AI \u0437\u0430 \u0441\u043e\u0432\u0435\u0442\u043e\u043c \u0438\u043b\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439, \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0442\u044c \u044d\u0442\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u043d\u0430\u043c \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u0430 \u0437\u0430\u0442\u0435\u043c, \u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0435\u0451 \u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u0415\u0441\u043b\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f \u043e\u0448\u0438\u0431\u043a\u043e\u0439, AI \u043f\u043e\u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u043f\u043e\u0448\u043b\u043e \u043d\u0435 \u0442\u0430\u043a, \u0438 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u0442 \u0440\u0435\u0448\u0435\u043d\u0438\u0435. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0430\u043c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442\u044b, \u043d\u043e \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0443\u0442\u0438\u043d\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438, \u043d\u0435 \u0432\u044b\u0445\u043e\u0434\u044f \u0438\u0437 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0435\u043d \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0441\u043b\u0435\u0434\u0438\u0442\u044c \u0437\u0430 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u043c\u0438 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430\u043c\u0438, \u0431\u0443\u0434\u0443 \u043f\u0440\u0438\u0437\u043d\u0430\u0442\u0435\u043b\u0435\u043d \u0437\u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0443 \u043d\u0430 \u043c\u043e\u0439 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c-\u043a\u0430\u043d\u0430\u043b. \u0422\u0430\u043c \u044f \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u044e \u043f\u043e\u043b\u0435\u0437\u043d\u044be \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435, \u0440\u0430\u0437\u0431\u043e\u0440\u044b \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0439, \u0441\u043e\u0432\u0435\u0442\u044b \u043a\u0430\u043a \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0438\u0432\u043d\u044b\u043c \u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435 \u043e\u0442\u0431\u043e\u0440\u043d\u044b\u0435 \u043c\u0435\u043c\u044b:\u00a0<a href=\"https:\/\/t.me\/nullPointerDotEXE\" rel=\"noopener noreferrer nofollow\">https:\/\/t.me\/nullPointerDotEXE<\/a>.  <\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>github.com\/fatih\/color<\/code> \u0434\u043b\u044f \u043a\u0440\u0430\u0441\u0438\u0432\u043e\u0433\u043e \u0432\u044b\u0432\u043e\u0434\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0440\u0430\u0437\u0443 \u0441\u0434\u0435\u043b\u0430\u0439\u0442\u0435 <code>go get github.com\/fatih\/color<\/code><\/p>\n<h2>\u0428\u0430\u0433 1. \u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c\u0441\u044f<\/h2>\n<pre><code class=\"go\">var ( successColor = color.New(color.FgGreen).Add(color.Bold).SprintFunc() borderColor  = color.New(color.FgWhite).Add(color.Bold).SprintFunc() labelColor   = color.New(color.FgHiWhite).Add(color.Bold).SprintFunc() aiColor      = color.New(color.FgHiCyan).Add(color.Bold).SprintFunc() errorColor   = color.New(color.FgRed).Add(color.Bold).SprintFunc() ) <\/code><\/pre>\n<p>\u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445. \u042d\u0442\u043e \u043d\u0435 \u0431\u043e\u043b\u0435\u0435, \u0447\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0438 \u0442\u0435\u043a\u0441\u0442\u0430. \u041c\u044b \u0436\u0435 \u043f\u0438\u0448\u0435\u043c \u0430\u043d\u0430\u043b\u043e\u0433 gemini, \u0432\u0435\u0434\u044c \u0442\u0430\u043a? \u041d\u0443 \u0432\u043e\u0442 \u0438 \u0442\u0435\u043a\u0441\u0442 \u0431\u0443\u0434\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u0442\u043e\u0436\u0435 \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u043c. <\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0443 \u043d\u0430\u0441 \u0438\u0434\u0443\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438. \u041c\u043e\u0434\u0435\u043b\u044c\u043a\u0438 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0435, \u043d\u043e \u043d\u0435 \u0441\u0430\u043c\u044b\u0435 \u0441\u043b\u0430\u0431\u044b\u0435. \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0442\u0443\u0442 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e qwen3 \u043d\u0430 30b \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432. Api \u043a\u043b\u044e\u0447 \u044f \u043f\u043e\u043a\u0430\u0436\u0443 \u043a\u0430\u043a \u043f\u043e\u0437\u0436\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u0430 openrouter. <\/p>\n<pre><code class=\"go\">const ( systemPromptBase            = \"\u0412\u043e\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442:\\n\" simpleChatPromptTemplate    = \"\u0422\u044b \u2014 AI-\u0430\u0433\u0435\u043d\u0442. \u041e\u0442\u0432\u0435\u0442\u044c \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u043e\u0441\u043d\u043e\u0432\u044b\u0432\u0430\u044f\u0441\u044c \u043d\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0435\u0441\u0442\u044c. \u041d\u0418\u041a\u041e\u0413\u0414\u0410 \u041d\u0415 \u0418\u0421\u041f\u041e\u041b\u042c\u0417\u0423\u0419 \u0421\u041c\u0410\u0419\u041b\u0418\u041a\u0418. \u0432\u043e\u0442 \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439: %v\" commandGenPromptTemplate    = \"\u0422\u044b \u2014 AI-\u0430\u0433\u0435\u043d\u0442. \u0422\u0432\u043e\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u2014 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0434\u043b\u044f PowerShell \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\u041e\u0442\u0432\u0435\u0447\u0430\u0439 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439, \u0431\u0435\u0437 \u043b\u0438\u0448\u043d\u0438\u0445 \u0441\u043b\u043e\u0432, \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0439 \u0438 markdown-\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0422\u043e\u043b\u044c\u043a\u043e \u0433\u043e\u043b\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430. \u041d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439 \u0441\u043c\u0430\u0439\u043b\u0438\u043a\u0438. \u0421\u0442\u0430\u0440\u0430\u0439\u0441\u044f \u0433\u0435\u043d\u0435\u0440\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0432\u044b\u0432\u043e\u0434\u044f\u0442 \u043e\u0447\u0435\u043d\u044c \u0434\u043b\u0438\u043d\u043d\u044b\u0439 \u043b\u043e\u0433. \u0418 \u0432\u043e\u0442 \u043d\u0430\u0448\u0438 \u043f\u0440\u043e\u0448\u043b\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f: %v\" errorAnalysisPromptTemplate = \"\u041f\u0440\u043e\u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0439 \u043e\u0448\u0438\u0431\u043a\u0443 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u044b PowerShell \u0438 \u043e\u0431\u044a\u044f\u0441\u043d\u0438 \u043f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0447\u0442\u043e \u043f\u043e\u0448\u043b\u043e \u043d\u0435 \u0442\u0430\u043a. \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441: '%s'. \u041a\u043e\u043c\u0430\u043d\u0434\u0430: '%s'. \u041e\u0448\u0438\u0431\u043a\u0430: '%s'\" summaryPromptTemplate       = \"\u041a\u0440\u0430\u0442\u043a\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u043e\u0441\u043d\u043e\u0432\u044b\u0432\u0430\u044f\u0441\u044c \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441: '%s'. \u0412\u044b\u0432\u043e\u0434 \u043a\u043e\u043c\u0430\u043d\u0434\u044b: '%s'\" )<\/code><\/pre>\n<p>\u041d\u0443 \u0442\u0443\u0442 \u0441\u0430\u043c\u0438 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0435\u0442\u0435 \u0442\u0435\u043a\u0441\u0442\u044b. 1 \u043f\u0440\u043e\u043c\u043f\u0442 \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u043f\u043a. \u042d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u0431\u0440\u0430\u0442\u044c, \u043d\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442\u0435 \u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0433\u043e \u0430\u0433\u0435\u043d\u0442\u0430 \u043f\u043e\u0434 mac os \u0438\u043b\u0438 linux, \u0442\u043e \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u043a\u0435 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043c\u0430\u043d\u0434 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e. 2 \u043f\u0440\u043e\u043c\u043f\u0442 \u0434\u043b\u044f \u0440\u0435\u0436\u0438\u043c\u0430 \u0447\u0430\u0442\u0430. 3 \u0434\u043b\u044f \u0430\u0433\u0435\u043d\u0442\u0430. 4 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043e\u0448\u0438\u0431\u043e\u043a \u0438 5 \u0434\u043b\u044f \u043e\u0442\u0447\u0435\u0442\u043e\u0432. <\/p>\n<p>\u0418\u0434\u0435\u043c \u0434\u0430\u043b\u0435\u0435<\/p>\n<pre><code class=\"go\">type Message struct { Role    string `json:\"role\"` Content string `json:\"content\"` }  type App struct { APIKey     string APIUrl     string Model      string MaxRetries int Client     *http.Client Reader     *bufio.Reader History    []Message }  type APIRequest struct { Model    string    `json:\"model\"` Messages []Message `json:\"messages\"` }  type APIResponse struct { Choices []Choice `json:\"choices\"` }  type Choice struct { Message ResponseMessage `json:\"message\"` }  type ResponseMessage struct { Content string `json:\"content\"` }<\/code><\/pre>\n<p><strong>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043a\u0438.<\/strong> <\/p>\n<p>\u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u0438. \u0412\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 API \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438. \u0410 \u0432\u043e\u0442 app \u0434\u043b\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0413\u043e\u0440\u043e\u0434\u0438\u0442\u044c DI, \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0438 \u043f\u0440\u043e\u0447\u0438\u0439 \u043e\u0432\u0435\u0440\u0445\u0435\u0434 \u0432 <strong>\u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435<\/strong> \u044f \u043d\u0435 \u0431\u0443\u0434\u0443. \u0421\u0435\u0439\u0447\u0430\u0441 \u0443 \u043d\u0430\u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043b\u0430\u0439\u0442\u043e\u0432\u0430\u044f CLI&#8217;\u043a\u0430 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0434\u0435\u043d\u044c. <\/p>\n<p>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043a\u0443 App \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u043e\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c. <\/p>\n<pre><code class=\"go\">func NewApp() *App {  return &amp;App{ APIKey:     \"\u0430\u043f\u0438 \u043a\u043b\u044e\u0447\", APIUrl:     \"https:\/\/openrouter.ai\/api\/v1\/chat\/completions\", Model:      \"qwen\/qwen3-30b-a3b:free\", MaxRetries: 5, Client: &amp;http.Client{ Timeout: 60 * time.Second, \/\/\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435 \u0441\u0430\u043c\u043e\u0439 \u0431\u044b\u0441\u0442\u0440\u043e\u0439 }, Reader: bufio.NewReader(os.Stdin), History: []Message{ { Role:    \"system\", Content: systemPromptBase + getSystemInfo(), }, }, } }<\/code><\/pre>\n<p>\u041d\u043e \u0437\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u0435: <strong>\u041d\u0418\u041a\u041e\u0413\u0414\u0410 \u041d\u0415 \u0425\u0410\u0420\u0414\u041a\u041e\u0420\u0414\u0418\u0422\u0415 \u0410\u041f\u0418 \u041a\u041b\u042e\u0427\u0418! \u0412\u041e\u0422 \u0412\u041e\u041e\u0411\u0429\u0415 \u041d\u0415 \u041d\u0410\u0414\u041e \u0422\u0410\u041a \u0414\u0415\u041b\u0410\u0422\u042c!! <\/strong>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u043f\u0438\u0448\u0435\u043c CLI \u0447\u0438\u0441\u0442\u043e \u0434\u043b\u044f \u044d\u043a\u0441\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u0442\u0430, \u0430 \u043d\u0435 \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u043d. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433 \u0441 env \u044f \u043d\u0435 \u0432\u0438\u0436\u0443 \u0441\u043c\u044b\u0441\u043b\u0430 \u0442\u0443\u0442. \u041d\u043e \u0435\u0441\u043b\u0438 \u0431\u0443\u0434\u0435\u0442\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c, \u0442\u043e <strong>\u041e\u0411\u042f\u0417\u0410\u0422\u0415\u041b\u042c\u041d\u041e \u0412\u042b\u041d\u041e\u0421\u0418\u0422\u0415 \u041a\u041e\u041d\u0424\u0418\u0413\u0423\u0420\u0410\u0426\u0418\u042e \u0418 \u0421\u0410\u041c\u041e\u0415 \u0413\u041b\u0410\u0412\u041d\u041e\u0415 .ENV. <\/strong><\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>getSystemInfo()<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043f\u043a \u044e\u0437\u0435\u0440\u0430. <\/p>\n<pre><code class=\"go\">func getSystemInfo() string { osName := runtime.GOOS currentUser, err := user.Current() username := \"unknown\" if err == nil { username = currentUser.Username } cwd, err := os.Getwd() if err != nil { cwd = \"unknown\" } return fmt.Sprintf( \"System Context:\\n- OS: %s\\n- Shell: PowerShell\\n- User: %s\\n- CWD: %s\\n\", osName, username, cwd, ) }<\/code><\/pre>\n<p>\u0418\u0442\u0430\u043a, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043c API \u043a\u043b\u044e\u0447. \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u0430\u044f, \u0442\u043e \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0441\u043c\u0435\u043b\u043e \u0448\u0430\u0433 2. <\/p>\n<h2>\u0428\u0430\u0433 2. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c API \u043a\u043b\u044e\u0447 \u0434\u043b\u044f \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438 \u043d\u0430 openrouter<\/h2>\n<p>\u041f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043d\u0430 \u0441\u0430\u0439\u0442 <a href=\"https:\/\/openrouter.ai\/sign-in?redirect_url=https%3A%2F%2Fopenrouter.ai%2Fsettings%2Fkeys\" rel=\"noopener noreferrer nofollow\">\u043e\u043f\u0435\u043d\u0440\u043e\u0443\u0442\u0435\u0440\u0430 <\/a>\u0438 \u0432\u043e\u0439\u0434\u0438\u0442\u0435 \u043b\u044e\u0431\u044b\u043c \u0443\u0434\u043e\u0431\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0432\u0435\u0434\u0438\u0442\u0435 \u043a\u0443\u0440\u0441\u043e\u0440 \u043d\u0430 \u0441\u0432\u043e\u044e \u0438\u043a\u043e\u043d\u043a\u0443. \u0422\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u0432\u043a\u043b\u0430\u0434\u043a\u0430 &#171;keys&#187;. \u0412\u043e\u0442 \u044d\u0442\u043e \u0432\u043e\u0442 \u0432\u0430\u043c \u0442\u0443\u0434\u0430 \u0432\u043e\u0442. <\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0435 \u043a\u043b\u044e\u0447, \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442\u0435 \u0438 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0435. <\/p>\n<p>\u0421\u043b\u043e\u0436\u043d\u043e? \u041d\u0435 \u0434\u0443\u043c\u0430\u044e. <\/p>\n<h2>\u0428\u0430\u0433 3. \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430. <\/h2>\n<p>C\u0435\u0440\u0434\u0446\u0435 \u043d\u0430\u0448\u0435\u0439 \u0443\u0442\u0438\u043b\u0438\u0442\u044b, \u0431\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043e\u043d\u043e \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0445\u043e\u0442\u044c \u043a\u0430\u043a-\u0442\u043e. \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0442\u0438\u043f\u0438\u0447\u043d\u0430\u044f \u0438 \u043f\u0440\u043e\u0441\u0442\u0430\u044f. \u041e\u043d\u0430 \u0434\u0435\u043b\u0430\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441 \u043a API \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0442\u0432\u0435\u0442.  \u042d\u0442\u043e \u044f\u0434\u0440\u043e \u043b\u043e\u0433\u0438\u043a\u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0432\u043d\u0435\u0448\u043d\u0438\u043c API \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0442\u0435\u043a\u0441\u0442\u0430.  <\/p>\n<pre><code class=\"go\">func (a *App) GenerateContent(messages []Message) (string, error) { \/\/ \u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0442\u0435\u043b\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0441 \u043c\u043e\u0434\u0435\u043b\u044c\u044e \u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438 reqBody := APIRequest{ Model:    a.Model, Messages: messages, }  \/\/ \u0421\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0442\u0435\u043b\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0432 JSON bodyBytes, err := json.Marshal(reqBody) if err != nil { return \"\", fmt.Errorf(\"\u043e\u0448\u0438\u0431\u043a\u0430 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f JSON: %w\", err) }  \/\/ \u0421\u043e\u0437\u0434\u0430\u0451\u043c HTTP POST-\u0437\u0430\u043f\u0440\u043e\u0441 \u043a API req, err := http.NewRequest(\"POST\", a.APIUrl, bytes.NewBuffer(bodyBytes)) if err != nil { return \"\", fmt.Errorf(\"\u043e\u0448\u0438\u0431\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430: %w\", err) }  \/\/ \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438: \u0442\u0438\u043f \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430 \u0438 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f req.Header.Set(\"Content-Type\", \"application\/json\") req.Header.Set(\"Authorization\", \"Bearer \"+a.APIKey)  \/\/ \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043e\u0442\u0432\u0435\u0442 resp, err := a.Client.Do(req) if err != nil { return \"\", fmt.Errorf(\"\u043e\u0448\u0438\u0431\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430: %w\", err) } defer resp.Body.Close()  \/\/ \u0427\u0438\u0442\u0430\u0435\u043c \u0442\u0435\u043b\u043e \u043e\u0442\u0432\u0435\u0442\u0430 respBytes, err := io.ReadAll(resp.Body) if err != nil { return \"\", fmt.Errorf(\"\u043e\u0448\u0438\u0431\u043a\u0430 \u0447\u0442\u0435\u043d\u0438\u044f \u043e\u0442\u0432\u0435\u0442\u0430: %w\", err) }  \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043f\u043e \u0441\u0442\u0430\u0442\u0443\u0441-\u043a\u043e\u0434\u0443 if resp.StatusCode != http.StatusOK { return \"\", fmt.Errorf(\"API \u0432\u0435\u0440\u043d\u0443\u043b \u043e\u0448\u0438\u0431\u043a\u0443 (\u0441\u0442\u0430\u0442\u0443\u0441 %d): %s\", resp.StatusCode, string(respBytes)) }  \/\/ \u0414\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u043c JSON-\u043e\u0442\u0432\u0435\u0442 \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 var result APIResponse if err := json.Unmarshal(respBytes, &amp;result); err != nil { return \"\", fmt.Errorf(\"\u043e\u0448\u0438\u0431\u043a\u0430 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0442\u0432\u0435\u0442\u0430: %w\", err) }  \/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u0430, \u0435\u0441\u043b\u0438 \u043e\u043d \u0435\u0441\u0442\u044c if len(result.Choices) &gt; 0 &amp;&amp; result.Choices[0].Message.Content != \"\" { return result.Choices[0].Message.Content, nil }  \/\/ \u0415\u0441\u043b\u0438 \u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d \u2014 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043e\u0448\u0438\u0431\u043a\u0443 return \"\", fmt.Errorf(\"API \u043d\u0435 \u0432\u0435\u0440\u043d\u0443\u043b \u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u0432 \u043e\u0442\u0432\u0435\u0442\u0435\") }<\/code><\/pre>\n<h2>\u0428\u0430\u0433 4. \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043e\u0442 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438. <\/h2>\n<p>\u041d\u0430\u043f\u0438\u0448\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0441\u043b\u043e\u0432\u0430 \u0432 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435. <\/p>\n<pre><code class=\"go\">func executeCommand(cmdStr string) (string, error) { cmd := exec.Command(\"powershell\", \"-NoProfile\", \"-Command\", cmdStr) output, err := cmd.CombinedOutput() \/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0432\u044b\u0432\u043e\u0434 \u0432 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0442.\u043a. \u0442\u0430\u043c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0442\u0435\u043a\u0441\u0442 \u043e\u0448\u0438\u0431\u043a\u0438 return strings.ToValidUTF8(string(output), \"\"), err }<\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>executeCommand<\/code> \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0447\u0435\u0440\u0435\u0437 PowerShell, \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0432\u0435\u0441\u044c \u0432\u044b\u0432\u043e\u0434 (\u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0438), \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0435\u0433\u043e \u0432 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u0443\u044e UTF-8 \u0441\u0442\u0440\u043e\u043a\u0443 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439 (\u0435\u0441\u043b\u0438 \u043e\u043d\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430). \u0414\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0430\u0441\u044c \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439, \u0442\u0435\u043a\u0441\u0442 \u0435\u0451 \u0432\u044b\u0432\u043e\u0434\u0430 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u2014 \u044d\u0442\u043e \u0432\u0430\u0436\u043d\u043e \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e. \u0415\u0441\u043b\u0438 \u0432 \u0432\u044b\u0432\u043e\u0434\u0435 \u0431\u0443\u0434\u0435\u0442 \u043a\u0438\u0440\u0438\u043b\u043b\u0438\u0446\u0430, \u0442\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0431\u0443\u0434\u0443\u0442 \u0431\u0438\u0442\u044b\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u043c \u0432\u0441\u0435 \u0432 UTF8. <\/p>\n<p>\u0412 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a \u044d\u0442\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u0438\u0434\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438. \u0417\u0430\u0447\u0435\u043c? \u042f \u043e\u0442\u0432\u0435\u0447\u0443 \u0437\u0430\u0447\u0435\u043c. \u0425\u043e\u0442\u044c \u043c\u044b \u0432 \u043f\u0440\u043e\u043c\u043f\u0442\u0435 \u044f\u0432\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c, \u0447\u0442\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u043d\u0430\u0434\u043e \u0441\u0440\u0430\u0437\u0443, \u043d\u043e \u043e\u0442 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438 \u043c\u044b \u043d\u0435 \u043b\u0438\u0448\u0435\u043d\u044b. \u041d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0431\u044b\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u0438\u0437-\u0437\u0430 \u0434\u043b\u0438\u043d\u044b \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043f\u0435\u0440\u0435\u0441\u0442\u0440\u0430\u0445\u043e\u0432\u044b\u0432\u0430\u0435\u043c\u0441\u044f. <\/p>\n<pre><code class=\"go\">func cleanCommand(cmdStr string) string { cmdStr = strings.TrimPrefix(cmdStr, \"```powershell\") cmdStr = strings.TrimPrefix(cmdStr, \"```bash\") cmdStr = strings.TrimPrefix(cmdStr, \"```\") cmdStr = strings.TrimSuffix(cmdStr, \"```\") cmdStr = strings.TrimPrefix(cmdStr, \"\u041a\u043e\u043c\u0430\u043d\u0434\u0430: \") cmdStr = strings.TrimPrefix(cmdStr, \"Command: \")  \/\/ \u0411\u043e\u043b\u0435\u0435 \u043d\u0430\u0434\u0435\u0436\u043d\u043e\u0435 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0438\u0437 `powershell -command \"...\"` if strings.HasPrefix(strings.ToLower(cmdStr), \"powershell -command \") { firstQuote := strings.Index(cmdStr, \"\\\"\") lastQuote := strings.LastIndex(cmdStr, \"\\\"\") if firstQuote != -1 &amp;&amp; lastQuote &gt; firstQuote { cmdStr = cmdStr[firstQuote+1 : lastQuote] } } return strings.TrimSpace(cmdStr) }<\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>cleanCommand<\/code> \u043e\u0447\u0438\u0449\u0430\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043e\u0442 \u043b\u0438\u0448\u043d\u0435\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043e\u0431\u0451\u0440\u0442\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u043b\u0438 \u0431\u044b\u0442\u044c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c\u044e. \u041e\u043d\u0430 \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u044b \u0432\u0440\u043e\u0434\u0435 <code>powershell`, bash, \"\u041a\u043e\u043c\u0430\u043d\u0434\u0430: \", \"Command: \", \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u0431\u0440\u0435\u0437\u0430\u0435\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u044e\u0449\u0438\u0435 <\/code>&#171;&#171;.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 <code>powershell -command \"...\"<\/code>,<\/p>\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-466160","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/466160","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=466160"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/466160\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=466160"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=466160"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=466160"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}