mcpField
A
amazon-nova-canvas

amazon-nova-canvas

github.com/calesthio创意与媒体219100 次安装15 周前更新
代码仓库

关于 amazon-nova-canvas

面向使用 Amazon Bedrock 的图像生成流程的技能,介绍 Nova Canvas 的请求类型、输入规范和调用方式。它同时指出该模型已进入 Legacy 阶段,要求在依赖它前核实账户资格、区域和生命周期。

主要功能

  1. 01支持多种图像生成与编辑任务
  2. 02列明请求字段和输入约束
  3. 03介绍图像尺寸与格式校验
  4. 04说明 Bedrock InvokeModel 调用
  5. 05强调 Legacy 生命周期核验

适用场景

  1. 01通过文本生成图像
  2. 02依据参考图生成变体
  3. 03移除背景或编辑图像区域
  4. 04为现有 Nova Canvas 工作负载规划调用

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/calesthio/generative-media-skills --skill amazon-nova-canvas

安装后在 Claude Code 中输入/amazon-nova-canvas确认已加载。

附带文件EVAL.md

详细介绍

Amazon Nova Canvas

基于原生 Amazon Bedrock InvokeModel API 构建。每次推理都应视为付费的同步图像生成操作,并保持返回的字节不变。

从生命周期关卡开始

截至 2026-07-09,经核实,AWS 在其支持的区域中将 amazon.nova-canvas-v1:0 列为 Legacy,并给出了 2026-09-30 的生命周期结束日期。不要将其作为新的生产依赖。新客户无法使用 Legacy 模型;现有客户在 15 天不活跃后可能失去访问权限。在生命周期结束日或之后不久,除非客户与提供商有书面记录的私人安排,否则请求将失败。利益相关方的认可不会延长服务可用时间。

AWS 还禁止在基础模型进入 Legacy 后创建新的微调任务和新的 Provisioned Throughput 端点。若提供公开的扩展访问权限,提供商可能会设定更高的价格。符合条件的现有客户若要继续使用,必须先:

  1. 在目标区域中查询 GetFoundationModel 或 ListFoundationModels。
  2. 确认账户仍符合资格且处于活动状态,核实当前费率,并且仅在生命周期结束前,或在允许付费推理的书面记录私人安排下,另行授权进行低成本试运行。
  3. 重新查看 Nova Canvas 模型页面,确认生命周期、端点、区域和后续型号信息。
  4. 不要猜测替代模型 ID。记录明确的迁移负责人和切换日期。

当前生产事实(已于 2026-07-09 核实):

项目值
基础模型 IDamazon.nova-canvas-v1:0
运行时bedrock-runtime
API原生同步 InvokeModel;不是 Converse、Responses、Chat Completions 或 Bedrock Mantle
推理路由仅限区域内;不支持地理或全球推理配置文件
基础模型服务层级仅 Standard
基础模型预置吞吐量不支持
区域内可用性us-east-1、eu-west-1、ap-northeast-1
提示词语言英语
输入 / 输出文本和图像 / 图像
生命周期在目前所有支持的区域均为 Legacy;生命周期结束日期为 2026-09-30

绝不要在未告知的情况下将图像或提示词移至其他区域。区域选择属于数据驻留决策。

建立访问权限,但不要嵌入密钥

优先使用 AWS SDK 凭证提供程序链和短期角色凭证。在 AWS 计算环境中,附加遵循最小权限原则的执行角色。在本地开发时,使用 IAM Identity Center、aws login 或角色代入配置文件。不要将访问密钥或 Bedrock API 密钥放入源代码、命令历史记录、清单、提示词或日志中。

Bedrock 还支持通过 AWS_BEARER_TOKEN_BEDROCK 使用服务专用承载令牌 API 密钥。长期 Bedrock API 密钥与 IAM 用户绑定;仅在组织的密钥政策允许时使用,并将其存储在密钥管理器中且定期轮换。当前 AWS SDK 能识别此环境变量。请参阅 Bedrock API 密钥身份验证和 AWS 凭证提供程序链。

