Перейти до основного вмісту

Спостережуваність

Langfuse

Langfuse надає LLM observability — трейси, трекінг вартості та моніторинг якості.

Реалізація

src/observability/langfuse.ts

Конфігурація

ЗміннаОбовʼязковаОпис
LANGFUSE_PUBLIC_KEYніPublic-ключ (pk-lf-...)
LANGFUSE_SECRET_KEYніSecret-ключ (sk-lf-...)
LANGFUSE_HOSTніURL сервера (дефолт: cloud.langfuse.com)

Langfuse опційний. Якщо ключі не налаштовані — трейсинг тихо вимикається.

Трейсовані операції

Span nameКомпонентЩо трекається
intent.classifyIntent classifierInput text, матчений intent, confidence
ingestion.synthetic-qaIngestion pipelineДовжина контенту, згенеровані питання
rag.queryRAG pipelineQuery, retrieved chunks, scores, generation
generationLLM callsМодель, input/output tokens, latency, вартість

Модель даних

Трейси дзеркаляться локально у модель AgentRun:

  • traceId — Langfuse trace ID
  • provider, model — інфо про LLM-провайдера
  • inputTokens, outputTokens, totalTokens — використання токенів
  • costUsd — приблизна вартість
  • latencyMs — час відповіді

Повʼязані RetrievalHit-записи трекають, які чанки були retrieved та їхні scores.

Перегляд трейсів

Через API

GET /api/v1/traces/:trace_id

Повертає AgentRun з усіма retrieval hits.

Через дашборд Langfuse

Перегляд:

  • таймлайни трейсів;
  • використання токенів у часі;
  • розподіл вартості по моделях;
  • метрики якості.

Моніторинг agent tasks

Agent runner трекає кожну задачу і кроки tool-call у БД і бродкастить події реального часу через WebSocket.

Модель даних

Кожне вхідне повідомлення створює AgentTask із:

  • adapterType — який адаптер обробив її (api, claude_local, codex_local, ollama);
  • status — lifecycle-стан (queued → running → completed/failed/timeout);
  • використання токенів (inputTokens, outputTokens, totalTokens) і costUsd;
  • durationMs — end-to-end час обробки;
  • вкладені AgentToolCall-записи для кожного кроку pipeline.

REST API

ЕндпоінтПризначення
GET /api/v1/agent-tasksСписок задач із фільтрами (namespace, department, status, adapter, date range)
GET /api/v1/agent-tasks/:idДеталі задачі з tool-call трейсом
GET /api/v1/agent-tasks/statsАгреговані метрики: success rate, avg duration, avg cost по adapter/namespace

Події реального часу (WebSocket)

Підключіться до ws://<host>/ws/agent-tasks, автентифікуйтесь через first-message handshake ({ "action": "auth", "token": "<jwt>" }), а потім підпишіться по namespace, щоб отримувати live-події:

  • agent-task.created — задача поставлена у чергу;
  • agent-task.started — воркер підхопив;
  • agent-task.tool-call — окремий крок завершено (inject_profile, rag_search, generate, confidence_check, adapter-виклики);
  • agent-task.completed — задача готова з output;
  • agent-task.failed — задача впала або таймаутнулась.

Bull Board

Технічна queue-dashboard на /admin/queues (вимагає canEditSettings). Показує всі BullMQ-черги, включно з agent-tasks: статус задачі, retry count, failed job inspection.


Audit log

AgentCore автоматично логує усі мутації для compliance і дебагу.

Реалізація

src/middleware/audit.ts

Автоматичне логування

Audit-middleware перехоплює всі POST, PATCH і DELETE-запити та створює AuditLog-запис із:

ПолеДжерело
userIdJWT payload
actionВиводиться з метода + URL (create/update/delete/approve/reject/escalate/login)
entityTypeВитягується з URL-шляху
entityIdВитягується з URL-параметра
changesТіло запиту (JSON)
ipAddressКлієнтський IP
userAgentЗаголовок user-agent клієнта

Виведення дії

Патерн URLМетодAction
/auth/loginPOSTlogin
/approvals/:id/approvePOSTapprove
/approvals/:id/rejectPOSTreject
/approvals/:id/escalatePOSTescalate
*POSTcreate
*PATCHupdate
*DELETEdelete

Явне логування

Бізнес-логіка також може логувати події напряму:

import { logAuditEvent } from '../middleware/audit';

await logAuditEvent({
userId: user.id,
action: 'approve',
entityType: 'approval',
entityId: approval.id,
changes: { status: 'approved' },
ipAddress: request.ip,
userAgent: request.headers['user-agent'],
});

Запит до логів

Список audit-логів

GET /api/v1/audit?action=approve&entityType=approval&userId=<id>&limit=50&offset=0

Авторизація: дозвіл canViewAudit.

Індекси

Таблиця AuditLog проіндексована по:

  • userId — фільтр по актору;
  • (entityType, entityId) — фільтр по таргету;
  • createdAt — запити по часовому діапазону.