Собираю ассистентов на OpenAI Assistants API с конца 2023 года: начинал с бота поддержки для интернет-магазина на WooCommerce, потом переносил ту же логику на Tilda-лендинги и в Telegram-бота на aiogram. Если нужен openai ассистент, который отвечает по базе знаний компании, проверяет статус заказа через СДЭК и передаёт диалог менеджеру в CRM - ниже пошагово разбираю, как я его собираю: от создания ассистента через API до вывода виджета на сайте клиента.
Что такое OpenAI Assistants API и зачем он сайту
Assistants API - надстройка над обычными chat completions, которая берёт на себя память диалога и работу с инструментами. На голом Chat Completions историю переписки, чанкинг документов и логику вызова функций пишешь сам - на прототип у меня уходило от 3-4 дней. Assistants API хранит переписку в объекте Thread, сам решает, когда обратиться к базе знаний через File Search, когда выполнить код через Code Interpreter, а когда вызвать внешнюю функцию - проверить остаток на складе или статус доставки.
Для сайта это значит: не нужно городить отдельную БД под историю чатов и вручную парсить, когда модель «хочет» вызвать функцию - SDK возвращает объект run с понятным статусом (queued, in_progress, requires_action, completed), и backend просто реагирует на этот статус.
Threads, Runs и инструменты - из чего собран OpenAI-ассистент
Четыре сущности, вокруг которых строится вся логика:
- Assistant - конфигурация: системный промпт, модель, список инструментов
- Thread - переписка с конкретным пользователем сайта, живёт сколько угодно
- Message - реплика пользователя или ассистента внутри Thread
- Run - запуск обработки: модель читает Thread и либо отвечает, либо просит вызвать функцию
Инструменты, которые можно подключить ассистенту:
| Инструмент | Что делает | Когда беру |
|---|---|---|
| File Search | Ищет ответ в загруженных документах, сам режет их на чанки и делает эмбеддинги | FAQ, регламенты, прайсы, договоры оферты |
| Code Interpreter | Выполняет Python в песочнице - считает, строит графики, парсит CSV | Ассистенты для расчётов и аналитики, редко нужен на обычном лендинге |
| Function calling | Вызывает описанную вами функцию - backend решает, что с этим делать | Статус заказа в СДЭК, проверка оплаты в T‑Bank/WooCommerce, запись лида в CRM |
Минимальный рабочий путь на Python. Ключ API храню на сервере, в браузер он не попадает никогда.
Шаг 1. Создаю ассистента:
from openai import OpenAI
client = OpenAI(api_key="sk-...")
assistant = client.beta.assistants.create(
name="Ассистент поддержки",
instructions="Отвечай коротко и по делу на основе базы знаний компании. "
"Если вопрос про заказ, вызови функцию check_order_status.",
model="gpt-4o-mini",
tools=[{"type": "file_search"}]
)
Шаг 2. Создаю Thread и добавляю сообщение пользователя:
thread = client.beta.threads.create()
client.beta.threads.messages.create(
thread_id=thread.id,
role="user",
content="Где мой заказ номер 4821?"
)
Шаг 3. Запускаю обработку и жду результата:
run = client.beta.threads.runs.create_and_poll(
thread_id=thread.id,
assistant_id=assistant.id
)
messages = client.beta.threads.messages.list(thread_id=thread.id)
print(messages.data[0].content[0].text.value)
Модель выбираю по задаче: gpt-4o-mini закрывает большинство диалогов на сайте и обходится в разы дешевле, gpt-4o беру, когда ассистент должен рассуждать по сложным регламентам или сравнивать несколько документов сразу.
Бесплатный материал
🎁 Полезный скрипт в подарок
Подпишитесь на Telegram - пришлю готовый скрипт по этой теме.
Без спама. Отписка в 1 клик.
Подключаю базу знаний к ассистенту через File Search
Загружаю документы в векторное хранилище - OpenAI сам режет их на чанки и делает эмбеддинги, отдельный Pinecone или Weaviate поднимать не нужно:
vector_store = client.vector_stores.create(name="kb-client")
client.vector_stores.file_batches.upload_and_poll(
vector_store_id=vector_store.id,
files=[open("faq.pdf", "rb"), open("regulations.docx", "rb")]
)
client.beta.assistants.update(
assistant.id,
tool_resources={"file_search": {"vector_store_ids": [vector_store.id]}}
)
На практике загружал клиенту прайс-лист на 40 страниц и регламент по возвратам - ассистент цитировал нужный пункт уже на второй итерации промпта. Момент, который часто упускают: лимиты на размер файла и токены в чанке нужно проверять заранее, а если документ - это скан с картинками, распознавание текста ляжет на вас, File Search сам OCR не делает.
Встраиваю AI-ассистента в сайт - виджет, Tilda, WordPress
Ключ API нельзя класть в браузерный JS - между сайтом и OpenAI всегда стоит свой backend: Node/Express, Laravel или serverless-функция, которая проксирует запрос и хранит thread_id пользователя в cookie или localStorage.
Для Tilda обычно вешаю кастомный HTML-блок (T123) со скриптом виджета, который стучится в свой backend, а не напрямую в OpenAI - так ключ остаётся на сервере, а на странице только интерфейс чата. Похожие коннекторы для встраивания чата в Tilda и WordPress у меня уже собраны и лежат в библиотеке готовых скриптов - обычно быстрее адаптировать готовый под клиента, чем писать с нуля.
Для WordPress тот же backend вызывается либо через отдельный плагин с REST-эндпоинтом, либо через шорткод, который рендерит виджет и обращается к тому же прокси-серверу.
Если бэкенда пока нет и нужен быстрый MVP, связку «OpenAI + форма на Tilda + уведомление в CRM» собираю в n8n: узел с запросом к OpenAI, вебхук с сайта, узел записи лида в amoCRM или Bitrix24. По скорости ответа проигрывает прямому backend, но для проверки гипотезы хватает недели.
Function calling для реальных задач - заказы, оплата, CRM
Без function calling ассистент остаётся обычной справочной - отвечает и на этом всё. С функциями backend получает управление: ассистент сам решает вызвать check_order_status, проверить оплату или записать лида, вместо того чтобы просто вывести текстовый ответ. Описываю функцию схемой:
tools = [{
"type": "function",
"function": {
"name": "check_order_status",
"description": "Возвращает статус заказа по номеру через СДЭК",
"parameters": {
"type": "object",
"properties": {
"order_id": {"type": "string"}
},
"required": ["order_id"]
}
}
}]
Когда run возвращает статус requires_action, backend вызывает реальный метод СДЭК или проверяет оплату через вебхук T‑Bank/WooCommerce и передаёт результат обратно в run - модель уже сама формулирует ответ пользователю на человеческом языке.
Assistants API уходит на покой - что выбираю для новых проектов
OpenAI объявила курс на Responses API как основной способ работать с состоянием диалога и инструментами, а Assistants API пометила как устаревающий, с датой сунсета, которую несколько раз сдвигали. Для новых проектов беру Responses API: та же логика треда через chaining по response.id, тот же File Search и function calling, но меньше отдельных сущностей и один эндпоинт вместо связки assistants/threads/runs.
Клиентам, у кого уже работает интеграция на Assistants API, с переносом тянуть не советую - миграция логики на Responses API занимает от пары дней для простого FAQ-бота до пары недель, если завязаны сложные сценарии function calling и своя очередь на бэкенде. Дешевле сделать это спокойно, чем в авральном режиме после официального отключения старого эндпоинта.
Сколько стоит собрать виртуального ассистента для сайта
На бирже фриланса за подключение готового чат-бота к сайту просят от 20 000 до 60 000 ₽ в зависимости от сложности - это рыночный ориентир, не мои расценки. Свои цены считаю по объёму интеграции:
| Задача | Что входит | Стоимость |
|---|---|---|
| AI-интеграция под ключ | ассистент, база знаний, function calling, виджет на сайте | от 50 000 ₽ |
| Чат-бот с базой знаний (RAG) | только File Search и виджет, без внешних интеграций | от 50 000 ₽ |
| Telegram-бот на той же логике | aiogram-бот, использующий общий backend с сайтом | от 30 000 ₽ |
| Автоматизация в n8n без бэкенда | связка OpenAI, форма на сайте, CRM через no-code | от 25 000 ₽ |
| Техподдержка после запуска | обновление промптов, контроль лимитов и расходов на API | от 15 000 ₽/мес |
Окупаемость считаю не в абстрактных «экономит время», а в конкретных обращениях, которые ассистент закрывает без менеджера - на проектах с базой FAQ и function calling для статуса заказа это обычно 40-60% первичных обращений в чат.
Чат-бот с базой знаний
AI / RAG
от 50 000 ₽
Подробнее →Частые вопросы
Чем ассистент на OpenAI Assistants API отличается от обычного чат-бота на сайте?
Обычный чат-бот на сайте чаще всего работает по жёстким сценариям или ключевым словам. Ассистент на Assistants API понимает вопрос свободной формы, сам решает, искать ли ответ в загруженных документах, и может вызвать функцию - проверить заказ, записать заявку в CRM - вместо того чтобы просто вывести заготовленный текст.
Сколько стоит подключить openai ассистента к сайту на Tilda или WordPress?
AI-интеграция с ассистентом, базой знаний и виджетом на сайте - от 50 000 ₽, отдельный Telegram-бот на той же логике - от 30 000 ₽. Итоговая цена зависит от числа внешних интеграций: подключение СДЭК или CRM через function calling считаю отдельно.
Можно ли обучить ассистента на документах компании без разработчика?
Загрузить файлы в векторное хранилище и проверить ответы можно через Playground на platform.openai.com без единой строчки кода. Но для продакшена всё равно нужен backend, который прячет API-ключ, ведёт историю диалогов и связывает виджет на сайте с конкретным ассистентом - эту часть без разработчика не закрыть.
Что будет с проектами на Assistants API после его отключения?
OpenAI переносит функциональность в Responses API, а не убирает её совсем - Thread, File Search и function calling там есть в похожем виде. Проекты на Assistants API продолжат работать до объявленной даты сунсета, но переносить логику лучше заранее, а не после официального уведомления об отключении.