仅针对实际使用的模型和区域授予 bedrock:InvokeModel 权限。例如:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "InvokeNovaCanvasOnly",
      "Effect": "Allow",
      "Action": "bedrock:InvokeModel",
      "Resource": [
        "arn:aws:bedrock:us-east-1::foundation-model/amazon.nova-canvas-v1:0",
        "arn:aws:bedrock:eu-west-1::foundation-model/amazon.nova-canvas-v1:0",
        "arn:aws:bedrock:ap-northeast-1::foundation-model/amazon.nova-canvas-v1:0"
      ]
    }
  ]
}

尽可能将此列表缩小到一个区域。模型发现、定制、S3、KMS、日志记录和水印检测操作需要单独的权限;不要预先扩大推理角色的权限。

选择官方任务

仅使用当前请求/响应架构中的任务类型:

目标taskType参数对象关键输入
文生图TEXT_IMAGEtextToImageParamstext;可选 negativeText、style
布局/构图条件控制TEXT_IMAGEtextToImageParams添加 conditionImage,可选 controlMode、controlStrength
调色板引导COLOR_GUIDED_GENERATIONcolorGuidedGenerationParamscolors、text;可选 referenceImage、negativeText
参考图变化IMAGE_VARIATIONimageVariationParamsimages;text、negativeText、similarityStrength 为可选项或存在歧义
替换/移除某个区域INPAINTINGinPaintingParamsimage,且必须且只能指定 maskPrompt/maskImage 之一;可选生成文本
扩展/替换区域外的内容OUTPAINTINGoutPaintingParamsimage,且必须且只能指定一种遮罩;可选 outPaintingMode、生成文本
抠出前景BACKGROUND_REMOVALbackgroundRemovalParams仅 image
转换产品/服装VIRTUAL_TRY_ONvirtualTryOnParamssourceImage、referenceImage,以及一种遮罩模式

不要臆造超分辨率、图生视频、异步任务、流式处理、除文档所述两种控制模式之外的 ControlNet 名称、任意风格 ID,或兼容 OpenAI 的路由。

主体一致性不是推理时的任务类型。虽然 Canvas 过去支持微调,但 AWS 现已禁止新建微调任务,因为该基础模型已进入 Legacy 阶段。只有在严格遵循文档所述生命周期规则的情况下,才评估在进入 Legacy 阶段之前创建的自定义 Canvas 模型;否则,应选择并验证一个 Active 替代方案,不要臆造后继 ID。

精确应用通用架构

除 BACKGROUND_REMOVAL 外,所有任务的 imageGenerationConfig 都是可选的:

{
  "width": 1024,
  "height": 1024,
  "quality": "standard",
  "cfgScale": 6.5,
  "seed": 12,
  "numberOfImages": 1
}
  • quality:standard(默认值)或 premium。
  • cfgScale:1.1–10(含边界值);默认值为 6.5。建议从 4–7 的范围开始。
  • numberOfImages:1–5;默认值为 1。
  • seed:0–2,147,483,646;默认值为 12。在实验和清单中固定该值。种子有助于比较结果,但不保证服务/模型更新后输出的字节完全相同。
  • width 和 height:默认值为 1024。对于 INPAINTING、OUTPAINTING 和 VIRTUAL_TRY_ON,省略两者;这些任务的输出尺寸遵循编辑输入。
  • 对于 BACKGROUND_REMOVAL,省略整个配置对象。

对于生成尺寸,要求每边为 320–4096(含边界值),且可被 16 整除;宽高比介于 1:4 到 4:1 之间,并且不超过文档规定的像素上限。边界值可参考 AWS 发布的支持分辨率示例或通过金丝雀测试验证;AWS 页面对于是否接受恰好 4,194,304 像素存在冲突。

输入图像必须是经过 base64 编码的 PNG 或 JPEG,采用 8 位 RGB。PNG 可以包含 alpha 通道,但输入像素不能透明或半透明。输入尺寸须遵循边长、宽高比和像素规则,但边长无需能被 16 整除。编码前请在本地验证。

特定任务的负载

将每个 <BASE64_...> 占位符替换为 base64 图像字节,而不是数据 URL。

带可选条件的文本生成图像:

