{"id":9333,"date":"2026-02-17T01:14:24","date_gmt":"2026-02-16T22:14:24","guid":{"rendered":"https:\/\/1.cbm.ua\/?p=9333"},"modified":"2026-02-18T11:33:37","modified_gmt":"2026-02-18T08:33:37","slug":"9333","status":"publish","type":"post","link":"https:\/\/1.cbm.ua\/?p=9333","title":{"rendered":"\u0422\u0417 \u0447\u0435\u0440\u043d\u044b\u0439."},"content":{"rendered":"\n<!DOCTYPE html>\n<html lang=\"ru\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>LinguaCompanion \u2014 \u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u0435 v1.0<\/title>\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=IBM+Plex+Sans:wght@300;400;500;600;700&#038;family=JetBrains+Mono:wght@400;500&#038;family=Playfair+Display:wght@700;800&#038;display=swap\" rel=\"stylesheet\">\n<style>\n:root {\n  --bg: #0F1117;\n  --bg-card: #161921;\n  --bg-card-alt: #1C1F2B;\n  --border: #2A2D3A;\n  --border-accent: #3B82F6;\n  --text: #E2E4EB;\n  --text-dim: #8B8FA3;\n  --text-muted: #5C6078;\n  --accent: #3B82F6;\n  --accent-glow: rgba(59, 130, 246, 0.15);\n  --accent2: #22D3EE;\n  --accent3: #A78BFA;\n  --success: #34D399;\n  --warning: #FBBF24;\n  --font-body: 'IBM Plex Sans', -apple-system, sans-serif;\n  --font-display: 'Playfair Display', Georgia, serif;\n  --font-mono: 'JetBrains Mono', monospace;\n}\n\n* { margin: 0; padding: 0; box-sizing: border-box; }\n\nbody {\n  background: var(--bg);\n  color: var(--text);\n  font-family: var(--font-body);\n  font-size: 15px;\n  line-height: 1.7;\n  -webkit-font-smoothing: antialiased;\n}\n\n\/* === PRINT === *\/\n@media print {\n  body { background: #fff; color: #1a1a1a; font-size: 11pt; }\n  .hero { background: #f5f7fa !important; min-height: auto !important; padding: 60px 40px !important; }\n  .hero h1 { color: #1B4F72 !important; -webkit-text-fill-color: #1B4F72 !important; font-size: 32pt !important; }\n  .hero .subtitle { color: #555 !important; }\n  .hero .meta-grid span { color: #333 !important; background: #eee !important; border-color: #ccc !important; }\n  .nav { display: none !important; }\n  section { break-inside: avoid; }\n  .card { background: #fff !important; border-color: #ddd !important; box-shadow: none !important; }\n  table th { background: #1B4F72 !important; }\n  table td { color: #1a1a1a !important; }\n  .toc { break-after: page; }\n}\n\n\/* === SCROLLBAR === *\/\n::-webkit-scrollbar { width: 6px; }\n::-webkit-scrollbar-track { background: var(--bg); }\n::-webkit-scrollbar-thumb { background: var(--border); border-radius: 3px; }\n\n\/* === NAVIGATION === *\/\n.nav {\n  position: fixed; top: 0; left: 0; right: 0; z-index: 100;\n  background: rgba(15, 17, 23, 0.85);\n  backdrop-filter: blur(20px);\n  border-bottom: 1px solid var(--border);\n  padding: 0 32px;\n  height: 56px;\n  display: flex; align-items: center; justify-content: space-between;\n  transition: transform 0.3s;\n}\n.nav-logo {\n  font-family: var(--font-mono);\n  font-size: 13px;\n  font-weight: 500;\n  color: var(--accent);\n  letter-spacing: 0.5px;\n}\n.nav-version {\n  font-family: var(--font-mono);\n  font-size: 11px;\n  color: var(--text-muted);\n  background: var(--bg-card);\n  padding: 4px 10px;\n  border-radius: 4px;\n  border: 1px solid var(--border);\n}\n\n\/* === HERO === *\/\n.hero {\n  min-height: 100vh;\n  display: flex; flex-direction: column; align-items: center; justify-content: center;\n  text-align: center;\n  padding: 120px 32px 80px;\n  position: relative;\n  overflow: hidden;\n  background: radial-gradient(ellipse 80% 50% at 50% -20%, rgba(59,130,246,0.08), transparent),\n              radial-gradient(ellipse 60% 40% at 80% 80%, rgba(167,139,250,0.05), transparent),\n              var(--bg);\n}\n.hero::before {\n  content: '';\n  position: absolute; inset: 0;\n  background: url(\"data:image\/svg+xml,%3Csvg width='60' height='60' xmlns='http:\/\/www.w3.org\/2000\/svg'%3E%3Cpath d='M0 0h60v60H0z' fill='none'\/%3E%3Cpath d='M30 0v60M0 30h60' stroke='%23ffffff' stroke-opacity='0.015'\/%3E%3C\/svg%3E\");\n  pointer-events: none;\n}\n.hero-badge {\n  font-family: var(--font-mono);\n  font-size: 11px;\n  letter-spacing: 2px;\n  text-transform: uppercase;\n  color: var(--accent);\n  background: var(--accent-glow);\n  border: 1px solid rgba(59,130,246,0.25);\n  padding: 6px 18px;\n  border-radius: 20px;\n  margin-bottom: 40px;\n  animation: fadeInUp 0.8s ease;\n}\n.hero h1 {\n  font-family: var(--font-display);\n  font-size: clamp(48px, 8vw, 96px);\n  font-weight: 800;\n  line-height: 1.05;\n  background: linear-gradient(135deg, #E2E4EB 0%, #3B82F6 50%, #22D3EE 100%);\n  -webkit-background-clip: text;\n  -webkit-text-fill-color: transparent;\n  background-clip: text;\n  margin-bottom: 24px;\n  animation: fadeInUp 0.8s ease 0.1s both;\n}\n.hero .subtitle {\n  font-size: 18px;\n  font-weight: 300;\n  color: var(--text-dim);\n  max-width: 560px;\n  line-height: 1.6;\n  animation: fadeInUp 0.8s ease 0.2s both;\n}\n.hero .meta-grid {\n  display: flex; gap: 12px; flex-wrap: wrap; justify-content: center;\n  margin-top: 48px;\n  animation: fadeInUp 0.8s ease 0.3s both;\n}\n.hero .meta-grid span {\n  font-family: var(--font-mono);\n  font-size: 12px;\n  color: var(--text-dim);\n  background: var(--bg-card);\n  border: 1px solid var(--border);\n  padding: 8px 16px;\n  border-radius: 6px;\n}\n\n@keyframes fadeInUp {\n  from { opacity: 0; transform: translateY(20px); }\n  to { opacity: 1; transform: translateY(0); }\n}\n\n\/* === TOC === *\/\n.toc {\n  max-width: 880px;\n  margin: 0 auto;\n  padding: 80px 32px 40px;\n}\n.toc h2 {\n  font-family: var(--font-display);\n  font-size: 28px;\n  margin-bottom: 32px;\n  color: var(--text);\n}\n.toc-list {\n  list-style: none;\n  display: grid;\n  gap: 2px;\n}\n.toc-list a {\n  display: flex;\n  align-items: center;\n  gap: 16px;\n  padding: 14px 20px;\n  color: var(--text-dim);\n  text-decoration: none;\n  border-radius: 8px;\n  transition: all 0.2s;\n  font-size: 14px;\n}\n.toc-list a:hover {\n  background: var(--bg-card);\n  color: var(--text);\n}\n.toc-list .num {\n  font-family: var(--font-mono);\n  font-size: 12px;\n  color: var(--accent);\n  min-width: 28px;\n}\n.toc-list .dots {\n  flex: 1;\n  border-bottom: 1px dashed var(--border);\n  margin: 0 8px;\n  min-width: 40px;\n}\n\n\/* === CONTENT === *\/\n.content {\n  max-width: 880px;\n  margin: 0 auto;\n  padding: 0 32px 120px;\n}\n\nsection {\n  margin-bottom: 64px;\n}\nsection > h2 {\n  font-family: var(--font-display);\n  font-size: 32px;\n  font-weight: 700;\n  color: var(--text);\n  margin-bottom: 8px;\n  padding-top: 80px;\n  position: relative;\n}\nsection > h2 .section-num {\n  font-family: var(--font-mono);\n  font-size: 13px;\n  font-weight: 500;\n  color: var(--accent);\n  display: block;\n  margin-bottom: 8px;\n  letter-spacing: 1px;\n}\n\nh3 {\n  font-size: 20px;\n  font-weight: 600;\n  color: var(--text);\n  margin: 40px 0 12px;\n}\nh3 .sub-num {\n  font-family: var(--font-mono);\n  font-size: 12px;\n  color: var(--accent2);\n  margin-right: 8px;\n}\n\nh4 {\n  font-size: 16px;\n  font-weight: 600;\n  color: var(--text);\n  margin: 28px 0 8px;\n}\n\np {\n  color: var(--text-dim);\n  margin-bottom: 16px;\n  max-width: 720px;\n}\n\n\/* === CARDS === *\/\n.card {\n  background: var(--bg-card);\n  border: 1px solid var(--border);\n  border-radius: 12px;\n  padding: 28px;\n  margin: 20px 0;\n  transition: border-color 0.2s;\n}\n.card:hover { border-color: rgba(59,130,246,0.3); }\n.card h4 { margin-top: 0; }\n\n\/* === TABLES === *\/\n.table-wrap {\n  overflow-x: auto;\n  margin: 20px 0;\n  border-radius: 12px;\n  border: 1px solid var(--border);\n}\ntable {\n  width: 100%;\n  border-collapse: collapse;\n  font-size: 14px;\n}\nth {\n  background: linear-gradient(135deg, #1B3A5C, #1B4F72);\n  color: #fff;\n  font-weight: 600;\n  font-size: 12px;\n  letter-spacing: 0.5px;\n  text-transform: uppercase;\n  text-align: left;\n  padding: 14px 18px;\n}\ntd {\n  padding: 12px 18px;\n  border-top: 1px solid var(--border);\n  color: var(--text-dim);\n}\ntr:nth-child(even) td {\n  background: rgba(255,255,255,0.015);\n}\ntr:hover td {\n  background: rgba(59,130,246,0.04);\n}\n\n\/* === LISTS === *\/\nul.styled {\n  list-style: none;\n  padding: 0;\n  margin: 16px 0;\n}\nul.styled li {\n  position: relative;\n  padding: 8px 0 8px 28px;\n  color: var(--text-dim);\n  font-size: 14px;\n}\nul.styled li::before {\n  content: '';\n  position: absolute;\n  left: 6px;\n  top: 15px;\n  width: 6px; height: 6px;\n  border-radius: 50%;\n  background: var(--accent);\n}\n\nol.styled {\n  list-style: none;\n  counter-reset: step;\n  padding: 0;\n  margin: 16px 0;\n}\nol.styled li {\n  position: relative;\n  padding: 10px 0 10px 40px;\n  color: var(--text-dim);\n  font-size: 14px;\n  counter-increment: step;\n}\nol.styled li::before {\n  content: counter(step);\n  position: absolute;\n  left: 0; top: 8px;\n  width: 26px; height: 26px;\n  background: var(--accent-glow);\n  border: 1px solid rgba(59,130,246,0.25);\n  border-radius: 6px;\n  display: flex; align-items: center; justify-content: center;\n  font-family: var(--font-mono);\n  font-size: 12px;\n  font-weight: 600;\n  color: var(--accent);\n}\n\n\/* === FILE TREE === *\/\n.file-tree {\n  font-family: var(--font-mono);\n  font-size: 13px;\n  line-height: 1.9;\n  background: var(--bg-card);\n  border: 1px solid var(--border);\n  border-radius: 12px;\n  padding: 24px 28px;\n  margin: 20px 0;\n  overflow-x: auto;\n  color: var(--text-dim);\n}\n.file-tree .dir { color: var(--accent); font-weight: 500; }\n.file-tree .comment { color: var(--text-muted); }\n\n\/* === FLOW DIAGRAM === *\/\n.flow {\n  display: flex; align-items: center; gap: 0;\n  flex-wrap: wrap;\n  margin: 16px 0;\n  font-size: 13px;\n}\n.flow-step {\n  background: var(--bg-card);\n  border: 1px solid var(--border);\n  padding: 8px 14px;\n  border-radius: 8px;\n  color: var(--text-dim);\n  font-family: var(--font-mono);\n  font-size: 12px;\n  white-space: nowrap;\n}\n.flow-arrow {\n  color: var(--accent);\n  font-size: 16px;\n  padding: 0 6px;\n}\n\n\/* === BADGES === *\/\n.badge {\n  display: inline-block;\n  font-family: var(--font-mono);\n  font-size: 11px;\n  padding: 3px 10px;\n  border-radius: 4px;\n  margin: 2px 4px 2px 0;\n}\n.badge-blue { background: rgba(59,130,246,0.12); color: #60A5FA; border: 1px solid rgba(59,130,246,0.2); }\n.badge-green { background: rgba(52,211,153,0.12); color: #34D399; border: 1px solid rgba(52,211,153,0.2); }\n.badge-purple { background: rgba(167,139,250,0.12); color: #A78BFA; border: 1px solid rgba(167,139,250,0.2); }\n.badge-yellow { background: rgba(251,191,36,0.12); color: #FBBF24; border: 1px solid rgba(251,191,36,0.2); }\n\n\/* === PHASE CARDS === *\/\n.phase {\n  border-left: 3px solid var(--accent);\n  padding-left: 24px;\n  margin: 24px 0;\n}\n.phase.phase-2 { border-color: var(--accent2); }\n.phase.phase-3 { border-color: var(--accent3); }\n.phase.phase-4 { border-color: var(--success); }\n.phase-label {\n  font-family: var(--font-mono);\n  font-size: 11px;\n  letter-spacing: 1.5px;\n  text-transform: uppercase;\n  margin-bottom: 6px;\n}\n.phase:nth-child(1) .phase-label { color: var(--accent); }\n.phase.phase-2 .phase-label { color: var(--accent2); }\n.phase.phase-3 .phase-label { color: var(--accent3); }\n.phase.phase-4 .phase-label { color: var(--success); }\n\n\/* === RESPONSIVE === *\/\n@media (max-width: 640px) {\n  .hero { padding: 100px 20px 60px; }\n  .hero .meta-grid { flex-direction: column; align-items: center; }\n  .content { padding: 0 20px 80px; }\n  section > h2 { font-size: 26px; }\n  .flow { gap: 4px; }\n  .flow-step { font-size: 11px; padding: 6px 10px; }\n  table { font-size: 12px; }\n  th, td { padding: 10px 12px; }\n}\n<\/style>\n<\/head>\n<body>\n\n<!-- NAV -->\n<nav class=\"nav\">\n  <div class=\"nav-logo\">LinguaCompanion<\/div>\n  <div class=\"nav-version\">\u0422\u0417 v1.0 \u00b7 16.02.2026<\/div>\n<\/nav>\n\n<!-- HERO -->\n<header class=\"hero\">\n  <div class=\"hero-badge\">\u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u0435<\/div>\n  <h1>Lingua<br>Companion<\/h1>\n  <p class=\"subtitle\">\u041c\u0443\u043b\u044c\u0442\u0438\u044f\u0437\u044b\u0447\u043d\u044b\u0439 \u0418\u0418-\u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442 \u0434\u043b\u044f \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f \u044f\u0437\u044b\u043a\u043e\u0432 \u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u0431\u0449\u0435\u043d\u0438\u0438<\/p>\n  <div class=\"meta-grid\">\n    <span>PWA<\/span>\n    <span>React + TypeScript<\/span>\n    <span>FastAPI<\/span>\n    <span>6 AI-\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u043e\u0432<\/span>\n    <span>5 \u044f\u0437\u044b\u043a\u043e\u0432<\/span>\n  <\/div>\n<\/header>\n\n<!-- TOC -->\n<div class=\"toc\">\n  <h2>\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435<\/h2>\n  <ol class=\"toc-list\">\n    <li><a href=\"#s1\"><span class=\"num\">01<\/span>\u041e\u0431\u0449\u0435\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430<span class=\"dots\"><\/span><\/a><\/li>\n    <li><a href=\"#s2\"><span class=\"num\">02<\/span>\u0420\u0435\u0436\u0438\u043c\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<span class=\"dots\"><\/span><\/a><\/li>\n    <li><a href=\"#s3\"><span class=\"num\">03<\/span>\u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u0442\u0435\u043a<span class=\"dots\"><\/span><\/a><\/li>\n    <li><a href=\"#s4\"><span class=\"num\">04<\/span>\u0410\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 \u043d\u0430\u0434 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430\u043c\u0438<span class=\"dots\"><\/span><\/a><\/li>\n    <li><a href=\"#s5\"><span class=\"num\">05<\/span>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430<span class=\"dots\"><\/span><\/a><\/li>\n    <li><a href=\"#s6\"><span class=\"num\">06<\/span>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u044f\u0437\u044b\u043a\u0438<span class=\"dots\"><\/span><\/a><\/li>\n    <li><a href=\"#s7\"><span class=\"num\">07<\/span>\u0425\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445<span class=\"dots\"><\/span><\/a><\/li>\n    <li><a href=\"#s8\"><span class=\"num\">08<\/span>\u0411\u044d\u043a\u0435\u043d\u0434 API<span class=\"dots\"><\/span><\/a><\/li>\n    <li><a href=\"#s9\"><span class=\"num\">09<\/span>\u041d\u0435\u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f<span class=\"dots\"><\/span><\/a><\/li>\n    <li><a href=\"#s10\"><span class=\"num\">10<\/span>\u0424\u0430\u0437\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438<span class=\"dots\"><\/span><\/a><\/li>\n    <li><a href=\"#s11\"><span class=\"num\">11<\/span>\u041f\u0440\u0438\u043d\u0446\u0438\u043f\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438<span class=\"dots\"><\/span><\/a><\/li>\n  <\/ol>\n<\/div>\n\n<!-- CONTENT -->\n<main class=\"content\">\n\n  <!-- 1 -->\n  <section id=\"s1\">\n    <h2><span class=\"section-num\">01<\/span>\u041e\u0431\u0449\u0435\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/h2>\n\n    <h3><span class=\"sub-num\">1.1<\/span>\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435<\/h3>\n    <p><strong>LinguaCompanion<\/strong> \u2014 \u043c\u0443\u043b\u044c\u0442\u0438\u044f\u0437\u044b\u0447\u043d\u044b\u0439 \u0418\u0418-\u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442 \u0434\u043b\u044f \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f \u044f\u0437\u044b\u043a\u043e\u0432 \u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u0431\u0449\u0435\u043d\u0438\u0438.<\/p>\n\n    <h3><span class=\"sub-num\">1.2<\/span>\u0426\u0435\u043b\u044c<\/h3>\n    <p>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 PWA-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u0434\u0432\u0443\u043c\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c\u0438 \u0440\u0435\u0436\u0438\u043c\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0435\u0437\u0434\u044b \u043d\u0430 \u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434\u0435, \u043f\u0440\u043e\u0433\u0443\u043b\u043e\u043a \u0438 \u0432 \u043f\u043e\u0432\u0441\u0435\u0434\u043d\u0435\u0432\u043d\u043e\u0439 \u0436\u0438\u0437\u043d\u0438. \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0441\u043d\u044f\u0442\u044c \u044f\u0437\u044b\u043a\u043e\u0432\u043e\u0439 \u0431\u0430\u0440\u044c\u0435\u0440 \u043f\u0440\u0438 \u043e\u0431\u0449\u0435\u043d\u0438\u0438 \u0441 \u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044f\u043c\u0438 \u044f\u0437\u044b\u043a\u0430 \u0438 \u043f\u043e\u043c\u043e\u0447\u044c \u0432 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0438 \u0438\u043d\u043e\u0441\u0442\u0440\u0430\u043d\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432.<\/p>\n\n    <h3><span class=\"sub-num\">1.3<\/span>\u0426\u0435\u043b\u0435\u0432\u0430\u044f \u0430\u0443\u0434\u0438\u0442\u043e\u0440\u0438\u044f<\/h3>\n    <ul class=\"styled\">\n      <li>\u0418\u0437\u0443\u0447\u0430\u044e\u0449\u0438\u0435 \u0438\u043d\u043e\u0441\u0442\u0440\u0430\u043d\u043d\u044b\u0435 \u044f\u0437\u044b\u043a\u0438 (\u043f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e \u0441\u0430\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a)<\/li>\n      <li>\u0421\u0442\u0443\u0434\u0435\u043d\u0442\u044b<\/li>\n      <li>\u041f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0438 \u043d\u043e\u0432\u043e\u0441\u0442\u0435\u0439 \u043d\u0430 \u0438\u043d\u043e\u0441\u0442\u0440\u0430\u043d\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445<\/li>\n      <li>\u041f\u043e\u0436\u0438\u043b\u044b\u0435 \u043b\u044e\u0434\u0438 \u0438 \u0434\u0435\u0442\u0438<\/li>\n      <li>\u041f\u0440\u0435\u0434\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u0438, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0435 \u0441 \u0438\u043d\u043e\u0441\u0442\u0440\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u0430\u0440\u0442\u043d\u0451\u0440\u0430\u043c\u0438<\/li>\n      <li>\u0418\u043c\u043c\u0438\u0433\u0440\u0430\u043d\u0442\u044b \u0432 \u0415\u0432\u0440\u043e\u043f\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043d\u0443\u0436\u043d\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u0432 \u043f\u043e\u0432\u0441\u0435\u0434\u043d\u0435\u0432\u043d\u043e\u043c \u043e\u0431\u0449\u0435\u043d\u0438\u0438<\/li>\n    <\/ul>\n\n    <h3><span class=\"sub-num\">1.4<\/span>\u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u0440\u044b\u043d\u043e\u043a<\/h3>\n    <p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e \u0415\u0432\u0440\u043e\u043f\u0430. \u0421\u0435\u0440\u0432\u0435\u0440\u044b \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u044e\u0442\u0441\u044f \u0432 \u0413\u0435\u0440\u043c\u0430\u043d\u0438\u0438 (Hetzner), \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c GDPR. \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u044f\u0437\u044b\u043a\u0438 \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438: \u0440\u0443\u0441\u0441\u043a\u0438\u0439, \u043d\u0435\u043c\u0435\u0446\u043a\u0438\u0439, \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0439, \u0438\u0441\u043f\u0430\u043d\u0441\u043a\u0438\u0439, \u0444\u0440\u0430\u043d\u0446\u0443\u0437\u0441\u043a\u0438\u0439. \u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043b\u0435\u0433\u043a\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u044f\u0437\u044b\u043a\u0438.<\/p>\n  <\/section>\n\n  <!-- 2 -->\n  <section id=\"s2\">\n    <h2><span class=\"section-num\">02<\/span>\u0420\u0435\u0436\u0438\u043c\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/h2>\n\n    <h3><span class=\"sub-num\">2.1<\/span>\u0420\u0435\u0436\u0438\u043c 1: \u0418\u0437\u0443\u0447\u0435\u043d\u0438\u0435 \u044f\u0437\u044b\u043a\u0430 + \u0418\u0418-\u0447\u0430\u0442<\/h3>\n    <p>\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043e\u0431\u0449\u0430\u0435\u0442\u0441\u044f \u0441 \u0418\u0418 \u0434\u043b\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438 \u0438\u043d\u043e\u0441\u0442\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430. \u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0442\u0440\u0438 \u043f\u043e\u0434\u0440\u0435\u0436\u0438\u043c\u0430 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f:<\/p>\n\n    <div class=\"card\">\n      <h4>2.1.1. \u0413\u043e\u043b\u043e\u0441\u043e\u0432\u043e\u0439 \u0440\u0435\u0436\u0438\u043c (\u0434\u043b\u044f \u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434\u0430)<\/h4>\n      <p>\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u0433\u043e\u043b\u043e\u0441\u043e\u043c, \u0418\u0418 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0433\u043e\u043b\u043e\u0441\u043e\u043c. \u0420\u0443\u043a\u0438 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b, \u044d\u043a\u0440\u0430\u043d \u043d\u0435 \u043d\u0443\u0436\u0435\u043d.<\/p>\n      <div class=\"flow\">\n        <span class=\"flow-step\">\u0413\u043e\u043b\u043e\u0441<\/span><span class=\"flow-arrow\">\u2192<\/span>\n        <span class=\"flow-step\">STT<\/span><span class=\"flow-arrow\">\u2192<\/span>\n        <span class=\"flow-step\">LLM<\/span><span class=\"flow-arrow\">\u2192<\/span>\n        <span class=\"flow-step\">TTS<\/span><span class=\"flow-arrow\">\u2192<\/span>\n        <span class=\"flow-step\">\u041e\u0442\u0432\u0435\u0442 \u0433\u043e\u043b\u043e\u0441\u043e\u043c<\/span>\n      <\/div>\n    <\/div>\n\n    <div class=\"card\">\n      <h4>2.1.2. \u0422\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u0440\u0435\u0436\u0438\u043c (\u043d\u0430 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430\u0445)<\/h4>\n      <p>\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u0438\u0448\u0435\u0442 \u0442\u0435\u043a\u0441\u0442, \u0418\u0418 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442\u043e\u043c \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0437\u0432\u0443\u0447\u0438\u0432\u0430\u043d\u0438\u044f. \u041c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0433\u043e\u043b\u043e\u0441\u043e\u0432\u043e\u0433\u043e \u0447\u0430\u0442\u0430, \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u044b, \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f.<\/p>\n    <\/div>\n\n    <div class=\"card\">\n      <h4>2.1.3. \u041f\u0430\u0441\u0441\u0438\u0432\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u043b\u0443\u0448\u0438\u0432\u0430\u043d\u0438\u0435<\/h4>\n      <p>\u0418\u0418 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0434\u0430\u0439\u0434\u0436\u0435\u0441\u0442 \u043d\u043e\u0432\u043e\u0441\u0442\u0435\u0439 \u043d\u0430 \u0438\u0437\u0443\u0447\u0430\u0435\u043c\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u0438 \u043e\u0437\u0432\u0443\u0447\u0438\u0432\u0430\u0435\u0442. \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0441\u043b\u0443\u0448\u0430\u0435\u0442 \u043a\u0430\u043a \u043f\u043e\u0434\u043a\u0430\u0441\u0442. \u0412 MVP \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u043d\u043e\u0432\u043e\u0441\u0442\u0435\u0439 \u2014 \u0418\u0418. \u041f\u043e\u0437\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f RSS.<\/p>\n    <\/div>\n\n    <h3><span class=\"sub-num\">2.2<\/span>\u0420\u0435\u0436\u0438\u043c 2: \u041f\u043e\u043c\u043e\u0449\u043d\u0438\u043a \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u0431\u0449\u0435\u043d\u0438\u0438<\/h3>\n    <p>\u041f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u043e\u0431\u0449\u0430\u0442\u044c\u0441\u044f \u0441 \u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044f\u043c\u0438 \u044f\u0437\u044b\u043a\u0430 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f\u0445: \u0437\u0432\u043e\u043d\u043a\u0438 \u0432 \u0431\u043e\u043b\u044c\u043d\u0438\u0446\u0443, \u0440\u0430\u0431\u043e\u0442\u043e\u0434\u0430\u0442\u0435\u043b\u044e, \u0433\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0443\u0447\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u044f \u0438 \u0442.\u0434.<\/p>\n\n    <div class=\"card\">\n      <h4>2.2.1. MVP: \u0422\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u0447\u0430\u0442 \u0441 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u043c<\/h4>\n      <p>\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u0438\u0448\u0435\u0442 \u0438\u043b\u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043d\u0430 \u0440\u043e\u0434\u043d\u043e\u043c \u044f\u0437\u044b\u043a\u0435, \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442 \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u043d\u0430 \u0438\u043d\u043e\u0441\u0442\u0440\u0430\u043d\u043d\u043e\u043c. \u041c\u043e\u0436\u043d\u043e \u043e\u0437\u0432\u0443\u0447\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u0447\u0435\u0440\u0435\u0437 TTS. \u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u0433\u043e\u043b\u043e\u0441\u043e\u0432\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043d\u0438\u043a\u0430 \u0447\u0435\u0440\u0435\u0437 \u043c\u0438\u043a\u0440\u043e\u0444\u043e\u043d, \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0442\u044c (STT) \u0438 \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438.<\/p>\n      <div class=\"flow\">\n        <span class=\"flow-step\">\u0412\u0432\u043e\u0434 (\u0442\u0435\u043a\u0441\u0442\/\u0433\u043e\u043b\u043e\u0441)<\/span><span class=\"flow-arrow\">\u2192<\/span>\n        <span class=\"flow-step\">[STT]<\/span><span class=\"flow-arrow\">\u2192<\/span>\n        <span class=\"flow-step\">\u041f\u0435\u0440\u0435\u0432\u043e\u0434<\/span><span class=\"flow-arrow\">\u2192<\/span>\n        <span class=\"flow-step\">[TTS]<\/span><span class=\"flow-arrow\">\u2192<\/span>\n        <span class=\"flow-step\">\u041e\u0437\u0432\u0443\u0447\u043a\u0430<\/span>\n      <\/div>\n    <\/div>\n\n    <div class=\"card\" style=\"opacity: 0.6;\">\n      <h4>2.2.2. \u0411\u0443\u0434\u0443\u0449\u0435\u0435: \u041c\u0438\u043a\u0440\u043e\u0444\u043e\u043d \u0434\u043b\u044f \u0436\u0438\u0432\u043e\u0433\u043e \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440\u0430<\/h4>\n      <p>\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u043b\u0443\u0448\u0430\u0435\u0442 \u0436\u0438\u0432\u043e\u0439 \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440 \u0447\u0435\u0440\u0435\u0437 \u043c\u0438\u043a\u0440\u043e\u0444\u043e\u043d \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430, \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 STT \u0438 \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435, \u043e\u0437\u0432\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u0447\u0435\u0440\u0435\u0437 TTS.<\/p>\n      <span class=\"badge badge-yellow\">\u0424\u0430\u0437\u0430 3<\/span>\n    <\/div>\n\n    <div class=\"card\" style=\"opacity: 0.6;\">\n      <h4>2.2.3. \u0411\u0443\u0434\u0443\u0449\u0435\u0435: VoIP\/WebRTC \u0437\u0432\u043e\u043d\u043a\u0438<\/h4>\n      <p>\u0417\u0432\u043e\u043d\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u043c \u0432 \u043e\u0431\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u044b.<\/p>\n      <span class=\"badge badge-yellow\">\u0424\u0430\u0437\u0430 3<\/span>\n    <\/div>\n  <\/section>\n\n  <!-- 3 -->\n  <section id=\"s3\">\n    <h2><span class=\"section-num\">03<\/span>\u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u0442\u0435\u043a<\/h2>\n\n    <h3><span class=\"sub-num\">3.1<\/span>\u0424\u0440\u043e\u043d\u0442\u0435\u043d\u0434<\/h3>\n    <div class=\"table-wrap\">\n      <table>\n        <thead><tr><th>\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442<\/th><th>\u0422\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f<\/th><th>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435<\/th><\/tr><\/thead>\n        <tbody>\n          <tr><td>\u0424\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a<\/td><td>React + TypeScript<\/td><td>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043b\u0451\u0433\u043a\u043e\u0439 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u043d\u0430 Vue<\/td><\/tr>\n          <tr><td>\u0422\u0438\u043f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/td><td>PWA<\/td><td>Service Worker, \u043e\u0444\u043b\u0430\u0439\u043d-\u043a\u044d\u0448<\/td><\/tr>\n          <tr><td>\u0421\u0431\u043e\u0440\u0449\u0438\u043a<\/td><td>Vite<\/td><td>\u0411\u044b\u0441\u0442\u0440\u0430\u044f \u0441\u0431\u043e\u0440\u043a\u0430, HMR<\/td><\/tr>\n          <tr><td>\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435<\/td><td>IndexedDB (Dexie.js)<\/td><td>\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c<\/td><\/tr>\n          <tr><td>\u0425\u043e\u0441\u0442\u0438\u043d\u0433<\/td><td>Vercel<\/td><td>CDN, \u0435\u0432\u0440\u043e\u043f\u0435\u0439\u0441\u043a\u0438\u0435 edge-\u0441\u0435\u0440\u0432\u0435\u0440\u044b<\/td><\/tr>\n        <\/tbody>\n      <\/table>\n    <\/div>\n\n    <h3><span class=\"sub-num\">3.2<\/span>\u0411\u044d\u043a\u0435\u043d\u0434<\/h3>\n    <div class=\"table-wrap\">\n      <table>\n        <thead><tr><th>\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442<\/th><th>\u0422\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f<\/th><th>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435<\/th><\/tr><\/thead>\n        <tbody>\n          <tr><td>\u042f\u0437\u044b\u043a<\/td><td>Python<\/td><td><\/td><\/tr>\n          <tr><td>\u0424\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a<\/td><td>FastAPI<\/td><td>Async, \u0430\u0432\u0442\u043e-\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f OpenAPI<\/td><\/tr>\n          <tr><td>\u0411\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445<\/td><td>PostgreSQL<\/td><td>\u041d\u0430 Hetzner VPS<\/td><\/tr>\n          <tr><td>ORM<\/td><td>SQLAlchemy + Alembic<\/td><td>\u041c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u0411\u0414<\/td><\/tr>\n          <tr><td>\u0425\u043e\u0441\u0442\u0438\u043d\u0433<\/td><td>Hetzner VPS (\u0413\u0435\u0440\u043c\u0430\u043d\u0438\u044f)<\/td><td>GDPR-compliant, \u043e\u0442 4\u20ac\/\u043c\u0435\u0441<\/td><\/tr>\n        <\/tbody>\n      <\/table>\n    <\/div>\n  <\/section>\n\n  <!-- 4 -->\n  <section id=\"s4\">\n    <h2><span class=\"section-num\">04<\/span>\u0410\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 \u043d\u0430\u0434 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430\u043c\u0438<\/h2>\n    <p>\u042f\u0434\u0440\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u2014 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a-\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043d\u0430 \u0447\u0438\u0441\u0442\u043e\u043c TypeScript. \u041d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 React\/Vue. \u042d\u0442\u043e 70-80% \u0432\u0441\u0435\u0439 \u043b\u043e\u0433\u0438\u043a\u0438. \u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0435\u0434\u0438\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u043e\u0432 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0438.<\/p>\n\n    <h3><span class=\"sub-num\">4.1<\/span>AI Chat \u2014 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f \u043d\u0430\u0434 LLM<\/h3>\n    <div class=\"table-wrap\">\n      <table>\n        <thead><tr><th>\u041f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440<\/th><th>\u041c\u043e\u0434\u0435\u043b\u0438<\/th><th>\u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438<\/th><\/tr><\/thead>\n        <tbody>\n          <tr><td>OpenAI<\/td><td>GPT-4o, GPT-4o-mini<\/td><td>\u0421\u0430\u043c\u044b\u0439 \u0448\u0438\u0440\u043e\u043a\u0438\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b<\/td><\/tr>\n          <tr><td>Anthropic<\/td><td>Claude Sonnet, Claude Haiku<\/td><td>\u041b\u0443\u0447\u0448\u0438\u0439 \u0434\u043b\u044f \u0434\u043b\u0438\u043d\u043d\u044b\u0445 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432<\/td><\/tr>\n          <tr><td>Google<\/td><td>Gemini Pro, Gemini Flash<\/td><td>\u0411\u044b\u0441\u0442\u0440\u044b\u0439, \u043c\u0443\u043b\u044c\u0442\u0438\u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0439<\/td><\/tr>\n          <tr><td>Mistral<\/td><td>Mistral Large, Mistral Small<\/td><td>\u0415\u0432\u0440\u043e\u043f\u0435\u0439\u0441\u043a\u0438\u0439 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 (GDPR)<\/td><\/tr>\n          <tr><td>Qwen<\/td><td>Qwen 2.5<\/td><td>\u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440<\/td><\/tr>\n          <tr><td>AssemblyAI<\/td><td>LeMUR<\/td><td>\u0421\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430 \u0430\u0443\u0434\u0438\u043e<\/td><\/tr>\n        <\/tbody>\n      <\/table>\n    <\/div>\n    <p>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441: <code>IChatProvider<\/code> \u0441 \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 <code>sendMessage()<\/code>, <code>streamMessage()<\/code>, <code>getModels()<\/code>. \u0412\u044b\u0431\u043e\u0440 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430 \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0438\u043b\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.<\/p>\n\n    <h3><span class=\"sub-num\">4.2<\/span>STT \u2014 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f \u043d\u0430\u0434 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u0435\u043c \u0440\u0435\u0447\u0438<\/h3>\n    <div class=\"table-wrap\">\n      <table>\n        <thead><tr><th>\u041f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440<\/th><th>\u0422\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f<\/th><th>\u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438<\/th><\/tr><\/thead>\n        <tbody>\n          <tr><td>AssemblyAI<\/td><td>Universal-2<\/td><td>\u041b\u0443\u0447\u0448\u0430\u044f \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c, real-time<\/td><\/tr>\n          <tr><td>OpenAI<\/td><td>Whisper API<\/td><td>\u0425\u043e\u0440\u043e\u0448\u0435\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e, \u043c\u043d\u043e\u0433\u043e\u044f\u0437\u044b\u0447\u043d\u044b\u0439<\/td><\/tr>\n          <tr><td>Google<\/td><td>Cloud Speech-to-Text<\/td><td>\u041d\u0438\u0437\u043a\u0430\u044f \u043b\u0430\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c<\/td><\/tr>\n          <tr><td>\u0411\u0440\u0430\u0443\u0437\u0435\u0440 <span class=\"badge badge-yellow\">\u0431\u0443\u0434\u0443\u0449\u0435\u0435<\/span><\/td><td>Web Speech API<\/td><td>\u041e\u0444\u043b\u0430\u0439\u043d-\u0444\u043e\u043b\u0431\u044d\u043a<\/td><\/tr>\n        <\/tbody>\n      <\/table>\n    <\/div>\n    <p>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441: <code>ISTTProvider<\/code> \u0441 \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 <code>transcribe(audio)<\/code>, <code>startStreaming()<\/code>, <code>stopStreaming()<\/code>, <code>onPartialResult()<\/code>.<\/p>\n\n    <h3><span class=\"sub-num\">4.3<\/span>TTS \u2014 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f \u043d\u0430\u0434 \u0441\u0438\u043d\u0442\u0435\u0437\u043e\u043c \u0440\u0435\u0447\u0438<\/h3>\n    <div class=\"table-wrap\">\n      <table>\n        <thead><tr><th>\u041f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440<\/th><th>\u0422\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f<\/th><th>\u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438<\/th><\/tr><\/thead>\n        <tbody>\n          <tr><td>OpenAI<\/td><td>TTS API (tts-1, tts-1-hd)<\/td><td>\u0421\u0430\u043c\u044b\u0435 \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u044b\u0435 \u0433\u043e\u043b\u043e\u0441\u0430<\/td><\/tr>\n          <tr><td>Google<\/td><td>Cloud Text-to-Speech<\/td><td>\u041c\u043d\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u043e\u0432 \u0438 \u0433\u043e\u043b\u043e\u0441\u043e\u0432<\/td><\/tr>\n          <tr><td>\u0411\u0440\u0430\u0443\u0437\u0435\u0440 (\u0444\u043e\u043b\u0431\u044d\u043a)<\/td><td>SpeechSynthesis API<\/td><td>\u0411\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e, \u043e\u0444\u043b\u0430\u0439\u043d<\/td><\/tr>\n        <\/tbody>\n      <\/table>\n    <\/div>\n    <p>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441: <code>ITTSProvider<\/code> \u0441 \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 <code>speak(text, lang, voice)<\/code>, <code>stop()<\/code>, <code>getVoices(lang)<\/code>. \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0444\u043e\u043b\u0431\u044d\u043a \u043d\u0430 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043d\u044b\u0439 SpeechSynthesis \u043f\u0440\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u043b\u0430\u043a\u0430.<\/p>\n\n    <h3><span class=\"sub-num\">4.4<\/span>Translation \u2014 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f \u043d\u0430\u0434 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u043c<\/h3>\n    <div class=\"table-wrap\">\n      <table>\n        <thead><tr><th>\u041f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440<\/th><th>\u0422\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f<\/th><th>\u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438<\/th><\/tr><\/thead>\n        <tbody>\n          <tr><td>DeepL<\/td><td>DeepL API<\/td><td>\u041b\u0443\u0447\u0448\u0435\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u0435\u0432\u0440\u043e\u043f\u0435\u0439\u0441\u043a\u0438\u0445 \u044f\u0437\u044b\u043a\u043e\u0432<\/td><\/tr>\n          <tr><td>LLM<\/td><td>Claude \/ GPT \/ Gemini<\/td><td>\u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0432\u043e\u0434, \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u044f<\/td><\/tr>\n          <tr><td>Google<\/td><td>Google Translate API<\/td><td>\u0428\u0438\u0440\u043e\u043a\u0438\u0439 \u044f\u0437\u044b\u043a\u043e\u0432\u043e\u0439 \u043e\u0445\u0432\u0430\u0442<\/td><\/tr>\n        <\/tbody>\n      <\/table>\n    <\/div>\n    <p>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441: <code>ITranslationProvider<\/code> \u0441 \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 <code>translate(text, from, to)<\/code>, <code>detectLanguage(text)<\/code>, <code>getSupportedLanguages()<\/code>.<\/p>\n  <\/section>\n\n  <!-- 5 -->\n  <section id=\"s5\">\n    <h2><span class=\"section-num\">05<\/span>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430<\/h2>\n\n    <h3><span class=\"sub-num\">5.1<\/span>\u041f\u0440\u0438\u043d\u0446\u0438\u043f \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f<\/h3>\n    <p>\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f \u043d\u0430 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u0447\u0451\u0442\u043a\u043e\u0433\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u0434\u0432\u0430 \u0441\u043b\u043e\u044f:<\/p>\n    <ul class=\"styled\">\n      <li><strong>Core-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430<\/strong> (\u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a-\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a) \u2014 \u0432\u0441\u044f \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0430, \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 \u043d\u0430\u0434 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430\u043c\u0438, \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438. \u041d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 React\/Vue. ~70-80% \u043a\u043e\u0434\u0430.<\/li>\n      <li><strong>UI-\u0441\u043b\u043e\u0439<\/strong> (React) \u2014 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b, \u0445\u0443\u043a\u0438, \u0440\u043e\u0443\u0442\u0438\u043d\u0433. ~20-30% \u043a\u043e\u0434\u0430. \u041f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 Vue \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f core.<\/li>\n    <\/ul>\n\n    <h3><span class=\"sub-num\">5.2<\/span>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/h3>\n    <div class=\"file-tree\">\n<span class=\"dir\">lingua-companion\/<\/span>\n\u251c\u2500\u2500 <span class=\"dir\">packages\/<\/span>\n\u2502   \u251c\u2500\u2500 <span class=\"dir\">core\/<\/span>            <span class=\"comment\">\u2014 \u0424\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a-\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430<\/span>\n\u2502   \u2502   \u251c\u2500\u2500 <span class=\"dir\">providers\/<\/span>   <span class=\"comment\">\u2014 \u0410\u0434\u0430\u043f\u0442\u0435\u0440\u044b AI, STT, TTS, Translation<\/span>\n\u2502   \u2502   \u251c\u2500\u2500 <span class=\"dir\">services\/<\/span>    <span class=\"comment\">\u2014 ChatService, TranslationService, NewsService<\/span>\n\u2502   \u2502   \u251c\u2500\u2500 <span class=\"dir\">interfaces\/<\/span>  <span class=\"comment\">\u2014 TypeScript \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b<\/span>\n\u2502   \u2502   \u2514\u2500\u2500 <span class=\"dir\">utils\/<\/span>       <span class=\"comment\">\u2014 \u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/span>\n\u2502   \u251c\u2500\u2500 <span class=\"dir\">react-ui\/<\/span>         <span class=\"comment\">\u2014 React-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0438 \u0445\u0443\u043a\u0438<\/span>\n\u2502   \u2514\u2500\u2500 <span class=\"dir\">shared\/<\/span>           <span class=\"comment\">\u2014 \u041e\u0431\u0449\u0438\u0435 \u0442\u0438\u043f\u044b \u0438 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b<\/span>\n\u251c\u2500\u2500 <span class=\"dir\">apps\/<\/span>\n\u2502   \u251c\u2500\u2500 <span class=\"dir\">web\/<\/span>              <span class=\"comment\">\u2014 PWA-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 (React + Vite)<\/span>\n\u2502   \u2514\u2500\u2500 <span class=\"dir\">server\/<\/span>           <span class=\"comment\">\u2014 FastAPI \u0431\u044d\u043a\u0435\u043d\u0434<\/span>\n\u2514\u2500\u2500 <span class=\"dir\">docs\/<\/span>                 <span class=\"comment\">\u2014 \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/span>\n    <\/div>\n\n    <h3><span class=\"sub-num\">5.3<\/span>\u041f\u043e\u0442\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445<\/h3>\n\n    <div class=\"card\">\n      <h4>\u0413\u043e\u043b\u043e\u0441\u043e\u0432\u043e\u0439 \u0440\u0435\u0436\u0438\u043c<\/h4>\n      <div class=\"flow\">\n        <span class=\"flow-step\">\u041c\u0438\u043a\u0440\u043e\u0444\u043e\u043d<\/span><span class=\"flow-arrow\">\u2192<\/span>\n        <span class=\"flow-step\">AudioCapture<\/span><span class=\"flow-arrow\">\u2192<\/span>\n        <span class=\"flow-step\">STTProvider<\/span><span class=\"flow-arrow\">\u2192<\/span>\n        <span class=\"flow-step\">\u0422\u0435\u043a\u0441\u0442<\/span><span class=\"flow-arrow\">\u2192<\/span>\n        <span class=\"flow-step\">ChatProvider<\/span><span class=\"flow-arrow\">\u2192<\/span>\n        <span class=\"flow-step\">\u041e\u0442\u0432\u0435\u0442<\/span><span class=\"flow-arrow\">\u2192<\/span>\n        <span class=\"flow-step\">TTSProvider<\/span><span class=\"flow-arrow\">\u2192<\/span>\n        <span class=\"flow-step\">\ud83d\udd0a<\/span>\n      <\/div>\n    <\/div>\n\n    <div class=\"card\">\n      <h4>\u041f\u0435\u0440\u0435\u0432\u043e\u0434\u0447\u0438\u043a<\/h4>\n      <div class=\"flow\">\n        <span class=\"flow-step\">\u0412\u0432\u043e\u0434 (\u0442\u0435\u043a\u0441\u0442\/\u0433\u043e\u043b\u043e\u0441)<\/span><span class=\"flow-arrow\">\u2192<\/span>\n        <span class=\"flow-step\">[STT]<\/span><span class=\"flow-arrow\">\u2192<\/span>\n        <span class=\"flow-step\">TranslationProvider<\/span><span class=\"flow-arrow\">\u2192<\/span>\n        <span class=\"flow-step\">\u041f\u0435\u0440\u0435\u0432\u043e\u0434<\/span><span class=\"flow-arrow\">\u2192<\/span>\n        <span class=\"flow-step\">[TTS]<\/span><span class=\"flow-arrow\">\u2192<\/span>\n        <span class=\"flow-step\">\ud83d\udd0a<\/span>\n      <\/div>\n    <\/div>\n\n    <div class=\"card\">\n      <h4>\u041d\u043e\u0432\u043e\u0441\u0442\u0438<\/h4>\n      <div class=\"flow\">\n        <span class=\"flow-step\">ChatProvider<\/span><span class=\"flow-arrow\">\u2192<\/span>\n        <span class=\"flow-step\">\u0414\u0430\u0439\u0434\u0436\u0435\u0441\u0442<\/span><span class=\"flow-arrow\">\u2192<\/span>\n        <span class=\"flow-step\">TTSProvider<\/span><span class=\"flow-arrow\">\u2192<\/span>\n        <span class=\"flow-step\">\u0410\u0443\u0434\u0438\u043e\u043f\u043e\u0442\u043e\u043a \ud83c\udfa7<\/span>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <!-- 6 -->\n  <section id=\"s6\">\n    <h2><span class=\"section-num\">06<\/span>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u044f\u0437\u044b\u043a\u0438<\/h2>\n    <div class=\"table-wrap\">\n      <table>\n        <thead><tr><th>\u042f\u0437\u044b\u043a<\/th><th>\u041a\u043e\u0434<\/th><th>\u0420\u043e\u043b\u044c \u0432 MVP<\/th><\/tr><\/thead>\n        <tbody>\n          <tr><td>\u0420\u0443\u0441\u0441\u043a\u0438\u0439<\/td><td><code>ru<\/code><\/td><td>\u0420\u043e\u0434\u043d\u043e\u0439 \u044f\u0437\u044b\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f<\/td><\/tr>\n          <tr><td>\u041d\u0435\u043c\u0435\u0446\u043a\u0438\u0439<\/td><td><code>de<\/code><\/td><td>\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0438\u0437\u0443\u0447\u0430\u0435\u043c\u044b\u0439<\/td><\/tr>\n          <tr><td>\u0410\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0439<\/td><td><code>en<\/code><\/td><td>\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439<\/td><\/tr>\n          <tr><td>\u0418\u0441\u043f\u0430\u043d\u0441\u043a\u0438\u0439<\/td><td><code>es<\/code><\/td><td>\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439<\/td><\/tr>\n          <tr><td>\u0424\u0440\u0430\u043d\u0446\u0443\u0437\u0441\u043a\u0438\u0439<\/td><td><code>fr<\/code><\/td><td>\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439<\/td><\/tr>\n        <\/tbody>\n      <\/table>\n    <\/div>\n    <p>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430.<\/p>\n  <\/section>\n\n  <!-- 7 -->\n  <section id=\"s7\">\n    <h2><span class=\"section-num\">07<\/span>\u0425\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445<\/h2>\n\n    <h3><span class=\"sub-num\">7.1<\/span>\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 (IndexedDB)<\/h3>\n    <ul class=\"styled\">\n      <li>\u0418\u0441\u0442\u043e\u0440\u0438\u044f \u0447\u0430\u0442\u043e\u0432 \u0441 \u0418\u0418<\/li>\n      <li>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f (\u044f\u0437\u044b\u043a\u0438, \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u044b, \u0433\u043e\u043b\u043e\u0441\u0430)<\/li>\n      <li>\u0418\u0441\u0442\u043e\u0440\u0438\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u0432<\/li>\n      <li>\u041f\u0440\u043e\u0433\u0440\u0435\u0441\u0441 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f<\/li>\n      <li>\u041a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0430\u0443\u0434\u0438\u043e-\u043e\u0442\u0432\u0435\u0442\u044b TTS<\/li>\n    <\/ul>\n\n    <h3><span class=\"sub-num\">7.2<\/span>\u0421\u0435\u0440\u0432\u0435\u0440\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 (PostgreSQL)<\/h3>\n    <ul class=\"styled\">\n      <li>\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u0435\u0436\u0434\u0443 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438<\/li>\n      <li>\u0410\u0433\u0440\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f<\/li>\n      <li>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043a \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c\u0443 \u0440\u0435\u0436\u0438\u043c\u0443<\/li>\n    <\/ul>\n\n    <h3><span class=\"sub-num\">7.3<\/span>\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f<\/h3>\n    <p>\u0412 MVP \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 (\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043b\u0438\u0447\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f). \u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0431\u044d\u043a\u0435\u043d\u0434\u0430 \u0437\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 middleware \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 MVP \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0432\u0441\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b. \u041f\u043e\u0437\u0436\u0435: JWT-\u0442\u043e\u043a\u0435\u043d\u044b, OAuth2, \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f.<\/p>\n  <\/section>\n\n  <!-- 8 -->\n  <section id=\"s8\">\n    <h2><span class=\"section-num\">08<\/span>\u0411\u044d\u043a\u0435\u043d\u0434 API<\/h2>\n    <p>\u0412\u0441\u0435 API-\u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043a \u0432\u043d\u0435\u0448\u043d\u0438\u043c \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430\u043c \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442 \u0447\u0435\u0440\u0435\u0437 \u0431\u044d\u043a\u0435\u043d\u0434 (\u043f\u0440\u043e\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 API-\u043a\u043b\u044e\u0447\u0435\u0439).<\/p>\n    <div class=\"table-wrap\">\n      <table>\n        <thead><tr><th>\u042d\u043d\u0434\u043f\u043e\u0439\u043d\u0442<\/th><th>\u041c\u0435\u0442\u043e\u0434<\/th><th>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/th><\/tr><\/thead>\n        <tbody>\n          <tr><td><code>\/api\/chat<\/code><\/td><td><span class=\"badge badge-blue\">POST<\/span><\/td><td>\u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 LLM (streaming)<\/td><\/tr>\n          <tr><td><code>\/api\/stt<\/code><\/td><td><span class=\"badge badge-blue\">POST<\/span><\/td><td>\u0420\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u0447\u0438 (audio \u2192 text)<\/td><\/tr>\n          <tr><td><code>\/api\/tts<\/code><\/td><td><span class=\"badge badge-blue\">POST<\/span><\/td><td>\u0421\u0438\u043d\u0442\u0435\u0437 \u0440\u0435\u0447\u0438 (text \u2192 audio)<\/td><\/tr>\n          <tr><td><code>\/api\/translate<\/code><\/td><td><span class=\"badge badge-blue\">POST<\/span><\/td><td>\u041f\u0435\u0440\u0435\u0432\u043e\u0434 \u0442\u0435\u043a\u0441\u0442\u0430<\/td><\/tr>\n          <tr><td><code>\/api\/news<\/code><\/td><td><span class=\"badge badge-green\">GET<\/span><\/td><td>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u0430\u0439\u0434\u0436\u0435\u0441\u0442\u0430 \u043d\u043e\u0432\u043e\u0441\u0442\u0435\u0439<\/td><\/tr>\n          <tr><td><code>\/api\/sync<\/code><\/td><td><span class=\"badge badge-purple\">POST\/GET<\/span><\/td><td>\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445<\/td><\/tr>\n          <tr><td><code>\/api\/health<\/code><\/td><td><span class=\"badge badge-green\">GET<\/span><\/td><td>\u0417\u0434\u043e\u0440\u043e\u0432\u044c\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u0430<\/td><\/tr>\n        <\/tbody>\n      <\/table>\n    <\/div>\n  <\/section>\n\n  <!-- 9 -->\n  <section id=\"s9\">\n    <h2><span class=\"section-num\">09<\/span>\u041d\u0435\u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f<\/h2>\n    <ul class=\"styled\">\n      <li><strong>GDPR:<\/strong> \u0434\u0430\u043d\u043d\u044b\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u0413\u0435\u0440\u043c\u0430\u043d\u0438\u0438 (Hetzner), \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0431\u043e\u0440 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445<\/li>\n      <li><strong>\u041b\u0430\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c:<\/strong> \u043e\u0442\u0432\u0435\u0442 STT &lt; 2\u0441, TTS &lt; 1.5\u0441, \u043f\u0435\u0440\u0435\u0432\u043e\u0434 &lt; 1\u0441 \u0434\u043b\u044f \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0445 \u0444\u0440\u0430\u0437<\/li>\n      <li><strong>\u041e\u0444\u043b\u0430\u0439\u043d:<\/strong> \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043e\u0444\u043b\u0430\u0439\u043d, \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0431\u0435\u0437 \u0441\u0435\u0442\u0438<\/li>\n      <li><strong>\u041c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c:<\/strong> \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u0434 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0434\u043d\u043e\u0439 \u0440\u0443\u043a\u043e\u0439, \u043a\u0440\u0443\u043f\u043d\u044b\u0435 \u043a\u043d\u043e\u043f\u043a\u0438<\/li>\n      <li><strong>\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c:<\/strong> API-\u043a\u043b\u044e\u0447\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435, HTTPS, CORS<\/li>\n      <li><strong>\u041c\u0438\u0433\u0440\u0430\u0446\u0438\u044f:<\/strong> \u043a\u043e\u0434 \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0439 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 UI-\u0441\u043b\u043e\u044f \u0441 React \u043d\u0430 Vue<\/li>\n    <\/ul>\n  <\/section>\n\n  <!-- 10 -->\n  <section id=\"s10\">\n    <h2><span class=\"section-num\">10<\/span>\u0424\u0430\u0437\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438<\/h2>\n\n    <div class=\"phase\">\n      <div class=\"phase-label\">\u0424\u0430\u0437\u0430 1 \u2014 MVP<\/div>\n      <ol class=\"styled\">\n        <li>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043c\u043e\u043d\u043e\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u0438 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b<\/li>\n        <li>Core-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430: \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b + \u0430\u0434\u0430\u043f\u0442\u0435\u0440\u044b \u0434\u043b\u044f AI, STT, TTS, Translation<\/li>\n        <li>FastAPI \u0431\u044d\u043a\u0435\u043d\u0434 \u0441 \u043f\u0440\u043e\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c API<\/li>\n        <li>\u0420\u0435\u0436\u0438\u043c 1: \u0418\u0418-\u0447\u0430\u0442 (\u0433\u043e\u043b\u043e\u0441 + \u0442\u0435\u043a\u0441\u0442)<\/li>\n        <li>\u0420\u0435\u0436\u0438\u043c 2: \u0422\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u0447\u0430\u0442 \u0441 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u043c + \u0433\u043e\u043b\u043e\u0441\u043e\u0432\u043e\u0439 \u0432\u0432\u043e\u0434\/\u0432\u044b\u0432\u043e\u0434<\/li>\n        <li>PWA: Service Worker, \u043e\u0444\u043b\u0430\u0439\u043d-\u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0430, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043d\u0430 \u0442\u0435\u043b\u0435\u0444\u043e\u043d<\/li>\n      <\/ol>\n    <\/div>\n\n    <div class=\"phase phase-2\">\n      <div class=\"phase-label\">\u0424\u0430\u0437\u0430 2 \u2014 \u041d\u043e\u0432\u043e\u0441\u0442\u0438 \u0438 \u043f\u0440\u043e\u0441\u043b\u0443\u0448\u0438\u0432\u0430\u043d\u0438\u0435<\/div>\n      <ul class=\"styled\">\n        <li>\u041d\u043e\u0432\u043e\u0441\u0442\u043d\u043e\u0439 \u0434\u0430\u0439\u0434\u0436\u0435\u0441\u0442 \u0447\u0435\u0440\u0435\u0437 \u0418\u0418<\/li>\n        <li>\u041e\u0437\u0432\u0443\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0441\u0442\u0435\u0439 \u0434\u043b\u044f \u043f\u0430\u0441\u0441\u0438\u0432\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u043b\u0443\u0448\u0438\u0432\u0430\u043d\u0438\u044f<\/li>\n        <li>RSS-\u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f<\/li>\n      <\/ul>\n    <\/div>\n\n    <div class=\"phase phase-3\">\n      <div class=\"phase-label\">\u0424\u0430\u0437\u0430 3 \u2014 \u0420\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u0431\u0449\u0435\u043d\u0438\u0435<\/div>\n      <ul class=\"styled\">\n        <li>\u041c\u0438\u043a\u0440\u043e\u0444\u043e\u043d \u0434\u043b\u044f \u0436\u0438\u0432\u044b\u0445 \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440\u043e\u0432 \u0441 \u0440\u0435\u0430\u043b-\u0442\u0430\u0439\u043c \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u043c<\/li>\n        <li>VoIP\/WebRTC \u0437\u0432\u043e\u043d\u043a\u0438 \u0441 \u0430\u0432\u0442\u043e\u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u043c<\/li>\n      <\/ul>\n    <\/div>\n\n    <div class=\"phase phase-4\">\n      <div class=\"phase-label\">\u0424\u0430\u0437\u0430 4 \u2014 \u041c\u043d\u043e\u0433\u043e\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0441\u0442\u044c<\/div>\n      <ul class=\"styled\">\n        <li>\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f (JWT, OAuth2)<\/li>\n        <li>\u041e\u0444\u043b\u0430\u0439\u043d STT (\u0444\u043e\u043b\u0431\u044d\u043a)<\/li>\n        <li>\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f \u044f\u0437\u044b\u043a\u0430<\/li>\n        <li>\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u044f\u0437\u044b\u043a\u0438<\/li>\n      <\/ul>\n    <\/div>\n  <\/section>\n\n  <!-- 11 -->\n  <section id=\"s11\">\n    <h2><span class=\"section-num\">11<\/span>\u041f\u0440\u0438\u043d\u0446\u0438\u043f\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438<\/h2>\n    <ol class=\"styled\">\n      <li><strong>\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f<\/strong> \u2014 \u043d\u0435 \u0438\u0437\u043e\u0431\u0440\u0435\u0442\u0430\u0442\u044c \u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434<\/li>\n      <li><strong>\u0411\u044b\u0441\u0442\u0440\u044b\u0435 \u0438 \u043d\u0430\u0434\u0451\u0436\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f<\/strong> \u2014 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438 API<\/li>\n      <li><strong>\u0410\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f \u043d\u0430\u0434 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430\u043c\u0438<\/strong> \u2014 \u043b\u0451\u0433\u043a\u0430\u044f \u0437\u0430\u043c\u0435\u043d\u0430 \u043b\u044e\u0431\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430<\/li>\n      <li><strong>\u0420\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 core\/UI<\/strong> \u2014 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 React \u2192 Vue<\/li>\n      <li><strong>Offline-first<\/strong> \u2014 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0434\u0430\u0436\u0435 \u0431\u0435\u0437 \u0441\u0435\u0442\u0438<\/li>\n      <li><strong>Mobile-first<\/strong> \u2014 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u0445\u043e\u0434\u0443<\/li>\n      <li><strong>Europe-first<\/strong> \u2014 GDPR, \u0435\u0432\u0440\u043e\u043f\u0435\u0439\u0441\u043a\u0438\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u044b, \u043d\u0438\u0437\u043a\u0430\u044f \u043b\u0430\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c<\/li>\n    <\/ol>\n  <\/section>\n\n<\/main>\n\n<script>\n\/\/ Smooth scroll for TOC links\ndocument.querySelectorAll('.toc-list a').forEach(a => {\n  a.addEventListener('click', e => {\n    e.preventDefault();\n    const target = document.querySelector(a.getAttribute('href'));\n    if (target) target.scrollIntoView({ behavior: 'smooth', block: 'start' });\n  });\n});\n\n\/\/ Fade-in sections on scroll\nconst observer = new IntersectionObserver(entries => {\n  entries.forEach(e => {\n    if (e.isIntersecting) {\n      e.target.style.opacity = '1';\n      e.target.style.transform = 'translateY(0)';\n    }\n  });\n}, { threshold: 0.1 });\n\ndocument.querySelectorAll('section').forEach(s => {\n  s.style.opacity = '0';\n  s.style.transform = 'translateY(30px)';\n  s.style.transition = 'opacity 0.6s ease, transform 0.6s ease';\n  observer.observe(s);\n});\n<\/script>\n<\/body>\n<\/html>\n","protected":false},"excerpt":{"rendered":"<p>LinguaCompanion \u2014 \u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u0435 v1.0 LinguaCompanion \u0422\u0417 v1.0 \u00b7 16.02.2026 \u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u0435 LinguaCompanion \u041c\u0443\u043b\u044c\u0442\u0438\u044f\u0437\u044b\u0447\u043d\u044b\u0439 \u0418\u0418-\u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442 \u0434\u043b\u044f \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f \u044f\u0437\u044b\u043a\u043e\u0432 \u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u0431\u0449\u0435\u043d\u0438\u0438 PWA React + TypeScript FastAPI 6 AI-\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u043e\u0432 5 \u044f\u0437\u044b\u043a\u043e\u0432 \u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 01\u041e\u0431\u0449\u0435\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 02\u0420\u0435\u0436\u0438\u043c\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f 03\u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u0442\u0435\u043a 04\u0410\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 \u043d\u0430\u0434 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430\u043c\u0438 05\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 06\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u044f\u0437\u044b\u043a\u0438 07\u0425\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 08\u0411\u044d\u043a\u0435\u043d\u0434 API 09\u041d\u0435\u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f 10\u0424\u0430\u0437\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438&hellip;&nbsp;<a href=\"https:\/\/1.cbm.ua\/?p=9333\" rel=\"bookmark\">\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 &raquo;<span class=\"screen-reader-text\">\u0422\u0417 \u0447\u0435\u0440\u043d\u044b\u0439.<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":0,"neve_meta_title_alignment":"","neve_meta_author_avatar":"","neve_post_elements_order":"","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":"","footnotes":""},"categories":[1],"tags":[],"class_list":["post-9333","post","type-post","status-publish","format-standard","hentry","category-1"],"_links":{"self":[{"href":"https:\/\/1.cbm.ua\/index.php?rest_route=\/wp\/v2\/posts\/9333","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/1.cbm.ua\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/1.cbm.ua\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/1.cbm.ua\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/1.cbm.ua\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=9333"}],"version-history":[{"count":3,"href":"https:\/\/1.cbm.ua\/index.php?rest_route=\/wp\/v2\/posts\/9333\/revisions"}],"predecessor-version":[{"id":9372,"href":"https:\/\/1.cbm.ua\/index.php?rest_route=\/wp\/v2\/posts\/9333\/revisions\/9372"}],"wp:attachment":[{"href":"https:\/\/1.cbm.ua\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=9333"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/1.cbm.ua\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=9333"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/1.cbm.ua\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=9333"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}