1. Концепция
  • Один эндпоинт: POST /api/v1/conversation.
  • Вы управляете персоной, через которую ведётся общение.
  • Для каждого API-ключа задаётся глобальный профиль персоны — общий характер и стиль для всех конечных пользователей.
  • Для каждого user_id в рамках API (multi-tenant-архитектура) — создаётся отдельная изолированная память, индивидуальная поведенческая эволюция персоны.
Итого: одна согласованная персона бренда и множество персонализированных диалогов.
2. Эндпоинт и авторизация
URL
POST https://<API_URL>/api/v1/conversation
Авторизация (обязательно)
Передавайте API-ключ в одном из заголовков следующим образом:
Authorization: Bearer YOUR_API_KEY
или
X-API-Key: YOUR_API_KEY
Требования к запросу
Content-Type: application/json
user_id обязателен.
Должен быть хотя бы один из:
  • message
  • image_b64 + image_mime
  • voice_b64 (рекомендуется с voice_mime)
3. Тело запроса
Базовая схема:
{
  "user_id": "user-123",
  "message": "Привет!",
  "image_b64": null,
  "image_mime": null,
  "voice_b64": null,
  "voice_mime": null,
  "persona": { }
}
3.1. user_id (required)
Идентификатор конечного пользователя в вашей системе.

  • Тип: строка.
  • Длина: 1–128 символов.
  • Должен быть стабильным.

Для каждого user_id формируется отдельная история, изолированная память, персональное развитие персоны.
3.2. message (optional)
Текст запроса.
  • Тип: строка.
  • Длина: 1–4000 символов.
  • Можно использовать отдельно или вместе с изображением.
3.3. image_b64 + image_mime (optional)
Используются для распознавания/анализа изображений.
image_b64 (base64 содержимого файла без data:...)
image_mime (обязательно при наличии image_b64)

Поддерживаемые значения:
  • image/jpeg
  • image/jpg
  • image/png
  • image/webp
Размер (после декодирования): до ~5 MB.
Если указан image_mime без image_b64 → ошибка.
3.4. voice_b64 + voice_mime (optional)
Голосовое сообщение автоматически транскрибируется в текст.

voice_b64 (base64 аудио)
voice_mime (рекомендуется)

Поддерживаемые значения:
  • audio/ogg
  • audio/opus
  • audio/mpeg
  • audio/mp3
  • audio/wav
  • audio/x-wav
  • audio/webm
  • audio/mp4
  • audio/m4a
  • audio/aac
Размер: до ~25 MB.
Если есть только voice_b64 → текст берётся из транскрибации.
Если есть и message, и voice_b64 → приоритет у message.
4. Persona: глобальный профиль и параметры
4.1. Общая логика
Поле persona задаёт/обновляет глобальный профиль персоны для данного API-ключа.
  • Профиль общий для всех user_id под этим ключом.
  • Определяет характер, тон, стиль, позиционирование.
  • Может передаваться: однократно при инициализации, периодически для уточнения (частичное обновление — только по указанным полям).
  • Невалидные значения игнорируются; валидные аккуратно мёрджатся.
Для каждого конечного пользователя:
  • используется этот глобальный профиль как база,
  • поверх него строится индивидуальная поведенческая эволюция: учёт его прошлых взаимодействий, предпочтений, задач, формирование уникального "отношения" персоны к этому пользователю.
  • Память и поведение одного user_id не влияют на других.
4.2. Поддерживаемые поля persona
"persona": {
  "name": "Nova",
  "age": 27,
  "gender": "female",
  "zodiac": "Gemini",
  "temperament": {
    "sanguine": 0.5,
    "choleric": 0.2,
    "phlegmatic": 0.2,
    "melancholic": 0.1
  },
  "sociality": "ambivert",
  "archetypes": ["Explorer", "Muse", "Sage"],
  "role": "Ты вдохновляющая фигура, которая мягко ведет людей через сложные решения, говоришь по делу, поддерживаешь и задаешь оптимистичный тон."
}
Ниже — строго поддерживаемые значения.
name (optional)
  • Строка, до 64 символов.
  • Имя персоны (отображается в коммуникации, если это уместно).
