URL
POST https://<PRIVATE_DEPLOYMENT_URL>/api/v1/conversationAuthentication headers
- Authorization: Bearer YOUR_API_KEY
- X-API-Key: YOUR_API_KEY
- Idempotency-Key: optional-request-key
Conversation API
Conversation API
HTTP API для private dialogue layer: текст, изображения, голос, память по user_id, глобальный persona profile на ключ и knowledge-driven ответы через custom KB.
Conversation API живет внутри private deployment. Вы получаете отдельный base URL и используете один endpoint для всех диалоговых сценариев.
URL
POST https://<PRIVATE_DEPLOYMENT_URL>/api/v1/conversationAuthentication headers
Runtime факты
image limit
≈ 5 MB decoded
voice limit
≈ 25 MB decoded
default key limit
60 RPM
default IP limit
360 RPM
user_id обязателен. Нужно передать хотя бы одно из: message, image_b64 или voice_b64. Если одновременно отправить message и voice_b64, текст считается основным входом, а голос остается дополнительным контекстом.
| Поле | Type | Обязательность | Описание |
|---|---|---|---|
| user_id | string (1..128) | Yes | Стабильный идентификатор пользователя в вашей системе. Он используется как ключ памяти. |
| message | string (1..4000) | No | Текстовый запрос. Может использоваться отдельно или вместе с картинкой. |
| image_b64 | base64 string | No | Изображение без data:-префикса. Поддерживаются image/jpeg, image/jpg, image/png, image/webp. |
| image_mime | string | With image_b64 | MIME-тип изображения. Если image_mime передан без image_b64, запрос отклоняется. |
| voice_b64 | base64 string | No | Голосовой вход. Если message отсутствует, сервис пытается транскрибировать аудио в текст. |
| voice_mime | string | Recommended | Поддерживаются audio/aac, audio/m4a, audio/mp3, audio/mp4, audio/mpeg, audio/ogg, audio/opus, audio/wav, audio/webm, audio/x-wav. |
| persona | object | No | Обновляет глобальный persona profile для API key. Частичные поля сливаются с существующим профилем. |
persona — это общий профиль на API key. Он задает роль, стиль и позиционирование, а поверх него система ведет индивидуальную историю по каждому user_id.
| Поле | Type | Описание |
|---|---|---|
| name | string (1..64) | Имя профиля. |
| age | integer 1..120 | Стилистический нюанс, а не бизнес-правило. |
| gender | male | female | Пол профиля. |
| zodiac | 12 fixed values | Aries..Pisces. |
| temperament | object | Весы для sanguine / choleric / phlegmatic / melancholic; внутри движка нормализуются. |
| sociality | introvert | ambivert | extrovert | Социальный вектор поведения. |
| archetypes | array up to 16 enum values | Например: Sage, Explorer, Creator, Caregiver. |
| role | string (1..1000) | Главное рабочее описание роли, экспертизы, ограничений и тона. |
Успешный ответ содержит текст reply, latency_ms для SLA-наблюдения, latency_breakdown для детальной трассировки и request_id для инцидентов.
Пример ответа
{
"reply": "Для старта чаще всего подходит Basic: он закрывает типовые задачи без лишнего объема. Если важны приоритетная поддержка и более высокий лимит запросов, тогда стоит смотреть Pro.",
"latency_ms": 842,
"latency_breakdown": {
"queue_latency_ms": 44,
"worker_latency_ms": 798,
"total_latency_ms": 842
},
"request_id": "4611686018427387904-7-a1b2c3"
}Все ошибки используют envelope { detail: { code, message, request_id? } }. В части ранних 4xx request_id может отсутствовать.
| HTTP | code | Описание | Повтор |
|---|---|---|---|
| 401 | missing_api_key | API-ключ не передан. | No |
| 401 | invalid_api_key | Ключ невалиден или деактивирован. | No |
| 402 | no_requests | Недостаточно request balance для API-использования. | After refill |
| 400 | invalid_payload | Неверная форма запроса, неправильные комбинации полей или broken base64. | After fix |
| 400 | invalid_voice_format / invalid_voice_mime / voice_transcription_failed | Голосовой payload не поддерживается, не распознан или не был транскрибирован. | After fix |
| 409 | idempotency_in_flight / idempotency_key_reused_with_different_payload | Ключ идемпотентности уже в работе или использован с другим payload. | Carefully |
| 429 | rate_limited / rate_limited_ip | Превышен лимит по ключу или IP. Возвращается Retry-After: 60. | Yes |
| 503 | queue_unavailable / rate_limiter_unavailable / idempotency_unavailable | Временная недоступность очереди, rate limiter или idempotency storage. | Yes |
| 504 | upstream_timeout | Worker или модель не ответили вовремя. | Yes |
| 500 | internal_error | Внутренняя ошибка. | Yes |
Ниже — базовые примеры для private deployment. В production вы меняете только base URL и API key.
Request example
{
"user_id": "usr-42",
"message": "Помоги выбрать стартовый тариф и кратко объясни разницу с Pro.",
"image_b64": null,
"image_mime": null,
"voice_b64": null,
"voice_mime": null,
"persona": {
"name": "Nora",
"gender": "female",
"sociality": "ambivert",
"archetypes": ["Sage", "Explorer"],
"role": "You are the private AI assistant for Acme. You answer product and support questions, rely on the official knowledge base, keep replies concise, and escalate billing disputes to a human."
}
}cURL · bash
curl -X POST "https://<PRIVATE_DEPLOYMENT_URL>/api/v1/conversation" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Idempotency-Key: req-usr-42-001" \
-H "Content-Type: application/json" \
-d '{
"user_id": "usr-42",
"message": "Помоги выбрать стартовый тариф и кратко объясни разницу с Pro.",
"image_b64": null,
"image_mime": null,
"voice_b64": null,
"voice_mime": null,
"persona": {
"name": "Nora",
"gender": "female",
"sociality": "ambivert",
"archetypes": ["Sage", "Explorer"],
"role": "You are the private AI assistant for Acme. You answer product and support questions, rely on the official knowledge base, keep replies concise, and escalate billing disputes to a human."
}
}'JavaScript / fetch · ts
const API_URL = 'https://<PRIVATE_DEPLOYMENT_URL>';
const API_KEY = 'YOUR_API_KEY';
const body = {
"user_id": "usr-42",
"message": "Помоги выбрать стартовый тариф и кратко объясни разницу с Pro.",
"image_b64": null,
"image_mime": null,
"voice_b64": null,
"voice_mime": null,
"persona": {
"name": "Nora",
"gender": "female",
"sociality": "ambivert",
"archetypes": ["Sage", "Explorer"],
"role": "You are the private AI assistant for Acme. You answer product and support questions, rely on the official knowledge base, keep replies concise, and escalate billing disputes to a human."
}
};
const response = await fetch(`${API_URL}/api/v1/conversation`, {
method: 'POST',
headers: {
Authorization: `Bearer ${API_KEY}`,
'Content-Type': 'application/json',
'Idempotency-Key': 'req-usr-42-001'
},
body: JSON.stringify(body)
});
console.log(response.status, await response.json());Python / requests · py
import requests
API_URL = 'https://<PRIVATE_DEPLOYMENT_URL>'
API_KEY = 'YOUR_API_KEY'
payload = {
"user_id": "usr-42",
"message": "Помоги выбрать стартовый тариф и кратко объясни разницу с Pro.",
"image_b64": null,
"image_mime": null,
"voice_b64": null,
"voice_mime": null,
"persona": {
"name": "Nora",
"gender": "female",
"sociality": "ambivert",
"archetypes": ["Sage", "Explorer"],
"role": "You are the private AI assistant for Acme. You answer product and support questions, rely on the official knowledge base, keep replies concise, and escalate billing disputes to a human."
}
}
resp = requests.post(
f"{API_URL}/api/v1/conversation",
headers={
'Authorization': f'Bearer {API_KEY}',
'Content-Type': 'application/json',
'Idempotency-Key': 'req-usr-42-001',
},
json=payload,
timeout=30,
)
print(resp.status_code, resp.json())KB привязана к API key и автоматически применяется ко всем user_id под этим ключом. Сейчас KB управляется вне HTTP endpoint: вы загружаете JSON, а индекс перестраивается в фоне.
KB JSON example
[
{
"id": "faq-billing-1",
"category": "support",
"tags": ["оплата", "billing", "как оплатить", "тариф"],
"text": "Оплата проходит после подтверждения заказа. Если вопрос связан с возвратом или спорным списанием, сначала собери контекст и передай кейс человеку."
},
{
"id": "faq-plan-basic",
"category": "sales",
"tags": ["basic", "стартовый тариф", "для начала"],
"text": "Basic подходит для первого запуска и типовой нагрузки. Сначала объясни сценарий, затем коротко сравни Basic и Pro по ограничениям и поддержке."
}
]Покажем, как развернуть Synchatica под ваш контур, какие поля persona и KB лучше задать и где имеет смысл включать модерацию, handoff и request tracing.