Реализация AI-генерации контента для CMS сайта

Наша компания занимается разработкой, поддержкой и обслуживанием сайтов любой сложности. От простых одностраничных сайтов до масштабных кластерных систем построенных на микро сервисах. Опыт разработчиков подтвержден сертификатами от вендоров.
Разработка и обслуживание любых видов сайтов:
Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Предлагаемые услуги
Показано 1 из 1 услугВсе 2065 услуг
Реализация AI-генерации контента для CMS сайта
Средняя
~3-5 рабочих дней
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    874
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    851

Реализация AI-генерации контента для CMS сайта

AI-генерация в CMS — это не «кнопка написать статью». Это ассистентские инструменты для редактора: черновик по брифу, переформулировка абзаца, SEO-оптимизация мета-тегов, перевод, генерация вариантов заголовков. Интегрируется прямо в редактор без переключения контекста.

Что реализуем в CMS

  • Генерация черновика статьи по заголовку и ключевым словам
  • Переформулировка выделенного текста (сделать короче / официальнее / проще)
  • Генерация SEO-мета: title, description, OG-теги
  • Варианты заголовков (5 вариантов на выбор)
  • Автоматический alt-text для изображений
  • Краткое содержание (excerpt) из тела статьи

Серверный API для генерации

// api/ai-content.js
import OpenAI from 'openai';

const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });

const BRAND_VOICE = `
Стиль бренда: профессиональный, без воды, конкретные факты.
Запрещено: слова "уникальный", "инновационный", "революционный".
Целевая аудитория: технические специалисты 25-45 лет.
`;

export async function POST(request) {
  const { action, content, options = {} } = await request.json();

  const handlers = {
    draft: generateDraft,
    rephrase: rephraseText,
    seo_meta: generateSeoMeta,
    headlines: generateHeadlines,
    excerpt: generateExcerpt,
    alt_text: generateAltText,
  };

  const handler = handlers[action];
  if (!handler) return Response.json({ error: 'Unknown action' }, { status: 400 });

  const stream = await handler(content, options);
  return new Response(stream);
}

async function generateDraft(data, options) {
  const { title, keywords, outline, wordCount = 800 } = data;

  return openai.chat.completions.create({
    model: 'gpt-4o',
    stream: true,
    messages: [
      {
        role: 'system',
        content: `${BRAND_VOICE}\nГенерируй контент в Markdown. Используй H2, H3, списки, жирный текст.`,
      },
      {
        role: 'user',
        content: `Напиши статью (~${wordCount} слов).
Заголовок: ${title}
Ключевые слова: ${keywords?.join(', ')}
${outline ? `Структура:\n${outline}` : ''}`,
      },
    ],
  }).then(s => s.toReadableStream());
}

async function rephraseText(data, options) {
  const { text, tone } = data; // tone: shorter|formal|casual|simpler

  const toneInstructions = {
    shorter: 'Сократи текст вдвое, сохранив смысл.',
    formal: 'Перепиши в официальном деловом стиле.',
    casual: 'Перепиши в разговорном, дружелюбном стиле.',
    simpler: 'Упрости текст, замени сложные термины на понятные.',
  };

  return openai.chat.completions.create({
    model: 'gpt-4o-mini',
    stream: true,
    messages: [
      { role: 'system', content: toneInstructions[tone] || 'Перефразируй текст.' },
      { role: 'user', content: text },
    ],
    max_tokens: 500,
  }).then(s => s.toReadableStream());
}

async function generateSeoMeta(data) {
  const { title, body } = data;

  const response = await openai.chat.completions.create({
    model: 'gpt-4o-mini',
    response_format: { type: 'json_object' },
    messages: [
      {
        role: 'system',
        content: 'Верни JSON: { meta_title: string (до 60 символов), meta_description: string (до 160 символов), og_title: string, og_description: string, focus_keyword: string }',
      },
      {
        role: 'user',
        content: `Заголовок: ${title}\n\nТекст:\n${body?.slice(0, 2000)}`,
      },
    ],
  });

  return Response.json(JSON.parse(response.choices[0].message.content));
}

Интеграция в TipTap / Lexical редактор

Для TipTap — кастомный Extension с плавающим меню:

import { Extension } from '@tiptap/core';
import { Plugin, PluginKey } from 'prosemirror-state';

export const AIAssistant = Extension.create({
  name: 'ai-assistant',

  addCommands() {
    return {
      rephraseSelection: (tone) => ({ state, dispatch }) => {
        const { from, to } = state.selection;
        const selectedText = state.doc.textBetween(from, to);

        if (!selectedText) return false;

        // Запускаем стриминг прямо в редактор
        streamRephrase(selectedText, tone, (chunk) => {
          if (dispatch) {
            const tr = state.tr.replaceWith(
              from, to,
              state.schema.text(chunk)
            );
            dispatch(tr);
          }
        });

        return true;
      },
    };
  },

  addProseMirrorPlugins() {
    return [
      new Plugin({
        key: new PluginKey('ai-context-menu'),
        // Показываем меню при выделении текста
      }),
    ];
  },
});

Плавающее меню с AI-командами:

function AIFloatingMenu({ editor }) {
  const [visible, setVisible] = useState(false);
  const [loading, setLoading] = useState(false);

  const actions = [
    { label: 'Сделать короче', action: () => rephrase('shorter') },
    { label: 'Официальный тон', action: () => rephrase('formal') },
    { label: 'Упростить', action: () => rephrase('simpler') },
    { label: 'Исправить грамматику', action: () => rephrase('correct') },
  ];

  async function rephrase(tone) {
    setLoading(true);
    const selectedText = editor.state.doc.textBetween(
      editor.state.selection.from,
      editor.state.selection.to
    );

    const response = await fetch('/api/ai-content', {
      method: 'POST',
      body: JSON.stringify({ action: 'rephrase', content: { text: selectedText, tone } }),
    });

    // Стриминг в редактор
    const reader = response.body.getReader();
    let result = '';
    while (true) {
      const { value, done } = await reader.read();
      if (done) break;
      result += new TextDecoder().decode(value);
      editor.commands.setContent(result, false);
    }
    setLoading(false);
  }

  return (
    <div className={`ai-menu ${visible ? 'visible' : ''}`}>
      {loading ? <Spinner /> : actions.map(a => (
        <button key={a.label} onClick={a.action}>{a.label}</button>
      ))}
    </div>
  );
}

Генерация alt-text через Vision API

async function generateAltText(imageUrl) {
  const response = await openai.chat.completions.create({
    model: 'gpt-4o-mini',
    messages: [
      {
        role: 'user',
        content: [
          {
            type: 'image_url',
            image_url: { url: imageUrl, detail: 'low' },
          },
          {
            type: 'text',
            text: 'Опиши изображение для alt-атрибута (до 125 символов). Только описание, без вводных слов.',
          },
        ],
      },
    ],
    max_tokens: 60,
  });

  return response.choices[0].message.content.trim();
}

Контроль качества и модерация

async function moderateContent(text) {
  const response = await openai.moderations.create({ input: text });
  const result = response.results[0];

  if (result.flagged) {
    const flaggedCategories = Object.entries(result.categories)
      .filter(([, flagged]) => flagged)
      .map(([cat]) => cat);

    throw new Error(`Контент нарушает правила: ${flaggedCategories.join(', ')}`);
  }

  return text;
}

Сроки

  • SEO-мета + варианты заголовков в CMS — 1–2 дня
  • AI-панель в редакторе (переформулировка, черновик) — 3–4 дня
  • Alt-text через Vision API при загрузке изображений — 1 день
  • Генерация черновика статьи со стримингом — 2–3 дня