РаботаСМоделямиИИ_зи

Запрос к модели по промту, поиск промта по имени, параметры промта для кода, представление расхода, проверка подключения, обновление каталога моделей и запись параметров в промт.

Основной модуль коннектора. Где вызывать, единый результат и расход — в разделе Программный интерфейс.

ВыполнитьЗапросПоПромту

Отправляет модели запрос по сохранённому промту и возвращает её ответ. Провайдер, модель, системный текст и прочие настройки берутся из промта; часть из них можно переопределить на один вызов, сам промт при этом не меняется.

Функция ВыполнитьЗапросПоПромту(ПараметрыЗапроса) Экспорт

Параметры

ПараметрыЗапроса — Структура:

Ключ

Тип

Описание

Промт

СправочникСсылка.ПромтыИИ_зи, Строка

Обязательный. Ссылка либо имя для кода промта, регистр букв не важен. Имени нет или его носят несколько промтов — отказ 400.

СообщениеПользователя

Строка

Текст запроса. Обязателен, если у запроса нет системного текста. Модели решений не нужен, если переданы Файлы.

Файлы

Массив из Структура

Файлы к сообщению пользователя, см. «Файлы» ниже.

Провайдер

СправочникСсылка.ПровайдерыИИ_зи

Вместо провайдера промта.

Модель

СправочникСсылка.МоделиИИ_зи

Вместо модели промта.

СистемныйТекст

Строка

Вместо системного текста промта; пустая строка — запрос без системного текста. Ключ не передан — текст промта.

Температура

Число

Вместо температуры промта. 0 не переопределяет.

УровеньРассуждений

Строка

Вместо уровня промта: none, minimal, low, medium, high или xhigh. Пустая строка — уровень промта, другое значение — отказ 400.

МаксимумТокенов

Число

Вместо «Максимум токенов» промта: предел ответа, токенов.

Таймаут

Число

Вместо «Таймаут, с» промта: сколько секунд ждать ответа на одно обращение.

ДлительнаяОперация

Булево

Генерация, которой мало обычного таймаута. Пока выполняется обычным запросом с ожиданием ПредельноеВремяГенерации; Таймаут при этом не действует.

ПредельноеВремяГенерации

Число

Ожидание длительной операции, с. Не передано — 300.

ИнтервалПроверкиГотовности

Число

Зарезервирован для фонового режима длительной операции, сейчас не читается.

Не переданный или незаполненный ключ переопределения означает «как в промте»; исключение — пустой СистемныйТекст. Числовой ключ, равный 0, отрицательный или не числовой, тоже ничего не переопределяет. Дополнительные параметры, схема ответа, порции и проверка суммы строк берутся только из промта.

Возвращаемое значение

Единый результат. При успехе Данные — текст ответа модели (Строка), а если в промте задана схема ответа — текст JSON-объекта: разберите его ПрочитатьJSON. У промта с моделью решений Данные — тоже JSON-объект по схеме ответа, см. Модель решений.

Если запрос дошёл до обращения к сервису, результат дополнен полями:

Поле

Тип

Описание

РежимСхемыОтвета

Строка

Как схема ответа дошла до модели: Схема — соответствие схеме гарантирует сервис; JSON — гарантирован только JSON, схема передана инструкцией; Текст — схема только в инструкции; Решения — свойства схемы стали вопросами модели решений. Пусто — схема в промте не задана.

УровеньРассуждений

Строка

Уровень, фактически переданный модели. Пусто — не задан или модель уровень не настраивает.

Порций

Число

Сколько запросов к модели выполнено; без порций — 1.

Расход

Структура

Расход всех обращений запроса, см. Расход.

ИдентификаторОперации

Строка

Отбор обращений этого запроса в журнале запросов.

Решения

Соответствие

Только у модели решений: вероятности и уверенность ответов на каждый вопрос. Состав — как Сведения.Решения возможности Решения.

Дополнительных полей может не быть

Если метод отказал по собственной проверке — промт не найден, в нём не задан таймаут, у чат-модели нет ни сообщения, ни системного текста, не выбраны провайдер или модель, модель принадлежит другому провайдеру, ошибка в схеме ответа, порциях или проверке суммы строк, неизвестный уровень рассуждений, настройки промта не подходят модели решений, — результат приходит без этих полей. Обращайтесь к ним через Свойство.

