Привет! Мы создаем веб-приложение, очень похожее на nzleads.com, но оно использует GPT для ответа вместо предопределенных сообщений.
Стек:
NestJS - бэкенд-фреймворк
PostgreSQL - СУБД
TypeORM - ORM
Docker - для деплоя и разработки
Next.js - фронтенд-фреймворк
Mantine - UI-kit
React Hook Form - валидация форм
Zod - описание схем
Zustand - глобальный store
React Query + ky - http-client
Есть ошибки в логике, работает нестабильно. Нужно все изучить, продумать логику и исправить. В личку пришлю ссылку на проект.
В целом ожидается, что это будет большой проект, поэтому буду рад продолжить работу.
Понимаю, что нужно будет время чтобы разобраться в чужом коде. Я во всем готов учавствовать.
Примеры доработок:
* Исключить возможность добавления одного Yelp Token в несколько App Акаунтов. Выдавать ошибку с просьбой обратиться в поддержку чтобы перенести аккаунт.
* Stripe Customer Portal доделать. Убедиться, что стоимость подписки - $99. Проверить как работает оплата при подключении нескольких бизнесов. Нужно чтобы просил оплату за каждый новый. Проверить, что бизнес деактивируются если подписка закончилась. (Это работает через вебхуки? Или как мы определяем?)
* Сделать мониторинг на Sentry
* Ограничить доступ к вебхукам по IP
* Подключить Twilio на фронт, убедиться, что GPT умеет передавать инструкции движку отправки СМС. И что СМС уходят правильно. GPT должен сам решать когда отправлять смс, и что там писать. Через метаданные.
* История переписки в клиентом хранится у нас в БД. Возможно проще вытаскивать ее из API Yelp перед отправкой в GPT в качестве промпта. В БД решили хранить чтобы потом отличать, юзер или GPT сгенерировало сообщение. Также, это нужно чтобы App не реагировал на вебхук, который пришел в ответ на его действие в Yelp API
* История переписки в клиентом, которая хранится у нас в БД, иногда в неправильном порядке сообщений передается в GPT. Поэтому GPT иногда отправляет нелогичный ответ на какое-то старое сообщение, вместо последнего.
* handleFollowUp видимо запускает таймер от каждого сообщения входящего, и не сбрасывает его когда запускается новый таймер. Поэтому потом уходят множественные Follow Ups.
* В таблице с лидами на фронте не отображается последнее отправленное клиенту сообщение, и номер телефона клиента.