Locust

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

Шаг 1. Откройте Locust и нажмите «Получить доступ»

locust: карточка сервиса с кнопкой «Получить доступ»
Чтобы получить доступ, нажмите Получить доступ на карточке сервиса.

Шаг 2. Подтверждение создания учетной записи

locust: подтверждение
Для подтверждения создания учетной записи нажмите Подтвердить

Что выдает Alem Plus:

  • Ссылка

По этой ссылке Вы увидете веб-интерфейс Locust, развернутый на удалённом сервере. Через данный интерфейс можно наблюдать результаты нагрузочного тестирования: количество запросов, ошибки, время ответа и RPS. Чтобы проверить работу моделей Alem Plus локально, можно выполнить простой запрос к API. Пример запроса к модели kazllm на Python:

from locust import HttpUser, task, between

API_KEY = "YOUR_ALEM_API_KEY"

class KazLLMUser(HttpUser):
    wait_time = between(1, 3)
    host = "https://llm.alem.ai"

    @task
    def chat_completion(self):
        payload = {
            "model": "kazllm",
            "messages": [
                {
                    "role": "user",
                    "content": "Сәлем! Қазақстан туралы қысқаша айтып бер."
                }
            ]
        }

        headers = {
            "Authorization": f"Bearer {API_KEY}",
            "Content-Type": "application/json"
        }

        with self.client.post(
            "/v1/chat/completions",
            json=payload,
            headers=headers,
            catch_response=True,
            name="kazllm_chat_completion"
        ) as response:
            if response.status_code == 200:
                try:
                    data = response.json()
                    if "choices" in data:
                        response.success()
                    else:
                        response.failure(f"Unexpected response format: {data}")
                except Exception as e:
                    response.failure(f"JSON parse error: {e}")
            else:
                response.failure(f"HTTP {response.status_code}: {response.text}")
const axios = require("axios");

const API_KEY = "YOUR_API_KEY";
const URL = "https://llm.alem.ai/v1/chat/completions";

function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

async function sendRequest() {
  try {
    const response = await axios.post(
      URL,
      {
        model: "kazllm",
        messages: [
          {
            role: "user",
            content: "Сәлем! Қазақстан туралы қысқаша айтып бер."
          }
        ]
      },
      {
        headers: {
          Authorization: `Bearer ${API_KEY}`,
          "Content-Type": "application/json"
        }
      }
    );

    console.log("Ответ:", response.data.choices[0].message.content);

  } catch (err) {
    console.error("Ошибка:", err.response?.data || err.message);
  }
}

async function runLoadTest() {
  while (true) {
    await sendRequest();
    await sleep(Math.random() * 2000 + 1000); // 1-3 секунды
  }
}

runLoadTest();

<?php

$apiKey = "YOUR_API_KEY";
$url = "https://llm.alem.ai/v1/chat/completions";

function sendRequest($apiKey, $url) {
    $payload = [
        "model" => "kazllm",
        "messages" => [
            [
                "role" => "user",
                "content" => "Сәлем! Қазақстан туралы қысқаша айтып бер."
            ]
        ]
    ];

    $ch = curl_init($url);

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        "Authorization: Bearer " . $apiKey,
        "Content-Type: application/json"
    ]);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload, JSON_UNESCAPED_UNICODE));

    $response = curl_exec($ch);

    if (curl_errno($ch)) {
        echo "Ошибка: " . curl_error($ch) . PHP_EOL;
    } else {
        $data = json_decode($response, true);
        echo "Ответ: " . ($data["choices"][0]["message"]["content"] ?? "Ошибка") . PHP_EOL;
    }

    curl_close($ch);
}

while (true) {
    sendRequest($apiKey, $url);
    sleep(rand(1, 3)); // пауза 1-3 сек
}

Запуск локального интерфейса Locust

Для запуска веб-интерфейса Locust необходимо установить библиотеку Locust. Затем запустить locust -f filename.py. После запуска открыть адрес в браузере.

Интерпретация результатов Locust

locust: results
Описание ниже
  • Type — тип запроса (GET/POST)
  • Name — имя запроса (endpoint или задача)
  • Requests — общее количество запросов
  • Fails — количество ошибок
  • Median (ms) — медианное время ответа
  • 95%ile (ms) — время, быстрее которого выполняется 95% запросов
  • 99%ile (ms) — время для самых медленных запросов
  • Average (ms) — среднее время ответа
  • Min (ms) — минимальное время
  • Max (ms) — максимальное время
  • Average size (bytes) — средний размер ответа
  • Current RPS — запросов в секунду
  • Current Failures/s — ошибок в секунду