Особенности

  • Исключение. При непредвиденном сбое — например, если у пользователя нет прав на чтение промта — метод вызывает исключение. Если сбой случился после обращения к сервису, итог сперва записывается в журнал запросов. Где отказ не должен прерывать вашу операцию, вызывайте метод в Попытка … Исключение.

  • Таймаут берётся из промта («Таймаут, с») и там обязателен, если не передан при вызове. Сервис не ответил вовремя — КодСостояния = 504, а подсказка в описании называет, где увеличить время: в промте, в ключе Таймаут или в ПредельноеВремяГенерации.

  • Переопределённые предел и время видны в журнале запросов: поле «Переопределено при вызове» перечисляет ключи, взятые из вызова, а пустое значит, что всё взято из промта. Рядом — фактически отправленные «Максимум токенов» и «Таймаут, с».

  • Длительная операция пока не использует фоновый режим сервиса: запрос идёт обычным способом и ждёт ПредельноеВремяГенерации. В журнале это отмечено как «ДлительнаяОперация (синхронно)». Ключи можно передавать уже сейчас: когда фоновый режим появится, вызов менять не придётся.

  • Провайдер и модель меняются парой: модель должна принадлежать провайдеру запроса, иначе отказ 400.

  • Температура 0 означает «не задана». Переопределить ею нельзя, а промт с нулевой температурой отправляет запрос без неё — модель берёт своё значение по умолчанию.

  • Уровень рассуждений не передаётся модели, которая, судя по каталогу моделей провайдера, рассуждения не настраивает. Что ушло на деле, видно в поле УровеньРассуждений.

  • Без сообщения пользователя задание целиком лежит в системном тексте. Если нет и файлов, системный текст уходит модели как сообщение пользователя.

  • Пустой ответ модели без схемы считается успехом: в Данные попадает пояснение коннектора — «Модель вернула пустой ответ…» или, если исчерпан лимит токенов, совет увеличить «Максимум токенов» в промте (либо ключ МаксимумТокенов, если предел передан при вызове).

Файлы

Файлы — массив структур с ключами ИмяФайла (Строка с расширением, по нему определяется тип) и ДанныеФайла (ДвоичныеДанные). Файлы ставятся в сообщение пользователя перед текстом; сообщение может состоять из одних файлов.

Провайдер

Допустимые типы

RouterAI

pdf, png, jpg, jpeg, webp

Yandex

png, jpg, jpeg, webp — PDF сервис не принимает

До отправки отклоняются (код 400) файл другого типа, без имени или пустой, а также изображение для модели, которая по каталогу провайдера не принимает изображения. PDF у RouterAI принимает любая модель: сервис сам извлекает из него текст. Если каталог ничего не сообщает о модели (так у Yandex), проверки нет, и текстовая модель может ответить так, будто изображения нет.

Схема ответа и порции

Если в промте задана схема ответа (см. Промты):

  • ответ модели обязан быть одним JSON-объектом, иначе Успешно = Ложь при КодСостояния = 200, а в Данные — исходный текст модели;

  • при заданных порциях модель возвращает массив по частям, отдельным запросом на каждую. Данные — склеенный объект (поля вне массива — из первой порции), Порций — число запросов, не больше 50. Ошибка любой порции — неуспех всего запроса с её номером в описании;

  • при заданной проверке суммы строк расхождение больше допуска или пустой итог дают Успешно = Ложь при КодСостояния = 200; ответ модели остаётся в Данные.

Модель решений

Если в промте выбрана модель решений (в каталоге у неё выход «решения», например openai/gpt-6-luna-decisions), запрос уходит не в чат, а возможностью Решения. Вызов не меняется: тот же ВыполнитьЗапросПоПромту, и Данные — тот же JSON-объект по схеме ответа. Поменять модель в промте можно без правки кода.

Схема ответа для такой модели обязательна: каждое свойство верхнего уровня — вопрос, имя свойства — имя вопроса, description (иначе title, иначе имя) — инструкция к нему. В карточке промта вопросы задаются таблицей на странице «Вопросы», схему она пишет сама (см. Промты).

Свойство схемы

Вопрос

Значение в Данные

string с enum

Выбор варианта

Выбранный вариант, строка.

string с oneOf или anyOf из {"const": …, "description": …}

Выбор варианта с описаниями

Выбранный вариант, строка.

boolean

Да или нет