age (optional)
  • Целое число 1–120.
  • Влияет только на стилизацию (зрелость, тон).
gender (optional)
Поддерживаемые значения:
  • male
  • female
zodiac (optional)
Поддерживаемые значения (строго одно из):
  • Aries
  • Taurus
  • Gemini
  • Cancer
  • Leo
  • Virgo
  • Libra
  • Scorpio
  • Sagittarius
  • Capricorn
  • Aquarius
  • Pisces
temperament (optional)
Объект вида (сумма не более 1.00):
"temperament": {
  "sanguine": 0.45,
  "choleric": 0.18,
  "phlegmatic": 0.25,
  "melancholic": 0.12
}
sociality (optional)
Поддерживаемые значения (строго один из):
  • introvert
  • ambivert
  • extrovert
archetypes (optional)
Список архетипов персоны.
  • Максимум 3 значения.
  • Поддерживаемые значения (строго из этого списка): Nomad, Architect, Mirror, Spark, Ghost, Anchor, Muse, Trickster, Hero, Sage, Explorer, Creator, Caregiver, Rebel, Lover, Jester
role (optional)
Рекомендации:
  • Писать во втором лице: «Ты — амбассадор бренда CocaCola и икона современного общества. Ты помогаешь клиентам компании в любых делах, делая их жизнь проще. После общения с тобой люди ощущают лёгкость и свежесть, будто сделали глоток холодной газировки после изнуряющего дня. Ты естественно вплетаешь продукты и стиль бренда в диалог, без навязчивых продаж.»
  • Описывайте в роли только факты, навыки, особенности характера, предпочтения или биографические вкрапления.
  • Не превышайте объём описания в 1000 символов для лучшего качества.
  • Не используйте абстрактное «ты — просто support-агент», а задайте цельный образ.
Это описание становится основой глобального профиля для всех пользователей API-ключа, в рамках которого персона будет развиваться индивидуально для каждого пользователя.
5. Ответ
Успешный ответ (200 OK):
{
  "reply": "Привет! Как настроение?",
  "latency_ms": 842,
  "request_id": "4611686018427387904-7"
}
Поля:
  • reply — текст ответа персоны.
  • latency_ms — время обработки запроса на стороне сервиса.
  • request_id — уникальный ID запроса (используйте в логах и при разборе инцидентов).
6. Ошибки
Все ошибки возвращаются в JSON-формате:
{
  "detail": {
    "code": "error_code",
    "message": "Описание ошибки",
    "request_id": "..."    // может отсутствовать для некоторых 4xx
  }
}
Ниже — основные коды, с которыми следует работать в интеграции.
6.1. Авторизация
401 missing_api_key
  • Не передан API-ключ.
401 invalid_api_key
  • Ключ неверен или деактивирован.
6.2. Баланс
402 no_requests
  • Недостаточно доступных запросов в рамках вашего тарифа/баланса.
6.3. Валидация данных
Обычно 400 или 422:
  • empty_message (не передан ни message, ни image_b64, ни voice_b64)
  • invalid_image_mime
  • invalid_image_b64
  • image_too_large
  • invalid_voice_mime
  • voice_transcription_failed
6.4. Лимиты
429 rate_limited
  • Превышен лимит запросов для данного API-ключа.
429 rate_limited_ip
  • Превышен лимит запросов с вашего IP.
Рекомендуется реализовать ретраи с бэкоффом.
6.5. Серверные ошибки
Могут возникать временно, рекомендуются ретраи:
  • 503 queue_unavailable (временная недоступность сервиса)
  • 504 upstream_timeout (ответ не получен за отведённое время)
  • 500 internal_error (общая внутренная ошибка)
