«Алло, на реснички есть места?»: Голосовой AI-администратор для салонов красоты Алматы, который не ходит на обед
Пятница, вечер, Аль-Фараби стоит. А лиды сгорают.
Представьте типичный вечер алматинского бьюти-коворкинга. В 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).
┌─────────┐ (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 │
└─────────────────────┘Цепочка потоков данных:
- Клиент шлет голосовое или текстовое сообщение в WhatsApp. Webhook летит в наш Cloud Run сервис.
- Cloud Run берет бинарник OGG/AAC и напрямую скармливает его в Gemini 2.5 Flash (без сторонних транскрибаторов!).
- LLM извлекает: Услугу, Мастера, Дату и Время. Возвращает строгий JSON (Function Calling).
- Сервис дергает Google Calendar API мастера. Если время занято, Gemini генерирует вежливый отказ и предлагает ближайшие свободные слоты. Если свободно — ставит Event.
- Клиент получает ответ текстом (или, при желании, сгенерированным аудио через TTS).
Виртуальная примерочная для Instagram-бутиков: Image-to-Image генерация на Imagen 3 / Vertex AI по фото клиента
Код: Поднимаем 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).