Перейти к основному содержимому

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

Namespaces и персоны

Namespace задаёт личность и поведение AI-ассистента внутри отдела. У каждого namespace может быть свой system prompt, шкала формальности, правила эскалации и матрица доверия.

Конфигурация персоны

JSON-поле persona поддерживает:

{
"language": "uk",
"style": {
"verbosity": "concise",
"citations": true,
"structure": "bullets",
"formality": 80
},
"boundaries": ["Do not provide legal advice", "Redirect medical questions to HR"],
"escalation": {
"triggers": ["lawsuit", "termination", "complaint"],
"defaultAssignee": "<user-id>",
"message": "This question has been escalated to a specialist."
},
"greeting": "Hello! How can I help you today?",
"fallback": "I'm not sure about that. Let me connect you with a specialist."
}

Шкала формальности

persona.style.formality — целое число от 0 до 100.

  • 0-33 — неформальные ответы простым языком.
  • 34-66 — сбалансированный профессиональный тон.
  • 67-100 — формальный юридический стиль.

Устаревшее поле persona.tone API больше не принимает.

System prompt

Поле systemPrompt подставляется первым сообщением в контекст LLM. Через него задаются роль ассистента, ограничения и границы знаний.

API

Список namespaces

GET /api/v1/namespaces

Создать namespace

POST /api/v1/namespaces
Body: { "name": "legal", "departmentId": "<id>", "systemPrompt": "...", "persona": {...} }

Обновить namespace

PATCH /api/v1/namespaces/:id
Body: { "systemPrompt": "...", "persona": {...} }

Удалить namespace

DELETE /api/v1/namespaces/:id

Конфигурация agent runner

Поле agentRunner в Namespace.config определяет, какой адаптер обрабатывает задачи для этого namespace.

PATCH /api/v1/namespaces/:id
{
"config": {
"agentRunner": {
"activeAdapter": "api",
"adapters": {
"api": { "model": "gpt-4o-mini", "apiKey": "$OPENAI_API_KEY" },
"claude_local": { "model": "claude-sonnet-4-6", "maxTokens": 4096, "timeoutMs": 300000 },
"codex_local": { "model": "codex-mini-latest", "timeoutMs": 300000 },
"ollama": { "baseUrl": "http://localhost:11434", "model": "llama3.1-70b", "temperature": 0.7 }
}
}
}
}
ПолеТипОписание
activeAdapterapi | claude_local | codex_local | ollamaКакой адаптер использовать для этого namespace
adapters.<type>объектНастройки конкретного адаптера (модель, таймаут, ключи и т.д.)

Смена адаптера для namespace делается одним обновлением конфига — менять код не нужно.

Связь с другими фичами

  • Agent runner — каждый namespace выбирает свой адаптер через config.agentRunner.activeAdapter.
  • Intent trust — у каждого namespace своя матрица доверия (записи IntentTrust, привязанные к namespaceId).
  • Intent examples — обучающие примеры ограничены namespace-ом.
  • Разговоры — каждый разговор может принадлежать namespace.
  • RAG — system prompt namespace подставляется в RAG-контекст.

Маршруты моделей

AgentCore использует OpenAI-совместимые API для генерации и embeddings. Маршрутизация настраивается через env.

LLM generation

ПеременнаяПо умолчаниюОписание
OPENAI_API_KEYAPI-ключ (обязательно)
OPENAI_BASE_URLhttps://api.openai.com/v1Base URL для generation API
OPENAI_MODELgpt-4oМодель для RAG-генерации

Другие провайдеры

Любой OpenAI-совместимый API подключается сменой OPENAI_BASE_URL:

# Azure OpenAI
OPENAI_BASE_URL=https://your-resource.openai.azure.com/openai/deployments/gpt-4o
OPENAI_API_KEY=your-azure-key

# Local model (Ollama, vLLM, etc.)
OPENAI_BASE_URL=http://localhost:11434/v1
OPENAI_API_KEY=not-needed
OPENAI_MODEL=llama3

Embeddings

ПеременнаяПо умолчаниюОписание
OPENAI_EMBEDDING_MODELtext-embedding-3-smallEmbedding-модель (1536-dim)

Embedding-модель должна давать 1536-мерные векторы, чтобы совпадать с определением столбца pgvector. Если используете другую модель — проверьте размерность.

Переменные окружения