7. Стоимость и рейт-лимиты
Высокоуровнево:
  • Запросы списываются с вашего баланса при успешной обработке (1 успешный запрос-ответ - 5 Stars, либо бесплатно для развернутого движка под проект).
  • Ошибки авторизации (401), отсутствие лимита (402), превышение рейт-лимитов (429), а также внутренние ошибки сервиса (5xx) не расходуют оплаченные запросы.
  • Стандартные рейт-лимиты: 100 запросов в минуту с одного API-ключа и 360 запросов в минуту с одного IP-адреса.
8. Примеры использования
cURL
curl -X POST "https://<API_URL>/api/v1/conversation" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "user_id": "user-123",
    "message": "Подбери стартовый набор продукта под новичка.",
    "image_b64": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/w8AAwMB/6X8mNQAAAAASUVORK5CYII=",
    "image_mime": "image/png",
    "voice_b64": "<BASE64_AUDIO_OGG>",
    "voice_mime": "audio/ogg",
    "persona": {
      "name": "Nova",
      "age": 27,
      "gender": "female",
      "zodiac": "Gemini",
      "temperament": {
        "sanguine": 0.45,
        "choleric": 0.25,
        "phlegmatic": 0.20,
        "melancholic": 0.10
      },
      "sociality": "ambivert",
      "archetypes": ["Architect", "Sage", "Explorer"],
      "role": "Ты — амбассадор бренда Aurora. Ты знаешь ассортимент A, B и C, официальные регламенты, гарантийные условия и типовые сценарии использования. Ты даёшь пошаговые инструкции, проверенные рекомендации и ссылки на первоисточники. Ты помогаешь выбирать конфигурации, планировать внедрение и оценивать риски. Ты пишешь кратко и структурировано, используешь списки и примеры, указываешь единицы измерения и конкретные цифры. Ты соблюдаешь юридические и этические ограничения; медицинских, юридических и инвестиционных советов не даёшь."
    }
  }'
Python
import requests

API_URL = "https://<API_URL>"
API_KEY = "YOUR_API_KEY"

payload = {
    "user_id": "user-123",
    "message": "Подбери стартовый набор продукта под новичка.",
    "image_b64": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/w8AAwMB/6X8mNQAAAAASUVORK5CYII=",
    "image_mime": "image/png",
    "voice_b64": "<BASE64_AUDIO_OGG>",
    "voice_mime": "audio/ogg",
    "persona": {
        "name": "Nova",
        "age": 27,
        "gender": "female",
        "zodiac": "Gemini",
        "temperament": {
            "sanguine": 0.45,
            "choleric": 0.25,
            "phlegmatic": 0.20,
            "melancholic": 0.10
        },
        "sociality": "ambivert",
        "archetypes": ["Architect", "Sage", "Explorer"],
        "role": (
            "Ты — амбассадор бренда Aurora. Ты знаешь ассортимент A, B и C, "
            "официальные регламенты, гарантийные условия и типовые сценарии использования. "
            "Ты даёшь пошаговые инструкции, проверенные рекомендации и ссылки на первоисточники. "
            "Ты помогаешь выбирать конфигурации, планировать внедрение и оценивать риски. "
            "Ты пишешь кратко и структурировано, используешь списки и примеры, указываешь единицы измерения и цифры. "
            "Ты соблюдаешь юридические и этические ограничения; медицинских, юридических и инвестиционных советов не даёшь."
        )
    }
}

resp = requests.post(
    f"{API_URL}/api/v1/conversation",
    headers={"Authorization": f"Bearer {API_KEY}"},
    json=payload,
    timeout=30,
)
print(resp.status_code, resp.json())
JavaScript (fetch)
const API_URL = "https://<API_URL>";
const API_KEY = "YOUR_API_KEY";

