ИИ-генерация кода для компонента JavaScript в Loginom

16 марта 2026
0 комментариев

Использование больших языковых моделей позволяет значительно упростить разработку кода. Предлагаются шаблоны запросов к LLM для Компонента JavaScript в платформе Loginom. С их помощью можно генерировать рабочий код, ускоряя разработку аналитических Сценариев. Рассматриваются нюансы выбора LLM и подготовки запросов.

Большие языковые модели (LLM) активно используются для генерации программного кода по текстовому описанию задачи. Пользователь формулирует требования на естественном языке, после чего модель предлагает готовую реализацию — иногда полностью работоспособную, иногда требующую доработки.

Платформа Loginom предназначена для построения аналитических решений — от интеграции источников до моделирования логики обработки данных и внедрения результатов в бизнес-процессы.

Ключевая особенность платформы — low-code подход. Он предполагает создание аналитических решений преимущественно с помощью визуального проектирования из готовых Компонентов, минимизируя необходимость ручного написания кода. Такой подход позволяет значительно ускорить разработку и вовлекать в процесс специалистов, не имеющих навыков программирования, из различных предметных областей.

В Loginom пользователь строит Сценарий обработки данных в виде графа, состоящего из узлов. Каждый узел выполняет определенную операцию: импорт данных, трансформацию, анализ, моделирование или экспорт результатов. Благодаря этому сложные процессы обработки данных можно реализовать визуально, объединяя готовые Компоненты в единый аналитический конвейер.

Тем не менее, в рамках low-code подхода иногда возникает необходимость решать задачи, выходящие за рамки имеющихся средств обработки данных и коннекторов. Для таких случаев в платформе предусмотрены программируемые Компоненты, в том числе JavaScript, позволяющий добавлять пользовательский код в Сценарий обработки данных.

Компонент JavaScript и генерация кода

Компонент JavaScript в Loginom — это универсальный программируемый обработчик. Он предназначен для реализации логики, которая не может быть выполнена стандартными средствами платформы. Чаще всего это такие задачи как:

  • специфическая обработка данных, сложные вычисления;
  • интеграция с внешними сервисами, которая не может быть реализована готовыми Компонентами.

Написание кода вручную требует времени и соответствующих навыков. Именно здесь генеративные модели искусственного интеллекта (ИИ) могут значительно упростить процесс разработки.

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

В этих шаблонах содержится сжатое техническое описание требований к коду. Оно позволяют сформировать корректный и достаточно подробный запрос к языковой модели и получить рабочий код для Компонента JavaScript.

Пример генерации

Принцип работы с шаблоном очень прост. Нужно открыть страницу обращения к LLM, добавить туда файл-шаблон и ввести запрос.

Для примера взят ChatGPT-5.2 и добавлен шаблон для Loginom 7.3. Текст запроса:

Привет, мне нужен скрипт в узле JavaScript, реализующий следующий функционал: Запрос к API OpenRouter к LLM и вывод ответа. Детали: — ключ API вводим в порт переменных, — запрос пользователя вводим в порт переменных. На выходе получаем ответ LLM в таблице. Предусмотри вывод ошибок обращения к сервису.

Получен ответ:

Вот готовый пример для узла JavaScript в Loginom: берет API-ключ и запрос пользователя из входных переменных, делает запрос к OpenRouter Chat Completions, а на выход отдает одну строку с результатом (или ошибкой).

Важно: в Loginom для записи строки в выходную таблицу нужно сначала вызвать OutputTable.Append(), а потом OutputTable.Set(...) — иначе словишь ошибки вроде NewRow / «не поддерживается метод».

import {
  InputVariables,
  OutputTable,
  DataType
} from "builtIn/Data";

import { fetch, Headers } from "builtIn/Fetch";

// --- Настройки по умолчанию ---
var DEFAULT_MODEL = "openai/gpt-4o-mini"; // можешь заменить на нужную
var ENDPOINT = "https://openrouter.ai/api/v1/chat/completions";

function getVar(name, fallback) {
  var v = InputVariables && InputVariables.Items && InputVariables.Items[name];
  if (!v || v.IsNull) return fallback;
  // Value может быть undefined, поэтому страхуемся
  return (typeof v.Value === "undefined") ? fallback : v.Value;
}

function safeJsonParse(text) {
  try { return JSON.parse(text); } catch (e) { return null; }
}

function writeRow(ok, model, answer, error, status, raw) {
  OutputTable.Append();
  OutputTable.Set("ok", ok);
  OutputTable.Set("model", model || "");
  OutputTable.Set("answer", answer || "");
  OutputTable.Set("error", error || "");
  OutputTable.Set("http_status", (typeof status === "number") ? status : null);
  OutputTable.Set("raw_json", raw || "");
}

