Genkit Python 接入 Amazon Bedrock 完整指南:文本生成、流式推理、Embedding、图像生成与重排序实战
【免费下载链接】genkitOpen-source framework for building agentic apps in JavaScript, Go, Dart, and Python, built and used in production by Google项目地址: https://gitcode.com/GitHub_Trending/ge/genkit
genkit-amazon-bedrock是 Genkit Python 生态中连接 Amazon Bedrock 的官方插件,它把 Bedrock 托管的 Anthropic Claude、Amazon Nova、Meta Llama、Mistral、Cohere 等模型统一注册为 Genkit 的模型 Action,并通过 Bedrock 的 Converse / ConverseStream API 提供文本生成能力,同时通过 InvokeModel API 覆盖 Embedding、图像生成与文档重排序。读完本文,你将掌握该插件的安装与 AWS 前置配置、全部插件参数与默认值、文本与流式生成的调用方式、提示词缓存、推理配置文件(Inference Profile)、以及错误码到 Genkit 状态的映射规则,可以直接在自己的 Genkit Python 应用中接入 Bedrock。
本文以 py/packages/genkit-amazon-bedrock/CHANGELOG.md 的功能清单为主线,结合 py/packages/genkit-amazon-bedrock/README.md 的用法说明与 py/packages/genkit-amazon-bedrock/src/genkit_amazon_bedrock/ 下的源码实现展开。当前插件处于首个版本([Unreleased],见 CHANGELOG),以下所有行为均以本仓库当前代码为准。
安装与 AWS 前置准备
安装插件
插件与核心库一起通过uv安装即可:
uv add genkit genkit-amazon-bedrock模型访问(Model Access)
Bedrock 的模型访问权限是按账号、按区域授予的:在 Bedrock 控制台的 Model access 页面申请后,us-east-1的授权与us-west-2毫无关系——仅仅切换 region 就可能让原本可用的配置失效。Anthropic 系列模型还额外要求账号完成一次性使用场景协议(Bedrock 控制台 → Model access → Anthropic use case details),在协议通过之前,Claude 调用会以ResourceNotFoundException失败,该错误看起来像模型 ID 拼错,实为缺少协议授权。
IAM 最小权限策略
覆盖本插件全部能力(文本生成、Embedding、图像生成、重排序)的最小策略如下:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["bedrock:InvokeModel", "bedrock:InvokeModelWithResponseStream"], "Resource": [ "arn:aws:bedrock:*::foundation-model/*", "arn:aws:bedrock:*:*:inference-profile/*" ] } ] }关键点:
- Converse 由
bedrock:InvokeModel授权,ConverseStream 由bedrock:InvokeModelWithResponseStream授权,不存在单独的 Converse 权限需要授予; - Embedding、图像生成与重排序都走 InvokeModel,因此只需要第一个权限;
inference-profile/*资源极易遗漏。跨区域配置文件(如us.anthropic.claude-sonnet-4-5-20250929-v1:0)是账号级 inference-profile ARN,而非 foundation-model ARN,若策略只写了foundation-model/*,即使模型访问已授权也会被拒绝为AccessDeniedException。
凭据解析
凭据遵循标准 AWS SDK 链,以下任一方式均可生效:
- 环境变量:
AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY,临时凭据再加AWS_SESSION_TOKEN; ~/.aws下的共享配置与凭据文件,通过AWS_PROFILE选择;- EC2 / ECS / Lambda 上平台注入的 IAM 角色;
- SSO 配置(执行
aws sso login后)。
链上未覆盖的场景通过session=传入预配置的boto3.session.Session解决。Region 的解析与凭据相互独立,具体规则见下文“插件参数”。
快速开始
from genkit import Genkit from genkit_amazon_bedrock import Bedrock, ModelDefinition ai = Genkit( plugins=[ Bedrock( region='us-east-1', models=[ModelDefinition(name='us.anthropic.claude-sonnet-4-5-20250929-v1:0')], ) ], model='bedrock/us.anthropic.claude-sonnet-4-5-20250929-v1:0', )插件的 Action 命名空间固定为bedrock/,完整模型名即bedrock/<模型ID>(见 plugin.py 的bedrock_name())。上述代码把 Claude Sonnet 注册为默认模型后,直接await ai.generate(prompt=...)即可。
从源码结构看,插件的初始化是“惰性解析 + 启动校验”的:Bedrock.__init__会立即构造BedrockTransport,而init()在启动阶段调用await self._transport.ensure_client()预建 boto3 客户端——所以 region 未解析等配置错误会在启动时暴露,而不是拖到第一次模型调用(见 plugin.py)。
插件参数详解(Bedrock() 全部选项)
以下为Bedrock()的每个参数及其默认行为(README 参数表与 config.py 中的常量定义一致):
| 参数 | 默认 | 含义 |
|---|---|---|
region | 未设置 | AWS 区域。回退到 SDK 解析链;什么都解析不到时初始化直接失败 |
max_retries | 未设置 | 首次尝试之后的额外重试次数。回退到3,重试模式为 botocore 的standard,此时你的 AWS 配置不生效 |
read_timeout | 未设置 | Socket 读超时(秒)。回退到3600.0 |
connect_timeout | 未设置 | Socket 连接超时(秒),只覆盖 TCP 握手。回退到60.0 |
max_pool_connections | 未设置 | HTTP 连接池大小。回退到50(botocore 默认只有 10) |
total_timeout | 3600.0 | 非流式生成的整次调用截止时间(秒),包含重试;传None移除 |
session | 未设置 | 预配置的boto3.session.Session,用于自定义凭据或 SDK 装配 |
models | [] | 要注册的ModelDefinition条目;未列出的 ID 仍可按需解析 |
embedders | [] | 要注册的 Embedding 模型 ID;未列出的 ID 仍可按需解析 |
其中max_retries、read_timeout、connect_timeout、max_pool_connections默认均为 None,含义是“让位于你的 AWS 环境配置”,仅当环境配置也沉默时才填入上述包默认值;显式传参会覆盖两者(详见 transport.py 的_client_config()与_retry_config())。
不同参数的外部来源也不同(botocore 只读取其中一部分):
- 重试参数来自
AWS_MAX_ATTEMPTS、AWS_RETRY_MODE、~/.aws/config中的max_attempts与retry_mode键,或 session 的默认客户端配置。attempt 次数与模式是分开解析的:只设置其一,另一个会落在包默认值上;而传max_retries只调次数,不会把你从adaptive模式拽走(源码在_retry_config()中逐键判断_has_ambient_setting,见 transport.py); - 两个超时与连接池大小在 botocore 中没有环境变量或配置文件对应项,唯一外部来源是挂在
session=传入的 session 上的botocore.config.Config。
read_timeout是 socket 读超时,不是整次调用的截止时间。它约束的是“等下一个字节”的时长,每次收到字节都会重置,所以默认给足一小时——一次生成合法地跑数分钟(Nova 允许 60 分钟推理),且只要连接持续吐字节就不会触发。total_timeout才是真正卡总时长的墙钟限制:它端到端地限制一次非流式生成(含重试),默认 3600 秒,传None移除后只剩 socket 超时。截止时间触发时调用方收到DEADLINE_EXCEEDED错误,但 boto3 调用本身无法中止,其工作线程会一直跑到 socket 超时为止。流式生成、Embedding、图像生成与重排序只受 socket 超时约束。
max_pool_connections回退到 50 而非 botocore 的 10,是为了让连接池不成为瓶颈——并发先受事件循环默认线程池限制,因为 boto3 调用都通过asyncio.to_thread派发到工作线程(见 transport.py 的模块注释)。这也解释了为何一个同步 boto3 客户端可以同时服务应用循环与 Dev UI 的反射循环:boto3 客户端对调用是线程安全的。
models与embedders只是 Dev UI 的展示清单,裸Bedrock()什么都不列出。插件不会主动发现模型目录:那需要第二个面向bedrock控制平面的客户端和相应的 IAM 权限,而本插件只打开bedrock-runtime(见 plugin.py 的resolve()注释)。但这不影响调用,任何模型 ID 都按需解析。
文本生成:Converse 与 ConverseStream
文本生成基于 Bedrock 的 Converse(非流式)与 ConverseStream(流式)API,覆盖多轮对话、系统提示、工具调用、推理内容(reasoning content)与流式增量(streamed deltas)。调用入口在 models.py 的BedrockModel.generate():当运行上下文带流式回调(ctx.is_streaming)时走_generate_stream()消费 ConverseStream 事件,否则走converse()(见 models.py)。
- 流式路径把事件流整体放在 try 内消费,中途失败(botocore 以
EventStreamError抛出,它是ClientError子类)会像普通 AWS 错误一样映射;aclosing保证即使 chunk 回调抛异常也会关闭事件流(见 models.py); - 流式传输层把“首包”和“逐事件 next()”都桥接到线程(botocore 返回的是阻塞式
EventStream),并且total_timeout是整条流的一个统一截止时间,而不是每个事件单独计时(见 transport.py); - Genkit 类型与 Converse 请求/响应之间的转换全部集中在 converters.py,该模块刻意保持纯函数、无副作用,可脱离 AWS 直接测试。
推理(reasoning)内容的回传处理
值得注意的一个实现细节:Bedrock 返回的推理内容是签名且可能被脱敏的,下一轮必须原样回放,否则模型会拒绝。因此转换层把签名与脱敏块都存进 part 的元数据(bedrockReasoningSignature与bedrockRedactedContent两个键,见 converters.py),并且只回传带这两个标记的推理 part——一个普通的、不带 Bedrock 标记的推理 part 会被刻意丢弃,防止外来推理内容污染 Bedrock 对话。
BedrockConfig:Bedrock 专属配置
BedrockConfig继承核心ModelConfig字段,并额外声明两个 Bedrock 专属字段(见 config.py):
tool_choice:工具选择模式,auto、required/any、none或具体工具名;additional_model_request_fields:原样转发到 Converse API 的额外字段(例如 Claude 的扩展思考)。
配置解析采用了extra='forbid':未知键会被拒绝,因为只有声明的字段会到达 Converse API,一个被容忍的拼写错误(如maxTokens写成maxOutputTokens)会让调用在旋钮静默失效的情况下运行。
被忽略的字段:topK 与 version
BedrockConfig继承了核心ModelConfig的字段,因此 Dev UI 会展示topK和version,但 Converse 没有对应参数,两者都会被丢弃。支持 top-k 旋钮的模型应改走additionalModelRequestFields:
BedrockConfig(additional_model_request_fields={'top_k': 40})提示词缓存(Prompt Caching)
当一段很大的静态系统提示被反复发送时,用 Bedrock 的提示前缀缓存很划算。cache_point_part()用于标记可缓存前缀的结束位置:
from genkit import Part, TextPart from genkit_amazon_bedrock import cache_point_part CLAUDE = 'bedrock/us.anthropic.claude-sonnet-4-5-20250929-v1:0' # 缓存点放在要缓存的内容之后。 system = [Part(root=TextPart(text=LONG_STATIC_PROMPT)), cache_point_part()] first = await ai.generate(model=CLAUDE, system=system, prompt='What are the delivery tiers?') second = await ai.generate(model=CLAUDE, system=system, prompt='Which tier needs a signature?') print(second.usage.cached_content_tokens)使用注意事项(源码与 README 共同确认):
- 缓存点必须放在要缓存的内容之后,绝不能在前;
- 缓存点可用于系统提示,也可用于普通用户消息与模型消息;系统消息只保留文本与缓存点,其他 part 类型会被丢弃;
- 要命中缓存,前缀必须跨调用字节级一致,所以应该用常量构建,而不是每请求重新拼装;
- 低于模型最小可缓存大小(Claude Sonnet 大约 1000 token,更小的模型要求更高)的前缀会被静默地不缓存——没有报错也没有警告;
- 缓存存活数分钟,窗口内重跑可读到上一轮写入的缓存;
- 用量上,
cacheReadInputTokens映射为usage.cached_content_tokens;cacheWriteInputTokens被刻意丢弃,因此“第二次调用报出了第一次没有的 cached tokens”是缓存生效的唯一证据; - Bedrock 把缓存 token 计在
inputTokens之外,所以usage.input_tokens只是未缓存余量,缓存越好它反而越小;缓存前缀计入usage.total_tokens。不要把小的input_tokens当成缓存失败,也不要拿它断言缓存命中; system传普通字符串会走 Genkit 的 dotprompt 模板,重写文本且无法表达缓存点;要表达缓存点并保持前缀字节一致,应传 part 列表(见 README.md 的 Prompt caching 一节)。
缓存点的底层实现是转换层中的一个自定义 part 键bedrockCachePointType(见 converters.py)。
推理配置文件(Inference Profiles)与 ARN
模型 ID 带global.、us-gov.、us.、eu.、jp.、apac.、au.前缀的,是跨区域推理配置文件,会把调用路由到该地理区域内任一有容量的区域:
ModelDefinition(name='us.anthropic.claude-sonnet-4-5-20250929-v1:0')- 完整 ID 始终原样发送给 Bedrock;前缀只在本地能力查询时剥离,因此配置文件会继承其基础模型声明的能力,而不是回退到未知模型的保守默认(见 model_info.py 的
strip_inference_profile_prefix,被 plugin.py、embedders.py、image.py 与 rerank.py 共同复用); - 多个新模型只能通过配置文件调用,裸 foundation-model ID 反而不可用,所以这是常规形态而非进阶选项;
- 任何配置文件 ID 或完整 ARN 都可接受,跨
arn:aws:、arn:aws-us-gov:、arn:aws-cn:分区。
Embedders(Embedding 模型)
Embedding 模型在插件参数中单独列出,使用裸模型 ID:
from genkit import Genkit from genkit_amazon_bedrock import Bedrock ai = Genkit(plugins=[Bedrock(embedders=['amazon.titan-embed-text-v2:0'])]) embeddings = await ai.embed( embedder='bedrock/amazon.titan-embed-text-v2:0', content='Bedrock hosts models from several providers.', )覆盖 Titan text、Titan multimodal、Cohere v3 与 Nova-2 家族,全部通过 InvokeModel 调用(见 embedders.py)。家族识别靠模型 ID 的子串匹配(titan-embed-image→ titan_multimodal、titan-embed→ titan_text、cohere.embed-v4→ cohere_v4、cohere.embed→ cohere_v3、nova-2-multimodal-embeddings→ nova,见 embedders.py)。注意cohere.embed而非裸cohere,否则会误吞cohere.rerank-*与cohere.command-*。
列出 embedder 是可选的:任何可路由的 ID 都按需解析,包括推理配置文件与 ARN 形式;列出仅为了出现在 Dev UI 中(见 plugin.py 的_create_embedder_action())。
已知行为与限制:
- Titan multimodal 接受 JPEG 与 PNG,每个文档一张图;文档同时带文本时取两个向量的平均;
- Bedrock 上的 Cohere Embedding 仅限文本:无文本的文档会被拒绝而不是发送;带媒体 part 会被忽略;
- 每请求的 embed 选项被忽略:Cohere 请求固定为
input_type: search_document,所以这些 embedder 用于索引文档,不用于查询 embedding; - Cohere v3 按 Bedrock 每请求 96 文档的限额分批(
COHERE_TEXT_BATCH_SIZE = 96),并发上限 10(EMBED_CONCURRENCY_LIMIT = 10),失败会取消其余任务并取消未开始的调用,避免批内错误继续计费(见 embedders.py 与_run_bounded()); - Titan multimodal 会在 HTTP 200 上通过响应体
message字段带内上报输入错误(见_titan_multimodal_vector()); - Nova-2 的响应是
{"embeddings": [{"embedding": [...]}]}的对象列表,与 Titan 的裸向量形态不同(见_nova_embedding()); - 各家族注册的维度信息:Titan Text v1 为 1536、Titan Text v2 为 1024、Titan Image 为 1024、Cohere v3 两个模型为 1024、Nova-2 为 3072(见
EMBEDDER_INFO)。
图像生成(Nova Canvas / Titan Image / Stability)
图像模型走 InvokeModel 而非 Converse,但它们是普通的 Genkit 模型 Action:ai.generate返回的媒体 part 携带 data URL。声明时加type='image':
from genkit import Genkit from genkit_amazon_bedrock import Bedrock, ModelDefinition ai = Genkit( plugins=[ Bedrock( # us-west-2:当前活跃的文生图模型只在该区域提供。 region='us-west-2', models=[ModelDefinition(name='stability.sd3-5-large-v1:0', type='image')], ) ] ) response = await ai.generate( model='bedrock/stability.sd3-5-large-v1:0', prompt='A tabby cat asleep on a sunlit windowsill, watercolour.', ) image = response.media[0].url # data:image/png;base64,...- 声明同样可选:未声明的 ID 若属于两个家族之一,会被当场归类为图像模型,裸
ai.generate(model='bedrock/<id>')就会走 InvokeModel 路径;声明则把模型加入 Dev UI 并固定路由(见 plugin.py 的resolve()分类逻辑); - 提示词取最近一条用户消息的文本 part 拼接,其他 part 被忽略(这些模型只支持文生图,见 image.py 的
image_prompt()); - 图像模型永远不会调用流式回调:没有可流式的内容,
generate_stream不产出 chunk,图像只在最终响应上到达; - 图像生成恒以
FinishReason.STOP结束且不报告 token(见 image.py)。
请求体形态(按模型家族区分)
两个家族请求体互不兼容,因此根据模型 ID 构建请求(_IMAGE_FAMILY_PATTERNS见 image.py):
Amazon 家族(ID 含titan-image或nova-canvas)把选项嵌套在imageGenerationConfig下,且只读取这个键,其他顶层键一律丢弃。你的条目会逐键合并到这些默认值之上:
config={ 'imageGenerationConfig': { 'numberOfImages': 1, 'height': 1024, 'width': 1024, 'cfgScale': 8.0, 'seed': 0, 'quality': 'standard', # 仅 Nova Canvas,Titan Image 不发送 } }输出恒为image/png。
Stability 家族(ID 含sd3-、stable-image-core或stable-image-ultra)采用扁平顶层字段,整个 config 字典合并到默认值{'prompt': ..., 'output_format': 'png'}之上,因此aspect_ratio、seed、negative_prompt、output_format等都生效:
config={'aspect_ratio': '16:9', 'output_format': 'jpeg', 'seed': 42}媒体 part 的 MIME 类型跟随output_format。
其他要点:
BedrockImageConfig是这些调用的导出配置类型,刻意不声明任何字段也不拒绝任何键:两个家族键互斥,而BedrockConfig描述的是 Converse 参数,会让每个家族专属键都被拒绝(见 config.py);- Genkit 的通用生成选项(
temperature、topP、maxOutputTokens、apiKey等)不会转发给图像模型,因为 Bedrock 图像 API 不接受它们;实现上通过_normalize_image_config()统一剔除(见 image.py); - 文生图与图像编辑模型不可互换:某区域提供的模型可能只支持 inpaint 或 upscale;账号无法使用的 Legacy 模型(从未启用或闲置后禁用)会以
ResourceNotFoundException出现,与缺少授权表现一致; titan-image家族仍被识别(与 Nova Canvas 共享请求形态);旧 Stable Diffusion XL schema(text_prompts/artifacts)未移植,因为该形态模型在 Bedrock 上已全部 EOL;Stability 的编辑服务(inpaint、erase、背景移除等)不属于文生图,超出范围;- Nova Canvas 返回的图片数可能少于
numberOfImages请求数:被内容过滤的图片会静默丢弃(见 image.py 的_amazon_images(),图像与错误同存时按部分成功处理,图像优先)。
重排序(Reranking)
重排序用查询给文档打分,让检索步骤按相关性返回命中。它是插件实例上的方法而非 Genkit Action,因此要保留传给Genkit的Bedrock引用:
from genkit import Document, Genkit from genkit_amazon_bedrock import Bedrock, BedrockRerankOptions bedrock = Bedrock(region='us-east-1') ai = Genkit(plugins=[bedrock]) response = await bedrock.rerank( 'cohere.rerank-v3-5:0', query='How do I configure authentication for Bedrock?', documents=[ Document.from_text('Configure AWS credentials with environment variables or AWS SSO.'), Document.from_text('Nova Canvas returns generated images as base64-encoded PNG data.'), Document.from_text('Model access is granted per account and region in the Bedrock console.'), ], options=BedrockRerankOptions(top_n=2), ) for document in response.documents: print(document.metadata.score, document.content[0].root.text)设计背景:Genkit Python 没有 reranker 原语——ActionKind.RERANKER只有裸枚举成员,请求与响应类型也未生成,因此没有可注册 Action 的对象(见 rerank.py 的模块注释)。插件导出的类型(BedrockRerankOptions、RankedDocumentData、RankedDocumentMetadata、RerankerRequest、RerankerResponse)与genkit-schema.json中的同名 schema 类型逐字段对齐,未来核心若重新引入原语,调用点无需改动。
行为细节:
top_n(以 dict 传参时写作topN)会被钳制到实际发送的文档数;<= 0或未设置表示返回全部;- 结果按服务的降序相关性返回,客户端不重排、不截断;
- 排好序的文档原样携带输入文档内容,元数据是全新的
{score};输入文档自身的元数据不会带过去; - 重排序模型没有 Converse 路径,永远不会解析为聊天模型;把它列在
models=里会被忽略,请把 ID 传给rerank()(见 plugin.py); - 只需要
bedrock:InvokeModel,不需要bedrock:Rerank——那个权限属于独立的 Bedrock Agent RuntimeRerankAPI,本插件并不调用; - 两个家族请求体不同:Cohere 与 Amazon 都发送
query、documents、top_n,但只有 Cohere 接受api_version(当前版本 2,schema 强制要求),Amazon schema 会拒绝任何携带该键的请求体(见 rerank.py);ID 不属于任一家族时采用 Cohere 请求体,因为那是 AWS 文档中 InvokeModel 重排序的唯一形态; - 任何模型 ID 都原样传给 InvokeModel,因此推理配置文件与 ARN 同样可用。
错误码到 Genkit 状态的映射
插件把 Bedrock 错误码映射为 Genkit 错误状态,失败以带类型的GenkitError到达调用方(PERMISSION_DENIED、NOT_FOUND、INVALID_ARGUMENT、RESOURCE_EXHAUSTED等),并保留服务原始消息。完整映射表见 models.py:
| AWS 错误码 / botocore 异常 | Genkit 状态 |
|---|---|
ThrottlingException/TooManyRequestsException/ServiceQuotaExceededException | RESOURCE_EXHAUSTED |
ValidationException | INVALID_ARGUMENT |
AccessDeniedException | PERMISSION_DENIED |
UnrecognizedClientException/ExpiredTokenException | UNAUTHENTICATED |
ResourceNotFoundException | NOT_FOUND |
ModelTimeoutException | DEADLINE_EXCEEDED |
ModelNotReadyException/ServiceUnavailableException | UNAVAILABLE |
ModelErrorException/InternalServerException/ModelStreamErrorException | INTERNAL |
ParamValidationError | INVALID_ARGUMENT |
NoCredentialsError/PartialCredentialsError | UNAUTHENTICATED |
NoRegionError | FAILED_PRECONDITION |
ReadTimeoutError/ConnectTimeoutError | DEADLINE_EXCEEDED |
EndpointConnectionError | UNAVAILABLE |
未列出的映射到UNKNOWN。实现细节:
- 服务端错误按 AWS 错误码映射;流中途失败的事件名是 lowerCamelCase(如
throttlingException),映射前统一把首字母大写(_normalize_error_code(),见 models.py); - 客户端侧 botocore 失败(
NoRegionError、ReadTimeoutError等)永不触达服务,按异常类型映射(_BOTOCORE_ERROR_STATUS); - 限流错误响应头里的
Retry-After会被解析并作为retry_after_ms放在响应元数据上(response_metadata={'retry_after_ms': ...}),同时兼容“延迟秒数”与“HTTP 日期”两种格式(见_parse_retry_after_ms(),models.py)。
常见故障排查
没有解析出 region。插件在初始化时报错而不是首次调用时报错,且刻意不默认任何区域:静默回退到us-east-1会把流量和数据发到你从未选择的区域。设置region=、AWS_REGION、AWS_DEFAULT_REGION,或在活动 profile 中配区域。对应的运行时错误文本在 transport.py 的NO_REGION_MESSAGE中。
AccessDeniedException。要么该模型在该区域未授权模型访问,要么 IAM 策略缺少 inference-profile 资源。若模型 ID 带跨区域前缀,先检查策略——这种失败与缺少授权长得一模一样。
ResourceNotFoundException。模型存在但当前账号在此处无法使用:Anthropic 模型的使用场景协议未接受,或 Legacy 模型。而模型确实不在该区域提供时,会以下面的ValidationException形式报告。
ValidationException提示 "The provided model identifier is invalid"。ID 拼错,或该模型不在调用所去区域提供。Converse 与 InvokeModel 对缺失模型都这样报告(经线上验证),所以这就是区域选错的真实样子:在默认区域为us-east-1的会话里调用stability.sd3-5-large-v1:0(仅 us-west-2)恰好产生此错误。怀疑 ID 之前先检查区域。
其他ValidationException。请求或配置对特定模型格式有误:thinking budget 超出模型允许范围,或图像配置字段家族不接受(整个 config 字典会到达 Stability,imageGenerationConfig内的一切会到达 Amazon 家族)。Bedrock 按模型校验,在 A 模型上能用的配置可能在 B 模型上被拒。
ThrottlingException。该模型与区域的按需容量上限。插件自动指数退避重试,最多到max_retries次(首次尝试之后),耗尽后把错误抛给调用方。可提高max_retries、分散负载,或改用 provisioned throughput。
元数据级调试日志
GENKIT_LOG=debug会打开插件自身的日志行:解析出的 region 与客户端配置、每次调用路由到的模型、stop reason、token 计数,以及resolve拒绝了什么。日志只携带元数据,永不包含提示词、Embedding 或图像字节,因此可以放心常开(各模块均通过structlog.get_logger(__name__)打日志,见 plugin.py、models.py 等)。
完整可运行示例
仓库在 py/samples/amazon-bedrock-sample/ 提供了一个可运行示例(对应 README 末尾的指引),覆盖聊天、流式、工具调用、结构化输出、推理、提示词缓存、视觉、PDF 输入、Embedding、图像生成与重排序等全部能力。仓库测试目录 py/packages/genkit-amazon-bedrock/tests/ 下还有converters_test.py、embedders_test.py、image_test.py、models_test.py、plugin_test.py、rerank_test.py、stream_test.py、transport_test.py等针对各模块的测试,以及一个live_test.py用于真实 AWS 环境的验证,可作为进一步阅读实现细节的入口。
总而言之,genkit-amazon-bedrock把 Bedrock 的四大能力(Converse 文本生成、InvokeModel Embedding、InvokeModel 图像生成、InvokeModel 重排序)统一收敛到 Genkit 的 Action 模型之下,同时在连接层(超时、重试、连接池、region 解析)、类型层(严格配置校验、family 路由)与错误层(错误码映射、Retry-After透传)做了系统性的工程化处理——这些细节正是从“能跑通”到“生产可用”的分水岭。
【免费下载链接】genkitOpen-source framework for building agentic apps in JavaScript, Go, Dart, and Python, built and used in production by Google项目地址: https://gitcode.com/GitHub_Trending/ge/genkit
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考