{
  "taskType": "TEXT_IMAGE",
  "textToImageParams": {
    "text": "Editorial product photograph of a ceramic teapot on pale oak, soft window light, three-quarter view",
    "negativeText": "text, watermark, duplicate objects, distorted handle",
    "style": "PHOTOREALISM",
    "conditionImage": "<BASE64_PNG_OR_JPEG>",
    "controlMode": "CANNY_EDGE",
    "controlStrength": 0.7
  },
  "imageGenerationConfig": {
    "width": 1024,
    "height": 1024,
    "quality": "standard",
    "cfgScale": 6.5,
    "seed": 24816,
    "numberOfImages": 1
  }
}

纯文本生成图像时,省略三个条件字段。controlMode 为 CANNY_EDGE(默认值)或 SEGMENTATION;controlStrength 范围为 0–1,默认值为 0.7。文档列出的八种 style 值如下:

3D_ANIMATED_FAMILY_FILM、DESIGN_SKETCH、FLAT_VECTOR_ILLUSTRATION、GRAPHIC_NOVEL_ILLUSTRATION、MAXIMALISM、MIDCENTURY_RETRO、PHOTOREALISM、SOFT_DIGITAL_PAINTING。

颜色引导生成:

{
  "taskType": "COLOR_GUIDED_GENERATION",
  "colorGuidedGenerationParams": {
    "colors": ["#16324F", "#E8C547", "#F7F4EA"],
    "text": "Flat editorial illustration of a harbor market at sunrise",
    "negativeText": "gradients, text, logo"
  },
  "imageGenerationConfig": {
    "width": 1536,
    "height": 1024,
    "quality": "standard",
    "cfgScale": 6.5,
    "seed": 7301,
    "numberOfImages": 1
  }
}

提供 1–10 个 #RRGGBB 值。可选的 referenceImage 会与这些颜色相互影响,并贡献自身的颜色。

图像变化:

{
  "taskType": "IMAGE_VARIATION",
  "imageVariationParams": {
    "images": ["<BASE64_REFERENCE_1>", "<BASE64_REFERENCE_2>"],
    "similarityStrength": 0.7,
    "text": "Studio product photograph, centered composition",
    "negativeText": "text, extra products"
  },
  "imageGenerationConfig": {
    "width": 1024,
    "height": 1024,
    "quality": "standard",
    "cfgScale": 6.5,
    "seed": 901,
    "numberOfImages": 1
  }
}

提供 1–5 张图像。similarityStrength 范围为 0.2–1.0;值越低,允许的变化越大。AWS 的概览称 text 为可选项,而详细架构则将其标记为必填,并包含与省略无关的说明。在经过授权的金丝雀测试于确切区域确认省略行为之前,请在生产环境中提供非空的 text。

图像修补:

{
  "taskType": "INPAINTING",
  "inPaintingParams": {
    "image": "<BASE64_SOURCE>",
    "maskImage": "<BASE64_MASK>",
    "text": "A small matte-black table lamp",
    "negativeText": "cord, text"
  },
  "imageGenerationConfig": {
    "quality": "standard",
    "cfgScale": 6.5,
    "seed": 41,
    "numberOfImages": 1
  }
}

使用 maskImage 或 maskPrompt,不能同时使用两者。对于图像修补蒙版,纯黑像素会改变,纯白像素受保护。虽然 AWS 将 text 标记为必填,但同一页面也称省略该字段会移除蒙版对象并填充背景;替换对象时请提供 text,只有在移除对象时才使用经过测试的省略方式。

图像扩展:

{
  "taskType": "OUTPAINTING",
  "outPaintingParams": {
    "image": "<BASE64_SOURCE>",
    "maskPrompt": "ceramic teapot",
    "outPaintingMode": "PRECISE",
    "text": "A ceramic teapot on a breakfast table in a bright Scandinavian kitchen",
    "negativeText": "text, duplicate teapot"
  },
  "imageGenerationConfig": {
    "quality": "standard",
    "cfgScale": 6.5,
    "seed": 42,
    "numberOfImages": 1
  }
}

