Инженерный хаб

«Алло, на реснички есть места?»: Голосовой AI-администратор для салонов красоты Алматы, который не ходит на обед

15.09.2026
Шарафутдинов Р.

Пятница, вечер, Аль-Фараби стоит. А лиды сгорают.

Представьте типичный вечер алматинского бьюти-коворкинга. В Instagram заряжен таргет, Reels вирусятся, директ взрывается от сообщений. Клиентка едет за рулем и записывает голосовое: «Алло, привет! На реснички к Айгерим завтра есть окошко часам к семи вечера?»

Администратор в это время побежала за Flat White на миндальном, разговаривает с другим клиентом или просто устала под конец смены. Проходит 40 минут. Клиентка уже записалась в соседний салон. Лид за 2000 ₸ сгорел. В масштабах месяца это потери на 300–400 тысяч тенге просто из-за того, что «человеческий фактор» не может отвечать за 5 секунд.

Малый и средний бизнес (SMB) Казахстана теряет огромные деньги на скорости обработки входящих заявок. Именно здесь в игру вступает Google Cloud и мультимодальная мощь Gemini 2.5 Flash.

Почему кнопочные чат-боты — это кринж?

Первое, что приходит в голову владельцу салона — сделать чат-бота в Telegram или WhatsApp. Но давайте честно: никто не любит общаться с тупыми автоответчиками. Когда клиент хочет записаться, он не хочет нажимать «1 — Услуги, 2 — Мастера, 3 — Запись». Он хочет живого диалога. Если бот не понимает контекста или заставляет вводить дату в формате YYYY-MM-DD, конверсия падает в пропасть.

Нам нужен был бот, который ведет себя как эмпатичный, вежливый администратор. Который понимает сленг («ноготочки», «реснички», «сложное окрашивание»), распознает аудиосообщения на лету и имеет прямой доступ к расписанию мастеров.

Архитектура: Serverless AI-Админ

Мы спроектировали архитектуру, где нет тяжелых серверов, виртуалок или абонентских плат за простаивающие мощности. В основе лежит Cloud Run, который просыпается только в момент входящего сообщения, и Gemini 2.5 Flash, способный обрабатывать аудио (Speech-to-Text) и рассуждать в едином промпте (Reasoning).

Архитектурная схема / Data Flow Pipeline (ASCII)
┌─────────┐   (1) Аудио     ┌──────────────┐   (2) Стрим в Flash   ┌─────────────────────┐
│ Client  │ ══════════════> │  Cloud Run   │ ════════════════════> │ Gemini 2.5 Flash    │
│ (WA/IG) │ <══════════════ │ (FastAPI)    │ <════════════════════ │ (Live Audio/Speech) │
└─────────┘   (5) Ответ     └──────┬───────┘   (3) JSON Intent     └─────────────────────┘
                                   │
                              (4) Check / Book
                                   V
                            ┌─────────────────────┐
                            │ Google Calendar API │
                            └─────────────────────┘

Цепочка потоков данных:

  1. Клиент шлет голосовое или текстовое сообщение в WhatsApp. Webhook летит в наш Cloud Run сервис.
  2. Cloud Run берет бинарник OGG/AAC и напрямую скармливает его в Gemini 2.5 Flash (без сторонних транскрибаторов!).
  3. LLM извлекает: Услугу, Мастера, Дату и Время. Возвращает строгий JSON (Function Calling).
  4. Сервис дергает Google Calendar API мастера. Если время занято, Gemini генерирует вежливый отказ и предлагает ближайшие свободные слоты. Если свободно — ставит Event.
  5. Клиент получает ответ текстом (или, при желании, сгенерированным аудио через TTS).

Код: Поднимаем AI-движок на FastAPI

Давайте посмотрим на ядро нашего сервиса. Код ниже является рабочим референсом для обработки входящих вебхуков. В production-реализации он дополняется проверкой подписей Meta/WhatsApp, ретраями и логгированием.

import os
import json
from fastapi import FastAPI, Request
from google import genai
from google.genai import types
from google.oauth2 import service_account
from googleapiclient.discovery import build
from datetime import datetime, timedelta

app = FastAPI()

# Инициализация Gemini 2.5 Flash
client = genai.Client(api_key=os.environ.get("GEMINI_API_KEY"))

# Инициализация Google Calendar API (предполагаем, что Service Account настроен)
creds = service_account.Credentials.from_service_account_file('gcp-calendar-sa.json', scopes=['https://www.googleapis.com/auth/calendar'])
calendar_service = build('calendar', 'v3', credentials=creds)
CALENDAR_ID = os.environ.get("CALENDAR_ID", "primary")

def check_availability(start_time_iso, end_time_iso):
    """Проверяет занятость слота в календаре (p95 latency ~150ms)."""
    events_result = calendar_service.events().list(
        calendarId=CALENDAR_ID, timeMin=start_time_iso, timeMax=end_time_iso,
        singleEvents=True, orderBy='startTime'
    ).execute()
    return len(events_result.get('items', [])) == 0

def book_appointment(client_name, service_name, start_time_iso, end_time_iso):
    """Бронирует слот."""
    event = {
        'summary': f"{service_name} - {client_name}",
        'start': {'dateTime': start_time_iso, 'timeZone': 'Asia/Almaty'},
        'end': {'dateTime': end_time_iso, 'timeZone': 'Asia/Almaty'},
    }
    calendar_service.events().insert(calendarId=CALENDAR_ID, body=event).execute()

