Chiti

მრავალტენანტიანი პლატფორმა მომხმარებელთა მხარდაჭერისთვის. ჩატის ვიჯეტი მაღაზიის საკუთარ საიტზე ჩაიდგმება, ხოლო Messenger, Instagram, WhatsApp, Telegram და TikTok იმავე რიგში ხვდება. ბოტი პირველი პასუხობს მაღაზიის ცოდნის ბაზიდან და ადამიანს ბრიფინგით გადასცემს ჩატს; ოპერატორი რიგში AI კოპილოტთან ერთად მუშაობს; ადმინისტრატორები და მხოლოდ-წაკითხვის უფლების მქონე ზედამხედველი გუნდს მართავენ; პლატფორმის კონსოლი კი — ტენანტებს. მთელი პროდუქტი ქართულად და ინგლისურად მეტყველებს, მაღაზიის საკუთარი კონტენტი კი რუსულსაც შეიცავს. ჩვენ ის თავიდან ბოლომდე ავაგეთ — Node API თითო ტენანტზე ერთი სოკეტ-სახელთა სივრცით და React ფრონტენდი, რომელშიც ყველა კონსოლი და ვიჯეტია მოქცეული.

წელი: 2026 · კატეგორია: მომხმარებელთა მხარდაჭერა

ჩვენი როლი

Full-stack. ჩვენზე იყო მრავალტენანტიანი მონაცემთა მოდელი, არხების წესები და ბოტიდან ოპერატორზე გადაცემა, რეალური დროის შრე, ვიჯეტი, ხუთივე როლის კონსოლები და სამენოვანი კონტენტის მოდელი.

პრობლემა

მაღაზია, რომელიც საქართველოში ყიდის, შეკითხვებს ერთ ადგილას არ იღებს. ისინი მოდის საიტზე, Messenger-ში, Instagram-ზე, WhatsApp-ზე, Telegram-სა და TikTok-ზე, და თითოეული ცალკე შემომავალი ყუთია, რომელსაც ცალკე ადამიანი თვალყურს ადევნებს. ვერავინ იტყვის, რამდენი ხანია ელოდება მომხმარებელი; საუბარი, რომელიც ერთი ადამიანიდან მეორესთან გადადის, გზაში ისტორიას კარგავს; მენეჯერს კი გუნდის მუშაობის დანახვა მისი შეწყვეტის გარეშე არ შეუძლია.

არხები იმაშიც არ ეთანხმებიან, როგორი შეიძლება იყოს პასუხი. WhatsApp თავისუფალი ფორმის ფანჯარას ერთი დღის შემდეგ ხურავს და მერე მხოლოდ დამტკიცებულ შაბლონს იღებს. TikTok ზედიზედ ათი ბიზნეს-შეტყობინების შემდეგ აღარ იღებს. Instagram PDF-ს არ იღებს, Telegram-ს რეაქციები არ აქვს. აგენტი, რომელმაც ეს არ იცის, ამას მაშინ ხვდება, როცა შეტყობინება ვერ იგზავნება; ბოტი კი, რომელიც იმ არხზე პასუხობს, სადაც ამის უფლება არ აქვს, კიდევ უარესია.

მიდგომა

ერთი საუბრის მოდელი და თითოეული არხის წესები ერთ ადგილას, რომელსაც ყველაფერი ეკითხება.

ყოველი შემოსული შეტყობინება ერთსა და იმავე ფორმაში მოჰყავთ, საიდანაც არ უნდა მოვიდეს, ამიტომ რიგი, საუბარი, ისტორია და სტატისტიკა არხის მიხედვით არასოდეს იტოტება. არხის წესები — პასუხის ფანჯარა, შეტყობინებათა ლიმიტი, დაშვებული მედია, შეუძლია თუ არა ბოტს საუბარი — ერთ წმინდა მოდულშია, რომელსაც ოპერატორის კომპოზერიც კითხულობს და სერვერის გაგზავნის გზაც, ამიტომ ეკრანი იმას ვერ შემოგთავაზებს, რასაც სერვერი უარყოფს.

ბოტი პირველი პასუხობს და განზრახ ნებდება: ჩატი მოკლე ბრიფინგით, მომხმარებლის საკუთარ ენაზე, ადამიანს გადაეცემა, თუ მომხმარებელი ადამიანს ითხოვს, ბოტისთვის წაუკითხავ რამეს გზავნის, ბოტი ორჯერ ცდება ან საუბარი მაშინ იწყება, როცა AI გათიშულია. შემდეგ ოპერატორს ჰყავს კოპილოტი, რომელიც ციტატებით დასაბუთებულ პასუხებს წერს, ასევე სწრაფი პასუხების ბიბლიოთეკა, შიდა შენიშვნები, მომხმარებლის წინა საუბრები და გუნდური ჩატი. ამას ადმინისტრატორის კონტროლი ერთვის — მარშრუტიზაციის სტრატეგია, ტაიმერები, სამუშაო საათები, ბლოკირებები, FAQ-ს ნაკადის რედაქტორი — და პლატფორმის კონსოლი, რომელიც ტენანტებს ქმნის, თიშავს და შლის.