DEFAULT 会在边界处进行融合,但背景变化较大时可能出现光晕;PRECISE 会更严格地遵循边界。使用显式图像扩展蒙版时,详细输入指南称白色像素会改变。AWS 在其他位置的架构说明中对黑白像素的描述前后不一致,因此请将小型视觉测试素材纳入集成测试,并拒绝使用极性未记录的蒙版。

背景移除:

{
  "taskType": "BACKGROUND_REMOVAL",
  "backgroundRemovalParams": {"image": "<BASE64_SOURCE>"}
}

预期输出为一张带有 8 位透明度的 PNG。请确认解码后的图像包含 alpha 通道;不要添加 imageGenerationConfig。

虚拟试穿:

{
  "taskType": "VIRTUAL_TRY_ON",
  "virtualTryOnParams": {
    "sourceImage": "<BASE64_PERSON_OR_SCENE>",
    "referenceImage": "<BASE64_PRODUCT>",
    "maskType": "GARMENT",
    "garmentBasedMask": {
      "maskShape": "BOUNDING_BOX",
      "garmentClass": "UPPER_BODY",
      "garmentStyling": {"outerLayerStyle": "OPEN"}
    },
    "maskExclusions": {
      "preserveBodyPose": "ON",
      "preserveHands": "ON",
      "preserveFace": "ON"
    },
    "mergeStyle": "BALANCED",
    "returnMask": true
  },
  "imageGenerationConfig": {
    "quality": "standard",
    "cfgScale": 6.5,
    "seed": 43,
    "numberOfImages": 1
  }
}

虚拟试穿不支持 text 或 negativeText。恰好选择一个蒙版分支:

  • IMAGE + imageBasedMask.maskImage。
  • GARMENT + garmentBasedMask.garmentClass;仅使用有文档说明的服装类别和适用的造型提示。
  • PROMPT + promptBasedMask.maskPrompt;当替换对象与原始轮廓不同时,建议使用 BOUNDING_BOX。

选择 BALANCED 以保留蒙版以外的像素;选择 SEAMLESS 以减少接缝,同时允许所有像素略微偏移;或选择 DETAILED 以呈现精细的徽标/文本,但可能出现明显接缝。不要将结果描述为尺寸或合身度准确;AWS 明确说明无法保证合身度的准确性。

将提示词写成图像说明

用简洁的英文说明主体、动作、场景、构图、相机/视角、光线、配色和媒介。将不需要的概念作为名词或短语填入 negativeText;两个字段中都避免使用 no、not 和 without。不要用“获奖作品”“4K”或“最佳品质”等说法凑字数。

将简短的场景文本用双引号括起来,然后手动检查。Nova Canvas 无法可靠地生成连贯的字体排版。请在下游使用确定性图形工具合成准确的法律文案、价格、徽标和 UI 文本。

正向和负向字段的长度都应在 1–1024 个字符之间。2025 年的服务卡说明两个字段合计上限为 1,024 个字符,而当前 API 页面称每个字段上限为 1,024 个字符。除非特定区域的金丝雀测试证明情况并非如此,否则请采用较保守的合计上限。

使用有界且保留来源信息的 Python 调用

安装 boto3 和 Pillow,在脚本外配置凭证,并仅在获得付费推理的批准后运行。此示例会发起一次文本生成图像请求、验证响应、以原子方式写入原始 PNG/JPEG 字节,并创建不含机密信息的清单。

from __future__ import annotations

import argparse
import base64
import binascii
import hashlib
import io
import json
import os
import sys
import tempfile
from datetime import datetime, timezone
from pathlib import Path

import boto3
from botocore.config import Config
from botocore.exceptions import BotoCoreError, ClientError
from PIL import Image, UnidentifiedImageError

MODEL_ID = "amazon.nova-canvas-v1:0"
ALLOWED_REGIONS = {"us-east-1", "eu-west-1", "ap-northeast-1"}
MAX_RESPONSE_BYTES = 25_000_000
MAX_REQUEST_BYTES = 25_000_000
MAX_DECODED_IMAGE_BYTES = 20_000_000
Image.MAX_IMAGE_PIXELS = 20_000_000


