AI · 7 мин чтения

OpenAI ассистент для сайта: как собрать на Assistants API

Собираю ассистентов на 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 клик.

Загружаю документы в векторное хранилище - 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 продолжат работать до объявленной даты сунсета, но переносить логику лучше заранее, а не после официального уведомления об отключении.

Есть задача?

Обсудим в мессенджере

Расскажите, что нужно сделать — отвечу в течение 4 часов в рабочее время. Первая консультация бесплатно.

Самозанятый Калинкин Н. А. · работаю с физлицами и юрлицами

Продолжая пользование настоящим сайтом Вы выражаете своё согласие на обработку Ваших персональных данных (файлов куки) с использованием Yandex.Metrika.
Понятно