მთავარი მომენტები

  • ერთი რიგი ექვსი არხისთვის. ნორმალიზებული შეტყობინების ფორმა ნიშნავს, რომ შემომავალი ყუთი, საუბარი, ისტორია და სტატისტიკა არასოდეს იტოტება იმის მიხედვით, საიდან მოვიდა შეტყობინება.
  • არხების წესები კოდია და არა შეთანხმება: 24-საათიანი WhatsApp-ის ფანჯარა შაბლონის სახით გამოსავლით, შვიდდღიანი ფანჯარა Messenger-სა და Instagram-ზე, TikTok-ის ზედიზედ ათი შეტყობინების ლიმიტი და ის, სად აქვს ბოტს საუბრის უფლება. ერთი წმინდა მოდული პასუხობს როგორც კომპოზერს, ისე გაგზავნის გზას.
  • ჯერ ბოტი, მერე ადამიანი — განზრახ. ადამიანის მოთხოვნა, ბოტისთვის წაუკითხავი დანართი, ორი შეცდომა ან AI-ის გათიშვა ჩატს მომხმარებლის ენაზე დაწერილი ბრიფინგით გადასცემს.
  • ოპერატორის კოპილოტი წერს დასაბუთებულ პასუხებს ციტატებით, შეუძლია მათი შემოკლება, უფრო თბილად ან ფორმალურად გადაწერა და ქართულ, ინგლისურ და რუსულ ენებს შორის თარგმნა, ხოლო თუ მონახაზი ისეთ რამეს ჰპირდება, რაც გადამოწმებას საჭიროებს, ოპერატორს აფრთხილებს.
  • ტენანტობა ჩანაწერის დონემდე. ყოველი ჩანაწერი ტენანტის id-ს ატარებს, ყოველი მოთხოვნა მისით იზღუდება, ყველა ტენანტს საკუთარი სოკეტ-სახელთა სივრცე აქვს და პლატფორმის კონსოლი სასიცოცხლო ციკლს შექმნიდან წაშლამდე მართავს.
  • ხუთი როლი სამ კონსოლზე. ზედამხედველი ადმინისტრატორის კონსოლია, რომელსაც ყველა ჩაწერის უფლება აქვს ჩამორთმეული, ხოლო პლატფორმის ადმინისტრატორს შეუძლია ნებისმიერ წევრად შესვლა, რომ დაინახოს, რასაც ის ხედავს.
  • ტენანტის კონტენტი სამენოვანია: FAQ, მისალმებები, სწრაფი პასუხები, ველების სახელები და არასამუშაო საათების შეტყობინებები ქართულად, ინგლისურად და რუსულად ინახება, ვიჯეტი კი მომხმარებლის ენას ირჩევს.