def atomic_write(path: Path, data: bytes) -> None:
    path.parent.mkdir(parents=True, exist_ok=True)
    temp_name = None
    try:
        with tempfile.NamedTemporaryFile(dir=path.parent, delete=False) as handle:
            temp_name = handle.name
            handle.write(data)
            handle.flush()
            os.fsync(handle.fileno())
        os.replace(temp_name, path)
    finally:
        if temp_name and os.path.exists(temp_name):
            os.unlink(temp_name)


def validate_dimensions(width: int, height: int) -> None:
    if not (320 <= width <= 4096 and 320 <= height <= 4096):
        raise ValueError("Each side must be between 320 and 4096 pixels")
    if width % 16 or height % 16:
        raise ValueError("Each generation dimension must be divisible by 16")
    if max(width / height, height / width) > 4:
        raise ValueError("Aspect ratio must be between 1:4 and 4:1")
    # Conservative because AWS pages disagree at the exact 4,194,304 boundary.
    if width * height > 4_194_304:
        raise ValueError("Pixel count exceeds the documented Canvas limit")


def decode_and_inspect(encoded: str) -> tuple[bytes, str, tuple[int, int]]:
    try:
        raw = base64.b64decode(encoded, validate=True)
    except (binascii.Error, ValueError) as exc:
        raise ValueError("Response image is not strict base64") from exc
    if not raw or len(raw) > MAX_DECODED_IMAGE_BYTES:
        raise ValueError("Decoded image is empty or exceeds the local safety cap")
    try:
        with Image.open(io.BytesIO(raw)) as probe:
            fmt = probe.format
            size = probe.size
            probe.verify()
        with Image.open(io.BytesIO(raw)) as probe:
            probe.load()
    except (UnidentifiedImageError, OSError, Image.DecompressionBombError) as exc:
        raise ValueError("Decoded bytes are not a valid bounded image") from exc
    if fmt not in {"PNG", "JPEG"}:
        raise ValueError(f"Unexpected response image format: {fmt}")
    if size[0] * size[1] > 4_194_304:
        raise ValueError(f"Unexpected response dimensions: {size}")
    return raw, fmt.lower().replace("jpeg", "jpg"), size