const body = {
  user_id: "user-123",
  message: "Подбери стартовый набор продукта под новичка.",
  image_b64: "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/w8AAwMB/6X8mNQAAAAASUVORK5CYII=",
  image_mime: "image/png",
  voice_b64: "<BASE64_AUDIO_OGG>",
  voice_mime: "audio/ogg",
  persona: {
    name: "Nova",
    age: 27,
    gender: "female",
    zodiac: "Gemini",
    temperament: {
      sanguine: 0.45,
      choleric: 0.25,
      phlegmatic: 0.20,
      melancholic: 0.10
    },
    sociality: "ambivert",
    archetypes: ["Architect", "Sage", "Explorer"],
    role: "Ты — амбассадор бренда Aurora. Ты знаешь ассортимент A, B и C, официальные регламенты, гарантийные условия и типовые сценарии использования. Ты даёшь пошаговые инструкции, проверенные рекомендации и ссылки на первоисточники. Ты помогаешь выбирать конфигурации, планировать внедрение и оценивать риски. Ты пишешь кратко и структурировано, используешь списки и примеры, указываешь единицы измерения и цифры. Ты соблюдаешь юридические и этические ограничения; медицинских, юридических и инвестиционных советов не даёшь."
  }
};

(async () => {
  const resp = await fetch(`${API_URL}/api/v1/conversation`, {
    method: "POST",
    headers: {
      "Authorization": `Bearer ${API_KEY}`,
      "Content-Type": "application/json"
    },
    body: JSON.stringify(body)
  });
  const data = await resp.json().catch(() => ({}));
  console.log(resp.status, data);
})();
PHP (cURL)
<?php
$apiUrl = 'https://<API_URL>';
$apiKey  = 'YOUR_API_KEY';

$payload = [
  "user_id" => "user-123",
  "message" => "Подбери стартовый набор продукта под новичка.",
  "image_b64" => "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/w8AAwMB/6X8mNQAAAAASUVORK5CYII=",
  "image_mime" => "image/png",
  "voice_b64" => "<BASE64_AUDIO_OGG>",
  "voice_mime" => "audio/ogg",
  "persona" => [
    "name" => "Nova",
    "age" => 27,
    "gender" => "female",
    "zodiac" => "Gemini",
    "temperament" => [
      "sanguine" => 0.45,
      "choleric" => 0.25,
      "phlegmatic" => 0.20,
      "melancholic" => 0.10
    ],
    "sociality" => "ambivert",
    "archetypes" => ["Architect", "Sage", "Explorer"],
    "role" => "Ты — амбассадор бренда Aurora. Ты знаешь ассортимент A, B и C, официальные регламенты, гарантийные условия и типовые сценарии использования. Ты даёшь пошаговые инструкции, проверенные рекомендации и ссылки на первоисточники. Ты помогаешь выбирать конфигурации, планировать внедрение и оценивать риски. Ты пишешь кратко и структурировано, используешь списки и примеры, указываешь единицы измерения и цифры. Ты соблюдаешь юридические и этические ограничения; медицинских, юридических и инвестиционных советов не даёшь."
  ]
];

$ch = curl_init("$apiUrl/api/v1/conversation");
curl_setopt_array($ch, [
  CURLOPT_POST => true,
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $apiKey",
    "Content-Type: application/json",
  ],
  CURLOPT_POSTFIELDS => json_encode($payload, JSON_UNESCAPED_UNICODE),
  CURLOPT_TIMEOUT => 30,
]);

$response = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

echo $code, PHP_EOL, $response, PHP_EOL;
Go (net/http)
package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io"
	"net/http"
	"time"
)