არქიტექტურა

  • ვიჯეტი: მომხმარებლის ჩატის ცალკე, ბიბლიოთეკის სახით აწყობილი ვერსია, რომელიც მასპინძელ გვერდზე ჩაიდგმება, CSS ცვლადებით ირგებს თემას და id-პრეფიქსის ქვეშაა იზოლირებული, რათა მაღაზიის საკუთარმა სტილებმა მასზე გავლენა ვერ იქონიოს. FAQ-ის გადაწყვეტილებათა ხე, ჩატამდელი ფორმა ტენანტის მორგებადი ველებიდან, ჩატი, სადაც ჯერ ბოტი პასუხობს, წერისა და წაკითხვის ინდიკატორები, უმოქმედობის გაფრთხილება და შეფასება. ტელეფონზე ბარათი ქვედა პანელად იქცევა.
  • კონსოლები: ერთი React ერთგვერდიანი აპლიკაცია (SPA) მოიცავს ოპერატორის შემომავალ ყუთს, ადმინისტრატორისა და მხოლოდ-წაკითხვის ზედამხედველის კონსოლს და პლატფორმის კონსოლს, რომელთა მარშრუტიზაცია როლის მიხედვით ხდება. სერვერის მდგომარეობა TanStack Query-შია, ფორმები — React Hook Form-სა და Zod-ში, ხოლო რეალური დროის მოვლენები იმავე query-გასაღებებს ბათილად აცხადებს, რომლებსაც ეკრანები უკვე კითხულობენ.
  • API: Node და TypeScript Express-ზე. REST მარშრუტები ავტორიზაციის, ადმინისტრირების, პლატფორმის, სესიების, ატვირთვების, ინტეგრაციების, პერსონალის ჩატის, კომენტარების, AI-ის, push-ისა და ოპერატორისთვის, ასევე ვებჰუკ-მარშრუტები, რომლებიც მოთხოვნის დაუმუშავებელ სხეულს ინახავენ, რათა ყოველი პროვაიდერის ხელმოწერა გადამოწმდეს.
  • რეალური დრო: Socket.IO ტენანტზე ერთი სახელთა სივრცით და ოთახებით ოპერატორებისთვის, ადმინისტრატორებისთვის, თითოეული სესიისა და თითოეული ოპერატორისთვის. რიგის ცვლილებები, შეტყობინებები, წერის ინდიკატორი, წაკითხვის აღნიშვნები, ონლაინ-სტატუსი და პარამეტრების განახლებები ტიპიზებული მოვლენებით მოძრაობს, ამიტომ ადმინისტრატორის შენახული თემა მომხმარებლის ტელეფონზე არსებულ ვიჯეტამდე აღწევს.
  • არხების ადაპტერები: თითოეული არხის ადაპტერი პროვაიდერის ვებჰუკს ერთ ნორმალიზებულ შეტყობინებად გარდაქმნის და აცხადებს, რა შეუძლია არხს: ნომრის პრეფიქსი, კომენტარები, რეაქციები, ისტორია, შაბლონები, პასუხის ფანჯარა. საუბრების როუტერი კონტაქტზე ცალკე რიგით იღებს შეტყობინებას, პოულობს ან ქმნის სესიას, ინახავს მედიას, უშვებს AI-ს, ოთახში აგზავნის მოვლენას და ავტომატურად ნიშნავს ოპერატორს.
  • AI შრე: ცალკე Python სერვისი, რომელსაც ერთი კლიენტით მივმართავთ: პასუხის ენდფოინთი ბოტისთვის, turns-ენდფოინთი კოპილოტის მონახაზებისთვის, ასევე რეგენერაცია და უკუკავშირი. თითო ტენანტზე ცალკე circuit breaker და პაუზა იმას ნიშნავს, რომ გათიშვა ჩატის გაჭედვის ნაცვლად ადამიანისთვის დაუყოვნებლივ, განმარტებით გადაცემად იქცევა.
  • მონაცემები: PostgreSQL Prisma-ს მეშვეობით. ერთი მონაცემთა ბაზა ყველა ტენანტისთვის, ყოველი ჩანაწერი ტენანტის id-ს ატარებს და ყოველი მოთხოვნა მის მიხედვით იზღუდება. სესიები, შეტყობინებები, მინიჭებები, შენიშვნები, უკუკავშირი, მორგებადი ველები, ბლოკირებები, შაბლონები, ინტეგრაციები, პერსონალის ჩატი და სრული აქტივობის ჟურნალი.
  • ფონური სამუშაო: პროცესის შიგნით მომუშავე ტაიმერები და გასუფთავებები: უმოქმედობის კიბე, ავტომატური მინიჭება, ოპერატორის პასუხის ვადა, გასვლის შემდგომი საშეღავათო პერიოდი, ხანგრძლივად მოლოდინში მყოფი ჩატების გასუფთავება, ონლაინ-სტატუსის შეჯერება გადატვირთვის შემდეგ, სისტემის ჯანმრთელობის სინჯები და შენახვის ვადის მიხედვით გაწმენდა.
  • ავტორიზაცია და ტენანტობა: როლის მიხედვით გაცემული ტოკენები, რომლებიც როლის დამცავი მექანიზმის უკანაა. ადმინისტრატორები, ზედამხედველები და პლატფორმის ადმინისტრატორი ერთიან შესვლას იზიარებენ, ხოლო პლატფორმის კონსოლს შეუძლია ტენანტის ნებისმიერ წევრად შესვლა. არხების ფუნქციური ფლაგები განსაზღვრავს, რომელ არხებს ხედავს ტენანტი.
  • შენახვა, push და მიწოდება: ატვირთვები ლოკალურ დისკზე ან S3-თან თავსებად დრაივერზე, web push VAPID-ით და service worker-ით, და გაშვების ორი გზა: Docker Compose (ბაზა, API, nginx-ით გაცემული ფრონტენდი) ან დროის ნიშნულიანი რელიზ-დირექტორიები ატომური სიმლინკის გადართვით, წინ PM2-ითა და nginx-ით.

ციფრებში

