AWS Bedrock
Конвертация AWS Bedrock API в Meridian — семейства моделей, маппинг параметров, обработка сообщений, reasoning/thinking, преобразование инструментов и AWS-аутентификация.
Обзор
AWS Bedrock поддерживает несколько семейств моделей (Claude, Nova, Mistral, Llama, Cohere, Titan) со значительными структурными отличиями от формата OpenAI. Meridian выполняет обширные преобразования:
- Определение семейства моделей — автоматическая маршрутизация по идентификатору модели для применения параметров, специфичных для семейства;
- Переименование параметров — например,
max_completion_tokens→maxTokens,stop→stopSequences; - Преобразование reasoning — параметры
reasoningмаппятся в специфичные для модели структуры thinking/reasoning (Anthropic, Nova); - Реструктуризация tools — определения функций конвертируются в формат Bedrock ToolConfig;
- Конвертация сообщений — извлечение system-сообщений, группировка tool-сообщений, адаптация формата изображений (только base64);
- AWS-аутентификация — автоматическая подпись запросов SigV4 с поддержкой credential chain;
- Structured output —
response_formatконвертируется в специальные определения tools; - Service tier и guardrails — поддержка специфичных для Bedrock конфигураций производительности и безопасности.
Поддерживаемые семейства моделей
| Семейство | Chat | Responses | Text | Embeddings | Image Gen | Image Edit | Image Variation |
|---|---|---|---|---|---|---|---|
| Claude (Anthropic) | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
| Nova (Amazon) | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ |
| Mistral | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
| Llama | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Cohere | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ |
| Titan | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ |
| Stability AI | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ❌ |
Поддерживаемые операции
| Операция | Non-Streaming | Streaming | Endpoint |
|---|---|---|---|
| Chat Completions | ✅ | ✅ | converse |
| Responses API | ✅ | ✅ | converse |
| Text Completions | ✅ | ❌ | invoke |
| Embeddings | ✅ | — | invoke |
| Files | ✅ | — | S3 (через SDK) |
| Batch | ✅ | — | batch |
| List Models | ✅ | — | listFoundationModels |
| Image Generation | ✅ | ❌ | invoke |
| Image Edit | ✅ | ❌ | invoke |
| Image Variation | ✅ | ❌ | invoke |
| Count Tokens | ✅ | — | count-tokens |
| Speech (TTS) | ❌ | ❌ | — |
| Transcriptions (STT) | ❌ | ❌ | — |
Неподдерживаемые операции (❌): Speech (TTS) и Transcriptions (STT) не поддерживаются upstream-API AWS Bedrock. Возвращают UnsupportedOperationError.
Ограничения: изображения только в формате base64 / data URI (удалённые URL не поддерживаются). Стриминг для text completion не поддерживается.
Beta-заголовки
Для моделей Claude на Bedrock Meridian валидирует заголовки anthropic-beta и удаляет неподдерживаемые из запроса.
Поддерживаются: computer-use-*, structured-outputs-*, compact-*, context-management-*, interleaved-thinking-*, context-1m-*.
Не поддерживаются: advanced-tool-use-*, mcp-client-*, prompt-caching-scope-*, files-api-*, skills-*, fast-mode-*, redact-thinking-*.
Дефолты можно переопределить на уровне провайдера через вкладку Beta Headers в настройках провайдера или через beta_header_overrides в настройке провайдера. Полная матрица поддержки — на странице Anthropic.
1. Chat Completions
Параметры запроса
Маппинг параметров
| Параметр | Преобразование | Примечания |
|---|---|---|
max_completion_tokens | → inferenceConfig.maxTokens | Обязательное поле в Bedrock |
temperature, top_p | Прямой проброс в inferenceConfig | |
stop | → inferenceConfig.stopSequences | Массив строк |
response_format | → tool для structured output (см. Structured Output) | Создаёт tool bf_so_* |
tools | Схема реструктурируется (см. Tool Conversion) | |
tool_choice | Тип маппится (см. Tool Conversion) | |
reasoning | Конфиг thinking зависит от модели (см. Reasoning / Thinking) | |
user | → metadata.userID (если задан) | Метаданные Bedrock |
service_tier | → serviceModelTier (если задан) | Выбор тарифа производительности |
top_k | Через extra_params (зависит от модели) | Bedrock-специфичный sampling |
Игнорируемые параметры
Следующие параметры тихо игнорируются: frequency_penalty, presence_penalty, logit_bias, logprobs, top_logprobs, seed, parallel_tool_calls.
Extra-параметры
Передаются прямо в теле запроса для специфичных для Bedrock полей:
curl -X POST http://localhost:8080/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0",
"messages": [{"role": "user", "content": "Hello"}],
"guardrailConfig": {
"guardrailIdentifier": "guardrail-id",
"guardrailVersion": "1",
"trace": "enabled"
},
"performanceConfig": {
"latency": "optimized"
}
}'Доступные extra-параметры:
guardrailConfig— конфигурация Bedrock guardrail с полямиguardrailIdentifier,guardrailVersion,trace;performanceConfig— оптимизация производительности сlatency("optimized"или"standard");additionalModelRequestFieldPaths— проброс полей модели, отсутствующих в стандартной схеме;promptVariables— переменные для prompt-шаблонов (при использовании prompt caching);requestMetadata— произвольные метаданные для трекинга запроса.
Cache Control
Prompt caching поддерживается через директивы cache control:
curl -X POST http://localhost:8080/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0",
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": "Этот контекст будет закэширован",
"cache_control": {"type": "ephemeral"}
}
]
}
],
"system": [
{
"type": "text",
"text": "Ты — полезный ассистент",
"cache_control": {"type": "ephemeral"}
}
]
}'Reasoning / Thinking
Документация: см. Reasoning.
Поддержка reasoning/thinking зависит от семейства модели.
Модели Anthropic Claude
Маппинг параметров:
reasoning.effort→thinkingConfig.type = "enabled"(всегда включено при наличии reasoning);reasoning.max_tokens→thinkingConfig.budgetTokens(бюджет токенов на thinking).
Критичные ограничения:
- Минимальный бюджет: 1024 токена; запросы с меньшим значением завершаются с ошибкой;
- Динамический бюджет:
-1автоматически конвертируется в1024.
// Запрос
{"reasoning": {"effort": "high", "max_tokens": 2048}}
// Преобразование Bedrock
{"thinkingConfig": {"type": "enabled", "budgetTokens": 2048}}Модели Amazon Nova
Маппинг параметров:
reasoning.effort→reasoningConfig.thinkingLevel("low"→low,"high"→high);reasoning.max_tokens→ максимум reasoning-токенов (влияет на inference-конфигурацию).
// Запрос
{"reasoning": {"effort": "high", "max_tokens": 10000}}
// Преобразование Bedrock
{"reasoningConfig": {"type": "enabled", "thinkingLevel": "high"}}Конвертация сообщений
Критичные нюансы
- Извлечение system-сообщения: system-сообщения удаляются из массива messages и помещаются в отдельное поле
system; - Группировка tool-сообщений: подряд идущие tool-сообщения сливаются в одно user-сообщение с tool-результатами в content;
- Формат изображений: только base64 / data URI; удалённые URL не поддерживаются Bedrock Converse API;
- Документы: путь конвертации Bedrock сейчас поддерживает форматы PDF, CSV, DOC, DOCX, XLS, XLSX, HTML, TXT, MD.
Поддерживаемые блоки контента
Формат запроса Chat Completions OpenAI-совместим для стандартных блоков (type: "text", type: "image_url", type: "file"). Meridian внутренне конвертирует их в Bedrock Converse-блоки. Bedrock-специфичные расширения (например, отдельный cachePoint) также принимаются при использовании провайдера Bedrock.
| Тип блока | Форма запроса (OpenAI-совместимая) | Обработка Bedrock | Поддержка |
|---|---|---|---|
| Text | {"type":"text","text":"..."} | Конвертируется в Bedrock text | ✅ |
| Image | {"type":"image_url","image_url":{"url":"data:image/png;base64,..."}} | Конвертируется в Bedrock image.source.bytes | ✅ (только base64 / data URI) |
| File | {"type":"file","file":{...}} | Конвертируется в Bedrock document | ✅ |
| Input audio | {"type":"input_audio",...} | Возвращает audio input not supported in Bedrock Converse API | ❌ |
| Standalone cache point | {"cachePoint":{"type":"default"}} (без поля type снаружи) | Конвертируется в маркер Bedrock cachePoint | ✅ (расширение Bedrock) |
Конвертация изображения
- Форма запроса (клиент → Meridian):
type: "image_url"сimage_url.url, содержащим data URI / base64 изображения; - Внутренняя форма Bedrock (Meridian → Bedrock): конвертируется в
image: { format, source: { bytes } }; - URL-изображения: ❌ не поддерживаются — запросы завершатся ошибкой;
- Документы: конвертируются в document-блоки с MIME-типами.
Пример с image-блоком (image_url)
curl -X POST http://localhost:8080/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0",
"messages": [
{
"role": "user",
"content": [
{"type": "text", "text": "Что на этом изображении?"},
{
"type": "image_url",
"image_url": {
"url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA..."
}
}
]
}
]
}'Пример с file-блоком (file → Bedrock document)
curl -X POST http://localhost:8080/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0",
"messages": [
{
"role": "user",
"content": [
{"type": "text", "text": "Суммируй документ."},
{
"type": "file",
"file": {
"file_data": "JVBERi0xLjQKJcfs...",
"filename": "report.pdf",
"file_type": "application/pdf"
}
}
]
}
]
}'file_data — сырой base64-контент (без префикса data: URI, в отличие от image_url). Форматы, поддерживаемые путём конвертации документов Bedrock в Meridian: pdf, txt, md, html, csv, doc, docx, xls, xlsq.
Пример с отдельным cache point (расширение Bedrock)
{
"role": "system",
"content": [
{"type": "text", "text": "Длинный контекст для кэширования"},
{"cachePoint": {"type": "default"}}
]
}Отдельный блок cachePoint — расширение Bedrock (не OpenAI-стандарт); используйте только с провайдером Bedrock.
Замечания о неподдерживаемых блоках
- Блоки
input_audioне поддерживаются Bedrock Converse и возвращают ошибку; - Для документов используйте
file.file_data;file_urlиfile_idне являются документированным путём для chat-content в Bedrock.
Места применения cache control
Cache-директивы поддерживаются на:
- блоках content системного сообщения (всё system-сообщение);
- блоках content user-сообщения (конкретные части);
- определениях tools в tool configuration.
Tool Conversion
Определения tools реструктурируются:
function.name→name(сохраняется);function.parameters→inputSchema(формат Schema);function.strict→ отбрасывается (Bedrock не поддерживает).
Маппинг tool_choice
| OpenAI | Bedrock |
|---|---|
"auto" | auto (по умолчанию) |
"none" | Пропускается (явно не поддерживается) |
"required" | any |
| Конкретный tool | {type: "tool", name: "X"} |
Обработка tool calls
- Meridian → Bedrock: аргументы tool call конвертируются из JSON-объекта в поле
input; - Bedrock → Meridian: результаты
toolUseсtoolUseIdконвертируются обратно в формат Meridian; - Tool results: подряд идущие tool-сообщения сливаются в одно user-сообщение.
Structured Output
Structured output использует специальный tool-based подход:
// Запрос со structured output
{
"response_format": {
"type": "json_schema",
"json_schema": {
"name": "response",
"schema": {
"type": "object",
"properties": {
"name": {"type": "string"},
"age": {"type": "number"}
}
}
}
}
}
// Преобразование Bedrock (внутреннее)
{
"tools": [{
"name": "bf_so_response",
"description": "Structured output tool",
"inputSchema": {
"type": "object",
"properties": {...}
}
}],
"toolChoice": {"type": "tool", "name": "bf_so_response"}
}При обработке ответа input tool use извлекается и возвращается как contentStr.
Конвертация ответа
Маппинг полей
stopReason→finish_reason:endTurn/stopSequence→stop,maxTokens→length,toolUse→tool_calls;usage.inputTokens + usage.cacheReadInputTokens + usage.cacheWriteInputTokens→prompt_tokens(все кеш-счётчики свёрнуты в общий итог);- Разбивка cache-токенов в
prompt_tokens_details:usage.cacheReadInputTokens→prompt_tokens_details.cached_read_tokens;usage.cacheWriteInputTokens→prompt_tokens_details.cached_write_tokens;
usage.outputTokens→completion_tokens;- Блоки
reasoning/thinking→reasoning_detailsс index, type, text и signature; inputtool call (объект) →arguments(JSON-строка).
Ответ structured output
При обнаружении structured output:
- Tool call с именем
bf_so_*рассматривается как structured output; - Объект
inputизвлекается и возвращается какcontentStr; - Удаляется из массива
toolCalls.
Стриминг
Стриминг Chat Completions
Последовательность событий из Bedrock Converse Stream API:
- Начальная role:
contentBlockIndexи информация о role; - Начала content-блоков: блоки
toolUseсtoolUseId,name; - Дельты content-блоков:
- Text delta: инкрементальный текст;
- Tool use delta: накопленные аргументы tool call (JSON);
- Reasoning delta: reasoning-текст и опционально signature;
- Завершение сообщения:
stopReasonи финальные счётчики токенов; - Метрики usage: счётчики токенов, кэш, метрики производительности.
Конвертация stream-событий:
- Каждое stream-событие Bedrock → одна или несколько чанков Meridian;
- Аргументы tool накапливаются по дельтам и эмитятся на завершении блока;
- Reasoning-контент эмитится с signature, если есть.
Стриминг Text Completion
❌ Не поддерживается — AWS Bedrock не поддерживает стриминг для text completion API.
Стриминг Responses API
Стриминг responses использует lifecycle-события, совместимые с OpenAI:
response.created;response.in_progress;content_part.start;content_part.delta;content_part.done;function_call_arguments.delta;function_call_arguments.done;output_item.done.
Особенности:
- Аргументы tool накапливаются по дельтам;
- Индексы content-блоков мапятся на output-индексы;
- Синтетические события эмитятся для text/reasoning контента.
2. Responses API
Responses API использует тот же эндпоинт converse, но конвертирует между форматом OpenAI Responses и форматом Bedrock Messages.
Параметры запроса
Маппинг параметров
| Параметр | Преобразование |
|---|---|
max_output_tokens | Переименование в maxTokens (через inferenceConfig) |
temperature, top_p | Прямой проброс |
instructions | Становится system-сообщением |
tools | Схема реструктурируется (см. Chat Completions) |
tool_choice | Тип маппится (см. Chat Completions) |
reasoning | Маппится в thinking/reasoning config (см. Reasoning / Thinking) |
text | Конвертируется в output_format (Bedrock-специфичный) |
include | Через extra_params (Bedrock-специфичный) |
stop | Через extra_params, переименование в stopSequences |
truncation | Автоматически "auto" для computer-tools |
Extra-параметры
curl -X POST http://localhost:8080/v1/responses \
-H "Content-Type: application/json" \
-d '{
"model": "bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0",
"input": "Hello, how are you?",
"stop": ["###"]
}'Input и Instructions
- Input: строка оборачивается как user-сообщение, массив конвертируется в сообщения;
- Instructions: становится system-сообщением (та же логика извлечения, что и в Chat Completions);
- Cache control: поддерживается на instructions (system) и input-сообщениях.
Конвертация ответа
stopReason→status:endTurn/stopSequence→completed,maxTokens→incomplete;usage.inputTokensагрегируется вinput_tokens(та же семантика, что и в Chat:inputTokens+cacheReadInputTokens+cacheWriteInputTokensсворачиваются вinput_tokens);usage.outputTokens→output_tokens;- Cache-токены:
cacheReadInputTokens→input_tokens_details.cached_read_tokens,cacheWriteInputTokens→input_tokens_details.cached_write_tokens; - Output items:
text→message,toolUse→function_call,thinking→reasoning.
Стриминг
Последовательность событий: response.created → response.in_progress → content_part.start → content_part.delta → content_part.done → output_item.done.
3. Text Completions (Legacy)
Legacy API через эндпоинт invoke. Стриминг не поддерживается. Поддерживаются только модели Claude (Anthropic) и Mistral.
Конвертация запроса:
-
Модели Claude: используется формат Anthropic
/v1/completeс обёрткой prompt:promptавтоматически оборачивается в\n\nHuman: {prompt}\n\nAssistant:;max_tokens→max_tokens_to_sample;temperature,top_p— прямой проброс;top_k,stop— черезextra_params.
-
Модели Mistral: стандартный формат:
max_tokens→max_tokens;temperature,top_p— прямой проброс;stop→stop.
Конвертация ответа:
- Claude:
completion→choices[0].text; - Mistral:
outputs[].text→choices[](поддерживает несколько); stopReason→finish_reason.
4. Embeddings
Поддерживаемые embedding-модели: Titan, Cohere.
Параметры запроса
| Параметр | Преобразование | Примечания |
|---|---|---|
input | Прямой проброс | Текст или массив текстов |
dimensions | ⚠️ Не поддерживается | У Titan фиксированные размерности на модель |
encoding_format | Через extra_params | "base64" или "float" |
Особенности Titan:
- Нет настройки размерности;
- Фиксированный размер вывода на версию модели.
Особенности Cohere:
- Переиспользует конвертацию формата Cohere;
- Маппинг параметров аналогичен стандартному Cohere.
Конвертация ответа
- Titan:
embedding→ один embedding-вектор; - Cohere: переиспользует формат Cohere с массивом
embeddings; usage.inputTokens→usage.prompt_tokens.
5. Image Generation
Поддерживаемые модели генерации изображений: Titan Image Generator v1, Titan Image Generator v2, Nova Canvas v1.
Конвертация запроса
| Параметр (Meridian) | Преобразование (Bedrock) |
|---|---|
prompt | textToImageParams.text |
n | imageGenerationConfig.numberOfImages |
negativePrompt | textToImageParams.negativeText |
seed | imageGenerationConfig.seed |
quality | imageGenerationConfig.quality (см. Маппинг quality) |
style | textToImageParams.style |
size | imageGenerationConfig.width и imageGenerationConfig.height |
Маппинг quality
Параметр quality автоматически маппится в ожидаемый Bedrock формат:
| Входное значение | Значение Bedrock | Примечания |
|---|---|---|
"low" | "standard" | Автомаппинг |
"medium" | "standard" | Автомаппинг |
"high" | "premium" | Автомаппинг |
"default" | "standard" | Пробрасывается (case-insensitive) |
"premium" | "premium" | Пробрасывается (case-insensitive) |
Конвертация ответа
| Параметр (Bedrock) | Преобразование (Meridian) |
|---|---|
images | data.b64_json |
Пример запроса
curl -X POST http://localhost:8080/v1/images/generations \
-H "Content-Type: application/json" \
-d '{
"model": "bedrock/amazon.nova-canvas-v1:0",
"prompt": "Футуристичный городской пейзаж с летающей машиной",
"size": "1024x1024",
"seed": 123,
"negative_prompt": "велосипеды",
"n": 2
}'Модели Stability AI
Поддерживаемые модели генерации: stability.stable-image-core-v1:1, stability.stable-image-ultra-v1:1.
Эти модели используют плоское JSON-тело (не вложенную Bedrock-структуру taskType). Meridian определяет их автоматически — любой ID, содержащий "stability.", конвертируется через ToStabilityAIImageGenerationRequest.
Параметры запроса:
| Параметр | Тип | Обязательный | Примечания |
|---|---|---|---|
prompt | string | ✅ | Описание изображения |
negative_prompt | string | ❌ | Что исключить |
seed | int | ❌ | Seed для воспроизводимости |
aspect_ratio | string | ❌ | Например "16:9", "1:1", "21:9" |
output_format | string | ❌ | "png", "jpeg", "webp" |
curl -X POST http://localhost:8080/v1/images/generations \
-H "Content-Type: application/json" \
-d '{
"model": "bedrock/us.stability.stable-image-ultra-v1:1",
"prompt": "Величественный горный хребет в час заката",
"negative_prompt": "размыто, низкое качество",
"aspect_ratio": "16:9",
"output_format": "png",
"seed": 42
}'6. Image Edit
Запросы используют multipart/form-data, не JSON.
Поддерживаемые модели редактирования изображений: Titan Image Generator v1, Titan Image Generator v2, Nova Canvas v1.
Bedrock поддерживает три типа задач редактирования: INPAINTING, OUTPAINTING и BACKGROUND_REMOVAL. Поле type обязательно.
Параметры запроса:
| Параметр | Тип | Обязательный | Примечания |
|---|---|---|---|
model | string | ✅ | Идентификатор модели (Titan или Nova Canvas) |
type | string | ✅ | Тип редактирования: "inpainting", "outpainting", "background_removal" |
prompt | string | ❌ | Описание правки (обязательно для inpainting/outpainting) |
image[] | binary | ✅ | Изображение(я) для редактирования (используется только первое) |
mask | binary | ❌ | Маска (для inpainting/outpainting) |
n | int | ❌ | Кол-во изображений (1–10, только inpainting/outpainting) |
size | string | ❌ | Размер "WxH" (только inpainting/outpainting) |
quality | string | ❌ | Качество (см. Маппинг quality) |
cfgScale | float | ❌ | CFG scale (через ExtraParams) |
negative_text | string | ❌ | Negative prompt (через ExtraParams) |
mask_prompt | string | ❌ | Mask prompt (через ExtraParams) |
return_mask | bool | ❌ | Вернуть маску в ответе (через ExtraParams) |
outpainting_mode | string | ❌ | Режим outpainting: "DEFAULT" или "PRECISE" |
Конвертация запроса:
- Маппинг task type:
Params.Type→taskType(inpainting/outpainting/background_removal→INPAINTING/OUTPAINTING/BACKGROUND_REMOVAL); другие значения возвращают ошибку"unsupported type for Bedrock"; - Конвертация изображения: первое изображение конвертируется в base64;
- Task-specific параметры:
- INPAINTING:
inPaintingParams.text/image/maskImage/negativeText/maskPrompt/returnMask; - OUTPAINTING:
outPaintingParams.*+outPaintingMode(валидируется к"DEFAULT"или"PRECISE"); - BACKGROUND_REMOVAL:
backgroundRemovalParams.image(других параметров нет);
- INPAINTING:
- Image Generation Config (только INPAINTING и OUTPAINTING):
n,size,quality,cfgScale.
Конвертация ответа:
- Использует ту же структуру, что и Image Generation;
- Включает
images[](base64) и опциональноmaskImage(еслиreturn_mask: true); - При ошибке — поле
error.
Эндпоинт: invoke (тот же, что и для image generation). Стриминг не поддерживается.
Модели Stability AI
Запросы используют multipart/form-data, не JSON.
Stability AI edit-модели определяются автоматически по ID (содержит "stability."). Тип задачи выводится из имени модели по умолчанию, но можно задать type явно — удобно при использовании deployment-алиасов.
Поддерживаемые модели
| Model ID | Задача | Изображения | Prompt |
|---|---|---|---|
stability.stable-image-inpaint-v1:0 | inpaint | 1 + mask | ✅ |
stability.stable-outpaint-v1:0 | outpaint | 1 (опционально mask) | ✅ |
stability.stable-image-search-recolor-v1:0 | recolor | 1 | ✅ |
stability.stable-image-search-replace-v1:0 | search-replace | 1 | ✅ |
stability.stable-image-erase-object-v1:0 | erase-object | 1 + mask | ❌ |
stability.stable-image-remove-background-v1:0 | remove-bg | 1 | ❌ |
stability.stable-image-control-sketch-v1:0 | control-sketch | 1 | ✅ |
stability.stable-image-control-structure-v1:0 | control-structure | 1 | ✅ |
stability.stable-image-style-guide-v1:0 | style-guide | 1 | ✅ |
stability.stable-style-transfer-v1:0 | style-transfer | 2 | ✅ |
stability.stable-creative-upscale-v1:0 | upscale-creative | 1 | ✅ |
stability.stable-conservative-upscale-v1:0 | upscale-conservative | 1 | ✅ |
stability.stable-fast-upscale-v1:0 | upscale-fast | 1 | ❌ |
Общие параметры
| Параметр | Тип | Обязательный | Примечания |
|---|---|---|---|
model | string | ✅ | Stability AI model ID |
image[] | binary | ✅ | Входные изображения; style-transfer требует ровно 2 |
prompt | string | зависит | Обязателен для всех, кроме remove-bg, upscale-fast, erase-object |
negative_prompt | string | ❌ | Не применяется для: remove-bg, upscale-fast, erase-object |
seed | int | ❌ | Не применяется для: remove-bg, upscale-fast |
mask | binary | зависит | Обязательно для: inpaint, erase-object; игнорируется для остальных |
Task-specific extra-параметры
Передаются как top-level поля формы:
| Параметр | Тип | Задачи |
|---|---|---|
output_format | string | Все — "png", "jpeg", "webp" |
style_preset | string | inpaint, outpaint, recolor, search-replace, control-sketch, control-structure, style-guide, upscale-creative |
grow_mask | int | inpaint, recolor, search-replace, erase-object |
left, right, up, down | int | outpaint — расширение в каждую сторону, пиксели |
creativity | float | upscale-creative, upscale-conservative, outpaint |
select_prompt | string | recolor — область для перекраски |
search_prompt | string | search-replace — что найти и заменить |
control_strength | float | control-sketch, control-structure — 0.0–1.0 |
aspect_ratio | string | style-guide — соотношение сторон |
fidelity | float | style-guide — 0.0–1.0 |
style_strength | float | style-transfer — 0.0–1.0 |
composition_fidelity | float | style-transfer — 0.0–1.0 |
change_strength | float | style-transfer — 0.0–1.0 |
Style-transfer: порядок изображений важен. Первое (image[0]) становится init_image (контент для трансформации), второе (image[1]) — style_image (артистический образец). Оба должны быть непустыми.
Значения type для явного выбора задачи
type | Stability AI task |
|---|---|
inpainting или inpaint | inpaint |
outpainting или outpaint | outpaint |
background_removal, remove_background, remove_bg | remove-bg |
erase_object | erase-object |
upscale_fast | upscale-fast |
upscale_creative | upscale-creative |
upscale_conservative | upscale-conservative |
recolor | recolor |
search_replace | search-replace |
control_sketch | control-sketch |
control_structure | control-structure |
style_guide | style-guide |
style_transfer | style-transfer |
Примеры запросов
curl -X POST http://localhost:8080/v1/images/edits \
-F "model=bedrock/us.stability.stable-image-inpaint-v1:0" \
-F "image[]=@photo.png;type=image/png" \
-F "mask=@mask.png;type=image/png" \
-F "prompt=Красивый сад на месте маски" \
-F "negative_prompt=уродливо, размыто" \
-F "output_format=png"curl -X POST http://localhost:8080/v1/images/edits \
-F "model=bedrock/us.stability.stable-style-transfer-v1:0" \
-F "image[]=@content.png;type=image/png" \
-F "image[]=@style.png;type=image/png" \
-F "prompt=Применить артистический стиль к контенту" \
-F "style_strength=0.8" \
-F "composition_fidelity=0.5" \
-F "change_strength=0.4" \
-F "output_format=png"curl -X POST http://localhost:8080/v1/images/edits \
-F "model=bedrock/us.stability.stable-outpaint-v1:0" \
-F "image[]=@photo.png;type=image/png" \
-F "prompt=Естественно расширить сцену" \
-F "left=200" \
-F "right=200" \
-F "output_format=png"curl -X POST http://localhost:8080/v1/images/edits \
-F "model=bedrock/us.stability.stable-image-remove-background-v1:0" \
-F "image[]=@photo.png;type=image/png" \
-F "output_format=png"Prompt не требуется. Установите type=erase_object, чтобы пропустить валидацию на стороне шлюза.
curl -X POST http://localhost:8080/v1/images/edits \
-F "model=bedrock/us.stability.stable-image-erase-object-v1:0" \
-F "image[]=@photo.png;type=image/png" \
-F "mask=@mask.png;type=image/png" \
-F "type=erase_object" \
-F "output_format=png"Prompt не требуется. Установите type=upscale_fast, чтобы пропустить валидацию на стороне шлюза.
curl -X POST http://localhost:8080/v1/images/edits \
-F "model=bedrock/us.stability.stable-fast-upscale-v1:0" \
-F "image[]=@photo.png;type=image/png" \
-F "type=upscale_fast" \
-F "output_format=png"Эндпоинт: invoke. Стриминг не поддерживается.
7. Image Variation
Запросы используют multipart/form-data, не JSON.
Поддерживаемые модели вариаций: Titan Image Generator v1, Titan Image Generator v2, Nova Canvas v1.
Параметры запроса:
| Параметр | Тип | Обязательный | Примечания |
|---|---|---|---|
model | string | ✅ | Идентификатор Titan/Nova Canvas |
image | binary | ✅ | Источник вариаций (множественные — через image[]) |
n | int | ❌ | Кол-во изображений (1–10) |
size | string | ❌ | Размер "WxH" |
quality | string | ❌ | См. Маппинг quality |
cfgScale | float | ❌ | Через ExtraParams |
prompt | string | ❌ | Через ExtraParams |
negativeText | string | ❌ | Через ExtraParams |
similarityStrength | float | ❌ | Через ExtraParams, диапазон 0.2–1.0 |
Конвертация запроса:
- Task type:
taskType="IMAGE_VARIATION"; - Изображения: все конвертируются в base64 и складываются в
imageVariationParams.images[]; - Параметры variations:
prompt,negativeText,similarityStrength(валидируется 0.2–1.0) — вimageVariationParams; - Image Generation Config:
n,size,quality,cfgScale.
Конвертация ответа:
- Та же структура, что и Image Generation;
images[]: массив base64-вариаций;error: сообщение об ошибке (если есть).
Эндпоинт: invoke. Стриминг не поддерживается.
8. Batch API
Форматы запроса: массив requests (CustomID + Params) или input_file_id.
Пагинация: курсорная — afterId, beforeId, limit.
Эндпоинты:
POST /batch— создать batch;GET /batch— список batch'ей;GET /batch/{batch_id}— получить batch;POST /batch/{batch_id}/cancel— отмена.
Ответ: JSONL-формат с {recordId, modelOutput: {...}} или {recordId, error: {...}}.
Маппинг статусов:
| Bedrock | Meridian |
|---|---|
Submitted, Validating | Validating |
InProgress | InProgress |
Completed | Completed |
Failed, PartiallyCompleted | Failed |
Stopping | Cancelling |
Stopped | Cancelled |
Expired | Expired |
Метки времени RFC3339Nano конвертируются в Unix timestamp; поддерживается multi-key retry.
9. Files API
S3-бэкенд для файловых операций. Файлы хранятся в S3-бакетах, интегрированных с Bedrock.
Загрузка: multipart/form-data с обязательным file и опциональным filename.
Маппинг полей:
id(file ID);filename;size_bytes(размер S3-объекта);created_at(Unix timestamp из S3 LastModified);mime_type(выводится из контента или задаётся явно).
Эндпоинты:
POST /v1/files— загрузка;GET /v1/files— список (курсорная пагинация);GET /v1/files/{file_id}— метаданные;DELETE /v1/files/{file_id}— удаление;GET /v1/files/{file_id}/content— скачивание.
Назначение файла — всегда "batch", статус — всегда "processed".
10. List Models
Запрос: GET /v1/models (без тела).
Маппинг полей:
id(имя модели с префиксом deployment, если применимо);display_name→name;created_at(Unix timestamp).
Пагинация: токен-based — NextPageToken, FirstID, LastID.
Фильтрация:
- По региону;
- По маппингу deployment'ов из конфигурации;
- По allowlist моделей (
allowed_models).
Multi-key поддержка: результаты агрегируются по всем ключам, фильтруются allowedModels, если задано.
11. AWS-аутентификация и конфигурация
Meridian подписывает каждый запрос к Bedrock через AWS Signature Version 4 (SigV4). Credentials резолвятся в следующем порядке приоритета; STS AssumeRole может быть наложен поверх любого варианта.
Методы аутентификации
1. Явные credentials
Передаются access_key и secret_key в bedrock_key_config. Опционально session_token для готовых временных credentials.
{
"bedrock_key_config": {
"access_key": "your-aws-access-key",
"secret_key": "your-aws-secret-key",
"session_token": "optional-session-token",
"region": "us-east-1"
}
}2. Default Credential Chain (IAM Role / Instance Profile)
access_key и secret_key остаются пустыми (или опускаются). Meridian вызывает LoadDefaultConfig AWS, который резолвит credentials в следующем порядке:
- Переменные окружения (
AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY,AWS_SESSION_TOKEN); - EKS IRSA (
AWS_WEB_IDENTITY_TOKEN_FILE+AWS_ROLE_ARN); - ECS task role;
- EC2 instance profile (IMDS);
- Default profile из
~/.aws/credentials.
{
"bedrock_key_config": {
"region": "us-east-1"
}
}3. STS AssumeRole
role_arn задаёт IAM-роль для assume перед подписью запросов. AssumeRole требует валидной source identity — работает, когда credentials доступны либо из явных access_key/secret_key, либо из default credential chain. Если credentials недоступны ни оттуда, ни оттуда — AssumeRole упадёт.
{
"bedrock_key_config": {
"role_arn": "arn:aws:iam::123456789012:role/BedrockRole",
"external_id": "optional-external-id",
"session_name": "my-session",
"region": "us-east-1"
}
}| Поле | Обязательное | По умолчанию | Примечания |
|---|---|---|---|
role_arn | Да (для STS) | — | IAM role ARN для assume |
external_id | Нет | — | Если trust policy роли требует |
session_name | Нет | meridian-session | Идентификатор сессии в CloudTrail |
Setup и конфигурация
Как использовать ARN и Application Inference Profiles
При использовании AWS Bedrock inference profiles или application inference profiles конфигурацию надо разделять корректно, чтобы избежать UnknownOperationException:
| Поле | Назначение |
|---|---|
arn | Префикс ARN (всё до финального /resource-id). Нужен для формирования URL при использовании inference profile. |
deployments | Маппинг логических имён моделей в model ID или resource ID inference profile, но не в полный ARN. |
Не размещайте полный ARN в deployments. Resource ID (например, abc12xyz) идёт в deployments; префикс ARN — в отдельное поле arn. Полный ARN в deployments приводит к малформатным URL и UnknownOperationException.
Application inference profiles — в deployments используется resource ID (короткий буквенно-цифровой суффикс):
{
"bedrock_key_config": {
"access_key": "your-aws-access-key",
"secret_key": "your-aws-secret-key",
"session_token": "optional-session-token",
"region": "eu-west-1",
"arn": "arn:aws:bedrock:eu-west-1:123456789012:application-inference-profile",
"deployments": {
"claude-opus-4-6": "ghi56rst",
"claude-sonnet-4-5": "jkl78mno"
}
}
}Cross-region inference profiles — в deployments используется идентификатор модели (например, us.anthropic.claude-3-5-sonnet-v1:0):
{
"bedrock_key_config": {
"access_key": "your-aws-access-key",
"secret_key": "your-aws-secret-key",
"session_token": "optional-session-token",
"region": "us-east-1",
"arn": "arn:aws:bedrock:us-east-1:123456789012:inference-profile",
"deployments": {
"claude-sonnet": "us.anthropic.claude-3-5-sonnet-v1:0"
}
}
}Подробная инструкция по настройке аутентификации AWS Bedrock (credentials, IAM-роли, регионы, deployments) — на странице Настройка провайдеров.
Эндпоинты
- Runtime API:
bedrock-runtime.{region}.amazonaws.com/model/{path}; - Control Plane:
bedrock.{region}.amazonaws.com(list models); - Batch API: через bedrock-runtime.
12. Обработка ошибок
Маппинг HTTP-статусов:
| Статус | Тип ошибки Meridian | Примечания |
|---|---|---|
| 400 | invalid_request_error | Некорректные параметры |
| 401 | authentication_error | Невалидные/просроченные credentials |
| 403 | permission_denied_error | Нет доступа к модели/ресурсу |
| 404 | not_found_error | Модель или ресурс не найдены |
| 429 | rate_limit_error | Превышен лимит |
| 500 | api_error | Серверная ошибка |
| 529 | overloaded_error | Перегрузка сервиса |
Особые случаи:
- Отмена контекста →
RequestCancelled; - Тайм-аут запроса →
ErrProviderRequestTimedOut; - Ошибки в стриме → отправляются через канал с маркером конца стрима;
- Десериализация ответа →
ErrProviderResponseUnmarshal.