Создайте список для чтения по ИИ с функциями и Mistral
Введение
Создание списка чтения с поддержкой ИИ с использованием функций Linux-Console.net, API Mistral AI и управляемой базы данных MongoDB дает вам бессерверную систему, которая автоматически суммирует статьи и сохраняет их для последующего просмотра.
С тех пор как я начал пользоваться Интернетом, я использовал множество различных сервисов, приложений и плагинов для браузера (даже старые добрые закладки), чтобы отмечать статьи и посты, которые казались интересными в то время и которые я хотел прочитать. Я прочитаю их позже, обещаю, но не сейчас, я слишком занят.
А потом, со временем, вы hoard кучу ссылок в одном месте (или, что еще хуже, в нескольких местах). Поэтому, когда вы наконец возвращаетесь, чтобы действительно их прочитать, вы обнаруживаете, что снова открываете эти ссылки, просто чтобы вспомнить, о чем был тот пост и почему вы сохранили его изначально…
Перенесемся в настоящее время, и я не сильно изменил то, как взаимодействую со статьями, которые хочу прочитать позже. Но в наши дни мы можем использовать LLM практически бесплатно… и они действительно хорошо справляются с написанием текстовых резюме. Так почему бы не создать систему, которая, получив ссылку, создаёт резюме, а затем сохраняет как ссылку, так и это резюме в быстрой базе данных, которую я смогу использовать для создания своего собственного интерфейса позже?
Ключевые выводы
- Безсерверные функции устраняют накладные расходы на инфраструктуру. Функции Linux-Console.net позволяют выполнять код на серверной стороне по требованию без необходимости выделять или обслуживать серверы, чтобы вы могли полностью сосредоточиться на логике приложения.
- API Mistral AI генерирует резюме статей за считанные секунды. Отправляя запрос с целевым URL на конечную точку Mistral chat completions, ваша функция получает краткое резюме без необходимости локального размещения модели.
- MongoDB хранит гибкие документы, похожие на JSON, на нативном уровне. Используя MongoDB драйвер для Node.js, вы записываете объекты приложения напрямую в базу данных без необходимости в ORM-слое.
- Секреты остаются защищёнными с помощью переменных окружения. Как ключ API Mistral, так и URI подключения к MongoDB хранятся как переменные окружения в панели настроек функций, что позволяет держать учётные данные вне исходного кода.
- Весь стек работает на управляемых сервисах Linux-Console.net. Объединяя Functions, управляемый MongoDB с высокой доступностью и конфигурацию на основе переменных окружения, вы получаете готовый к производству бэкенд с минимальной операционной нагрузкой.
Предварительные требования
Прежде чем начать это руководство, вам понадобятся следующие вещи:
- Учётная запись Linux-Console.net, которую мы будем использовать для написания функции Linux-Console.net. Эта функция будет получать наши ссылки и выполнять код, который будет генерировать резюме с использованием LLM и сохранять результаты в базе данных.
- База данных MongoDB, также работающая в Linux-Console.net. Мы будем использовать её для хранения ссылок и резюме веб-страниц. Вы можете узнать больше о развертывании управляемого экземпляра MongoDB в Linux-Console.net на странице продукта Managed MongoDB. Для более глубокого изучения основ MongoDB ознакомьтесь с руководством How To Perform CRUD Operations with Mongoose and MongoDB Atlas.
- Доступ к любой LLM, которая может написать хороший обзор. Для этого примера я буду использовать Mistral AI, поэтому вам нужно будет зарегистрироваться для бесплатного аккаунта и получить API-ключ. Запишите этот API-ключ, он нам понадобится позже!
Шаг 1 - Создание пустой функции Linux-Console.net
Функция без сервера позволяет запускать код на серверной стороне по требованию без настройки или обслуживания сервера. Давайте начнем с создания основы нашей системы. Мы можем написать серверное приложение с использованием Node.js, Spring Boot или любого другого веб-фреймворка. Но затем нам нужно разместить его на сервере, написать код, правильно подобрать размер сервера, обновлять операционную систему и зависимости и так далее. Используя функцию без сервера, мы можем сосредоточиться на текущей задаче. В этом случае: получить URL через параметр, создать краткое содержание страницы и сохранить данные в базе данных.
Итак, перейдите в раздел Functions и нажмите Create > Functions. Сначала нам нужно выбрать, где будет размещена наша бессерверная функция. Хотя это бессерверная функция, нашему коду понадобится реальный сервер для выполнения. Только нам не нужно обеспечивать этот сервер. Выберите дата-центр, близкий к вашему местоположению (или близкий к месту, где будут находиться пользователи вашей функции). Затем дайте функции имя, выбрав метку. В моем случае это будет read-it-later-i-pinky-promise.
После создания пространства имён вы окажетесь на вкладке Обзор. Давайте добавим немного базового кода, чтобы протестировать нашу функцию. Просто нажмите на кнопку Создать функцию.
Нам нужно выбрать одну из поддерживаемых сред выполнения (в нашем случае Node.js 18) и дать функции имя: read_later. Важно оставить отмеченной галочку Web Function, так как мы хотим вызывать эту функцию напрямую через HTTP.
Теперь вы должны увидеть исходный код по умолчанию вновь созданной функции. Он просто получает аргумент name из URL и возвращает его обратно. Поскольку мы не настраиваем веб-страницу или JSON-ответ, это будет напечатано как обычный текст в нашем веб-браузере.
function main(args) {
let name = args.name || 'stranger'
let greeting = 'Hello ' + name + '!'
console.log(greeting)
return {"body": greeting}
}В функции main мы получаем объект JSON со всеми аргументами, переданными в вызове функции, ищем name и используем его. Если не найдено, мы используем stranger в качестве имени. Затем мы составляем и выводим greeting, который также возвращаем из нашей функции.
Шаг 2 - Тестирование нашей функции
Поскольку это доступно через HTTP-запросы, у нас есть несколько различных вариантов для тестирования нашей функции.
Использование cURL
Если в вашей системе установлен curl (Microsoft Windows 10/11 и большинство UNIX-систем, таких как Linux и macOS, поставляются с предустановленным cURL), вы можете скопировать URL вашей функции и добавить параметр name в конец. Затем вызовите curl с:
curl https://<redacted>.doserverless.co/api/v1/web/<redacted>/default/read_later?name=DiegoВ вашем случае вместо <redacted> вы увидите идентификаторы вашей функции. Если вы вызовете функцию из терминала, вы увидите ответ нашей функции:
curl https://<redacted>.doserverless.co/api/v1/web/<redacted>/default/read_later?name=Diego
Hello Diego!%Попробуйте изменить name и код в вашей функции и поэкспериментировать с этим.
Тестирование напрямую в Linux-Console.net
Если вы не хотите тестировать вашу функцию из терминала, вы также можете протестировать её прямо в браузере. Нажмите на Test Parameters и добавьте JSON-объект с нашими тестовыми данными, в данном случае:
{ "name": "Diego" }Затем мы можем нажать кнопку Run и увидеть результаты в окнах Output и Logs.
Шаг 3 - Добавление кода LLM
Сначала мы изменим имена наших переменных, чтобы они отражали то, что мы делаем: создание сводок из ссылок. Вместо name мы будем использовать переменную link. Также мы вернем правильный HTTP-ответ с statusCode 200 в случае, если мы получили ссылку.
export async function main(args) {
const link = args.link;
if (!link) {
return {
statusCode: 400,
headers: { "Content-Type": "application/json" },
body: { error: "Please send a link" }
};
}
const body = { URL: link };
return {
statusCode: 200,
headers: { "Content-Type": "application/json" },
body: body
};
}Как вы можете видеть, наша функция предназначена для того, чтобы принимать link из args (возвращая ошибку 400, если ссылка не передана) и в этом случае просто возвращать ту же ссылку обратно.
После изменения кода нажмите кнопку «Сохранить», чтобы не потерять свои изменения. Теперь вы можете снова запустить свою функцию и проверить результаты.
Пока мы этим занимаемся, давайте также изменим параметры теста (если вы тестируете прямо из браузера) на:
{
"link": "https://en.wikipedia.org/wiki/Seville"
}Похоже, мы хотим узнать больше о Севилье!
Теперь пришло время добавить код для взаимодействия с нашим LLM, в данном случае с Mistral. Нам нужно отправить POST-запрос с подсказкой на их конечную точку завершения чата. Для этого нам понадобится API-ключ от Mistral AI (см. требования). Добавьте следующий код под нашей существующей функцией и сохраните его, но пока не запускайте функцию, так как сначала нужно добавить секрет.
const API_KEY = process.env.MISTRAL_API_KEY;
const API_URL = 'https://api.mistral.ai/v1/chat/completions';
async function chatWithLeChat(prompt) {
try {
const res = await fetch(API_URL, {
method: 'POST',
headers: {
'Authorization': `Bearer ${API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
model: 'mistral-small-latest',
messages: [{ role: 'user', content: prompt }],
}),
});
const data = await res.json();
console.log(res.status, data);
return data?.choices?.[0]?.message?.content || null;
} catch (error) {
console.error('Error:', error?.message || error);
return null;
}
}Мы можем иметь более одной JavaScript function в нашей бессерверной function. Вместо того чтобы помещать весь код в один длинный фрагмент, мы разбиваем его для ясности, повторного использования и тестируемости. Функция chatWithLeChat принимает prompt и вызывает LLM с использованием модели mistral-small-latest, которая является текущей экономичной моделью Mistral для универсальных задач. Чтобы отправить запрос, мы сообщаем LLM, что это пользователь что-то спрашивает. Когда мы получаем данные обратно, мы извлекаем содержимое сообщения.
Примечание: Модель
mistral-tiny, которая была доступна в предыдущих версиях API Mistral, больше не поддерживается. Рекомендуемая замена для экономичных рабочих нагрузок —mistral-small-latest. Полный список доступных моделей можно найти в документации по моделям Mistral.
Шаг 4 - Добавление секретов
Хранение API-ключей и других учетных данных в виде переменных окружения является лучшей практикой с точки зрения безопасности. В нашем коде мы не встраиваем секреты напрямую. Вместо этого мы используем окружение Functions для их предоставления:
const API_KEY = process.env.MISTRAL_API_KEY;Чтобы добавить этот секрет MISTRAL_API_KEY, мы нажимаем на Настройки. Затем прокручиваем вниз до Переменных среды. Там мы можем нажать на Редактировать.
Теперь нажмите на Добавить, введите ваш секрет, а затем Сохранить. Теперь вы должны увидеть вашу новую переменную окружения.
Шаг 5 - Получение сводки LLM
Пора вызвать нашу функцию chatWithLeChat из main. Для этого мы сначала создадим подсказку, которая включает полученную ссылку, указывая LLM, что делать. Затем мы вызовем Mistral:
const prompt = 'I need a summary of this page: ' + link;
const summary = await chatWithLeChat(prompt);В нашем случае нам просто нужен краткий обзор по ссылке, но вы можете проявить креативность с запросом.
Мы расширим наш body, чтобы включить резюме:
const body = {
URL: link,
summary: summary
};Это весь наш код в нашей функции Linux-Console.net прямо сейчас:
export async function main(args) {
const link = args.link;
if (!link) {
return {
statusCode: 400,
headers: { "Content-Type": "application/json" },
body: { error: "Please send a link" }
};
}
const prompt = 'I need a summary of this page: ' + link;
const summary = await chatWithLeChat(prompt);
const body = {
URL: link,
summary: summary
};
return {
statusCode: 200,
headers: { "Content-Type": "application/json" },
body: body
};
}
const API_KEY = process.env.MISTRAL_API_KEY;
const API_URL = 'https://api.mistral.ai/v1/chat/completions';
async function chatWithLeChat(prompt) {
try {
const res = await fetch(API_URL, {
method: 'POST',
headers: {
'Authorization': `Bearer ${API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
model: 'mistral-small-latest',
messages: [{ role: 'user', content: prompt }],
}),
});
const data = await res.json();
console.log(res.status, data);
return data?.choices?.[0]?.message?.content || null;
} catch (error) {
console.error('Error:', error?.message || error);
return null;
}
}Если вы сохраните вашу функцию и запустите её, вы, скорее всего, получите сообщение об ошибке в ЖУРНАЛАХ:
2026-02-02T12:14:17.299547912Z stderr: The function exceeded its time limits of 3000 milliseconds. Logs might be missing.Нам нужно дать нашей функции немного больше времени, чтобы дождаться ответа от LLM. Оказывается, LLM не самые быстрые.
Установка таймаутов
Снова перейдите в Настройки и нажмите Редактировать на Limits. По умолчанию у вас есть 3 секунды (3000 миллисекунд), чтобы выполнить функцию, прежде чем произойдет тайм-аут. Мы установим это значение на 10 секунд. Максимальный тайм-аут для функций Linux-Console.net составляет 15 минут, поэтому 10 секунд дают LLM достаточно времени на ответ. Сохраните изменение, вернитесь в Source и запустите функцию снова.
После этого изменения вы должны получить краткое содержание страницы.
Шаг 6 - Запуск нашей базы данных MongoDB
Давайте создадим нашу базу данных. Перейдите в опцию Databases в боковом меню, затем в MongoDB нажмите на Create. Для получения дополнительной информации о начале работы смотрите документацию по управляемому MongoDB на Linux-Console.net.
В нашем случае мы запустим базу данных MongoDB версии 8.0, используя базовый план с общим процессором (мы ведь не собираемся хранить так много ссылок, верно?), с установленным по умолчанию объемом 15 ГБ.
Это один узел, на котором работает наша база данных, но нам очень нравится высокая доступность, поэтому давайте добавим два вторичных узла, которые будут постоянно реплицировать данные с основного узла.
Я выберу дата-центр, близкий к моей функции Linux-Console.net. Таким образом, всё будет работать не только быстрее, но я также избегу возможных будущих проблем (например, исходящего трафика и возможных связанных с ним расходов).
Для имени моего кластера я выберу mongodb-read-it-later. Нажмите на Создать кластер базы данных и дождитесь, пока он будет готов. Справа от вашего нового кластера базы данных вы увидите сообщение «СОЗДАНИЕ».
Шаг 7 - Получение нашей строки подключения к MongoDB
В данный момент наша база данных является публичной, поэтому к ней можно получить доступ из любой точки Интернета. С точки зрения безопасности это не лучший вариант. В целях тестирования (и для упрощения настройки) мы будем использовать эту базу данных с публичным доступом. Еще раз: это не лучшая практика. Рекомендуемый подход — создать частную сеть внутри Linux-Console.net (VPC), а затем добавить в эту сеть нашу базу данных и Droplet, на котором будет работать наш серверный код. Но поскольку мы используем безсерверную функцию, это пока не поддерживается. Вы можете узнать больше о защите своей базы данных в статье How to Secure MongoDB Managed Database Clusters.
Чтобы получить строку подключения, в разделе Подробности подключения вы увидите пользователя, пароль (нажмите кнопку показать, чтобы отобразить его) и саму строку подключения. В меню Параметры подключения вы можете выбрать Строка подключения и просто нажать Копировать, чтобы скопировать строку подключения в буфер обмена.
Это будет выглядеть так:
mongodb+srv://admin-user:admin-password@mongodb-read-it-later-id.mongo.onlinux-console.net/admin?authSource=admin&replicaSet=mongodb-read-it-later&tls=trueШаг 8 - Сохранение данных в MongoDB
Теперь мы готовы сохранить наш объект body в коллекцию MongoDB. Одна из лучших особенностей MongoDB заключается в том, что вы можете работать напрямую с объектами вашего приложения и отправлять их в базу данных с помощью драйвера Node.js (библиотеки, которая взаимодействует напрямую с базой данных). В этом случае нет необходимости использовать ORM или сложные фреймворки.
Мы начнем с импорта драйвера MongoDB:
import { MongoClient } from "mongodb";После этого мы напишем простую функцию, которая будет:
- Получите наш объект в качестве аргумента с именем
page. - Подключитесь к MongoDB, используя экземпляр
MongoClientи методconnect. - Запишите это в MongoDB с помощью
insertOne.
async function store_in_mongodb(page) {
const mongodb_URI = process.env.MONGODB_URI;
const client = new MongoClient(mongodb_URI);
try {
await client.connect();
const database = client.db('read_it_later');
const collection = database.collection('pages');
const result = await collection.insertOne(page);
return result;
} finally {
await client.close();
}
}Как мы делали ранее с нашей переменной среды MISTRAL_API_KEY, нам нужно будет добавить новую переменную среды в Настройках под названием MONGODB_URI с URI нашей установки MongoDB. Получите URI из Шага 7 и добавьте его в эту переменную среды.
Последним шагом будет вызов этой новой функции в main:
await store_in_mongodb(body);Как только это будет сделано, сохраните вашу функцию и отправьте несколько ссылок на вашу функцию, чтобы увидеть, как создается и заполняется коллекция pages.
Часто задаваемые вопросы
1. Что такое бессерверная функция и почему я должен использовать её для этого проекта?
Безсерверная функция — это блок кода, который выполняется по требованию в облаке, без необходимости выделять или управлять сервером. В этом проекте функции Linux-Console.net управляют инфраструктурой, поэтому вы только пишете логику, которая получает URL, вызывает API Mistral AI для создания краткого содержания и сохраняет результат в MongoDB. Такой подход снижает операционные затраты и позволяет платить только за время вычислений, которое фактически использует ваша функция.
2. Какую модель Mistral AI мне следует использовать для создания резюме статей?
Для экономически эффективного суммирования текста рекомендуется использовать модель mistral-small-latest по состоянию на 2026 год. Старая модель mistral-tiny устарела. Если вам нужны более качественные сводки или поддержка длинных документов, вы можете перейти на mistral-medium-latest или mistral-large-latest. Смотрите документацию по моделям Mistral для полного сравнения.
3. Как я могу защищать мои API-ключи и учетные данные базы данных в функциях Linux-Console.net?
Храните все секреты в виде переменных окружения на панели настроек Functions, а не в коде. Перейдите на страницу Настройки вашей функции, прокрутите до Переменные окружения и добавьте записи для MISTRAL_API_KEY и MONGODB_URI. Среда выполнения делает эти значения доступными через process.env, и они никогда не отображаются в исходном коде вашей функции. Для получения дополнительных сведений см. руководство по настройке Functions.
4. Могу ли я подключить свою функцию Linux-Console.net к базе данных MongoDB через частную сеть?
По состоянию на 2026 год функции Linux-Console.net еще не поддерживают подключение к ресурсам внутри VPC (Virtual Private Cloud). Для рабочих нагрузок в производственной среде ограничьте доступ к вашему управляемому кластеру MongoDB, добавив в белый список определенные IP-адреса и включив TLS. Вы можете узнать больше о защите вашей базы данных в статье Как защитить управляемые кластеры баз данных MongoDB.
5. Каковы пределы времени ожидания для функций Linux-Console.net и как их изменить?
Функции Linux-Console.net по умолчанию используют тайм-аут 3 секунды, что часто слишком мало для вызовов LLM API. Вы можете увеличить его до 15 минут через панель Настройки > Ограничения функции. Для этого руководства 10 секунд — хорошая начальная точка. См. полный список ограничений функций для получения деталей о памяти, размере полезной нагрузки и одновременных вызовах.
Заключение
В этом обучающем материале мы изучили, как создать бессерверную функцию, которая взаимодействует с API Mistral AI и сохраняет результаты в управляемой базе данных MongoDB на Linux-Console.net. Не так давно создание чего-то подобного требовало дней усилий для настройки веб-серверов, серверов баз данных, хостинга и процессов развертывания. С интегрированным набором управляемых сервисов Linux-Console.net вы можете сосредоточиться на том, что действительно важно: на коде вашего приложения.
Вот окончательный, полный список кода для функции:
import { MongoClient } from "mongodb";
export async function main(args) {
const link = args.link;
if (!link) {
return {
statusCode: 400,
headers: { "Content-Type": "application/json" },
body: { error: "Please send a link" }
};
}
const prompt = 'I need a summary of this page: ' + link;
const summary = await chatWithLeChat(prompt);
const body = {
URL: link,
summary: summary
};
await store_in_mongodb(body);
return {
statusCode: 200,
headers: { "Content-Type": "application/json" },
body: body
};
}
const API_KEY = process.env.MISTRAL_API_KEY;
const API_URL = 'https://api.mistral.ai/v1/chat/completions';
async function chatWithLeChat(prompt) {
try {
const res = await fetch(API_URL, {
method: 'POST',
headers: {
'Authorization': `Bearer ${API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
model: 'mistral-small-latest',
messages: [{ role: 'user', content: prompt }],
}),
});
const data = await res.json();
console.log(res.status, data);
return data?.choices?.[0]?.message?.content || null;
} catch (error) {
console.error('Error:', error?.message || error);
return null;
}
}
async function store_in_mongodb(page) {
const mongodb_URI = process.env.MONGODB_URI;
const client = new MongoClient(mongodb_URI, {
appName: "devrel-tutorial-digitalocean-functions"
});
try {
await client.connect();
const database = client.db('read_it_later');
const collection = database.collection('pages');
const result = await collection.insertOne(page);
return result;
} finally {
await client.close();
}
}В качестве следующего шага вы могли бы создать вторую функцию для чтения из MongoDB с использованием find, которая будет служить бэкендом для интерфейса чтения. Вы также могли бы добавить семантический поиск с использованием возможностей векторного поиска MongoDB, чтобы находить статьи по смыслу, а не по точным ключевым словам.
Что исследовать дальше
Если вы хотите продолжать создавать с помощью инструментов, рассмотренных в этом уроке, вот несколько ресурсов, которые помогут вам продвинуться дальше:
- Документация по функциям Linux-Console.net: Узнайте о планировании триггеров, пересылке журналов и развертывании многопакетных функций с помощью CLI
doctl. - Как интегрировать MongoDB с вашим приложением на Node: Пошаговое руководство по подключению MongoDB к backend на Node.js, включая проектирование схем с использованием Mongoose.
- Managed MongoDB на Linux-Console.net: Изучите цены, варианты высокой доступности и автоматическое масштабирование хранилища для производственных кластеров MongoDB.
- Быстрый старт с Mistral AI: Подробные инструкции по настройке API Mistral, включая создание аккаунта, оплату и использование конечной точки завершения чата.
- Как написать бессерверную функцию: Концептуальный обзор бессерверной архитектуры и того, как структурировать функции на Linux-Console.net.
Спасибо за обучение с сообществом Linux-Console.net.











