Repository navigation
API Reference
Полная документация по REST API AI Secretary System с примерами запросов и ответов.
POST /admin/auth/login
Content-Type: application/json
{
"username": "admin",
"password": "admin"
}Ответ:
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"token_type": "Bearer"
}Добавьте JWT токен в заголовок Authorization для всех защищённых эндпоинтов:
GET /admin/auth/me
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...| Метод | Эндпоинт | Описание |
|---|---|---|
| POST | /admin/auth/login |
Вход (получение JWT) |
| GET | /admin/auth/me |
Текущий пользователь |
| GET | /admin/auth/status |
Статус аутентификации |
| GET | /admin/auth/profile |
Профиль пользователя |
| PUT | /admin/auth/profile |
Обновление профиля |
| POST | /admin/auth/change-password |
Смена пароля |
Для интеграции с OpenWebUI и другими клиентами, поддерживающими OpenAI API.
GET /v1/models
Authorization: Bearer <token>Ответ:
{
"data": [
{
"id": "anna-secretary-vllm",
"object": "model",
"created": 1234567890,
"owned_by": "system"
},
{
"id": "marina-secretary-gemini",
"object": "model",
"created": 1234567890,
"owned_by": "system"
}
]
}Формат ID: {persona}-secretary-{backend} (например, anna-secretary-vllm, marina-secretary-cloud_1)
GET /v1/voices
Authorization: Bearer <token>Ответ:
{
"voices": [
{"id": "anna_ru", "name": "Анна (Russian)"},
{"id": "marina_ru", "name": "Марина (Russian)"}
]
}POST /v1/audio/speech
Authorization: Bearer <token>
Content-Type: application/json
{
"model": "tts-1",
"input": "Привет, это Анна",
"voice": "anna_ru"
}Ответ: WAV аудиофайл (audio/wav)
Особенности:
- Поддержка streaming cache optimization
- Автоматическое кеширование аудио
POST /v1/chat/completions
Authorization: Bearer <token>
Content-Type: application/json
{
"model": "anna-secretary-vllm",
"messages": [
{"role": "user", "content": "Привет"}
],
"stream": true
}Ответ (SSE):
data: {"choices":[{"delta":{"content":"Привет"}}]}
data: {"choices":[{"delta":{"content":"!"}}]}
data: [DONE]
Особенности:
- Background TTS synthesis (аудио генерируется параллельно)
- Non-streaming режим (stream: false) возвращает полный JSON
POST /tts
Content-Type: application/json
{
"text": "Привет, это Анна",
"voice_id": "anna_ru"
}Ответ: WAV аудиофайл
POST /stt
Content-Type: multipart/form-data
file: <audio.wav>Ответ:
{
"text": "Привет, это Анна"
}POST /chat
Content-Type: application/json
{
"message": "Привет",
"persona": "anna"
}Ответ:
{
"response": "Здравствуйте! Чем могу помочь?"
}POST /process_call
Content-Type: multipart/form-data
audio: <call.wav>Ответ:
{
"transcription": "Текст звонка",
"response": "Ответ секретаря",
"audio_url": "/path/to/response.wav"
}POST /reset_conversationОтвет:
{
"status": "ok",
"message": "Контекст сброшен"
}GET /healthОтвет:
{
"status": "healthy",
"services": {
"tts": "running",
"stt": "running",
"llm": "running"
},
"database": "connected",
"llm_backend": "vllm"
}| Метод | Эндпоинт | Описание | Доступ |
|---|---|---|---|
| GET | /admin/kanban/tasks |
Список видимых задач | get_current_user |
| POST | /admin/kanban/tasks |
Создать задачу (всегда draft + private) | require_not_guest |
| PATCH | /admin/kanban/tasks/{id} |
Обновить задачу (автор или admin) | require_not_guest |
| DELETE | /admin/kanban/tasks/{id} |
Удалить задачу | require_admin |
| POST | /admin/kanban/reorder |
Изменить статус и позицию | require_not_guest |
| Метод | Эндпоинт | Описание | Доступ |
|---|---|---|---|
| POST | /admin/kanban/dependencies |
Добавить зависимость (409 при цикле) | require_not_guest |
| DELETE | /admin/kanban/dependencies?blocker_id=X&dependent_id=Y |
Удалить зависимость | require_not_guest |
| Метод | Эндпоинт | Описание | Доступ |
|---|---|---|---|
| POST | /admin/kanban/tasks/{id}/checklist |
Добавить пункт чеклиста | require_not_guest |
| PATCH | /admin/kanban/checklist/{item_id}/toggle |
Переключить выполнение | require_not_guest |
| DELETE | /admin/kanban/checklist/{item_id} |
Удалить пункт | require_not_guest |
POST /admin/kanban/tasks
Authorization: Bearer <token>
Content-Type: application/json
{
"title": "Настроить интеграцию",
"description": "Подключить API",
"assignee": "admin",
"due_date": "2026-03-01",
"tags": ["интеграция", "api"]
}Ответ:
{
"task": {
"id": 1,
"title": "Настроить интеграцию",
"description": "Подключить API",
"status": "draft",
"is_private": true,
"assignee": "admin",
"created_by": "admin",
"start_date": null,
"due_date": "2026-03-01",
"position": 0,
"tags": ["интеграция", "api"],
"checklist": [],
"blockers": [],
"dependents": [],
"created": "2026-02-21T00:00:00",
"updated": "2026-02-21T00:00:00"
}
}PATCH /admin/kanban/tasks/1
Authorization: Bearer <token>
Content-Type: application/json
{
"status": "in_progress",
"assignee": "admin"
}При смене статуса с draft на любой другой — задача автоматически становится публичной (is_private: false).
POST /admin/kanban/dependencies
Authorization: Bearer <token>
Content-Type: application/json
{
"blocker_id": 1,
"dependent_id": 2
}Возвращает 409 если зависимость создаёт цикл или целевая задача приватная.
| Паттерн | Описание | Пример |
|---|---|---|
GET /admin/{resource} |
Список всех | /admin/chat/sessions |
POST /admin/{resource} |
Создать новый | /admin/telegram/bots |
GET /admin/{resource}/{id} |
Получить один | /admin/telegram/bots/123 |
PUT /admin/{resource}/{id} |
Обновить | /admin/telegram/bots/123 |
DELETE /admin/{resource}/{id} |
Удалить | /admin/telegram/bots/123 |
| Паттерн | Описание | Пример |
|---|---|---|
POST /admin/{resource}/{id}/action |
Выполнить действие | /admin/telegram/bots/123/start |
Примеры действий:
-
/admin/telegram/bots/{id}/start— запустить бота -
/admin/telegram/bots/{id}/stop— остановить бота -
/admin/telegram/bots/{id}/test— тестовое сообщение
| Паттерн | Описание | Пример |
|---|---|---|
GET /admin/{resource}/stream |
Server-Sent Events | /admin/chat/stream |
Формат SSE:
data: {"message": "chunk"}\n\n
data: [DONE]\n\n
| Паттерн | Описание | Пример |
|---|---|---|
POST /webhooks/{service} |
Внешние вебхуки | /webhooks/amocrm |
Доступные вебхуки:
-
/webhooks/amocrm— amoCRM webhook -
/webhooks/yoomoney— YooMoney payments -
/webhooks/github— GitHub CI/CD
Система использует 3 уровня защиты эндпоинтов:
| Dependency | Роли | Применение |
|---|---|---|
get_current_user |
Любой авторизованный | Read endpoints |
require_not_guest |
user, web, admin | Write endpoints |
require_admin |
admin | Sensitive operations |
| Роль | Права | Ограничения |
|---|---|---|
| admin | Полный доступ | Видит все ресурсы всех пользователей |
| user | Read + Write своих ресурсов | Полный доступ к админ-панели |
| web | Как user, но упрощённый UI | Скрыты: Dashboard, Services, vLLM, Models |
| guest | Read-only (demo) | Только просмотр, без изменений |
Для пользователей с ролью user и web применяется фильтрация по owner_id:
owner_id = None if user.role == "admin" else user.id
# Пользователь видит только свои ресурсы + расшаренные емуРесурсы с owner_id: ChatSession, BotInstance, WidgetInstance, CloudLLMProvider, TTSPreset
Чат-сессии (admin source) могут быть расшарены другим пользователям с уровнями доступа read или write.
При read-доступе пользователь может просматривать чат, но не может отправлять/редактировать/удалять сообщения. При write — полный доступ, аналогичный владельцу (кроме удаления сессии и управления шарами).
| Метод | Эндпоинт | Описание | Доступ |
|---|---|---|---|
| GET | /admin/chat/sessions/{id}/shares |
Список шар сессии | owner/admin |
| POST | /admin/chat/sessions/{id}/shares |
Расшарить сессию | owner/admin, not_guest |
| PUT | /admin/chat/sessions/{id}/shares/{user_id} |
Изменить permission | owner/admin |
| DELETE | /admin/chat/sessions/{id}/shares/{user_id} |
Удалить шар | owner/admin |
| POST | /admin/chat/sessions/{id}/fork |
Форк сессии (глубокое копирование) | любой с доступом, not_guest |
| GET | /admin/chat/shareable-users |
Список пользователей для шаринга | not_guest |
POST /admin/chat/sessions/{id}/shares
Content-Type: application/json
Authorization: Bearer <token>
{
"user_id": 2,
"permission": "read"
}Ответ:
{
"share": {
"id": 1,
"session_id": "chat_123",
"user_id": 2,
"permission": "read",
"shared_by": 1,
"shared_at": "2026-02-19T12:00:00"
}
}При получении сессии добавляются поля шаринга:
{
"session": {
"id": "chat_123",
"owner_id": 1,
"is_shared_with_me": true,
"share_permission": "read",
"share_count": 2
}
}POST /admin/chat/sessions/{id}/fork
Content-Type: application/json
Authorization: Bearer <token>
{
"title": "Мой форк"
}Создаёт глубокую копию всех активных сообщений с новым owner_id.
Все ошибки возвращаются в единообразном JSON формате:
{
"detail": "Описание ошибки"
}| Код | Описание |
|---|---|
| 200 | Успех |
| 201 | Создано |
| 400 | Некорректный запрос |
| 401 | Требуется аутентификация |
| 403 | Доступ запрещён |
| 404 | Не найдено |
| 422 | Ошибка валидации |
| 500 | Внутренняя ошибка сервера |
# Получить токен
TOKEN=$(curl -s -X POST http://localhost:8002/admin/auth/login \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"admin"}' | jq -r .access_token)
# Запрос к API
curl -X GET http://localhost:8002/v1/models \
-H "Authorization: Bearer $TOKEN"import requests
# Аутентификация
response = requests.post(
"http://localhost:8002/admin/auth/login",
json={"username": "admin", "password": "admin"}
)
token = response.json()["access_token"]
# Запрос с токеном
headers = {"Authorization": f"Bearer {token}"}
response = requests.get("http://localhost:8002/v1/models", headers=headers)
print(response.json())← Personas | Troubleshooting →