def main() -> int:
    parser = argparse.ArgumentParser()
    parser.add_argument("prompt")
    parser.add_argument("--negative", default="text, watermark, distorted anatomy")
    parser.add_argument("--region", default=os.getenv("AWS_REGION", "us-east-1"))
    parser.add_argument("--width", type=int, default=1024)
    parser.add_argument("--height", type=int, default=1024)
    parser.add_argument("--seed", type=int, default=12)
    parser.add_argument("--quality", choices=("standard", "premium"), default="standard")
    parser.add_argument("--output", type=Path, default=Path("nova-canvas-output"))
    parser.add_argument("--store-prompt", action="store_true")
    args = parser.parse_args()

    if args.region not in ALLOWED_REGIONS:
        raise ValueError("Nova Canvas is not documented for that In-Region endpoint")
    validate_dimensions(args.width, args.height)
    if not (0 <= args.seed <= 2_147_483_646):
        raise ValueError("Seed is outside the documented range")
    if not (1 <= len(args.prompt) <= 1024 and 1 <= len(args.negative) <= 1024):
        raise ValueError("Prompt fields must each contain 1-1024 characters")
    if len(args.prompt) + len(args.negative) > 1024:
        raise ValueError("Conservative combined prompt cap exceeded")

    payload = {
        "taskType": "TEXT_IMAGE",
        "textToImageParams": {
            "text": args.prompt,
            "negativeText": args.negative,
        },
        "imageGenerationConfig": {
            "width": args.width,
            "height": args.height,
            "quality": args.quality,
            "cfgScale": 6.5,
            "seed": args.seed,
            "numberOfImages": 1,
        },
    }
    request_body = json.dumps(payload, separators=(",", ":")).encode("utf-8")
    if len(request_body) > MAX_REQUEST_BYTES:
        raise ValueError("Serialized request exceeds the InvokeModel body limit")

    # Default to one paid attempt because InvokeModel has no client idempotency token.
    # Enable more attempts only behind an explicit duplicate-spend policy.
    client = boto3.client(
        "bedrock-runtime",
        region_name=args.region,
        config=Config(
            connect_timeout=10,
            read_timeout=300,
            retries={"mode": "standard", "total_max_attempts": 1},
        ),
    )

    try:
        response = client.invoke_model(
            modelId=MODEL_ID,
            contentType="application/json",
            accept="application/json",
            body=request_body,
        )
        body = response["body"].read(MAX_RESPONSE_BYTES + 1)
        if len(body) > MAX_RESPONSE_BYTES:
            raise ValueError("Response exceeds the InvokeModel API body limit")
        document = json.loads(body)
    except ClientError as exc:
        meta = exc.response.get("ResponseMetadata", {})
        error = exc.response.get("Error", {})
        print(
            f"Bedrock error code={error.get('Code')} status={meta.get('HTTPStatusCode')} "
            f"request_id={meta.get('RequestId')}",
            file=sys.stderr,
        )
        return 2
    except (BotoCoreError, json.JSONDecodeError, ValueError) as exc:
        print(f"Invocation/response failure: {type(exc).__name__}: {exc}", file=sys.stderr)
        return 3

    images = document.get("images")
    moderation_error = document.get("error")
    if not isinstance(images, list) or not images:
        print(f"No releasable image returned; moderation={moderation_error!r}", file=sys.stderr)
        return 4
    if len(images) != 1:
        print(f"Unexpected returned image count: {len(images)}", file=sys.stderr)
        return 4

    raw, extension, size = decode_and_inspect(images[0])
    output_path = args.output.with_suffix(f".{extension}")
    atomic_write(output_path, raw)  # Keep C2PA/watermark-bearing bytes unchanged.

    response_meta = response.get("ResponseMetadata", {})
    manifest = {
        "created_at": datetime.now(timezone.utc).isoformat(),
        "model_id": MODEL_ID,
        "region": args.region,
        "task_type": payload["taskType"],
        "config": payload["imageGenerationConfig"],
        "prompt_sha256": hashlib.sha256(args.prompt.encode()).hexdigest(),
        "negative_sha256": hashlib.sha256(args.negative.encode()).hexdigest(),
        "prompt": args.prompt if args.store_prompt else None,
        "negative_text": args.negative if args.store_prompt else None,
        "aws_request_id": response_meta.get("RequestId"),
        "moderation_notice": moderation_error,
        "output_file": output_path.name,
        "output_format": extension,
        "output_dimensions": list(size),
        "output_sha256": hashlib.sha256(raw).hexdigest(),
    }
    atomic_write(
        output_path.with_suffix(output_path.suffix + ".manifest.json"),
        json.dumps(manifest, indent=2, sort_keys=True).encode(),
    )
    print(output_path)
    return 0


if __name__ == "__main__":
    raise SystemExit(main())

不要仅为验证而重新打开并保存返回的图像;常见图像库可能会剥除 C2PA 元数据。请先对原始字节进行哈希并存档。如果必须进行下游转换,请保留原始文件、记录衍生关系,并按照适用的 AWS 条款保留来源信息。

谨慎处理审核、服务错误和重试

Canvas 有两种错误渠道:

  • 请求验证失败或文本/图像输入不安全:HTTP 400 ValidationException。请勿原样重试。区分普通架构错误和 Canvas 内容过滤器消息,但不要尝试规避过滤器。
  • 生成的输出不安全:HTTP 200 可能返回少于请求数量的 images,并附带说明部分或全部图像已被拦截的 error 字符串。应将数量不符和 error 视为审核结果,而非传输成功。

InvokeModel API 还记录了 AccessDeniedException(403)、ResourceNotFoundException(404)、ModelTimeoutException(408)、ModelErrorException(424)、ThrottlingException/ModelNotReadyException(429)、InternalServerException(500)和 ServiceUnavailableException(503)。

对 429 和 503 使用带抖动的指数退避,设置较小的总尝试次数上限,并将并发数限制在账户配额以下。请勿原样重试 400、403 或 404。连接重置或超时的结果并不明确:服务可能已完成生成并收取了图像费用,而 InvokeModel 没有客户端幂等令牌。请按明确的重复费用策略升级处理或重试。排查时保持相同的种子/配置,但不要假设这样能避免再次收费。

