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

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