Перейти к содержанию

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
}

Ответ:

{
  "choices": [
    {"message": {"role": "assistant", "content": "Привет! У меня всё отлично."}}
  ]
}

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
}

Ответ:

{
  "content": [
    {"type": "text", "text": "Привет! Чем могу помочь?"}
  ]
}

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"]}
  ]
}

Ответ:

{
  "outputs": [
    {"name": "text", "datatype": "BYTES", "data": ["I'm doing well, thank you!"]}
  ]
}

Сводная таблица

# 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 не нужен.