1
0
mirror of https://github.com/Bayselonarrend/OpenIntegrations.git synced 2025-11-25 22:12:29 +02:00
Files
OpenIntegrations/XML/CommonModules/OPI_Ollama/Ext/Module.bsl
Vitaly the Alpaca (bot) cdef2d02ab Main build (Jenkins)
2025-10-21 21:43:05 +03:00

732 lines
42 KiB
Plaintext

// OneScript: ./OInt/core/Modules/OPI_Ollama.os
// Lib: Ollama
// CLI: ollama
// MIT License
// Copyright (c) 2023-2025 Anton Tsitavets
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
// https://github.com/Bayselonarrend/OpenIntegrations
// BSLLS:Typo-off
// BSLLS:LatinAndCyrillicSymbolInWord-off
// BSLLS:IncorrectLineBreak-off
// BSLLS:NumberOfOptionalParams-off
// BSLLS:UsingServiceTag-off
// BSLLS:LineLength-off
// BSLLS:UsingSynchronousCalls-off
// BSLLS:MagicNumber-off
//@skip-check module-structure-top-region
//@skip-check module-structure-method-in-regions
//@skip-check wrong-string-literal-content
//@skip-check method-too-many-params
//@skip-check constructor-function-return-section
//@skip-check doc-comment-collection-item-type
#Область ПрограммныйИнтерфейс
#Область ОбработкаЗапросов
// Получить версию
// Получает версию Ollama
//
// Примечание:
// Метод в документации API: [Version](@github.com/ollama/ollama/blob/main/docs/api.md#version)
//
// Параметры:
// URL - Строка - URL сервера Ollama - url
// ДопЗаголовки - Соответствие Из КлючИЗначение - Доп заголовки запроса, если необходимо - headers
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - Результат обработки
Функция ПолучитьВерсию(Знач URL, Знач ДопЗаголовки = "") Экспорт
ДополнитьURL(URL, "api/version");
ОбработатьЗаголовки(ДопЗаголовки);
Ответ = OPI_ЗапросыHTTP.Get(URL, , ДопЗаголовки);
Возврат Ответ;
КонецФункции
// Получить ответ
// Генерирует ответ по заданному текстовому запросу
//
// Примечание:
// Метод в документации API: [Generate a completion](@github.com/ollama/ollama/blob/main/docs/api.md#generate-a-completion)
//
// Параметры:
// URL - Строка - URL сервера Ollama - url
// Модель - Строка - Имя модели - model
// Вопрос - Строка - Текст запроса - prompt
// ДопПараметры - Структура Из КлючИЗначение - Доп. параметры. См. ПолучитьСтруктуруПараметровЗапроса - options
// ДопЗаголовки - Соответствие Из КлючИЗначение - Доп заголовки запроса, если необходимо - headers
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - Результат обработки
Функция ПолучитьОтвет(Знач URL, Знач Модель, Знач Вопрос, Знач ДопПараметры = "", Знач ДопЗаголовки = "") Экспорт
ДополнитьURL(URL, "api/generate");
Параметры = Новый Структура;
Параметры.Вставить("suffix", "");
OPI_Инструменты.ДобавитьПоле("model" , Модель, "Строка", Параметры);
OPI_Инструменты.ДобавитьПоле("prompt", Вопрос, "Строка", Параметры);
OPI_Инструменты.ДобавитьПоле("stream", Ложь , "Булево", Параметры);
ОбработатьПараметры(Параметры, ДопПараметры);
ОбработатьЗаголовки(ДопЗаголовки);
Ответ = OPI_ЗапросыHTTP.PostСТелом(URL, Параметры, ДопЗаголовки);
Возврат Ответ;
КонецФункции
// Получить ответ в контексте
// Получает очередной ответ от модели в соответствии с историей сообщений
//
// Примечание:
// Метод в документации API: [Generate a chat completion](@github.com/ollama/ollama/blob/main/docs/api.md#generate-a-chat-completion)
//
// Параметры:
// URL - Строка - URL сервера Ollama - url
// Модель - Строка - Имя модели - model
// Сообщения - Массив Из Структура - История сообщений. См. ПолучитьСтруктуруСообщенияКонтекста - msgs
// ДопПараметры - Структура Из КлючИЗначение - Доп. параметры. См. ПолучитьСтруктуруПараметровЗапроса - options
// ДопЗаголовки - Соответствие Из КлючИЗначение - Доп заголовки запроса, если необходимо - headers
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - Результат обработки
Функция ПолучитьОтветВКонтексте(Знач URL, Знач Модель, Знач Сообщения, Знач ДопПараметры = "", Знач ДопЗаголовки = "") Экспорт
ДополнитьURL(URL, "api/chat");
Параметры = Новый Структура;
OPI_Инструменты.ДобавитьПоле("model" , Модель , "Строка" , Параметры);
OPI_Инструменты.ДобавитьПоле("messages", Сообщения, "Коллекция", Параметры);
OPI_Инструменты.ДобавитьПоле("stream" , Ложь , "Булево" , Параметры);
ОбработатьПараметры(Параметры, ДопПараметры);
ОбработатьЗаголовки(ДопЗаголовки);
Ответ = OPI_ЗапросыHTTP.PostСТелом(URL, Параметры, ДопЗаголовки);
Возврат Ответ;
КонецФункции
// Получить представления
// Получает представления (embeddings) для заданных вводных
//
// Примечание:
// Метод в документации API: [Generate Embeddings](@github.com/ollama/ollama/blob/main/docs/api.md#generate-embeddings)
//
// Параметры:
// URL - Строка - URL сервера Ollama - url
// Модель - Строка - Имя модели - model
// Вопрос - Массив Из Строка - Строка или массив строк запросов - input
// ДопПараметры - Структура Из КлючИЗначение - Доп. параметры. См. ПолучитьСтруктуруПараметровПредставлений - options
// ДопЗаголовки - Соответствие Из КлючИЗначение - Доп заголовки запроса, если необходимо - headers
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - Результат обработки
Функция ПолучитьПредставления(Знач URL, Знач Модель, Знач Вопрос, Знач ДопПараметры = "", Знач ДопЗаголовки = "") Экспорт
ДополнитьURL(URL, "api/embed");
Параметры = Новый Структура;
OPI_Инструменты.ДобавитьПоле("model", Модель, "Строка", Параметры);
OPI_Инструменты.ДобавитьПоле("input", Вопрос, "Строка", Параметры);
ОбработатьПараметры(Параметры, ДопПараметры);
ОбработатьЗаголовки(ДопЗаголовки);
Ответ = OPI_ЗапросыHTTP.PostСТелом(URL, Параметры, ДопЗаголовки);
Возврат Ответ;
КонецФункции
// Получить структуру параметров запроса
// Получает структуру дополнительных параметров для обработки запроса
//
// Параметры:
// Пустая - Булево - Истина > структура с пустыми значениями, Ложь > в значениях будут описания полей - empty
//
// Возвращаемое значение:
// Структура Из КлючИЗначение - Структура полей
Функция ПолучитьСтруктуруПараметровЗапроса(Знач Пустая = Ложь) Экспорт
OPI_ПреобразованиеТипов.ПолучитьБулево(Пустая);
СтруктураПолей = Новый Структура;
СтруктураПолей.Вставить("format" , "<формат, в котором возвращается ответ: json или схема JSON>");
СтруктураПолей.Вставить("options" , "<дополнительные параметры модели, перечисленные в документации к Modelfile>");
СтруктураПолей.Вставить("system" , "<системное сообщение (переопределяет то, что определено в Modelfile)>");
СтруктураПолей.Вставить("template" , "<шаблон промпта (переопределяет то, что определено в Modelfile)>");
СтруктураПолей.Вставить("raw" , "<истина > откюлчить форматирование промпта>");
СтруктураПолей.Вставить("keep_alive", "<как долго модель будет оставаться загруженной в память после запроса>");
СтруктураПолей.Вставить("suffix" , "<текст после ответа модели>");
СтруктураПолей.Вставить("images" , "<список картинок в формате Base64 (для многомодальных моделей, вроде llava)>");
Если Пустая Тогда
СтруктураПолей = OPI_Инструменты.ОчиститьКоллекциюРекурсивно(СтруктураПолей);
КонецЕсли;
//@skip-check constructor-function-return-section
Возврат СтруктураПолей;
КонецФункции
// Получить структуру параметров представлений
// Получает структуру дополнительных параметров для обработки запросов получения представлений
//
// Параметры:
// Пустая - Булево - Истина > структура с пустыми значениями, Ложь > в значениях будут описания полей - empty
//
// Возвращаемое значение:
// Структура Из КлючИЗначение - Структура полей
Функция ПолучитьСтруктуруПараметровПредставлений(Знач Пустая = Ложь) Экспорт
OPI_ПреобразованиеТипов.ПолучитьБулево(Пустая);
СтруктураПолей = Новый Структура;
СтруктураПолей.Вставить("options" , "<дополнительные параметры модели, перечисленные в документации к Modelfile>");
СтруктураПолей.Вставить("keep_alive", "<как долго модель будет оставаться загруженной в память после запроса>");
СтруктураПолей.Вставить("truncate" , "<обрезает конец каждого ответа, чтобы уложиться в длину контекста. Возвращает ошибку, если false и длина превышена>");
Если Пустая Тогда
СтруктураПолей = OPI_Инструменты.ОчиститьКоллекциюРекурсивно(СтруктураПолей);
КонецЕсли;
//@skip-check constructor-function-return-section
Возврат СтруктураПолей;
КонецФункции
// Получить структуру параметров в контексте
// Получает структуру дополнительных параметров для обработки запроса в контексте
//
// Параметры:
// Пустая - Булево - Истина > структура с пустыми значениями, Ложь > в значениях будут описания полей - empty
//
// Возвращаемое значение:
// Структура Из КлючИЗначение - Структура полей
Функция ПолучитьСтруктуруПараметровВКонтексте(Знач Пустая = Ложь) Экспорт
OPI_ПреобразованиеТипов.ПолучитьБулево(Пустая);
СтруктураПолей = Новый Структура;
СтруктураПолей.Вставить("format" , "<формат, в котором возвращается ответ: json или схема JSON>");
СтруктураПолей.Вставить("options" , "<дополнительные параметры модели, перечисленные в документации к Modelfile>");
СтруктураПолей.Вставить("keep_alive", "<как долго модель будет оставаться загруженной в память после запроса>");
СтруктураПолей.Вставить("tools" , "<список инструментов в формате JSON (для моделей, которые это поддерживают)>");
Если Пустая Тогда
СтруктураПолей = OPI_Инструменты.ОчиститьКоллекциюРекурсивно(СтруктураПолей);
КонецЕсли;
//@skip-check constructor-function-return-section
Возврат СтруктураПолей;
КонецФункции
// Получить структуру сообщения контекста
// Получает структуру сообщения для списка сообщений запроса в контексте
//
// Параметры:
// Роль - Строка - Источник сообщения: system, user, assistant, tool - role
// Текст - Строка - Текст сообщения - text
// Картинки - Массив Из Строка - Список картинок в формате Base64 (для многомодальных моделей, вроде llava) - images
// Инструменты - Массив Из Строка - Список инструментов в формате JSON, которые модель должна использовать - tools
//
// Возвращаемое значение:
// Структура Из КлючИЗначение - Структура полей
Функция ПолучитьСтруктуруСообщенияКонтекста(Знач Роль, Знач Текст, Знач Картинки = "", Знач Инструменты = "") Экспорт
СтруктураПолей = Новый Структура;
OPI_Инструменты.ДобавитьПоле("role" , Роль , "Строка" , СтруктураПолей);
OPI_Инструменты.ДобавитьПоле("content" , Текст , "Строка" , СтруктураПолей);
OPI_Инструменты.ДобавитьПоле("images" , Картинки , "Коллекция", СтруктураПолей);
OPI_Инструменты.ДобавитьПоле("tool_calls", Инструменты, "Коллекция", СтруктураПолей);
Возврат СтруктураПолей;
КонецФункции
#КонецОбласти
#Область РаботаСМоделями
// Получить список моделей
// Получает список локальных моделей
//
// Примечание:
// Метод в документации API: [List Local Models](@github.com/ollama/ollama/blob/main/docs/api.md#list-local-models)
//
// Параметры:
// URL - Строка - URL сервера Ollama - url
// ДопЗаголовки - Соответствие Из КлючИЗначение - Доп заголовки запроса, если необходимо - headers
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - Результат обработки
Функция ПолучитьСписокМоделей(Знач URL, Знач ДопЗаголовки = "") Экспорт
ДополнитьURL(URL, "api/tags");
ОбработатьЗаголовки(ДопЗаголовки);
Ответ = OPI_ЗапросыHTTP.Get(URL, , ДопЗаголовки);
Возврат Ответ;
КонецФункции
// Получить список запущенных моделей
// Получает список запущенных моделей
//
// Примечание:
// Метод в документации API: [List Running Models](@github.com/ollama/ollama/blob/main/docs/api.md#list-running-models)
//
// Параметры:
// URL - Строка - URL сервера Ollama - url
// ДопЗаголовки - Соответствие Из КлючИЗначение - Доп заголовки запроса, если необходимо - headers
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - Результат обработки
Функция ПолучитьСписокЗапущенныхМоделей(Знач URL, Знач ДопЗаголовки = "") Экспорт
ДополнитьURL(URL, "api/ps");
ОбработатьЗаголовки(ДопЗаголовки);
Ответ = OPI_ЗапросыHTTP.Get(URL, , ДопЗаголовки);
Возврат Ответ;
КонецФункции
// Получить информацию о модели
// Получает информацию о выбранной модели
//
// Примечание:
// Метод в документации API: [Show Model Information](@github.com/ollama/ollama/blob/main/docs/api.md#show-model-information)
//
// Параметры:
// URL - Строка - URL сервера Ollama - url
// Модель - Строка - Имя модели - model
// Подробно - Булево - Возврат полной информации о модели - verbose
// ДопЗаголовки - Соответствие Из КлючИЗначение - Доп заголовки запроса, если необходимо - headers
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - Результат обработки
Функция ПолучитьИнформациюОМодели(Знач URL, Знач Модель, Знач Подробно = Истина, Знач ДопЗаголовки = "") Экспорт
ДополнитьURL(URL, "api/show");
Параметры = Новый Структура;
OPI_Инструменты.ДобавитьПоле("model" , Модель , "Строка", Параметры);
OPI_Инструменты.ДобавитьПоле("verbose", Подробно, "Булево", Параметры);
ОбработатьЗаголовки(ДопЗаголовки);
Ответ = OPI_ЗапросыHTTP.PostСТелом(URL, Параметры, ДопЗаголовки);
Возврат Ответ;
КонецФункции
// Создать модель
// Создает новую модель с заданными настройками
//
// Примечание:
// Метод в документации API: [Create a Model](@github.com/ollama/ollama/blob/main/docs/api.md#create-a-model)
//
// Параметры:
// URL - Строка - URL сервера Ollama - url
// Модель - Строка - Имя модели - model
// Настройки - Структура Из КлючИЗначение - Настройки модели. См. ПолучитьСтруктуруНастроекМодели - settings
// ДопЗаголовки - Соответствие Из КлючИЗначение - Доп заголовки запроса, если необходимо - headers
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - Результат обработки
Функция СоздатьМодель(Знач URL, Знач Модель, Знач Настройки, Знач ДопЗаголовки = "") Экспорт
ДополнитьURL(URL, "api/create");
Параметры = Новый Структура;
OPI_Инструменты.ДобавитьПоле("model" , Модель, "Строка" , Параметры);
OPI_Инструменты.ДобавитьПоле("stream", Ложь , "Булево" , Параметры);
ОбработатьПараметры(Параметры, Настройки);
ОбработатьЗаголовки(ДопЗаголовки);
Ответ = OPI_ЗапросыHTTP.PostСТелом(URL, Параметры, ДопЗаголовки);
Возврат Ответ;
КонецФункции
// Копировать модель
// Копирует существующую модель
//
// Примечание:
// Метод в документации API: [Copy a Model](@github.com/ollama/ollama/blob/main/docs/api.md#copy-a-model)
//
// Параметры:
// URL - Строка - URL сервера Ollama - url
// Модель - Строка - Имя существующей модели - model
// Имя - Строка - Имя новой модели - name
// ДопЗаголовки - Соответствие Из КлючИЗначение - Доп заголовки запроса, если необходимо - headers
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - Результат обработки
Функция КопироватьМодель(Знач URL, Знач Модель, Знач Имя, Знач ДопЗаголовки = "") Экспорт
ДополнитьURL(URL, "api/copy");
Параметры = Новый Структура;
OPI_Инструменты.ДобавитьПоле("source" , Модель, "Строка", Параметры);
OPI_Инструменты.ДобавитьПоле("destination", Имя , "Строка", Параметры);
ОбработатьЗаголовки(ДопЗаголовки);
Ответ = OPI_ЗапросыHTTP.PostСТелом(URL, Параметры, ДопЗаголовки, , Истина);
Ответ = Новый Структура("status_code", Ответ.КодСостояния);
Возврат Ответ;
КонецФункции
// Удалить модель
// Удаляет существующую модель
//
// Примечание:
// Метод в документации API: [Delete a Model](@github.com/ollama/ollama/blob/main/docs/api.md#delete-a-model)
//
// Параметры:
// URL - Строка - URL сервера Ollama - url
// Модель - Строка - Имя модели - model
// ДопЗаголовки - Соответствие Из КлючИЗначение - Доп заголовки запроса, если необходимо - headers
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - Результат обработки
Функция УдалитьМодель(Знач URL, Знач Модель, Знач ДопЗаголовки = "") Экспорт
ДополнитьURL(URL, "api/delete");
Параметры = Новый Структура;
OPI_Инструменты.ДобавитьПоле("model" , Модель, "Строка", Параметры);
ОбработатьЗаголовки(ДопЗаголовки);
Ответ = OPI_ЗапросыHTTP.DeleteСТелом(URL, Параметры, ДопЗаголовки, , Истина);
Ответ = Новый Структура("status_code", Ответ.КодСостояния);
Возврат Ответ;
КонецФункции
// Загрузить модель в память
// Загружает выбранную модель в оперативную память
//
// Примечание:
// Метод в документации API: [Load a model](@github.com/ollama/ollama/blob/main/docs/api.md#load-a-model)
//
// Параметры:
// URL - Строка - URL сервера Ollama - url
// Модель - Строка - Имя модели - model
// Период - Число - Время удержания модели в памяти в секундах - keep
// ДопЗаголовки - Соответствие Из КлючИЗначение - Доп заголовки запроса, если необходимо - headers
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - Результат обработки
Функция ЗагрузитьМодельВПамять(Знач URL, Знач Модель, Знач Период = 300, Знач ДопЗаголовки = "") Экспорт
ДополнитьURL(URL, "api/generate");
Параметры = Новый Структура;
OPI_Инструменты.ДобавитьПоле("model" , Модель, "Строка", Параметры);
OPI_Инструменты.ДобавитьПоле("keep_alive", Период, "Число" , Параметры);
ОбработатьЗаголовки(ДопЗаголовки);
Ответ = OPI_ЗапросыHTTP.PostСТелом(URL, Параметры, ДопЗаголовки);
Возврат Ответ;
КонецФункции
// Выгрузить модель из памяти
// Выгружает выбранную модель из памяти
//
// Примечание:
// Метод в документации API: [Unload a model](@github.com/ollama/ollama/blob/main/docs/api.md#unload-a-model)
//
// Параметры:
// URL - Строка - URL сервера Ollama - url
// Модель - Строка - Имя модели - model
// ДопЗаголовки - Соответствие Из КлючИЗначение - Доп заголовки запроса, если необходимо - headers
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - Результат обработки
Функция ВыгрузитьМодельИзПамяти(Знач URL, Знач Модель, Знач ДопЗаголовки = "") Экспорт
ДополнитьURL(URL, "api/generate");
Параметры = Новый Структура;
Параметры.Вставить("keep_alive", 0);
OPI_Инструменты.ДобавитьПоле("model", Модель, "Строка", Параметры);
ОбработатьЗаголовки(ДопЗаголовки);
Ответ = OPI_ЗапросыHTTP.PostСТелом(URL, Параметры, ДопЗаголовки);
Возврат Ответ;
КонецФункции
// Отправить модель
// Загружает модель в библиотеку моделей
//
// Примечание:
// Метод в документации API: [Push a Model](@github.com/ollama/ollama/blob/main/docs/api.md#push-a-model)
// Имя модели должно быть в формате <namespace>/<model>:<tag>^
// Требуется регистрация на ollama.ai и добавление открытого ключа.
//
// Параметры:
// URL - Строка - URL сервера Ollama - url
// Модель - Строка - Имя модели - model
// Небезопасно - Булево - Разрешает незащищенное соединение с библиотекой - insecure
// ДопЗаголовки - Соответствие Из КлючИЗначение - Доп заголовки запроса, если необходимо - headers
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - Результат обработки
Функция ОтправитьМодель(Знач URL, Знач Модель, Знач Небезопасно = Ложь, Знач ДопЗаголовки = "") Экспорт
ДополнитьURL(URL, "api/push");
Параметры = Новый Структура;
OPI_Инструменты.ДобавитьПоле("model" , Модель , "Строка", Параметры);
OPI_Инструменты.ДобавитьПоле("insecure", Небезопасно, "Булево", Параметры);
OPI_Инструменты.ДобавитьПоле("stream" , Ложь , "Булево", Параметры);
ОбработатьЗаголовки(ДопЗаголовки);
Ответ = OPI_ЗапросыHTTP.PostСТелом(URL, Параметры, ДопЗаголовки);
Возврат Ответ;
КонецФункции
// Скачать модель
// Скачивает модель из библиотеки
//
// Примечание:
// Метод в документации API: [Pull a Model](@github.com/ollama/ollama/blob/main/docs/api.md#pull-a-model)
//
// Параметры:
// URL - Строка - URL сервера Ollama - url
// Модель - Строка - Имя модели - model
// Небезопасно - Булево - Разрешает незащищенное соединение с библиотекой - insecure
// ДопЗаголовки - Соответствие Из КлючИЗначение - Доп заголовки запроса, если необходимо - headers
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - Результат обработки
Функция СкачатьМодель(Знач URL, Знач Модель, Знач Небезопасно = Ложь, Знач ДопЗаголовки = "") Экспорт
ДополнитьURL(URL, "api/pull");
Параметры = Новый Структура;
OPI_Инструменты.ДобавитьПоле("model" , Модель , "Строка", Параметры);
OPI_Инструменты.ДобавитьПоле("insecure", Небезопасно, "Булево", Параметры);
OPI_Инструменты.ДобавитьПоле("stream" , Ложь , "Булево", Параметры);
ОбработатьЗаголовки(ДопЗаголовки);
Ответ = OPI_ЗапросыHTTP.PostСТелом(URL, Параметры, ДопЗаголовки);
Возврат Ответ;
КонецФункции
// Получить структуру настроек модели
// Получает структуру настроек для создания новой модели
//
// Параметры:
// Пустая - Булево - Истина > структура с пустыми значениями, Ложь > в значениях будут описания полей - empty
//
// Возвращаемое значение:
// Структура Из КлючИЗначение - Структура полей
Функция ПолучитьСтруктуруНастроекМодели(Знач Пустая = Ложь) Экспорт
OPI_ПреобразованиеТипов.ПолучитьБулево(Пустая);
СтруктураПолей = Новый Структура;
СтруктураПолей.Вставить("from" , "<имя существующей модели, из которой будет создана новая>");
СтруктураПолей.Вставить("files" , "<список имен файлов или SHA256 блобов, из которых будет создана модель>");
СтруктураПолей.Вставить("adapters" , "<список имен файлов или SHA256 блобов для LORA адаптеров>");
СтруктураПолей.Вставить("template" , "<шаблон промптов новой модели>");
СтруктураПолей.Вставить("license" , "<строка или список строк текста лицензий для модели>");
СтруктураПолей.Вставить("system" , "<строка с системным промптом для модели>");
СтруктураПолей.Вставить("parameters", "<список параметров модели>");
СтруктураПолей.Вставить("messages" , "<список объектов сообщений контекста>");
СтруктураПолей.Вставить("quantize" , "<квантовать неквантованную (например, float16) модель>");
Если Пустая Тогда
СтруктураПолей = OPI_Инструменты.ОчиститьКоллекциюРекурсивно(СтруктураПолей);
КонецЕсли;
//@skip-check constructor-function-return-section
Возврат СтруктураПолей;
КонецФункции
#КонецОбласти
#Область РаботаСBlob
// Отправить BLOB
// Отправляет двоичные данные на сервер Ollama
//
// Примечание:
// Метод в документации API: [Push a Blob](@github.com/ollama/ollama/blob/main/docs/api.md#push-a-blob)
//
// Параметры:
// URL - Строка - URL сервера Ollama - url
// Данные - Строка, ДвоичныеДанные - Данные или путь к файлу - data
// ДопЗаголовки - Соответствие Из КлючИЗначение - Доп заголовки запроса, если необходимо - headers
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - Результат обработки
Функция ОтправитьBlob(Знач URL, Знач Данные, Знач ДопЗаголовки = "") Экспорт
OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Данные, Истина);
ДополнитьURL(URL, "api/blobs/sha256:%1");
Хеш = OPI_Криптография.Хеш(Данные, ХешФункция.SHA256);
Хеш = нРег(ПолучитьHexСтрокуИзДвоичныхДанных(Хеш));
URL = СтрШаблон(URL, Хеш);
ОбработатьЗаголовки(ДопЗаголовки);
Ответ = OPI_ЗапросыHTTP.НовыйЗапрос()
.Инициализировать(URL)
.УстановитьДвоичноеТело(Данные)
.УстановитьЗаголовки(ДопЗаголовки)
.ОбработатьЗапрос("POST")
.ВернутьОтвет(Ложь, Истина);
Ответ = Новый Структура("status_code,digest", Ответ.КодСостояния, Хеш);
Возврат Ответ;
КонецФункции
// Проверить BLOB
// Проверяет существование BLOB по его SHA256 дайджесту
//
// Примечание:
// Метод в документации API: [Check if a Blob Exists](@github.com/ollama/ollama/blob/main/docs/api.md#check-if-a-blob-exists)
//
// Параметры:
// URL - Строка - URL сервера Ollama - url
// SHA256 - Строка - SHA256 дайджест нужного BLOB - digest
// ДопЗаголовки - Соответствие Из КлючИЗначение - Доп заголовки запроса, если необходимо - headers
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - Результат обработки
Функция ПроверитьBlob(Знач URL, Знач SHA256, Знач ДопЗаголовки = "") Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(SHA256);
ДополнитьURL(URL, "api/blobs/sha256:%1");
URL = СтрШаблон(URL, SHA256);
ОбработатьЗаголовки(ДопЗаголовки);
Ответ = OPI_ЗапросыHTTP.Head(URL, , ДопЗаголовки, , Истина);
Ответ = Новый Структура("status_code", Ответ.КодСостояния);
Возврат Ответ;
КонецФункции
#КонецОбласти
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Процедура ДополнитьURL(URL, Знач Путь)
OPI_ПреобразованиеТипов.ПолучитьСтроку(URL);
URL = ?(СтрЗаканчиваетсяНа(URL, "/"), URL, URL + "/");
URL = URL + Путь;
КонецПроцедуры
Процедура ОбработатьПараметры(Параметры, Знач ДопПараметры)
Если Не ЗначениеЗаполнено(ДопПараметры) Тогда
Возврат;
КонецЕсли;
ТекстОшибки = "Передана некорректная коллекция доп. параметров!";
OPI_ПреобразованиеТипов.ПолучитьКоллекциюКлючИЗначение(ДопПараметры, ТекстОшибки);
Для Каждого ДопПараметр Из ДопПараметры Цикл
Параметры.Вставить(ДопПараметр.Ключ, ДопПараметр.Значение);
КонецЦикла;
КонецПроцедуры
Процедура ОбработатьЗаголовки(ДопЗаголовки)
Если Не ЗначениеЗаполнено(ДопЗаголовки) Тогда
ДопЗаголовки = Новый Соответствие;
Иначе
ТекстОшибки = "Передана некорректная коллекция доп. заголовков!";
OPI_ПреобразованиеТипов.ПолучитьКоллекциюКлючИЗначение(ДопЗаголовки, ТекстОшибки);
КонецЕсли;
КонецПроцедуры
#КонецОбласти