true, если вероятность «да» не меньше 0,5.

boolean с oneOf или anyOf из {"const": true, "description": …} и {"const": false, "description": …}

Да или нет с описаниями ответов; можно описать только один

true, если вероятность «да» не меньше 0,5.

number или integer с enum либо oneOf из const

Оценка по уровням, уровни — по возрастанию const

const уровня, ближайшего к ожидаемому.

Свойство другой формы — объект, массив, строка без вариантов, boolean с вариантами не из true и false — отклоняется с именем свойства и перечнем поддержанных форм.

Задание модели решений — в схеме: что спросить и что значат варианты, говорят description свойств. Системный текст и сообщение пользователя для неё необязательны. Если они есть, то уходят вместе, через пустую строку, как часть того, что модель оценивает, — рядом с изображениями из Файлы. Поэтому пишите туда контекст («снимок сделан при приёмке товара»), а не указания вроде «определи…»: указания модель приняла бы за оцениваемые данные. Одного снимка без текста достаточно. Нет ни текста, ни файлов — отказ 400 до обращения к сервису.

Ограничения файлов строже, чем у чата: только png, jpg, jpeg, webp, не больше 8, всё тело запроса — не больше 4 500 000 байт.

Температура, максимум токенов, уровень рассуждений и дополнительные параметры промта модели решений не передаются. Порции и проверка суммы строк к ней не применяются: промт с ними не запишется, а запрос по такому промту отклоняется с кодом 400 до обращения к сервису.

Вероятности и уверенность ответов — в поле Решения результата:

Результат = РаботаСМоделямиИИ_зи.ВыполнитьЗапросПоПромту(ПараметрыЗапроса); Если Результат.Успешно Тогда Чтение = Новый ЧтениеJSON; Чтение.УстановитьСтроку(Результат.Данные); Ответ = ПрочитатьJSON(Чтение, Истина); // {"kind": "tape"} Чтение.Закрыть(); Решения = Неопределено; Если Результат.Свойство("Решения", Решения) Тогда Уверенность = Решения.Получить("kind").Уверенность; КонецЕсли; КонецЕсли;

Пример

Промт с заданием в системном тексте и схемой ответа разбирает присланный документ:

Функция ДанныеДокумента(Промт, ИмяФайла, ДанныеФайла) Файлы = Новый Массив; Файлы.Добавить(Новый Структура("ИмяФайла, ДанныеФайла", ИмяФайла, ДанныеФайла)); ПараметрыЗапроса = Новый Структура; ПараметрыЗапроса.Вставить("Промт", Промт); ПараметрыЗапроса.Вставить("Файлы", Файлы); Результат = РаботаСМоделямиИИ_зи.ВыполнитьЗапросПоПромту(ПараметрыЗапроса); Если НЕ Результат.Успешно Тогда ВызватьИсключение Результат.ОписаниеОшибки; КонецЕсли; Чтение = Новый ЧтениеJSON; Чтение.УстановитьСтроку(Результат.Данные); Документ = ПрочитатьJSON(Чтение, Истина); Чтение.Закрыть(); Возврат Документ; КонецФункции

ПромтПоИмени

Находит промт по имени для кода. ВыполнитьЗапросПоПромту принимает имя и сам, функция нужна, когда требуется ссылка.

Функция ПромтПоИмени(Имя) Экспорт

Параметры. Имя — Строка: имя для кода промта, регистр букв не важен.

Возвращаемое значение. СправочникСсылка.ПромтыИИ_зи. Пустая ссылка — промта с таким именем нет либо имя носят несколько промтов: так бывает только после записи в обход проверки.

ПараметрыПромта

Читает параметры для кода промта — значения, которые задают в конкретной базе: порог уверенности, ссылку на объект базы. Модели они не передаются, применяет их ваш код.

Функция ПараметрыПромта(Промт) Экспорт

Параметры. Промт — СправочникСсылка.ПромтыИИ_зи или Строка: ссылка либо имя для кода промта.

Возвращаемое значение.

  • Структура: ключ — имя параметра, значение — его значение. Если в этой базе значение не задано — Неопределено.

  • Неопределено — промт не найден либо его имя носят несколько промтов. Опечатка в имени промта поэтому не выглядит как «параметр не задан».

