slavb18

    Запуск бета-версии интеллектуального агента по оценке проектов

    AIProject EstimationSoftware DevelopmentBeta LaunchEfficiencyTech StackLLMProductivity

    Запуск бета-версии интеллектуального агента по оценке проектов

    Вайб-кодинг: от идеи до работающего прототипа за пару часов

    Сегодня скорость важнее бесконечных архитектурных дискуссий. Мы запустили бета-версию Умной Оценки Проекта - инструмента, который за пару минут структурирует хаотичные требования и прикидывает масштаб работ.

    Самое интересное здесь не только в функционале, а в том, как это было сделано. Это чистый vibe coding.


    Инструментарий: Google AI Studio

    Прототип был создан в Google AI Studio. Основная фишка такого подхода - вы "кодите" в диалоге с моделью, которая тут же позволяет запускать и тестировать код. Есть и другие решения вроде Lovable, но AI Studio оказалась под рукой и отлично справилась.

    Процесс максимально простой:

    1. Генерируем логику в AI Studio.
    2. Коммитим в GitHub.
    3. Деплоим на Vercel.

    Архитектура (точнее, её отсутствие)

    Давайте будем честны: структура кода здесь "ужасная".

    • Нет DI (Dependency Injection).
    • Принципы SOLID даже не пробегали мимо.
    • Сопровождать такой код в долгосроке - та еще задача.

    Но для прототипа это идеальное решение. Весь фронтенд живет в одном огромном файле App.tsx, а бэкенд - в server.ts. Это не про "правильный код", а про "работающее решение". Как прототип - он полностью выполняет свою задачу.

    Чтобы строить серьезные системы с RBAC, сложными админками и высокой надежностью, по-прежнему нужны глубокие инженерные скиллы. Но для проверки гипотезы - вайб-кодинга более чем достаточно.


    Технические грабли: PDF на Vercel

    Одна из проблем, с которой пришлось столкнуться: локально парсинг PDF работал идеально, а на Vercel (в Serverless функциях) - наотрез отказался. Пришлось "погуглить" и адаптировать импорты.

    Пример того, как выглядит бэкенд-обработчик (просто, прямолинейно, без лишних абстракций):

    app.post('/api/extract-text', upload.single('file'), async (req, res) => {
      try {
        if (!req.file) throw new Error('Файл не получен');
        const { originalname, buffer } = req.file;
        const extension = originalname.split('.').pop()?.toLowerCase();
        
        let text = '';
        if (extension === 'pdf') {
          const { PDFParse } = await import('pdf-parse');
          const parser = new PDFParse({ data: buffer });
          const result = await parser.getText();
          text = result.text;
          await parser.destroy();
        } else {
          text = buffer.toString('utf-8');
        }
        res.json({ text });
      } catch (error: any) {
        res.status(500).json({ error: error.message });
      }
    });
    

    И обработка требований через LLM:

    app.post('/api/ai/detail', async (req, res) => {
      const { requirement } = req.body;
      const response = await ai.chat.completions.create({
        model: 'gpt-4o',
        messages: [
          { 
            role: "system", 
            content: 'Decompose requirements and return JSON: { "detailedDescription": "...", "estimate": "XS | S | M | L | XL" }' 
          }, 
          { role: "user", content: `Name: ${requirement.name}\nDescription: ${requirement.description}` }
        ],
        response_format: { type: 'json_object' }
      });
      res.json(JSON.parse(response.choices[0].message.content));
    });
    

    JSON-боль и LiteLLM

    Еще один нюанс всплыл при переходе с прямой работы с Gemini на работу через прокси-шлюз LiteLLM (для подключения моделей OpenAI и других).

    В изначальной "навайбкоженной" версии на чистом Gemini проблем с парсингом JSON почти не было. Но как только в цепочке появился прокси-шлюз, начались странности: лишние переносы строк внутри значений, "битые" кавычки и другие артефакты, которые ломали стандартный JSON.parse.

    Чтобы не тратить время на бесконечные правки промптов, мы выделили решение в отдельную открытую библиотеку:

    @iconicompany/sanitizejson

    Это небольшая надстройка над мощным инструментом @qraftr/json-repair. Почему не использовать его напрямую? Потому что даже он иногда пасует перед специфическими "глюками" LLM-шлюзов (например, когда строка обрывается посередине или содержит неэкранированные литералы). Наша утилита добавляет слой эвристик, который "склеивает" такие куски до того, как они попадут в основной парсер.


    Итог

    Главное изменение рынка сейчас не в самом факте появления AI. А в том, что разница в скорости между командами стала x5-x10. Пока одни спорят, какой фреймворк "правильнее", другие используют вайб-кодинг, чтобы проверить гипотезу и собрать обратную связь.

    Ждем вашего фидбека! В долгосрочных планах - интеграция в ai-native цикл SDLC от идеи и формирования команды до релиза.


    📚 Читайте также