Genkit Python 接入 Amazon Bedrock 完整指南:文本生成、流式推理、Embedding、图像生成与重排序实战
2026/9/17 15:06:11 网站建设 项目流程

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_IDAWS_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_timeout3600.0非流式生成的整次调用截止时间(秒),包含重试;传None移除
session未设置预配置的boto3.session.Session,用于自定义凭据或 SDK 装配
models[]要注册的ModelDefinition条目;未列出的 ID 仍可按需解析
embedders[]要注册的 Embedding 模型 ID;未列出的 ID 仍可按需解析

其中max_retriesread_timeoutconnect_timeoutmax_pool_connections默认均为 None,含义是“让位于你的 AWS 环境配置”,仅当环境配置也沉默时才填入上述包默认值;显式传参会覆盖两者(详见 transport.py 的_client_config()_retry_config())。

不同参数的外部来源也不同(botocore 只读取其中一部分):

  • 重试参数来自AWS_MAX_ATTEMPTSAWS_RETRY_MODE~/.aws/config中的max_attemptsretry_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 客户端对调用是线程安全的。

modelsembedders只是 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 的元数据(bedrockReasoningSignaturebedrockRedactedContent两个键,见 converters.py),并且只回传带这两个标记的推理 part——一个普通的、不带 Bedrock 标记的推理 part 会被刻意丢弃,防止外来推理内容污染 Bedrock 对话。

BedrockConfig:Bedrock 专属配置

BedrockConfig继承核心ModelConfig字段,并额外声明两个 Bedrock 专属字段(见 config.py):

  • tool_choice:工具选择模式,autorequired/anynone或具体工具名;
  • additional_model_request_fields原样转发到 Converse API 的额外字段(例如 Claude 的扩展思考)。

配置解析采用了extra='forbid':未知键会被拒绝,因为只有声明的字段会到达 Converse API,一个被容忍的拼写错误(如maxTokens写成maxOutputTokens)会让调用在旋钮静默失效的情况下运行。

被忽略的字段:topK 与 version

BedrockConfig继承了核心ModelConfig的字段,因此 Dev UI 会展示topKversion,但 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_tokenscacheWriteInputTokens被刻意丢弃,因此“第二次调用报出了第一次没有的 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-imagenova-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-corestable-image-ultra)采用扁平顶层字段,整个 config 字典合并到默认值{'prompt': ..., 'output_format': 'png'}之上,因此aspect_ratioseednegative_promptoutput_format等都生效:

config={'aspect_ratio': '16:9', 'output_format': 'jpeg', 'seed': 42}

媒体 part 的 MIME 类型跟随output_format

其他要点:

  • BedrockImageConfig是这些调用的导出配置类型,刻意不声明任何字段也不拒绝任何键:两个家族键互斥,而BedrockConfig描述的是 Converse 参数,会让每个家族专属键都被拒绝(见 config.py);
  • Genkit 的通用生成选项(temperaturetopPmaxOutputTokensapiKey等)不会转发给图像模型,因为 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,因此要保留传给GenkitBedrock引用:

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 的模块注释)。插件导出的类型(BedrockRerankOptionsRankedDocumentDataRankedDocumentMetadataRerankerRequestRerankerResponse)与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 都发送querydocumentstop_n,但只有 Cohere 接受api_version(当前版本 2,schema 强制要求),Amazon schema 会拒绝任何携带该键的请求体(见 rerank.py);ID 不属于任一家族时采用 Cohere 请求体,因为那是 AWS 文档中 InvokeModel 重排序的唯一形态;
  • 任何模型 ID 都原样传给 InvokeModel,因此推理配置文件与 ARN 同样可用。

错误码到 Genkit 状态的映射

插件把 Bedrock 错误码映射为 Genkit 错误状态,失败以带类型的GenkitError到达调用方(PERMISSION_DENIEDNOT_FOUNDINVALID_ARGUMENTRESOURCE_EXHAUSTED等),并保留服务原始消息。完整映射表见 models.py:

AWS 错误码 / botocore 异常Genkit 状态
ThrottlingException/TooManyRequestsException/ServiceQuotaExceededExceptionRESOURCE_EXHAUSTED
ValidationExceptionINVALID_ARGUMENT
AccessDeniedExceptionPERMISSION_DENIED
UnrecognizedClientException/ExpiredTokenExceptionUNAUTHENTICATED
ResourceNotFoundExceptionNOT_FOUND
ModelTimeoutExceptionDEADLINE_EXCEEDED
ModelNotReadyException/ServiceUnavailableExceptionUNAVAILABLE
ModelErrorException/InternalServerException/ModelStreamErrorExceptionINTERNAL
ParamValidationErrorINVALID_ARGUMENT
NoCredentialsError/PartialCredentialsErrorUNAUTHENTICATED
NoRegionErrorFAILED_PRECONDITION
ReadTimeoutError/ConnectTimeoutErrorDEADLINE_EXCEEDED
EndpointConnectionErrorUNAVAILABLE

未列出的映射到UNKNOWN。实现细节:

  • 服务端错误按 AWS 错误码映射;流中途失败的事件名是 lowerCamelCase(如throttlingException),映射前统一把首字母大写(_normalize_error_code(),见 models.py);
  • 客户端侧 botocore 失败(NoRegionErrorReadTimeoutError等)永不触达服务,按异常类型映射(_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_REGIONAWS_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.pyembedders_test.pyimage_test.pymodels_test.pyplugin_test.pyrerank_test.pystream_test.pytransport_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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询