AWS 建议将 read_timeout 设置为至少 300 秒;对于 Canvas,尤其是高品质、高分辨率或多图生成,更应如此。连接超时应明显更短。

验证生产输出,而不只是 HTTP 状态

对于每张返回的图像:

  1. 要求 JSON 正文大小有界,并严格验证 base64。
  2. 解码为大小有界的字节,并验证实际图像格式和尺寸。
  3. 要求可发布图像数量符合预期;即使 HTTP 为 200,也要检查 error。
  4. 对于背景移除,要求输出为带有有效透明度的 PNG,检查主体边缘,并测试在浅色、深色和棋盘格背景上的合成效果。
  5. 对于编辑,在所选模式承诺保留内容的区域逐像素比较;检查接缝、光晕、主体身份、手部/面部、产品标记和几何形状。
  6. 使用适用于具体用例的评估标准,验证提示词遵循情况、物体数量、相机/视角、调色板、解剖结构、事实/产品声明、场景文字、受保护特征和违禁内容。
  7. 将面向公众、商业用途、涉及肖像、影响重大或受监管的内容交由合格的人工审核员审查。
  8. 保留原始字节、请求 ID、模型 ID、Region、任务、配置、种子、哈希值、审核结果、审核决定以及父级/衍生关系。
  9. 按照不同种子、任务类型、人口群体、边缘案例和已知故障维护固定回归集;模型/服务更新后重新测试。

不要声称水印检查成功就能证明作者身份、真实性、同意或权利。修改过的图像可能会降低水印检测准确率。

调用前控制成本和配额

AWS Canvas 按生成的图像数量计费,具体价格取决于分辨率档位和质量。Bedrock 定价页面是动态页面;在估算或运行任务前,应立即重新查看该页面和账户的实际 Legacy 访问权限账单。AWS 的生命周期政策指出,公开的扩展访问可能采用由提供商设定的较高价格,因此下方静态表格不能作为 Legacy 账户当前费用的依据。经核实的快照日期:2026-07-09:

输出档位标准高级
不超过 1024×1024$0.04/张图像$0.06/张图像
不超过 2048×2048$0.06/张图像$0.08/张图像

估算方式:requested_images × unit_price × attempts,然后加上存储、传输、日志记录、审核、衍生内容处理以及任何自定义模型费用。内容审核、失败和重试都可能影响计费总额;请使用 AWS Cost Explorer/Budgets 和实际账单数据,不要假设只有已保存的图像才会收费。批量任务开始前,必须设定图像数量、尝试次数、并发数和支出的硬性上限。

Bedrock 配额表目前列出的配额为:每个受支持区域每分钟 100 个按需 Nova Canvas 请求,并标注为不可调整。AWS 指出,账户配额可能有所不同。请查询 Service Quotas,并留意账户/区域的实际限流情况;按较小的数值进行速率限制。一次请求生成 5 张图像会消耗 1 个请求,但可能产生 5 次图像生成费用,且耗时更长。

基础版 Nova Canvas 不支持预置吞吐量。请勿为此 Legacy 模型创建新的微调任务或新的 Provisioned Throughput 端点。根据 AWS 的生命周期规则,在 Legacy 之前创建的自定义 Canvas 模型可能符合继续使用现有部署或新建按需自定义部署的条件;请核实具体资源和配置,不要根据历史微调文档进行概括。