Параметры = РаботаСМоделямиИИ_зи.ПараметрыПромта("ПроверкаСнимкаДокумента"); Если Параметры = Неопределено Тогда ВызватьИсключение "Не найден промт ПроверкаСнимкаДокумента"; КонецЕсли; Порог = Неопределено; Параметры.Свойство("ПорогУверенности", Порог); Если Порог = Неопределено Тогда Порог = 0.8; // в этой базе порог не задан КонецЕсли;

Особенности. Строку с недопустимым или повторным именем функция пропускает, из повторных остаётся первая. Такие строки бывают только после записи промта в обход проверки. Без права на чтение промтов функция вызывает исключение.

ПредставлениеРасхода

Возвращает строку о расходе для показа пользователю.

Функция ПредставлениеРасхода(Расход) Экспорт

Параметры. Расход — Структура или Неопределено: расход из результата ВыполнитьЗапросПоПромту или из ДиспетчерПровайдеровИИ_зи.ЗавершитьОперацию.

Возвращаемое значение. Строка вида «Токенов: 12 345 (запрос 10 000, ответ 2 345); время: 38,2 с; стоимость: 1,23 RUB». Если обращений несколько, добавляется их число, если модель рассуждала — токены рассуждений. Стоимость, сообщённая не всеми обращениями, помечается «не менее», не сообщённая — «стоимость не сообщена». Пустая строка — токены не расходовались или передан не расход.

Расход = Неопределено; Результат.Свойство("Расход", Расход); // поля может не быть ТекстРасхода = РаботаСМоделямиИИ_зи.ПредставлениеРасхода(Расход);

ПроверитьПодключение

Проверяет, что провайдер настроен и сервис принимает его ключ. Обращение пишется в журнал запросов.

Функция ПроверитьПодключение(Провайдер) Экспорт

Параметры. Провайдер — СправочникСсылка.ПровайдерыИИ_зи.

Возвращаемое значение. Единый результат; при успехе Данные — строка «Подключение успешно. Доступно моделей: N.».

ОбновитьКаталогМоделей

Загружает перечень моделей провайдера в справочник моделей — то же, что команда «Обновить каталог моделей» в карточке провайдера (см. Провайдеры и модели).

Функция ОбновитьКаталогМоделей(Провайдер) Экспорт

Параметры. Провайдер — СправочникСсылка.ПровайдерыИИ_зи.

Возвращаемое значение. Единый результат; при успехе Данные — Структура со счётчиками (Число): Добавлено — новых моделей, Активировано — снова доступных, Деактивировано — помеченных недоступными, ПараметровДобавлено — новых элементов справочника параметров моделей.

Особенности.

  • Затрагиваются только модели этого провайдера, сопоставление — по идентификатору модели. Карточка найденной модели целиком перезаписывается сведениями сервиса.

  • Модель, которой нет в ответе, помечается недоступной, но не удаляется: ссылки на неё из промтов сохраняются.

  • Если обращение к сервису не удалось или сервис вернул пустой перечень, каталог не меняется.

  • Нужна роль «Добавление / изменение ИИ», без неё метод завершится исключением.

СохранитьПараметрыВПромт

Записывает в промт провайдера, модель, системный текст, температуру и уровень рассуждений — например, подобранные пользователем в вашей форме.

Функция СохранитьПараметрыВПромт(Промт, ПараметрыСохранения) Экспорт

Параметры. Промт — СправочникСсылка.ПромтыИИ_зи; ПараметрыСохранения — Структура:

Ключ

Тип

Описание

Провайдер

СправочникСсылка.ПровайдерыИИ_зи

Не передан, а модель передана — записывается провайдер модели.

Модель

СправочникСсылка.МоделиИИ_зи

Должна принадлежать провайдеру, иначе отказ 400.

СистемныйТекст

Строка

Температура

Число

УровеньРассуждений

Строка

Необязательный: ключ не передан — уровень промта не меняется, пустая строка — уровень по умолчанию модели. Значения — как в ВыполнитьЗапросПоПромту.

Возвращаемое значение. Единый результат; при успехе Данные — наименование промта.

Особенности.

  • Первые четыре реквизита записываются всегда: ключ, которого нет в структуре, очищает реквизит промта. Передавайте все четыре.

  • Максимум токенов, таймаут, дополнительные параметры и схема ответа не меняются.

  • Нужна роль «Добавление / изменение ИИ». Если промт записать не удалось, возвращается отказ 400 с причиной.