ПеременнаяОбязательнаПо умолчаниюОписание
DATABASE_URLдаСтрока подключения PostgreSQL
OPENAI_API_KEYдаOpenAI API-ключ
JWT_SECRETдаСекрет подписи JWT, минимум 32 символа
NODE_ENVнетdevelopmentРежим работы: development, production или test
PORTнет3000Порт сервера
HOSTнет0.0.0.0Bind address
REDIS_URLнетredis://localhost:6379Строка подключения Redis
KB_UPLOAD_DIRнет./tmp/knowledge_uploadsКаталог для загрузок документов
OPENAI_BASE_URLнетhttps://api.openai.com/v1Base URL LLM API
OPENAI_MODELнетgpt-4oLLM-модель для генерации
OPENAI_EMBEDDING_MODELнетtext-embedding-3-smallEmbedding-модель
ANTHROPIC_API_KEYнетКлюч Anthropic API (зарезервирован для будущей маршрутизации)
LANGFUSE_PUBLIC_KEYнетLangfuse tracing public key
LANGFUSE_SECRET_KEYнетLangfuse tracing secret key
LANGFUSE_HOSTнетURL сервера Langfuse
JWT_EXPIRES_INнет7dСрок жизни JWT-токена
PII_ENCRYPTION_KEYда32-байтовый AES-GCM ключ в Base64
WHATSAPP_APP_IDнетID приложения WhatsApp Cloud API
WHATSAPP_APP_SECRETнетSecret приложения WhatsApp Cloud API
WHATSAPP_PHONE_NUMBER_IDнетPhone number ID WhatsApp
WHATSAPP_ACCESS_TOKENнетAccess-токен WhatsApp API
WHATSAPP_WEBHOOK_VERIFY_TOKENнетVerify-токен webhook
WA_PHONE_NUMBERнет+380000000000Номер отправителя WhatsApp
WA_RATE_LIMIT_PER_MINнет60Лимит WhatsApp-сообщений в минуту
TG_BOT_TOKENнетТокен Telegram-бота
TG_RATE_LIMIT_PER_MINнет30Лимит Telegram-сообщений в минуту
ALLOWED_ORIGINSнетhttp://localhost:5173Разрешённые CORS origins (точный match)
MEMORY_EXTRACT_EVERY_N_MESSAGESнет10Каждые N сообщений — запуск memory extraction
MEMORY_EXTRACTION_MODELнетgpt-4o-miniМодель для memory extraction
INTENT_TRIGGER_WORDSнетсм. config.tsТриггерные слова HITL через запятую

Memory extraction

ПеременнаяПо умолчаниюОписание
MEMORY_EXTRACTION_MODELgpt-4o-miniМодель для извлечения профиля сотрудника

По умолчанию стоит более дешёвая модель ради экономии. Извлечение профиля менее чувствительно к качеству, чем RAG-генерация.

Anthropic (опционально)

ПеременнаяПо умолчаниюОписание
ANTHROPIC_API_KEYКлюч Anthropic API

Зарезервировано для будущей маршрутизации между несколькими провайдерами. Сейчас в основном generation-пайплайне не используется.


RAG-веса

Веса поиска настраиваются per-knowledge base — можно тюнить качество поиска под разный тип контента.

Дефолтные веса

ПолеПо умолчаниюОписание
vector0.65Доля итогового скора от векторного (embedding) поиска
keyword0.35Доля итогового скора от полнотекстового keyword-поиска

Внутри векторного бюджета 85% идёт на content embeddings и 15% — на синтетические embeddings вопросов. Эти доли зашиты и не настраиваются. Сумма vector + keyword должна быть ≤ 1.0.

Настройка per-KB

Кастомные веса задаются через отдельный config-эндпоинт базы знаний:

PATCH /api/v1/knowledge/bases/:id/config
{
"ragWeights": {
"vector": 0.70,
"keyword": 0.30
}
}

Передайте "ragWeights": null, чтобы сбросить веса KB и вернуться к глобальным дефолтам.

Рекомендации по тюнингу

Тип контентаРекомендация
Юридические документы (структурированные)Выше keyword-вес (например, keyword: 0.45) — юридические термины точные
FAQ / Q&A-парыВыше vector-вес (например, vector: 0.80) — семантический match важнее
Общий текстДефолтные веса работают хорошо
Техническая документацияСбалансировано: важны и термины, и контекст

Как считается скор

  1. Каждый путь поиска возвращает кандидатов с сырыми скорами.
  2. Скоры нормализуются в каждом пути (диапазон 0–1).
  3. Итоговый скор: (vector × 0.85) × vecScore + (vector × 0.15) × qScore + keyword × keyScore.
  4. Топ-6 кандидатов отбираются по итоговому скору.