func main() {
	apiURL := "https://<API_URL>"
	apiKey := "YOUR_API_KEY"

	body := map[string]any{
		"user_id":   "user-123",
		"message":   "Подбери стартовый набор продукта под новичка.",
		"image_b64": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/w8AAwMB/6X8mNQAAAAASUVORK5CYII=",
		"image_mime": "image/png",
		"voice_b64":  "<BASE64_AUDIO_OGG>",
		"voice_mime": "audio/ogg",
		"persona": map[string]any{
			"name":   "Nova",
			"age":    27,
			"gender": "female",
			"zodiac": "Gemini",
			"temperament": map[string]float64{
				"sanguine":    0.45,
				"choleric":    0.25,
				"phlegmatic":  0.20,
				"melancholic": 0.10,
			},
			"sociality":  "ambivert",
			"archetypes": []string{"Architect", "Sage", "Explorer"},
			"role": "Ты — амбассадор бренда Aurora. Ты знаешь ассортимент A, B и C, официальные регламенты, гарантийные условия и типовые сценарии использования. Ты даёшь пошаговые инструкции, проверенные рекомендации и ссылки на первоисточники. Ты помогаешь выбирать конфигурации, планировать внедрение и оценивать риски. Ты пишешь кратко и структурировано, используешь списки и примеры, указываешь единицы измерения и цифры. Ты соблюдаешь юридические и этические ограничения; медицинских, юридических и инвестиционных советов не даёшь.",
		},
	}

	b, _ := json.Marshal(body)

	req, _ := http.NewRequest("POST", apiURL+"/api/v1/conversation", bytes.NewReader(b))
	req.Header.Set("Authorization", "Bearer "+apiKey)
	req.Header.Set("Content-Type", "application/json")

	client := &http.Client{Timeout: 30 * time.Second}
	resp, err := client.Do(req)
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()

	rb, _ := io.ReadAll(resp.Body)
	fmt.Println(resp.StatusCode)
	fmt.Println(string(rb))
}
Примечания
  • image_b64 — валидный 1×1 PNG, удобен для тестов; при реальной интеграции используйте свои данные (image/jpeg|png|webp).
  • voice_b64 оставлен как placeholder (<BASE64_AUDIO_OGG>); подставьте base64-аудио в поддерживаемом формате (например, OGG/Opus).
  • Поле role соответствует правилам: второй лицо, факты/навыки/био, без описания эмоций, объём < 1000 символов.
9. База знаний (KB) в рамках API-ключей
KB (Knowledge Base) — это дополнительный слой знаний и сценариев, привязанный к API-ключу, который используется поверх персоны:
1) Одна KB на один API-ключ.
2) KB автоматически применяется ко всем user_id под этим ключом.
3) Персон использует KB в рамках гибридного RAG контура:
  • переводит запрос пользователя в векторное представление и сравнивает с триггерами в базе по смыслу (семантический поиск),
  • строит свой ответ на основании фрагментов для найденных триггеров, делая это естественным образом и в рамках текущего контекста диалога.
KB можно использовать не только как «FAQ-справку», но и для:
  • консультационных и экспертных сценариев,
  • дейтинга и социальных сценариев,
  • скриптов продаж и обработки возражений,
  • любых диалоговых паттернов, которые можно продумать и описать текстом.
  • Персона (persona в запросе) получает стиль, характер, роль. KB добавляет к ней управляемые доменные знания и сценарии поведения.
9.1. Как KB используется в рамках API
С точки зрения API всё просто. Вы не передаёте ничего про KB в POST /api/v1/conversation.

1) Если для ключа загружена KB и в ней есть подходящие триггеры и информация:
  • персона подбирает небольшое число релевантных записей (до 3: по Top_k),
  • отмечает такие фрагменты приоритетной пометкой в ядре диалоговой системы,
  • формирует ответ на основании этих фрагментов, истории общения и эмоционального состояния
2) Если подходящих фрагментов нет — ответ строится без знаний из KB.

KB влияет на:
  • используемые факты в ходе диалога (условия, тарифы, правила, описания продукта и т.д.);
  • ход диалога (как ответить, что спросить, как отработать возражение, как вести диалог, как реагировать и т.д.).

KB не превращает диалог в жёсткий сценарий:
  • это приоритетный источник знаний и инструкций,
  • но модель продолжает адаптировать формулировки под контекст и настроение.