@app.post("/webhook/whatsapp")
async def handle_whatsapp_message(request: Request):
    payload = await request.json()
    message = payload.get("message", "")
    
    # Промпт для Gemini 2.5 Flash. Мы используем System Instructions для жесткого формата
    prompt = f"""
    Ты - вежливый администратор салона красоты в Алматы.
    Сегодняшняя дата: {datetime.now().strftime("%Y-%m-%d %H:%M")}.
    Сообщение клиента: "{message}"
    Определи намерение. Если клиент хочет записаться, верни JSON:
    {{"intent": "book", "service": "услуга", "time_start": "ISO-8601"}}
    """
    
    response = client.models.generate_content(
        model='gemini-2.5-flash',
        contents=prompt,
        config=types.GenerateContentConfig(
            response_mime_type="application/json",
            temperature=0.1
        )
    )
    
    data = json.loads(response.text)
    
    if data.get("intent") == "book":
        # Логика бронирования
        start_time = data["time_start"]
        end_time = (datetime.fromisoformat(start_time) + timedelta(hours=1)).isoformat()
        
        is_free = check_availability(start_time, end_time)
        if is_free:
            book_appointment("Клиент из WA", data["service"], start_time, end_time)
            return {"reply": f"Отлично! Записала вас на {data['service']} в {start_time}. Ждем!"}
        else:
            return {"reply": "К сожалению, это время уже занято. Предложить вам другое окошко?"}
            
    return {"reply": "Я вас не совсем поняла, переключаю на старшего администратора!"}

Смотреть код на GitHub (OZAT-kz)

Для развертывания этой магии мы используем Terraform. Одна команда, и Cloud Run поднимется с нужными правами доступа. Обратите внимание, что мы используем Secret Manager для хранения токенов.

resource "google_cloud_run_v2_service" "ai_admin" {
  name     = "ai-salon-admin"
  location = "europe-west4"
  ingress  = "INGRESS_TRAFFIC_ALL"

  template {
    containers {
      image = "eu.gcr.io/my-project/ai-salon-admin:latest"
      
      env {
        name = "GEMINI_API_KEY"
        value_source {
          secret_key_ref {
            secret  = google_secret_manager_secret.gemini_key.secret_id
            version = "latest"
          }
        }
      }
      
      resources {
        limits = {
          cpu    = "1000m"
          memory = "512Mi"
        }
      }
    }
    
    # Scale to zero для малого бизнеса - это мастхэв!
    scaling {
      min_instance_count = 0
      max_instance_count = 5
    }
  }
}

Смотреть код на GitHub (OZAT-kz)

Метрики, FinOps и реалистичный ROI для малого бизнеса

Мы не берем абстрактные корпорации. Посчитаем экономику для локального салона в Астане (5 мастеров, 40-50 записей в день). Трафик: ~150 сообщений в день (текст + аудио).

  • Google Cloud Run: ~4,500 запросов в месяц. Это глубоко внутри Free Tier (бесплатный лимит 2 миллиона запросов в месяц). Стоимость: $0.
  • Gemini 2.5 Flash API: Обработка текста и коротких аудиосообщений. При цене $0.075 за 1 млн входных токенов, месячный инференс обойдется примерно в $0.5 (около 250 ₸).
  • Google Calendar API: Бесплатно.

Экономика внедрения: Cloud Run vs Менеджер (тыс. ₸ / мес)

ИТОГО (TCO): Инфраструктура обходится владельцу бизнеса дешевле, чем один стаканчик капучино (меньше 300 ₸ в месяц!).
ROI: Зарплата удаленного администратора или менеджера Direct составляет от 150 000 до 250 000 ₸. Автоматизация не только страхует от потери лидов (спасая ~100 000 ₸ упущенной прибыли), но и позволяет масштабировать рекламу без найма новых людей.

Производительность решения также на высоте. Перцентили задержки ($p50$ ~1.2 секунды на текст, $p95$ ~2.5 секунды на аудио + API календаря). Клиент получает ответ мгновенно.

Реальные ограничения и компромиссы

  • Интеграция с WhatsApp: Официальный WhatsApp Business API стоит денег (плата за диалоги Meta). Чтобы не платить, Скауты часто используют "серые" Node.js библиотеки (Baileys), что несет риск бана номера.
  • Галлюцинации со временем: LLM может запутаться в относительных датах («послезавтра», «в следующий вторник»). В промпте обязательно должен быть жестко вшит текущий timestamp с часовым поясом (Asia/Almaty).
  • Отмены и переносы: Сложно научить бота надежно понимать контекст отмены через аудио, если клиент бормочет неразборчиво. Лучше переводить сложные случаи на живого человека (Handoff).

Угол для Скаутов OZAT: Как продавать это бизнесу

В этом кроется главная ценность Академии Скаутов OZAT. Вы не продаете «облачную инфраструктуру GCP» — эти слова напугают малый бизнес. Вы продаете готовое решение боли.

Скаут приходит в салон, отправляет боту аудио: «Запиши меня на завтра в обед», и на экране у владелицы бизнеса сама по себе появляется бронь в Google Календаре. Вау-эффект гарантирован. Средний чек за внедрение такого бота «под ключ» в Казахстане составляет от 250 000 до 400 000 ₸, плюс абонентская плата 15 000 ₸/мес за саппорт (при расходах на GCP в 300 тенге).

Встраивая ИИ в ежедневные процессы SMB-сектора, инженеры получают огромный рынок, а бизнес — реальную экономию.

💡 Совет OZAT: Готовы к внедрению? Рассчитайте архитектуру и бюджет через Scope Builder или пройдите бесплатный ИИ-аудит.

Рустам Шарафутдинов

Рустам Шарафутдинов

Автор Инженерного хаба

Эксперт в области архитектуры Google Cloud и Senior Full-Stack разработчик с более чем 15-летним опытом. Специализируется на отказоустойчивых архитектурах, оптимизации высоконагруженных проектов и интеграции AI (Vertex AI).

Экспертность: GCP, Kubernetes, Микросервисы, React, Node.js

Комментарии (0)