保护隐私、权利、安全和来源信息

  • 确保已获得每个提示词、源素材、参考素材、蒙版、徽标、服装/产品图片和人物肖像的使用权。对真人进行操纵、生物特征处理和创建数字替身时,应取得适当同意。虚拟试穿不代表可以随意修改人物图像。
  • 不得将输出用于适用法律或 AWS Responsible AI Policy 禁止的做法。切勿尝试绕过 Canvas 不可配置的安全过滤器。
  • 将输出视为概率性草稿。它们可能会歪曲产品、幻觉出不可见的侧面、扭曲人体结构、引入偏见并生成错误文本。不得将其用作证据或作为重大决策的唯一依据。
  • 除非获批的数据分类、区域、保留期限、访问、加密和事件响应控制措施允许,否则不要在提示词和参考素材中包含敏感数据。应停用或保护模型调用日志;若启用,这些日志可能会将完整请求/响应复制到客户控制的日志或 S3。
  • 当前的 Canvas service card 说明,Bedrock 不会使用 Canvas 输入或输出训练 Bedrock 模型,也不会在客户之间或与第三方模型提供商共享这些内容。AWS 较新的滥用检测文档说明,默认情况下零数据保留,但保留了特定模型例外的可能性。处理敏感数据前,请重新核查这两项内容,并记录适用的合同条款。
  • 不要承诺所有权或不侵权。请与法律顾问一起核查当前的 AWS 协议、服务条款、适用许可和当地法律。服务卡说明,对于正式发布的 Nova 输出,IP 赔偿受 AWS 服务条款中的条件约束;这不能替代权利清查。
  • Canvas 会为生成的图像添加不可见水印和包含模型/平台/任务来源信息的 C2PA Content Credentials。请保留这些信息。当前 AWS 服务条款禁止移除或修改生成内容的来源数据。
  • 除非元数据已被移除,否则可使用 Content Credentials Verify 检查 Content Credentials。目前,Canvas 的 AWS 水印检测仍为预览版,仅在 us-east-1 和 us-west-2 提供,接受最大 18 MB 的 JPEG/PNG 文件,且经过编辑后准确度可能降低。若没有版本和回退控制措施,不要将合规要求硬性依赖于预览版 API。

对历史自定义模型实施准入控制

请勿启动新的 Canvas 微调项目:AWS 当前的生命周期政策规定,基础模型进入 Legacy 后,不得再提交新的自定义任务。如果组织在 2026-03-30 进入 Legacy 状态前创建了 Canvas 自定义模型,请盘点其训练授权、IAM 角色、S3/KMS 控制措施、评估记录、当前部署、计费、删除/保留义务以及 EOL 迁移计划。AWS 表示,此类已存在的自定义模型可以继续使用现有的按需部署或进入 Legacy 前已配置的 Provisioned Throughput 端点,也可以创建新的按需自定义部署;但不得创建新的微调任务或 Provisioned Throughput 端点。

若需满足新的主体一致性需求,请寻找支持当前自定义功能的 Active 模型,独立验证该模型,并在更换提供商/模型前取得批准。不要猜测 Nova Canvas 的继任模型,也不要将 Canvas 的历史超参数移植到其他模型。

记录已知文档冲突

不要悄悄解决以下当前 AWS 差异:

  • 图像变化:概览称 text 为可选项;详细架构则将其标为必填,并包含修补图像相关说明。除非经授权的金丝雀测试证实可以省略,否则请包含 text。
  • 提示词长度:架构规定正向和负向字段分别为 1–1024 个字符;2025 年服务卡称总长度为 1,024 个字符。默认按更严格的总长度上限执行。
  • 像素边界:概览将 2048×2048 列为有效尺寸,编辑功能允许不超过 419 万像素;详细输入指南则称总像素必须小于 4,194,304。优先参考已发布的示例和金丝雀边界值。
  • 扩图蒙版:专用输入指南称白色像素会发生变化,而架构说明在称修补图像和扩图互为反向操作之前,重复了黑色像素会发生变化的说法。通过固定样例测试锁定极性。
  • Seed:当前架构允许 0–2,147,483,646,而一些官方 SDK 示例仍描述较小的 0–858,993,459 范围。使用架构范围;若重视最大向后兼容性,则使用较小范围。
  • Provisioned Throughput:基础模型页面称不支持,而历史微调资料描述了自定义 Canvas Provisioned Throughput 服务;但当前生命周期政策禁止 Legacy 阶段之后创建新的 Provisioned Throughput 端点。仅将符合条件的 Legacy 阶段之前创建的自定义资源视为可继续使用。

如果边界值很重要,请保存来源 URL、检索日期、区域、确切载荷、响应状态/消息、SDK 版本和 AWS 请求 ID。生命周期或文档发生任何变化后,都应重新验证。

主要来源

以上所有易变信息均于 2026-07-09 根据 AWS 一手来源核实:

评论

支持 Markdown