9.2. Управление KB
Управление KB сейчас делается через Telegram-бота.
  1. Откройте чат с ботом.
  2. Нажмите кнопку API (в главном меню).
  3. Выберите нужный API-ключ.
  4. Нажмите кнопку 📚 KB:
  • Upload / Загрузить KB — отправьте JSON-файл с базой знаний (как документ).
  • Clear / Очистить KB — удаляет KB для этого ключа.
Ограничения (ориентировочно):
  • размер файла — до ~5 MB;
  • разумное количество записей — до ~2000 элементов за одну загрузку (по text).
После загрузки индекс пересобирается; в панели отображается статус KB для ключа (pending, building, ready, failed).
9.3. Формат JSON-файла KB
Информацю в KB можно записывать на любом языке.
Если вам нужно мультиязычное испольнение - делайте KB на английском.

Ожидается массив объектов:
[
  {
    "id": "faq-001",
    "category": "faq",
    "text": "Краткий, законченный фрагмент знаний, факт или сценарий.",
    "tags": ["ключевые слова", "ключевые фразы", "предложения"]
  }
]
Поля:
1) text (обязательно) - основной контент записи:
  • факт/справка,
  • мини-инструкция,
  • кусок сценария,
  • шаблон обработки возражения и т.п.

2) id (опционально)
Строковый идентификатор записи. Если не указан — подставляется порядковый номер.

3) category (опционально)
Логическая категория ("faq", "sales", "consulting", "dating", "support" и т.д.).
Для структуры и аналитики; на подбор напрямую не влияет.

4) tags (обязательно) - семантические триггеры:
  • ключевые слова и ключевые фразы, похожие на реальные запросы пользователей;
  • «машинные» теги ("sales:price") можно сочетать с человеческими ("дорого", "нет бюджета").
9.4. Как писать записи KB, чтобы они влияли на диалог
Рекомендации:
1) Одна запись text — одна цельная мысль или сценарий.
2) Объём text — от пары предложений до короткого абзаца (не больше 500 токенов).
3) Можно смешивать:
  • «чистые» факты (условия, цифры, регламенты),
  • инструкции для персоны («если пользователь говорит X — сделай Y, затем Z»),
  • элементы биографии и поведения персоны
Если в записи есть явные инструкции («ответь пользователю шуткой одновременно с выражением недовольства его поведением»), то при релевантном запросе персона стремится им следовать с учетом текущего контекста и настроения беседы.
9.5. Типовые сценарии использования KB
Задача: точные, предсказуемые ответы на типовые вопросы.
[
  {
    "id": "faq-shipping-1",
    "category": "faq",
    "tags": ["доставка", "сколько идет доставка", "сроки доставки", "shipping"],
    "text": "Стандартная доставка по России: 3–7 рабочих дней. Отправка заказа — на следующий рабочий день после оплаты."
  },
  {
    "id": "faq-refund-1",
    "category": "faq",
    "tags": ["возврат", "refund", "гарантия"],
    "text": "Вы можете вернуть товар в течение 14 дней при сохранении товарного вида и упаковки. Возврат средств — в течение 5 рабочих дней."
  }
]
  • Вопросы про доставку/возврат будут автоматически тянуть эти записи.
  • Персона отвечает в своём стиле, но опирается на эти факты.
Задача: не только отвечать, но и вести пользователя по шагам.
[
  {
    "id": "consult-onboarding-1",
    "category": "consulting",
    "tags": ["с чего начать", "onboarding", "я новичок"],
    "text": "1) уточни цель пользователя в 1–2 вопросах; 2) предложи один простой шаг; 3) договорись о следующем шаге."
  },
  {
    "id": "consult-kpi-1",
    "category": "consulting",
    "tags": ["kpi", "метрики", "цели"],
    "text": "Помоги пользователю сформулировать 1–3 измеримых показателя с горизонтом 2–4 недели, без сложной терминологии и учитывая текущий контекст беседы."
  }
]
  • KB задаёт «скелет» консультационного сценария.
  • в role можно описать, какой это консультант (кратко: тон, экспертиза, ограничения).