როლი: 5 · არხი ერთ რიგში: 6 · სიმულირებული API მარშრუტი: 149 · ეკრანი: 25 · საწყისი საუბარი: 369 · ფრონტენდის სტრიქონი: 34k

შედეგები

  • მომხმარებელი ექვსი არხიდან ნებისმიერით ერთსა და იმავე რიგში, ერთსა და იმავე საუბარში და ერთი მოლოდინის ტაიმერით ხვდება, ხოლო ოპერატორი არხის წესებს წერამდე ხედავს და არა მას შემდეგ, რაც შეტყობინება ვერ გაიგზავნა.
  • ბოტიდან გამოსული ჩატი ბრიფინგით მოდის — რატომ გადმოეცა და რა უნდა მომხმარებელს — ამიტომ ადამიანი, ვინც მას იღებს, იმავე შეკითხვის ხელახლა დასმით არ იწყებს.
  • ადმინისტრატორს შეუძლია ნებისმიერი ცოცხალი ჩატის დათვალიერება, მასში ჩართვა, დასრულება ან მთელი რიგის გასუფთავება, და თითოეული ეს მოქმედება აქტივობის ჟურნალში აღირიცხება შემსრულებლითა და დროით.
  • ახალი მაღაზია ჩანაწერია და არა დეპლოი: პლატფორმის კონსოლი ქმნის ტენანტს, რთავს მის არხებს, შეუძლია მისი გათიშვა, წაშლა, დაბრუნება ან სამუდამოდ წაშლა.
  • პროდუქტი ქართულად და ინგლისურად იკითხება, მაღაზიის FAQ, მისალმებები, სწრაფი პასუხები და ველების სახელები კი ქართულ, ინგლისურ და რუსულ ვარიანტებად გვერდიგვერდ ინახება.

რა გამოვიყენეთ

  • ბექენდი: Node.js, TypeScript 5, Express 4, Socket.IO 4, Zod 3, Helmet, p-queue 9, Multer, Sharp, bcryptjs, web-push 3
  • მონაცემები და შენახვა: PostgreSQL, Prisma 6, AWS SDK v3 (S3-თან თავსებადი ატვირთვები), ატვირთვის დრაივერი ლოკალური დისკისთვის
  • AI: FastAPI (ცალკე Python სერვისი), circuit breaker თითო ტენანტზე, მოძიებულ ინფორმაციაზე დაფუძნებული პასუხები წყაროების მითითებით
  • ფრონტენდი: React 18, TypeScript 5, Vite 5, Tailwind CSS 3, Radix UI-ზე აგებული shadcn/ui, Ant Design 6, TanStack Query 5, React Flow 12, React Hook Form 7 + Zod 3, React Router 6, i18next 25 (KA/EN/RU), Recharts 2, socket.io-client 4, Vitest 2
  • გაშვება და მიწოდება: Docker Compose, nginx, PM2, რელიზ-დირექტორიები ატომური გადართვით, Web push (VAPID, service worker)
  • დემოს აწყობა: Vite 6, React 18, Tailwind CSS 4, @portfolio/demo-kit (სიმულირებული API, საცავი, სესია), TanStack Query 5, React Router 6, i18next 24 (KA/EN), Radix UI, Recharts 2, cmdk, Sonner, React Hook Form 7 + Zod 3, BroadcastChannel, Fontsource (Bricolage Grotesque, Instrument Sans, Noto Sans Georgian, IBM Plex Mono)

დემო

ჩვენ მიერ აგებული რეალური პროდუქტის გამოგონილი ბრენდით გადაკეთებული ვერსია: ორიგინალის სახელი, იდენტობა, ტექსტები და მონაცემები მოხსნილია და მათ ადგილას გამოგონილი ქართული ბრენდი და დემო-ტენანტად Vazi-ს ღვინის მაღაზიაა. ბექენდის ადგილას ბრაუზერში მომუშავე სიმულაციაა — ბანდლში ჩაშენებული საწყისი მონაცემები, 149 მარშრუტი, რომელსაც მეხსიერებიდან პასუხობს, და სცენარით მომუშავე მომხმარებლები, ბოტი, კოპილოტი და არხების დაკავშირების პროცესები. კუთხეში არსებული ზოლი ხუთ ანგარიშს შორის გადართავს, ან გახსენით ცოცხალი სამუშაო მაგიდა, რომ ვიჯეტი და ოპერატორის შემომავალი ყუთი გვერდიგვერდ ნახოთ. არაფერი ინახება: გვერდის გადატვირთვა პირვანდელ საწყის მონაცემებს აბრუნებს, ხოლო ორი ღია ჩანართი ერთ ცოცხალ სამყაროს იზიარებს.