Модуль журнала
Описание функции
Префикс интерфейса унифицирован как http(s)://<your-domain>
В производственных средах следует использовать HTTPS, чтобы гарантировать токены аутентификации. HTTP рекомендуется только для сред разработки.
Иерархическая система запросов к журналам позволяет администраторам просматривать журналы всего сайта, а пользователям — просматривать личные журналы. Обеспечивает статистику в реальном времени (RPM/TPM), многомерную фильтрацию, очистку исторических данных и другие функции. Интерфейс запроса токена, поддерживающий CORS, облегчает интеграцию сторонних разработчиков.
🔐 Аутентификация не требуется
Журналы запросов на основе токена
- Имя интерфейса: журналы запросов на основе токена.
- Метод HTTP: GET
- Путь:
/api/log/token - Требования аутентификации: общедоступно.
- Введение в функцию: запросы к записям журнала с помощью ключа токена, поддержка междоменного доступа.
💡Пример запроса:
const response = await fetch('/api/log/token?key=`<TOKEN_PLACEHOLDER>`', {
method: 'GET',
headers: {
'Content-Type': 'application/json'
}
});
const data = await response.json();✅ Пример успешного ответа:
{
"success": true,
"message": "",
"data": [
{
"id": 1,
"type": 2,
"content": "APIВызов успешен",
"model_name": "gpt-4",
"quota": 1000,
"created_at": 1640995000
}
]
}❗ Пример реакции на ошибку:
{
"success": false,
"message": "TokenНе существует или не имеет разрешения"
}🧾 Описание поля:
key (строка): обязательный ключ токена.
🔐 Аутентификация пользователя
Статистика моего журнала
- Имя интерфейса: статистика моего журнала.
- Метод HTTP: GET
- Путь:
key - Требования аутентификации: Пользователь
- Введение в функцию: получение статистики журнала текущего пользователя, включая потребление квоты, частоту запросов и использование токенов.
💡Пример запроса:
const response = await fetch('/api/log/self/stat?type=2&start_timestamp=1640908800&end_timestamp=1640995200&token_name=api_token&model_name=gpt-4&group=default', {
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer your_user_token',
'New-Api-User': 'your_user_id'
}
});
const data = await response.json();✅ Пример успешного ответа:
{
"success": true,
"message": "",
"data": {
"quota": 50000,
"rpm": 10,
"tpm": 1500
}
}❗ Пример реакции на ошибку:
{
"success": false,
"message": "Не удалось получить статистику"
}🧾 Описание поля:
type(число): тип журнала, дополнительные значения: 1=перезарядка, 2=потребление, 3=управление, 4=ошибка, 5=системаtype(число): временная метка началаtype(число): отметка времени окончания.type(строка): фильтр имени токена.type(строка): фильтр названия модели.type(строка): групповая фильтрация.type(число): общее использование квоты в течение указанного диапазона времени.type(число): количество запросов в минуту (последние 60 секунд).type(число): количество токенов в минуту (последние 60 секунд)
Получите мой журнал
- Имя интерфейса: получить мои журналы.
- Метод HTTP: GET
- Путь:
type - Требования аутентификации: Пользователь
- Введение в функцию: получение записей журнала текущего пользователя на страницах с поддержкой нескольких условий фильтрации.
💡Пример запроса:
const response = await fetch('/api/log/self?p=1&page_size=20&type=2&start_timestamp=1640908800&end_timestamp=1640995200&token_name=api_token&model_name=gpt-4&group=default', {
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer your_user_token',
'New-Api-User': 'your_user_id'
}
});
const data = await response.json();✅ Пример успешного ответа:
{
"success": true,
"message": "",
"data": {
"items": [
{
"id": 1,
"user_id": 1,
"created_at": 1640995000,
"type": 2,
"content": "APIВызов успешен",
"token_name": "api_token",
"model_name": "gpt-4",
"quota": 1000,
"prompt_tokens": 50,
"completion_tokens": 100
}
],
"total": 25,
"page": 1,
"page_size": 20
}
}❗ Пример реакции на ошибку:
{
"success": false,
"message": "Не удалось получить журнал"
}🧾 Описание поля:
Параметры запроса такие же, как и у интерфейса получения всех журналов, но возвращаются только записи журнала текущего пользователя.
Искать в моих журналах
- Имя интерфейса: поиск в моих журналах.
- Метод HTTP: GET
- Путь:
/api/log/self/search - Требования аутентификации: Пользователь
- Введение в функцию: поиск записей журнала текущего пользователя по ключевым словам.
💡Пример запроса:
const response = await fetch('/api/log/self/search?keyword=gpt-4', {
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer your_user_token',
'New-Api-User': 'your_user_id'
}
});
const data = await response.json();✅ Пример успешного ответа:
{
"success": true,
"message": "",
"data": [
{
"id": 1,
"type": 2,
"content": "GPT-4Вызов успешен",
"model_name": "gpt-4",
"created_at": 1640995000
}
]
}❗ Пример реакции на ошибку:
{
"success": false,
"message": "Журнал поиска не удался"
}🧾 Описание поля:
keyword (строка): ключевые слова для поиска, соответствующие типу журнала текущего пользователя.
🔐 Аутентификация администратора
Получить все журналы
- Имя интерфейса: получить все журналы.
- Метод HTTP: GET
- Путь:
keyword - Требования аутентификации: Администратор.
- Введение в функцию: получение всех записей журнала в системе в разбиении по страницам, поддержка нескольких условий фильтрации и фильтрации по типам журналов.
💡Пример запроса:
const response = await fetch('/api/log/?p=1&page_size=20&type=2&start_timestamp=1640908800&end_timestamp=1640995200&username=testuser&token_name=api_token&model_name=gpt-4&channel=1&group=default', {
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer your_admin_token',
'New-Api-User': 'your_user_id'
}
});
const data = await response.json();✅ Пример успешного ответа:
{
"success": true,
"message": "",
"data": {
"items": [
{
"id": 1,
"user_id": 1,
"created_at": 1640995000,
"type": 2,
"content": "APIВызов успешен",
"username": "testuser",
"token_name": "api_token",
"model_name": "gpt-4",
"quota": 1000,
"prompt_tokens": 50,
"completion_tokens": 100,
"use_time": 2,
"is_stream": false,
"channel_id": 1,
"channel_name": "OpenAIканал",
"token_id": 1,
"group": "default",
"ip": "192.168.1.1",
"other": "{\"model_ratio\":15.0}"
}
],
"total": 100,
"page": 1,
"page_size": 20
}
}❗ Пример реакции на ошибку:
{
"success": false,
"message": "Не удалось получить журнал"
}🧾 Описание поля:
p(номер): номер страницы, по умолчанию — 1.p(номер): количество на странице, по умолчанию — 20.p(число): тип журнала, дополнительные значения: 1=перезарядка, 2=потребление, 3=управление, 4=ошибка, 5=системный журнал.go: 41-48p(число): временная метка началаp(число): отметка времени окончания.p(строка): фильтрация имени пользователя.p(строка): фильтр имени токена.p(строка): фильтр названия модели.p(числовой): фильтрация идентификатора канала.p(строка): групповая фильтрация.
Удалить исторические журналы
- Имя интерфейса: удалить исторические журналы.
- Метод HTTP: УДАЛИТЬ
- Путь:
p - Требования аутентификации: Администратор.
- Введение в функцию: пакетное удаление записей журнала до указанной отметки времени, поддержка пакетного удаления во избежание чрезмерной нагрузки на базу данных.
💡Пример запроса:
const response = await fetch('/api/log/?target_timestamp=1640908800', {
method: 'DELETE',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer your_admin_token',
'New-Api-User': 'your_user_id'
}
});
const data = await response.json();✅ Пример успешного ответа:
{
"success": true,
"message": "",
"data": 1500
}❗ Пример реакции на ошибку:
{
"success": false,
"message": "target timestamp is required"
}🧾 Описание поля:
target_timestamp(число): целевая временная метка, необходимо удалить все журналы до этого времени.target_timestamp(число): количество успешно удаленных журналов.
Журнал статистики
- Имя интерфейса: статистика журнала.
- Метод HTTP: GET
- Путь:
target_timestamp - Требования аутентификации: Администратор.
- Введение в функцию: получение статистики журнала в указанном диапазоне времени и условиях, включая потребление квоты, частоту запросов и использование токенов.
💡Пример запроса:
const response = await fetch('/api/log/stat?type=2&start_timestamp=1640908800&end_timestamp=1640995200&username=testuser&token_name=api_token&model_name=gpt-4&channel=1&group=default', {
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer your_admin_token',
'New-Api-User': 'your_user_id'
}
});
const data = await response.json();✅ Пример успешного ответа:
{
"success": true,
"message": "",
"data": {
"quota": 150000,
"rpm": 25,
"tpm": 3500
}
}❗ Пример реакции на ошибку:
{
"success": false,
"message": "Не удалось получить статистику"
}🧾 Описание поля:
- Параметры запроса такие же, как и интерфейс получения всех логов
quota(число): общее использование квоты в течение указанного диапазона времени.quota(число): запросов в минуту (последние 60 секунд) log.go: 357quota(число): количество токенов в минуту (сумма Prompt_tokens + Complete_Tokens за последние 60 секунд)
Искать во всех журналах
- Имя интерфейса: поиск по всем журналам.
- Метод HTTP: GET
- Путь:
quota - Требования аутентификации: Администратор.
- Введение в функцию: поиск по всем записям журнала в системе по ключевым словам.
💡Пример запроса:
const response = await fetch('/api/log/search?keyword=error', {
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer your_admin_token',
'New-Api-User': 'your_user_id'
}
});
const data = await response.json();✅ Пример успешного ответа:
{
"success": true,
"message": "",
"data": [
{
"id": 1,
"type": 4,
"content": "APIОшибка звонка",
"username": "testuser",
"created_at": 1640995000
}
]
}❗ Пример реакции на ошибку:
{
"success": false,
"message": "Журнал поиска не удался"
}🧾 Описание поля:
keyword (строка): ключевое слово поиска, которое может соответствовать типу или содержимому журнала.