Справочник API Расширений
API Расширений предоставляет конечные точки для управления и взаимодействия с расширениями Ordinaut. Это включает обнаружение расширений, мониторинг здоровья и доступ к специфической функциональности расширений.
Основные Конечные Точки Расширений
Статус Расширений
Получить информацию о всех обнаруженных расширениях.
Конечная Точка: GET /ext/status
Аутентификация: Не требуется
Области: Никаких
Ответ:
{
"extensions": {
"observability": {
"state": "загружено",
"info": {
"id": "observability",
"name": "Observability",
"version": "0.1.0",
"description": "Метрики Prometheus и мониторинг"
},
"capabilities": ["ROUTES"],
"loaded_ms": 45,
"metrics": {
"requests_total": 150.0,
"errors_total": 2.0,
"latency_ms_sum": 1250.5
}
}
},
"discovery_sources": ["builtin", "env_dir"],
"total_extensions": 4,
"loaded_extensions": 3,
"failed_extensions": 0
}
Пример:
curl http://localhost:8080/ext/status
Встроенные Расширения
Расширение Observability
Предоставляет совместимые с Prometheus метрики для системного мониторинга.
Получить Метрики
Конечная Точка: GET /ext/observability/metrics
Аутентификация: Не требуется
Content-Type: text/plain; version=0.0.4
Возвращает метрики в формате Prometheus включая:
- Метрики HTTP запросов/ответов
- Статистику выполнения задач
- Метрики производительности расширений
- Использование системных ресурсов
Пример:
curl http://localhost:8080/ext/observability/metrics
Пример Ответа:
# HELP http_requests_total Общее количество HTTP запросов
# TYPE http_requests_total counter
http_requests_total{method="GET",endpoint="/health"} 45.0
# HELP task_executions_total Общее количество выполнений задач
# TYPE task_executions_total counter
task_executions_total{status="success"} 123.0
task_executions_total{status="failed"} 5.0
# HELP extension_requests_total Количество запросов расширений
# TYPE extension_requests_total counter
extension_requests_total{extension="webui"} 89.0
Расширение Web UI
Предоставляет веб-интерфейс для управления задачами и системного мониторинга.
Получить Веб Интерфейс
Конечная Точка: GET /ext/webui/
Аутентификация: Не требуется (настраиваемая)
Content-Type: text/html
Возвращает главную HTML страницу веб интерфейса.
Пример:
curl http://localhost:8080/ext/webui/
Конечные Точки API
Получить Задачи: GET /ext/webui/api/tasks
{
"tasks": [
{
"id": "uuid-1234",
"title": "Утренний Брифинг",
"status": "активная",
"next_run": "2025-08-26T08:30:00Z"
}
]
}
Создать Задачу: POST /ext/webui/api/tasks
{
"title": "Новая Задача",
"schedule_kind": "cron",
"schedule_expr": "0 9 * * *",
"payload": {
"pipeline": []
}
}
Расширение MCP HTTP
Model Context Protocol через HTTP для интеграции AI ассистентов.
MCP Метаданные
Конечная Точка: GET /ext/mcp_http/meta
Аутентификация: Не требуется
{
"server": "ordinaut-mcp-http",
"version": "0.2.0",
"capabilities": ["handshake", "list_tools", "invoke", "schema", "sse"]
}
MCP Рукопожатие
Конечная Точка: POST /ext/mcp_http/handshake
Content-Type: application/json
Запрос:
{
"client": {
"name": "ChatGPT",
"version": "1.0"
}
}
Ответ:
{
"server": {
"name": "ordinaut-mcp-http",
"version": "0.2.0"
},
"session_id": "sess-uuid-5678"
}
Список Доступных Инструментов
Конечная Точка: GET /ext/mcp_http/tools
{
"tools": [
{
"name": "create_task",
"description": "Создать новую запланированную задачу",
"parameters": {
"type": "object",
"properties": {
"title": {"type": "string"},
"schedule": {"type": "string"}
}
}
}
]
}
Вызов Инструмента
Конечная Точка: POST /ext/mcp_http/invoke
Запрос:
{
"tool": "create_task",
"parameters": {
"title": "Ежедневный Отчет",
"schedule": "0 18 * * *"
}
}
Ответ:
{
"success": true,
"result": {
"task_id": "uuid-9876",
"message": "Задача создана успешно"
}
}
Расширение Demo События
Демонстрирует систему событий Redis Streams.
Опубликовать Событие
Конечная Точка: POST /ext/events_demo/publish/{stream}
Content-Type: application/json
Пример:
curl -X POST http://localhost:8080/ext/events_demo/publish/test \\
-H "Content-Type: application/json" \\
-d '{"сообщение": "Привет События", "timestamp": "2025-08-26T10:00:00Z"}'
Ответ:
{
"success": true,
"stream": "test",
"event_id": "1692873600000-0",
"message": "Событие опубликовано успешно"
}
Подписка на События (Server-Sent Events)
Конечная Точка: GET /ext/events_demo/subscribe/{stream}
Content-Type: text/event-stream
Устанавливает SSE соединение для получения событий в реальном времени.
Пример:
curl -N http://localhost:8080/ext/events_demo/subscribe/test
Поток Ответа:
data: {"stream": "test", "id": "1692873600000-0", "data": {"сообщение": "Привет События"}}
data: {"stream": "test", "id": "1692873600001-0", "data": {"сообщение": "Другое событие"}}
API Разработки Расширений
Регистрация Расширений
Расширения обнаруживаются и регистрируются автоматически. Ручной API регистрации не требуется.
Источники Обнаружения:
1. Встроенные: директория ordinaut/extensions/
2. Окружение: переменная окружения ORDINAUT_EXT_PATHS
3. Entry points: группа Python entry points ordinaut.plugins
Возможности Расширений
Расширения могут запрашивать следующие возможности:
Возможность | Описание | Доступ API |
---|---|---|
ROUTES |
Создание HTTP конечных точек | Монтирование маршрутизатора FastAPI |
TOOLS |
Доступ к реестру инструментов | tool_registry.register_tool() |
EVENTS_PUB |
Публикация событий | events.publish() |
EVENTS_SUB |
Подписка на события | events.subscribe() |
BACKGROUND_TASKS |
Долгоработающие процессы | background.start_task() |
STATIC |
Обслуживание статичных файлов | Автоматическая маршрутизация статичных файлов |
Объекты Контекста
Расширения получают объекты контекста на основе предоставленных возможностей:
Контекст Реестра Инструментов
# Доступно когда предоставлена возможность TOOLS
tool_registry.register_tool(name: str, func: Callable, schema: dict)
tool_registry.list_tools() -> List[ToolInfo]
tool_registry.get_tool(name: str) -> ToolInfo
Контекст Событий
# Доступно когда предоставлены EVENTS_PUB или EVENTS_SUB
await events.publish(stream: str, data: dict) -> str
await events.subscribe(pattern: str, handler: Callable) -> None
await events.unsubscribe(pattern: str) -> None
Контекст Фоновых Задач
# Доступно когда предоставлена возможность BACKGROUND_TASKS
await background.start_task(name: str, coro: Coroutine) -> None
await background.stop_task(name: str) -> None
background.list_tasks() -> List[TaskInfo]
Аутентификация и Авторизация
Контроль Доступа на Основе Областей
Расширения могут быть защищены авторизацией на основе областей:
Конфигурация:
export ORDINAUT_REQUIRE_SCOPES=true
Заголовки Запроса:
curl -H "X-Scopes: ext:мое_расширение:routes" \\
http://localhost:8080/ext/мое_расширение/защищенный
Шаблон Требуемой Области: ext:{extension_id}:routes
Аутентификация JWT Токена
Когда аутентификация JWT включена, расширения наследуют те же требования аутентификации что и основной API.
Заголовки Запроса:
curl -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9..." \\
http://localhost:8080/ext/мое_расширение/безопасный
Ответы Ошибок
Все конечные точки расширений следуют согласованным форматам ответов ошибок:
400 Неверный Запрос
{
"error": "bad_request",
"message": "Неверные параметры запроса",
"details": {
"field": "schedule_expr",
"issue": "Неверное cron выражение"
}
}
401 Неавторизован
{
"error": "unauthorized",
"message": "Требуется аутентификация",
"details": {
"required_scopes": ["ext:мое_расширение:routes"]
}
}
403 Запрещено
{
"error": "forbidden",
"message": "Недостаточно разрешений",
"details": {
"required_capability": "TOOLS",
"granted_capabilities": ["ROUTES"]
}
}
404 Не Найдено
{
"error": "not_found",
"message": "Расширение не найдено",
"details": {
"extension_id": "несуществующее_расширение"
}
}
500 Внутренняя Ошибка Сервера
{
"error": "internal_error",
"message": "Выполнение расширения не удалось",
"details": {
"extension_id": "мое_расширение",
"error_type": "ImportError",
"traceback": "..."
}
}
Ограничение Скорости
Конечные точки расширений соблюдают ту же конфигурацию ограничения скорости что и основной API:
Заголовки:
- X-RateLimit-Limit
: Лимит запросов на окно
- X-RateLimit-Remaining
: Оставшиеся запросы в текущем окне
- X-RateLimit-Reset
: Время сброса окна
429 Слишком Много Запросов:
{
"error": "rate_limit_exceeded",
"message": "Превышен лимит скорости",
"details": {
"limit": 100,
"window": "60s",
"reset_at": "2025-08-26T10:01:00Z"
}
}
Проверки Здоровья
Расширения могут реализовать конечные точки проверки здоровья для мониторинга:
Соглашение: GET /ext/{extension_id}/health
Стандартный Ответ:
{
"status": "здоровый",
"timestamp": "2025-08-26T10:00:00Z",
"version": "1.0.0",
"checks": {
"database": "здоровый",
"external_api": "здоровый",
"background_tasks": "здоровый"
}
}
Поддержка WebSocket
Расширения могут реализовать WebSocket конечные точки для общения в реальном времени:
Шаблон Конечной Точки: WS /ext/{extension_id}/ws/{path}
Пример Реализации:
from fastapi import WebSocket
@router.websocket("/ws/events")
async def websocket_endpoint(websocket: WebSocket):
await websocket.accept()
try:
while True:
# Обработка WebSocket общения
data = await websocket.receive_json()
response = await обработать_websocket_данные(data)
await websocket.send_json(response)
except WebSocketDisconnect:
# Обработка отключения клиента
pass
Метрики Расширений
Все расширения автоматически получают базовый сбор метрик:
Доступные Метрики:
- extension_requests_total{extension, endpoint, method, status}
- extension_request_duration_seconds{extension, endpoint, method}
- extension_errors_total{extension, endpoint, error_type}
- extension_active_connections{extension, endpoint}
Доступ через Расширение Observability:
curl http://localhost:8080/ext/observability/metrics | grep extension
Данный справочник API предоставляет полную документацию для взаимодействия с системой расширений Ordinaut, позволяя разработчикам создавать мощные расширения и эффективно интегрировать внешние системы.