@crvouga/mockingbird-service-bedrock (英语)
本地模拟器。 真正的API合同. 部分 嘲笑鸟。 。 。 .
状态、可脚本仿真器 亚马逊 Bedrock 运行时间 测试套房: Converse, (中文(简体) ),
ConverseStream (字节精确) application/vnd.amazon.eventstream 框架, , , InvokeModel
(Anthropic Messages bodies and Titan text interestings), (Athropic Messages bodies and Titan text princepting s. ), (原始内容存档于2018年1月1日). 克克林特·克林特(英语:C, InvokeModelWithBidirectionalStream
(诺瓦·索尼克战胜了HTTP/2 二重奏)和特工科雷 InvokeHarness 事件流.
模拟器从不生成语言. 它会重播 脚本:一个测试说"当聊天模式
看见了 头晕 与 report_rx_symptom 可用, 发送此选项 toolUse; 工具结果之后
回来,说这个。" 聊天转弯、批准卡、护栏板块、结构化产出和
节流阀变得具有决定力,并取出毫秒.
- 行动范围: 支助
- 与官方客户 证明我们的消费者针:
@aws-sdk/[email protected], (中文(简体) ),@aws-sdk/[email protected], (中文(简体) ),@ai-sdk/[email protected]+ 键[email protected]。 。 。 .
安装
npm install -D @crvouga/mockingbird-service-bedrock
仅限无害环境管理。 节点 22或 Bun 1.2. 无土生属地. 给它服务
npx mockingbird-bedrock serve (h2c + 一个端口的HTTP/1.1), createServer 从 ./server, (中文(简体) ),
或者说 createRuntime 与任何获取服务器(仅HTTP/1.1——见下文).
使用量
对准应用程序 没有代码更改:每个客户端都会遵守端点变量.
npx mockingbird-bedrock serve --port 8796
export AWS_ENDPOINT_URL_BEDROCK_RUNTIME=http://127.0.0.1:8796 # SDK v3, AI SDK, botocore
export AWS_ENDPOINT_URL_BEDROCK_AGENTCORE=http://127.0.0.1:8796 # AgentCore InvokeHarness
import { BedrockRuntimeClient, ConverseCommand } from "@aws-sdk/client-bedrock-runtime"
import { createServer } from "@crvouga/mockingbird-service-bedrock/server"
// Test setup: start the emulator and script the model's turns.
const emulator = await createServer()
await fetch(`${emulator.url}/__admin/scripts`, {
method: "PUT",
headers: { "content-type": "application/json" },
body: JSON.stringify({
scripts: [
{
id: "rx-symptom-approval",
match: { modelId: "*sonnet*", lastUserText: { contains: "dizzy" }, toolsInclude: ["report_rx_symptom"] },
turns: [
{
toolUse: { name: "report_rx_symptom", input: { symptoms: [{ symptomDefinitionId: 7, severity: 3 }] } },
stopReason: "tool_use",
},
{
expectToolResult: { name: "report_rx_symptom" },
text: "I've flagged that for your care team.",
chunkSize: 12,
usage: { inputTokens: 1200, outputTokens: 40, cacheReadInputTokens: 900 },
},
],
},
],
}),
})
// The AWS SDK client your application uses; only the endpoint changes.
const bedrock = new BedrockRuntimeClient({
endpoint: emulator.url,
region: "us-east-1",
credentials: { accessKeyId: "fixture", secretAccessKey: "fixture" },
})
// Application code: the chat turn now asks for the tool, which the app shows as an approval card.
const turn = await bedrock.send(
new ConverseCommand({
modelId: "global.anthropic.claude-sonnet-4-6",
messages: [{ role: "user", content: [{ text: "I feel dizzy" }] }],
toolConfig: {
tools: [{ toolSpec: { name: "report_rx_symptom", inputSchema: { json: { type: "object" } } } }],
},
}),
)
// turn.stopReason === "tool_use"
// turn.output?.message?.content?.[0]?.toolUse?.name === "report_rx_symptom"
// Sending the tool result back resumes the turn: "I've flagged that for your care team."
await emulator.close() // after the test
议定书
Bedrock 运行时默认的 AWS SDK v3 客户端 NodeHttp2Handler: 反对
http:// 他们说话的终点 (单位:千美元) (有事先知识的文本HTTP/2),和Nova Sonic
需要 HTTP/2 二进制 。 AI SDK和Agent Core使用HTTP/1.1. mockingbird-bedrock serve 财务报告和审定财务报表
createServer 嗅出每个连接的第一个字节,并服务在一个端口上. ()serve --config 从另一个服务的CLI,和 createRuntime 在普通获取服务器后, 说
HTTP/1.1只——对AI SDK罚款,对SDK v3 Bedrock客户端不罚款. )
路线
| 路线 | 行为 |
|---|---|
POST /model/{modelId}/converse | 电话JSON: output.message.content[] (单位:千美元)text, (中文(简体) ), toolUse, (中文(简体) ), reasoningContent, (中文(简体) ), stopReason, (中文(简体) ), usage (与 cacheRead/WriteInputTokens 当 a cachePoint 现为正本), metrics, (中文(简体) ), trace.guardrail (与 guardrailConfig.trace: "enabled", (中文(简体) ), x-amzn-RequestId。 。 。 . |
POST /model/{modelId}/converse-stream | 与事件框架相同的答案 : messageStart, (中文(简体) ), contentBlockStart (工具的使用), contentBlockDelta (单位:千美元)text, (中文(简体) ), toolUse.input 部分的JSON,(JSON), reasoningContent, (中文(简体) ), contentBlockStop, (中文(简体) ), messageStop, (中文(简体) ), metadata; 例外框中游. |
POST /model/{modelId}/invoke | amazon.titan-embed-text-*数字 : {embedding, inputTextTokenCount} - SHA-256的确定单位矢量(inputText(默认为1024-d; dimensions 第256/512/1024号决议,或 embeddingMode: "lexical" (见设置). 克洛德模型:一个Anthropic Messages body in,一个Messages响应出. |
POST /model/{modelId}/invoke-with-bidirectional-stream | 诺瓦·索尼克(Nova Sonic)*sonic*), HTTP/2 二进制:读取 chunk 当事件到达时( SigV4 信封未被包装), 回答每个用户的转动 textOutput + 24 kHz PCM 语气 audioOutput + 键 toolUse,则 usageEvent· ; completionEnd 之后 sessionEnd。 。 。 . |
POST /harnesses/invoke?harnessArn= | 代理Core牵引流 : messageStart, (中文(简体) ), contentBlockDelta (单位:千美元)text 或者说 toolResult[], (中文(简体) ), contentBlockStop, (中文(简体) ), messageStop, (中文(简体) ), metadata· ; validationException 编号 : internalServerException 编号 : runtimeClientError 边框. |
modelId 是任何型号 id, 推想- profile id (global. 编号 : us.)或URL编码为ARN. 西格维4是
未经核实而接受。 请求检查贝德洛克制造和我们的代码分支
执行:角色交替,第一个/最后一个消息是用户(助手) 预补 被拒绝
用于Claude 4.5+),工具使用/工具结果配对, toolConfig 需要有工具块,a
文档需要一个兄弟姐妹的文本块, temperature + 键 top_p claude 4.5+上,加上
在"最佳猜想"下列出的最佳猜想检查,而非甲骨文验证. 错误是
x-amzn-ErrorType: <Name>:http://internal.amazon.com/coral/com.amazon.bedrock/ + 键 {"message"}。 。 。 .
产出超过 maxTokens (%% 4个字符/ token) 切入 stopReason: "max_tokens"。 。 。 .
脚本( S)PUT /__admin/scripts(中文(简体) )
脚本是 {id, match?, turns, times?}。第一个脚本(按插入顺序) match
接受电话 财务报告和审定财务报表 在谈话中,有这个转折的答案; times 盖子
有多少人称它为答案.
- 匹配密钥 :
modelId(英语:glob),operation(单位:千美元)Converse, (中文(简体) ),ConverseStream, (中文(简体) ),InvokeModel, (中文(简体) ),InvokeModelWithBidirectionalStream, (中文(简体) ),InvokeHarness, (中文(简体) ),lastUserText(字符串=包含,或{contains, regex, flags}, (中文(简体) ),systemHash(系统文本块的SHA-256六分块与\n, (中文(简体) ),systemText(同一系统合并文本,cachePoint已跳过; 字符串 = 不敏感大小写包含,或{contains, regex, flags}; 一个没有系统的电话 永远不要 匹配;用于InvokeModel克劳德system字符串或文本块,从未存储),jsonSchemaName(单位:千美元)outputConfig.textFormat.structure.jsonSchema.name; 字符串= 案件不敏感平等,或{contains, regex, flags}; 无名称的呼叫outputConfig计谋永远不匹配,toolsInclude, (中文(简体) ),toolChoice(单位:千美元)auto编号 :any/ 一个工具名称,hasDocument, (中文(简体) ),hasImage, (中文(简体) ),callIndex(以0为基础的命名空间中调用索引).match是关闭的集合:未知 或拼错的密钥 (lastUserTxt)或一个错误的标准使PUT编号 :POST /__admin/scripts答 400 (中文(简体) )scripts[0].match.lastUserTxt: unknown match field (one of ...)改为 默地匹配每通呼叫;文本匹配中的未知密钥也是如此. - 转动选择 读取对话,而不是服务器状态: 转 无 接电话
接下来 无 助理留言,因为成员上次说了些什么。 所以,转0是
第一次调用用户回合,第1回合是工具结果后恢复调用,每个新调用
谈话重新开始.
expectToolResult: {name}只在最后一个时进行回转 用户信息带有该工具的结果。 Nova Sonic在会话中计算答案. - 转一圈 系指:
text(流入chunkSize- 典型的三角洲,delayMsPerChunk模范者,reasoning, (中文(简体) ),toolUse(单位:千美元){name, input, toolUseId?}或名单,json(结构化产出,以所要求的形式提供——见下文),guardrail(单位:千美元)true或者说{text, trace}数字 :guardrail_intervened与贝德罗克的拒绝文本和追踪,toolResult(痛苦),userTranscript(诺瓦索尼克),stopReason, (中文(简体) ),usage, (中文(简体) ),fault。 。 。 . - 结构化产出 (单位:千美元)
json作为 JSON 的文本出炉outputConfig.textFormat.structure.jsonSchema(Python Boto3客户端)和additionalModelRequestFields.output_config.format(AI SDK 原生)和作为toolUse会 议 日 程 和 议 程 强制工具toolChoice: {tool}或者说{any}(AI SDK的合成器)json工具、见解 报告"record_chat_*) (中文(简体) ). - 未描述的默认,每个计算为
unscripted(单位:千美元)GET /__admin/scripts→stats: 聊天 ——"OK."(单位:千美元)PUT /__admin/settings {"defaultText"});结构输出 − 最小 对象对请求的图谋有效; 我们的意图分类器(它的系统提示请求){"category","confidence"}页:1{"category":"general","confidence":0.9}; 带有一个 Claude body (EMR 语录) → a 4-section SOAP JSON; Titan → sHA-256向量; Invoke Harness - 一个eligible_for_clinician_review预屏幕摘要; Nova Sonic →"OK."说.
错误
转弯 fault (或预设, POST /__admin/faults {"preset": "<name>", "count"?: n},哪个
适用于调用名称空间中的每个模型和调用:
| 预设/ 过失 | 效果 |
|---|---|
throttling | 429个 ThrottlingException 在第一个块之前 |
mid_stream_exception (单位:千美元)afterChunks, (中文(简体) ), exceptionType(中文(简体) ) | 内容块,然后是 a modelStreamErrorException 帧( 频率 : internalServerException(中文(简体) ) |
mid_stream_throttling | 同样的a throttlingException 边框 |
validation_exception 编号 : validation | 400个 ValidationException |
max_tokens | 输出切成一半, stopReason: "max_tokens" |
latency (单位:千美元)latencyMs(中文(简体) ) | 在模拟器时钟上的 2 s 后开始响应 |
truncated_frame | 溪流通过一个框架半途而废(两个解码器都抛出) |
model_timeout, (中文(简体) ), service_unavailable, (中文(简体) ), access_denied, (中文(简体) ), internal_server | 408 / 503 / 403 / 500 配对 x-amzn-ErrorType |
resource_not_found | 404 (韩语) ResourceNotFoundException ("没有找到指定的资源ARN. 请检查archive-date=中的日期值 (帮助) Converse Stream and InvokeModel上的 Converse, ConverseStream 和 InvokeModel 任何帧之前,请检查ARN并再试一次 |
时空相接 模拟时钟: 冻结它( namePOST /__admin/clock {"freeze": true}),并推进以释放出每个块,所以时间到第一的测试是准确的.
管理员(超过标准合同)
| 路线 | 效果 |
|---|---|
PUT /__admin/scripts | 替换命名空间的脚本( N){"scripts": [...]}; 验证. |
POST /__admin/scripts | 添加脚本( 相同的 ids 覆盖) . |
GET /__admin/scripts | 脚本加 stats (单位:千美元)calls, (中文(简体) ), scripted, (中文(简体) ), unscripted, (中文(简体) ), byScript, (中文(简体) ), byFallback, (中文(简体) ), byOperation) (中文(简体) ). |
DELETE /__admin/scripts[?id=] | 删除一个或全部. |
GET /__admin/model-metrics | 只是数据. |
GET/PUT /__admin/settings | defaultText, (中文(简体) ), chunkSize (16个), delayMsPerChunk (0个), audioTurnChunks (0: Nova Sonic 语音转会结束于音频) contentEnd; n: 在n音频帧后, embeddingMode (单位:千美元)sha256 默认,或 lexical, (中文(简体) ), validatePromptCaching (单位:千美元)true 默认; false 禁用模式检查 cachePoint) (中文(简体) ). |
embeddingMode: "lexical" (opt- in; #522中的测试控制请求,而非贝德洛克行为)
保持土卫一矢量的确定性和单位长度,但使其具有相似性保留:
单词(小写、重音和发音下降)增加了SHA-256选择的签名维度,所以
文本仅在下列情况下不同:平分或相距相近; 相近相近; 共享最多的文本
单词得分高,文本没有共同分数的单词接近0. 这是口袋话,不是
语言模型:同义词("晚上"/"夜晚")保持相去不远. 脚本的文字向量不是
已执行. normalize: false 在两种模式中被忽略(向量总是单位长度).
请求日记GET /__admin/requests(仅每个电话的记录) modelId, (中文(简体) ), script (或
unscripted:<default>),工具名称,旗帜(cachePoint, (中文(简体) ), guardrail, (中文(简体) ), document, (中文(简体) ), image, (中文(简体) ),
structured:<form>, (中文(简体) ), stopReason 和符号计数——永远不要及时发送或发送信件.
最佳猜测,不是甲骨文验证
这些要求的检查来自AWS的文档 以及消费者对现场报道的内容
贝德洛克,不是从观察服务; 标有"我们"的准确信息文本是
模拟器选择 。 全部回复 400 ValidationException。 。 。 .
- 结构化产出计划 (单位:千美元)
outputConfig.textFormat.structure.jsonSchema.schema旋转 和交锋, 文档:schema这不是JSON对象;oneOf(单位:千美元)Schema type 'oneOf' is not supported(三);additionalProperties设置为除false在任何节点上,true或子图 (单位:千美元)For 'object' type, 'additionalProperties: <X>' is not supported. Please set 'additionalProperties' to false; 仅限字符串enum结合工会type例如["string","null"](我们);minimum, (中文(简体) ),maximum, (中文(简体) ),multipleOf, (中文(简体) ),minLength, (中文(简体) ),maxLength, (中文(简体) ),minItems1以上,一个外部$ref递归$ref(我们) 省略一个additionalProperties财务报告和审定财务报表anyOf编号 :allOf内部$ref编号 :$defs通过。 只有outputConfig选中窗体, 不additionalModelRequestFields.output_config也没有InvokeModel尸体 - 文件名称 (单位:千美元)
document.name, (中文(简体) ), API 参考: ASCII 字母的 1到 200 个字符、 数字、 空白、 连字符、 括号和正方形 括号,不包含两个空白字符。 留言是消费者录的 从活贝德洛克. cachePoint(单位:千美元)文档: (单位:千美元)cachePoint内容块直接位于document块(消费者报告;我们的信息); 在交锋/交锋上cachePoint内system, (中文(简体) ),messages或者说toolConfig.tools(克洛德·3.5·海库、3.5·索内 v2、3.7·索内、克洛德) 4,后为Opus / Sonnet / Haiku, 有线和神话; Nova Micro / Lite / Pro / 2 Lite),相配 在平原上,us.编号 :global.和ARN表单。 列表增长: 转换模型 检查关闭PUT /__admin/settings {"validatePromptCaching": false}编辑ttl字段为 未检查.- 未知的型号标识 仍按正常情况回答(
modelId是任何编号。 A 类knownModels设置 使未知的 id 失败在 # 523 中被请求, 但未构建: 是否活的 Bedrock 答案ResourceNotFoundException或者说ValidationException因为它没有被观察到.
命名空间
x-mockingbird-namespace页:1 /__admin/ns/<name> 前缀在端点 URL上,或者通过证书: SDKs
无法添加信头, 因此绘制每个工人的访问密钥 id :
PUT /__admin/credentials {"credentials": {"<AWS_ACCESS_KEY_ID>": "<namespace>"}}。 。 。 .
故意不模拟
- 语言:输出只来自脚本或固定的默认.
- 真实语音:Nova Sonic音频出自440 Hz PCM语气,其长度跟随文本;音频
在其中被计数,从未被转录(口语转折匹配
lastUserText: "") (中文(简体) ). InvokeModelWithResponseStream(没有消费者称它) 护栏评估本身 (单位:千美元)ApplyGuardrail; 脚本决定护栏何时介入, 快速缓存算术 (cache sorders计数为0,除非脚本被写入),模型特定输出符号限制.- SigV4 签名未被验证;访问密钥 id 只选择一个命名空间 .
API 密码
| 导出 | 仁爱 | 说明 |
|---|---|---|
BedrockAPI | 类 | 进程模拟器 : fetch, (中文(简体) ), reset, (中文(简体) ), scripts(), (中文(简体) ), putScripts(scripts, replace?), (中文(简体) ), removeScripts(id?), (中文(简体) ), stats()选项: sqlite, (中文(简体) ), now, (中文(简体) ), namespace, (中文(简体) ), settings, (中文(简体) ), scripts, (中文(简体) ), sleep。 。 。 . |
createRuntime | 函数 | 具有完整服务合同的仿真器(健康,管理员,命名空间,SigV4证书,预设,脚本). 选项 : settings, (中文(简体) ), scripts, (中文(简体) ), clock, (中文(简体) ), seed, (中文(简体) ), adminKey, (中文(简体) ), onLog, (中文(简体) ), sqlite。 。 。 . |
BEDROCK_PRESETS | 对象 | 每个命名的断层预设. |
BEDROCK_NAMESPACE | 字符串 | 服务名称, "bedrock"。 。 。 . |
bedrockError | 函数 | 贝德罗克错误反应( A)status, (中文(简体) ), x-amzn-ErrorType, (中文(简体) ), {message}) (中文(简体) ). |
accessKeyCredential | 函数 | SigV4 访问请求的密钥 ID( 如何将证书映射到命名空间) . |
clockSleep | 函数 | 等待(可能冷冻)仿真时钟的睡眠. |
titanEmbedding | 函数 | 确定性单元矢量土卫一回答. |
lexicalEmbedding, (中文(简体) ), EMBEDDING_MODES | 函数,数组 | 选择式相似性保留嵌入和 embeddingMode 数值. |
sampleSchema | 函数 | JSON Schema的最小实例(无标注的结构输出). |
parseScript | 函数 | 验证一个脚本( 什么 PUT /__admin/scripts 运行). |
MODEL_OPERATIONS, (中文(简体) ), STOP_REASONS, (中文(简体) ), TURN_FAULTS | 数组 | 价值 operation, (中文(简体) ), stopReason 财务报告和审定财务报表 fault 接受 . |
DEFAULT_SETTINGS, (中文(简体) ), DEFAULT_CHAT_TEXT, (中文(简体) ), DEFAULT_CLASSIFIER, (中文(简体) ), DEFAULT_SOAP_NOTE, (中文(简体) ), GUARDRAIL_BLOCKED_TEXT | 数值 | 诸相缺失. |
encodeMessage, (中文(简体) ), decodeMessage, (中文(简体) ), FrameReader, (中文(简体) ), readFrames, (中文(简体) ), eventFrame, (中文(简体) ), exceptionFrame, (中文(简体) ), unwrapSigned, (中文(简体) ), crc32, (中文(简体) ), EventStreamError | 代码c | 事件流编码器(精确的前奏,头和CRC32),双向. |
document, (中文(简体) ), operationIds, (中文(简体) ), supportedOperationIds | 数值 | 销售商为OpenAPI合同及其业务代号. |
createServer, (中文(简体) ), serveTarget, (中文(简体) ), DEFAULT_PORT, (中文(简体) ), listenH2c (单位:千美元)./server(中文(简体) ) | 节点 | 在一个端口上服务 h2c + HTTP/1.1 serve CLI 目标; 第8796端口; 任何获取处理器的双协议收听器. |
部分 嘲笑鸟。 。 。 .