Mapping Presets¶
Mapping preset — предустановленный набор JSONPath-выражений, определяющих, где в JSON-запросе/ответе конкретного LLM-провайдера находятся ключевые поля (промпт пользователя, системный промпт, имя модели, текст ответа). Request Normalizer использует эти выражения для извлечения текста в канонический формат перед детекцией.
Структура field mapping¶
Каждый preset содержит 5 JSONPath-выражений:
| Поле | Обязательное | Описание |
|---|---|---|
prompt_path |
Да | Путь к тексту промпта пользователя. Из этого текста извлекается user_prompt для детекции. |
system_prompt_path |
Нет | Путь к системному промпту. Используется для System Prompt Leak Detection. |
user_messages_path |
Нет | Путь к массиву сообщений пользователя (chat API). Используется для извлечения истории диалога. |
model_path |
Нет | Путь к имени модели. Записывается в метаданные события. |
response_path |
Нет | Путь к тексту ответа LLM. Используется Response Scanner для извлечения текста из ответа. |
Chat API¶
openai_chat_completions — OpenAI Chat Completions¶
Провайдеры: OpenAI (GPT-4, GPT-4o, GPT-3.5-Turbo), а также все OpenAI-совместимые API: Mistral, Ollama, vLLM, LiteLLM, OpenRouter, Together AI, Groq, Fireworks.
| Поле | JSONPath |
|---|---|
prompt_path |
messages[*].content |
system_prompt_path |
messages[?(@.role=='system')].content |
user_messages_path |
messages[?(@.role=='user')] |
model_path |
model |
response_path |
choices[0].message.content |
Запрос:
{
"model": "gpt-4",
"messages": [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Привет! Как дела?"}
],
"temperature": 0.7
}
Ответ:
anthropic_messages — Anthropic Messages API¶
Провайдеры: Anthropic (Claude 3 Opus, Sonnet, Haiku; Claude 4).
| Поле | JSONPath |
|---|---|
prompt_path |
messages[*].content |
system_prompt_path |
system |
user_messages_path |
messages[?(@.role=='user')] |
model_path |
model |
response_path |
content[0].text |
Особенность: Системный промпт — отдельное поле system верхнего уровня (не в массиве messages).
Запрос:
{
"model": "claude-sonnet-4-20250514",
"system": "You are a helpful assistant.",
"messages": [
{"role": "user", "content": "Привет!"}
],
"max_tokens": 1024
}
Ответ:
azure_openai_chat — Azure OpenAI Chat Completions¶
Провайдеры: Azure OpenAI Service.
| Поле | JSONPath |
|---|---|
prompt_path |
messages[*].content |
system_prompt_path |
messages[?(@.role=='system')].content |
user_messages_path |
messages[?(@.role=='user')] |
model_path |
model |
response_path |
choices[0].message.content |
Формат идентичен openai_chat_completions. Разница только в URL ({resource}.openai.azure.com) и аутентификации (api-key header вместо Authorization: Bearer).
gigachat_chat — Сбер GigaChat¶
Провайдеры: Сбер GigaChat, GigaChat-Pro, GigaChat-Max.
| Поле | JSONPath |
|---|---|
prompt_path |
messages[*].content |
system_prompt_path |
messages[?(@.role=='system')].content |
user_messages_path |
messages[?(@.role=='user')] |
model_path |
model |
response_path |
choices[0].message.content |
Формат OpenAI-совместимый. Особенность — аутентификация через Sber OAuth2 (client credentials → access token).
Запрос:
{
"model": "GigaChat-Pro",
"messages": [
{"role": "system", "content": "Ты полезный ассистент."},
{"role": "user", "content": "Привет!"}
]
}
yandexgpt — Яндекс YandexGPT¶
Провайдеры: YandexGPT Lite, YandexGPT Pro, YandexGPT Pro 32k.
| Поле | JSONPath |
|---|---|
prompt_path |
messages[*].text |
system_prompt_path |
messages[?(@.role=='system')].text |
user_messages_path |
messages[?(@.role=='user')] |
model_path |
modelUri |
response_path |
result.alternatives[0].message.text |
Особенности:
- Поле
textвместоcontent(нестандартный формат). - Поле
modelUriвместоmodel(формат:gpt://folder_id/model_name/version). - Ответ вложен в
result.alternatives[0].message.text.
Запрос:
{
"modelUri": "gpt://b1g12345abcdef/yandexgpt-lite/latest",
"completionOptions": {
"stream": false,
"temperature": 0.7,
"maxTokens": 2000
},
"messages": [
{"role": "system", "text": "Ты полезный ассистент."},
{"role": "user", "text": "Привет!"}
]
}
Ответ:
{
"result": {
"alternatives": [
{
"message": {"role": "assistant", "text": "Привет! Чем могу помочь?"},
"status": "ALTERNATIVE_STATUS_FINAL"
}
],
"usage": {"inputTextTokens": "10", "completionTokens": "8", "totalTokens": "18"},
"modelVersion": "latest"
}
}
Legacy Completions API¶
openai_completions — OpenAI Legacy Completions¶
Провайдеры: OpenAI (text-davinci-003 и старше). Устаревший API.
| Поле | JSONPath |
|---|---|
prompt_path |
prompt |
model_path |
model |
response_path |
choices[0].text |
Запрос: {"model": "text-davinci-003", "prompt": "Once upon a time"}.
Ответ: {"choices": [{"text": "there was a brave knight..."}]}.
anthropic_completions — Anthropic Legacy Completions¶
Провайдеры: Anthropic (Claude 2). Устаревший API.
| Поле | JSONPath |
|---|---|
prompt_path |
prompt |
model_path |
model |
response_path |
completion |
Запрос: {"model": "claude-2.1", "prompt": "\n\nHuman: Hello\n\nAssistant:"}.
Ответ: {"completion": " Hello! How can I help you?"}.
Прочие LLM API¶
google_palm — Google PaLM API¶
| Поле | JSONPath |
|---|---|
prompt_path |
prompt.text |
model_path |
model |
response_path |
candidates[0].output |
Запрос: {"model": "text-bison-001", "prompt": {"text": "What is AI?"}}.
Ответ: {"candidates": [{"output": "Artificial Intelligence is..."}]}.
cohere_generate — Cohere Generate¶
| Поле | JSONPath |
|---|---|
prompt_path |
prompt |
model_path |
model |
response_path |
generations[0].text |
Запрос: {"model": "command", "prompt": "Write a story"}.
Ответ: {"generations": [{"text": "Once upon a time..."}]}.
huggingface_inference — HuggingFace Inference API¶
| Поле | JSONPath |
|---|---|
prompt_path |
inputs |
model_path |
model |
response_path |
[0].generated_text |
Запрос: {"inputs": "The meaning of life is"}.
Ответ: [{"generated_text": "42, according to the book"}].
custom_simple — Простой кастомный формат¶
| Поле | JSONPath |
|---|---|
prompt_path |
prompt |
model_path |
model |
response_path |
response |
Универсальный preset для LLM с простым форматом {"prompt": "...", "model": "..."}.
Image Generation API¶
flux_bfl — Black Forest Labs FLUX API¶
| Поле | JSONPath |
|---|---|
prompt_path |
prompt |
model_path |
model |
response_path |
images[0].url |
Запрос:
{
"model": "flux-pro",
"prompt": "A beautiful sunset over mountains",
"image_size": {"width": 1024, "height": 768}
}
Ответ: {"images": [{"url": "https://cdn.bfl.ai/..."}]}
flux_openai_images — OpenAI Images API-совместимый¶
Провайдеры: Together AI, fal.ai и другие, реализующие OpenAI Images API.
| Поле | JSONPath |
|---|---|
prompt_path |
prompt |
model_path |
model |
response_path |
data[0].url |
Запрос: {"model": "black-forest-labs/FLUX.1-schnell", "prompt": "A sunset", "n": 1}.
Ответ: {"data": [{"url": "https://..."}]}.
flux_replicate — Replicate API¶
| Поле | JSONPath |
|---|---|
prompt_path |
input.prompt |
model_path |
version |
response_path |
output[0] |
Запрос:
{
"version": "flux-pro",
"input": {
"prompt": "A sunset over mountains",
"width": 1024,
"height": 768
}
}
Ответ: {"output": ["https://replicate.delivery/..."], "status": "succeeded"}
NVIDIA Triton Inference Server¶
triton_inference — Triton (генерация изображений)¶
| Поле | JSONPath |
|---|---|
prompt_path |
inputs[?(@.name=='prompt')].data[0] |
model_path |
(пустой) |
response_path |
outputs[?(@.name=='generated_image')].data[0] |
Запрос:
{
"inputs": [
{"name": "prompt", "shape": [1], "datatype": "BYTES", "data": ["a beautiful sunset"]},
{"name": "num_inference_steps", "shape": [-1], "datatype": "BYTES", "data": ["4"]},
{"name": "guidance_scale", "shape": [-1], "datatype": "BYTES", "data": ["12"]}
]
}
Ответ:
{
"outputs": [
{"name": "generated_image", "datatype": "BYTES", "data": ["base64_encoded_image"]}
]
}
triton_text_generation — Triton (генерация текста)¶
Провайдеры: NVIDIA Triton с vLLM, TensorRT-LLM backends.
| Поле | JSONPath |
|---|---|
prompt_path |
inputs[?(@.name=='prompt')].data[0] |
model_path |
inputs[?(@.name=='model')].data[0] |
response_path |
outputs[?(@.name=='text')].data[0] |
Запрос:
{
"inputs": [
{"name": "prompt", "shape": [1], "datatype": "BYTES", "data": ["Hello, how are you?"]},
{"name": "model", "shape": [1], "datatype": "BYTES", "data": ["llama-2-7b"]}
]
}
Ответ:
Сводная таблица¶
| # | Preset | Категория | prompt_path | system_prompt_path | model_path | response_path |
|---|---|---|---|---|---|---|
| 1 | openai_chat_completions |
Chat | messages[*].content |
messages[?(@.role=='system')].content |
model |
choices[0].message.content |
| 2 | anthropic_messages |
Chat | messages[*].content |
system |
model |
content[0].text |
| 3 | azure_openai_chat |
Chat | messages[*].content |
messages[?(@.role=='system')].content |
model |
choices[0].message.content |
| 4 | gigachat_chat |
Chat | messages[*].content |
messages[?(@.role=='system')].content |
model |
choices[0].message.content |
| 5 | yandexgpt |
Chat | messages[*].text |
messages[?(@.role=='system')].text |
modelUri |
result.alternatives[0].message.text |
| 6 | openai_completions |
Legacy | prompt |
— | model |
choices[0].text |
| 7 | anthropic_completions |
Legacy | prompt |
— | model |
completion |
| 8 | google_palm |
Other | prompt.text |
— | model |
candidates[0].output |
| 9 | cohere_generate |
Other | prompt |
— | model |
generations[0].text |
| 10 | huggingface_inference |
Other | inputs |
— | model |
[0].generated_text |
| 11 | custom_simple |
Other | prompt |
— | model |
response |
| 12 | flux_bfl |
Image | prompt |
— | model |
images[0].url |
| 13 | flux_openai_images |
Image | prompt |
— | model |
data[0].url |
| 14 | flux_replicate |
Image | input.prompt |
— | version |
output[0] |
| 15 | triton_inference |
Triton | inputs[?(@.name=='prompt')].data[0] |
— | — | outputs[?(@.name=='generated_image')].data[0] |
| 16 | triton_text_generation |
Triton | inputs[?(@.name=='prompt')].data[0] |
— | inputs[?(@.name=='model')].data[0] |
outputs[?(@.name=='text')].data[0] |
Кастомный field mapping¶
Если ни один preset не подходит для вашего LLM-провайдера, используйте кастомный field mapping:
curl -s -X POST http://localhost:8000/api/v1/providers \
-H "Content-Type: application/json" \
-d '{
"name": "My Custom LLM",
"match_type": "url",
"match_value": "/custom-llm/*",
"target_base_url": "https://custom-llm.company.com",
"target_path": "/api/generate",
"mapping_preset": null,
"mapping_custom": {
"prompt_path": "$.input.query",
"system_prompt_path": "$.input.context",
"model_path": "$.config.model_name",
"response_path": "$.output.generated_text"
}
}'
Правила:
- Либо
mapping_preset, либоmapping_custom— одно из двух обязательно. prompt_path— единственное обязательное поле вmapping_custom.- Кастомный mapping приоритетнее preset: если указаны оба, кастомные пути перезаписывают одноимённые поля preset.
- JSONPath синтаксис:
$.field,$.array[0].field,$.array[*].field,$.array[?(@.key=='value')].field.
OpenAI-совместимые API
Многие LLM-провайдеры (Mistral, Ollama, vLLM, LiteLLM, OpenRouter, Groq, Fireworks, Together AI) используют OpenAI-совместимый формат. Для них используйте preset openai_chat_completions — кастомный mapping не нужен.