Задача: устойчивый паттерн общения, а не рандомные советы.
[
  {
    "id": "dating-profile-1",
    "category": "dating",
    "tags": ["расскажи о себе", "ты кто", "можешь рассказать о себе"],
    "text": "Ты любишь настольные игры и кофе, но не любишь шумные клубы. Ты ищешь тёплое общение и долгосрочные отношения важны для тебя."
  },
  {
    "id": "dating-first-message",
    "category": "dating",
    "tags": ["привет", "здарова", "hey"],
    "text": "Поздоровайся с пользовтаелем и спроси как у него дела."
  },
  {
    "id": "dating-topics-1",
    "category": "dating",
    "tags": ["давай поговорим", "не знаю, о чем говорить", "на какую тему поговорим"],
    "text": "Предложи свободную тему для продолжения разговора, которая может подойти в текущей ситуации и в соотвествие с текущим контекстом, а также настроением беседы."
  }
]
  • Такой KB задаёт устойчивый стиль поведения дейтинг-персоны.
  • Характер и настроение — формируются на уровне движка эмоций.
Задача: структурно работать с возражениями, но оставить живой диалог.
[
  {
    "id": "sales-plan-basic",
    "category": "sales",
    "tags": ["тариф basic", "начальный план"],
    "text": "Тариф Basic: до 3 пользователей и 10 000 запросов в месяц. Хорош для тестов и маленьких команд."
  },
  {
    "id": "sales-plan-pro",
    "category": "sales",
    "tags": ["тариф pro", "масштабирование"],
    "text": "Тариф Pro: до 10 пользователей и 100 000 запросов в месяц, приоритетная поддержка. Подходит для продакшн-нагрузки и команд."
  },
  {
    "id": "sales-objection-price",
    "category": "sales",
    "tags": ["дорого", "нет бюджета", "обработка возражений", "sales:price"],
    "text": "1) не спорь; 2) уточни, какой результат он хочет и насколько это важно по времени; 3) покажи связь цены с ценностью и рисками отказа; 4) предложи подобрать более доступный вариант, если есть."
  },
  {
    "id": "sales-objection-price2",
    "category": "sales",
    "tags": ["более дешевый план, чем pro", "более доступный вариант, чем pro"],
    "text": "Тариф Basic-Pro: до 5 пользователей и 40 000 запросов в месяц. Подходит для проектов среднего масштаба."
  }
]
9.6. Поведение по умолчанию
1) Если сообщение пустое или из одних эмодзи — KB, скорее всего, не будет использована.
2) Если среди записей KB не находится ничего достаточно близкого по смыслу— ответ строится без подмешивания KB,
3) Если найдено несколько релевантных записей:
  • в ответ подмешивается несколько фрагментов,
  • персона может комбинировать факты и сценарные инструкции из них в одном ответе.
Такой режим позволяет одновременно:
  • держать в KB «сухой» слой фактов (FAQ),
  • задавать сценарии поведения (консультирование, продажи, дейтинг),
  • при этом не ломать естественный ход живого диалога.
9.4. Как писать записи KB, чтобы они влияли на диалог
Рекомендации:
1) Одна запись textодна цельная мысль или сценарий.
2) Объём text — от пары предложений до короткого абзаца (не больше 500 токенов).
3) Можно смешивать:
  • «чистые» факты (условия, цифры, регламенты),
  • инструкции для персоны («если пользователь говорит X — сделай Y, затем Z»),
  • элементы биографии и поведения персоны
4) В tags желательно указывать максимально релеватно-возможные запросы пользователей для которых нужно использовать данные из text
5) В tags рекомендуется добавлять не более 5 триггеров

Если в записи есть явные инструкции («ответь пользователю шуткой одновременно с выражением недовольства его поведением»), то при релевантном запросе персона стремится им следовать с учетом текущего контекста и настроения беседы.