(async function main() {
  // 1) Структура выходной таблицы
  OutputTable.AssignColumns([
    { Name: "ok",         DisplayName: "OK",          DataType: DataType.Boolean },
    { Name: "model",      DisplayName: "Model",       DataType: DataType.String },
    { Name: "answer",     DisplayName: "Answer",      DataType: DataType.String },
    { Name: "error",      DisplayName: "Error",       DataType: DataType.String },
    { Name: "http_status",DisplayName: "HTTP status", DataType: DataType.Integer },
    { Name: "raw_json",   DisplayName: "Raw JSON",    DataType: DataType.String }
  ]);

  // 2) Читаем входные переменные (переименуй под свои имена переменных в Loginom)
  var apiKey = getVar("OPENROUTER_API_KEY", "");
  var userPrompt = getVar("USER_PROMPT", "");
  var model = getVar("MODEL", DEFAULT_MODEL);

  if (!apiKey) {
    writeRow(false, model, "", "Не задана входная переменная OPENROUTER_API_KEY", null, "");
    return;
  }
  if (!userPrompt) {
    writeRow(false, model, "", "Не задана входная переменная USER_PROMPT", null, "");
    return;
  }

  // 3) Готовим запрос
  var headers = new Headers();
  headers.set("Authorization", "Bearer " + apiKey);
  headers.set("Content-Type", "application/json");
  // Эти заголовки OpenRouter рекомендует, но обычно необязательны:
  // headers.set("HTTP-Referer", "https://your-app.example"); // или домен компании
  // headers.set("X-Title", "Loginom JS Node");

  var bodyObj = {
    model: model,
    messages: [
      { role: "user", content: String(userPrompt) }
    ],
    // можно добавить параметры:
    // temperature: 0.2,
    // max_tokens: 512
  };

  var resp, text;
  try {
    resp = await fetch(ENDPOINT, {
      method: "POST",
      headers: headers,
      body: JSON.stringify(bodyObj)
    });

    text = await resp.text();

    if (!resp.ok) {
      // Попробуем вытащить осмысленную ошибку
      var jErr = safeJsonParse(text);
      var msg = jErr && jErr.error && (jErr.error.message || jErr.error);
      var errText = "OpenRouter вернул ошибку: HTTP " + resp.status + (msg ? (", " + msg) : "");
      writeRow(false, model, "", errText, resp.status, text);
      return;
    }

    var data = safeJsonParse(text);
    if (!data || !data.choices || !data.choices.length) {
      writeRow(false, model, "", "Неожиданный формат ответа OpenRouter (нет choices)", resp.status, text);
      return;
    }

    var answer =
      (data.choices[0].message && data.choices[0].message.content) ?
        String(data.choices[0].message.content) : "";

    var usedModel = data.model ? String(data.model) : model;

    writeRow(true, usedModel, answer, "", resp.status, text);
  } catch (e) {
    var err = (e && e.message) ? String(e.message) : String(e);
    writeRow(false, model, "", "Ошибка обращения к OpenRouter: " + err, resp && resp.status, text || "");
  }
})();

Как завести переменные в узле

Создай во входном порту переменных (InputVariables) переменные с именами:

OPENROUTER_API_KEY (строка)

USER_PROMPT (строка)

(опционально) MODEL (строка), например anthropic/claude-3.5-sonnet или openai/gpt-4o-mini

Если у тебя переменные называются иначе — просто замени строки "OPENROUTER_API_KEY", "USER_PROMPT", "MODEL" в коде.

Конец ответа ChatGPT

Написанный LLM код был добавлен в узел JavaScript и отработал без ошибок. Важно: этот код не оптимален, так и бывает в большинстве случаев. Тем не менее, он работает. Также, из-за специфики работы LLM, при попытке сгенерировать новый код по такому же запросу результат будет отличаться.

Также возможно возникновение ошибок. Можно вести диалог с LLM, отправлять ей возникающие ошибки. На практике многое будет зависеть от содержания запроса.

Рекомендации по работе с шаблоном

Важно учитывать, что запросы к LLM в данном случае получаются довольно объемными. Итоговый prompt может содержать значительное количество токенов. Это означает, что не все языковые модели способны корректно обработать подобный запрос.

Решение было протестировано на ряде современных больших языковых моделей (LLM). Им были даны аналогичные запросы и одинаковые шаблоны.

Хорошие результаты показали модели, доступные через API облачных сервисов. В частности, стабильную генерацию корректного кода продемонстрировали модели уровня ChatGPT-5 и выше, а также Gemini 2.5. Эти модели уверенно обрабатывают длинные запросы, корректно интерпретируют инструкции и достаточно точно следуют заданным ограничениям среды выполнения.

Среди решений, разворачиваемых локально, наилучшие результаты показали модели архитектуры Mamba-2, а также крупная открытая модель GPT-OSS-120B. При достаточных вычислительных ресурсах они способны корректно интерпретировать шаблон запроса и генерировать работоспособный код для Компонента JavaScript.

В то же время тестирование выявило и ряд антипримеров. Например, GPT-OSS-20B и Gemma 3:27B — достаточно распространенные локальные модели — показали заметно более слабые результаты. Основная проблема заключалась в том, что часть требований из prompt модель «теряла» в процессе генерации.

Практические рекомендации по использованию шаблонов:

  1. Необходимо четко формулировать задачу. Чем точнее описаны входные данные и ожидаемый результат, тем выше вероятность получить корректный код.
  2. Если используемая LLM поддерживает веб-поиск или работу с внешними источниками, может быть полезно добавить ссылку на официальную документацию Loginom.
  3. В конце запроса рекомендуется добавить фразу: «прежде, чем запустить генерацию, задай уточняющие вопросы, если информации недостаточно».

Также, при использовании внешних LLM, необходимо учитывать еще один важный момент — стоимость запроса. При безответственном отношении к генерации кода потратить впустую бюджет — очень просто. Рекомендуется об этом не забывать.

Тем не менее, использование генеративных моделей ИИ в сочетании с Компонентом JavaScript позволяет существенно расширить возможности low-code подхода.

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

Другие материалы по теме:

Гибкий конвейер нормализации НСИ

Рабочие кейсы применения AI с Loginom

#LLM#новости

Смотрите также

Подписывайтесь на телеграмм-канал Loginom
Новости, материалы по аналитике, кейсы применения, активное сообщество
Подписаться