diff --git a/bindings/lingua-wasm/package.json b/bindings/lingua-wasm/package.json index 7d1e6143..fc5b2228 100644 --- a/bindings/lingua-wasm/package.json +++ b/bindings/lingua-wasm/package.json @@ -4,8 +4,8 @@ "description": "WASM bindings for Lingua", "scripts": { "build": "pnpm run build:nodejs && pnpm run build:web", - "build:nodejs": "cd ../../crates/lingua && wasm-pack build --target nodejs --release --out-dir ../../bindings/lingua-wasm/nodejs --no-pack", - "build:web": "cd ../../crates/lingua && wasm-pack build --target web --release --out-dir ../../bindings/lingua-wasm/web --no-pack" + "build:nodejs": "cd ../../crates/lingua && wasm-pack build --target nodejs --release --out-dir ../../bindings/lingua-wasm/nodejs --no-pack --features bedrock", + "build:web": "cd ../../crates/lingua && wasm-pack build --target web --release --out-dir ../../bindings/lingua-wasm/web --no-pack --features bedrock" }, "files": [ "nodejs", diff --git a/crates/lingua/Cargo.toml b/crates/lingua/Cargo.toml index f3089c61..7908528b 100644 --- a/crates/lingua/Cargo.toml +++ b/crates/lingua/Cargo.toml @@ -36,7 +36,6 @@ assert-json-diff.workspace = true url.workspace = true urlencoding.workspace = true base64.workspace = true -aws-sdk-bedrockruntime = { workspace = true, optional = true } pyo3 = { workspace = true, optional = true } [target.'cfg(target_arch = "wasm32")'.dependencies] @@ -48,6 +47,7 @@ serde-wasm-bindgen.workspace = true [target.'cfg(not(target_arch = "wasm32"))'.dependencies] reqwest.workspace = true +aws-sdk-bedrockruntime = { workspace = true, optional = true } [dev-dependencies] tokio-test.workspace = true diff --git a/crates/lingua/src/providers/bedrock/mod.rs b/crates/lingua/src/providers/bedrock/mod.rs index 294ef4ea..6ede6de7 100644 --- a/crates/lingua/src/providers/bedrock/mod.rs +++ b/crates/lingua/src/providers/bedrock/mod.rs @@ -16,6 +16,7 @@ pub mod response; pub use adapter::BedrockAdapter; // Re-export commonly used AWS SDK types (note: these don't have Serde by default) +#[cfg(not(target_arch = "wasm32"))] pub use aws_sdk_bedrockruntime::types::{ ContentBlock, ConversationRole, Message, SystemContentBlock, }; diff --git a/payloads/scripts/transforms/__snapshots__/transforms.test.ts.snap b/payloads/scripts/transforms/__snapshots__/transforms.test.ts.snap index bf00c6e4..34f8ceec 100644 --- a/payloads/scripts/transforms/__snapshots__/transforms.test.ts.snap +++ b/payloads/scripts/transforms/__snapshots__/transforms.test.ts.snap @@ -1,573 +1,660 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`anthropic → chat-completions > cacheControl1hParam > request 1`] = ` +exports[`anthropic → bedrock > complexReasoningRequest > request 1`] = ` { - "max_completion_tokens": 1024, + "inferenceConfig": { + "maxTokens": 20000, + }, "messages": [ { "content": [ { - "text": "Be helpful.", - "type": "text", + "text": "There is a digital clock, with minutes and hours in the form of 00:00. The clock shows all times from 00:00 to 23:59 and repeating. Imagine you had a list of all these times. Which digit(s) is the most common and which is the rarest? Can you find their percentage?", }, ], - "role": "system", - }, - { - "content": "Hi", "role": "user", }, ], - "model": "gpt-5-nano", + "modelId": "claude-sonnet-4-5-20250929", } `; -exports[`anthropic → chat-completions > cacheControl1hParam > response 1`] = ` +exports[`anthropic → bedrock > complexReasoningRequest > response 1`] = ` { "content": [ { - "text": "Hi there! How can I help today? I can answer questions, help with writing or editing, brainstorm ideas, explain concepts, or assist with code. If you’re not sure, tell me your goal and I’ll suggest something.", + "text": "# Digital Clock Digit Analysis + +Let me work through this systematically by counting digit occurrences across all 24-hour times. + +## Setting Up the Problem + +A full day has **1,440 minutes** (00:00 through 23:59), and each time displays 4 digits. + +**Total digit positions: 1,440 × 4 = 5,760 digits** + +## Counting Each Position + +Let me count how often each digit (0-9) appears in each of the 4 positions: + +### Hours (00-23) +- **Tens place**: 0(00-09)×10, 1(10-19)×10, 2(20-23)×4 = cycles 24 times/day +- **Ones place**: Each digit 0-9 appears in every 10-hour cycle, repeated 2.4 times + +### Minutes (00-59) +- **Tens place**: Each digit 0-5 appears 10 times per hour, so 240 times/day +- **Ones place**: Each digit 0-9 appears 6 times per hour, so 144 times/day + +## Complete Count per Digit + +| Digit | Tens(H) | Ones(H) | Tens(M) | Ones(M) | **Total** | +|-------|---------|---------|---------|---------|-----------| +| 0 | 264 | 144 | 240 | 144 | **792** | +| 1 | 240 | 144 | 240 | 144 | **768** | +| 2 | 240 | 144 | 240 | 144 | **768** | +| 3 | 144 | 144 | 240 | 144 | **672** | +| 4 | 144 | 144 | 240 | 144 | **672** | +| 5 | 144 | 144 | 240 | 144 | **672** | +| 6 | 0 | 0 | 0 | 144 | **144** | +| 7 | 0 | 0 | 0 | 144 | **144** | +| 8 | 0 | 0 | 0 | 144 | **144** | +| 9 | 0 | 0 | 0 | 144 | **144** | + +## Results + +**Most Common: 0** +- Appears: **792 times** +- Percentage: 792 ÷ 5,760 = **13.75%** + +**Rarest: 6, 7, 8, and 9** (tied) +- Each appears: **144 times** +- Percentage: 144 ÷ 5,760 = **2.5%** + +The digit 0 dominates because it appears frequently in leading positions (00-09 hours, 00-09 and 00-59 minutes), while 6-9 only appear in the ones place of minutes.", "type": "text", }, ], - "id": "msg_DPVSonDHUFyqkBUAHfVZZu7VBv3wt", - "model": "gpt-5-nano-2025-08-07", + "id": "msg_transformed", + "model": "transformed", "role": "assistant", "stop_reason": "end_turn", "type": "message", "usage": { + "cache_creation_input_tokens": 0, "cache_read_input_tokens": 0, - "input_tokens": 14, - "output_tokens": 248, + "input_tokens": 80, + "output_tokens": 735, }, } `; -exports[`anthropic → chat-completions > cacheControl5mParam > request 1`] = ` +exports[`anthropic → bedrock > multimodalRequest > request 1`] = ` { - "max_completion_tokens": 1024, + "inferenceConfig": { + "maxTokens": 300, + }, "messages": [ { "content": [ { - "text": "Be helpful.", - "type": "text", + "text": "What do you see in this image?", + }, + { + "image": { + "format": "jpeg", + "source": { + "bytes": "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", + }, + }, }, ], - "role": "system", + "role": "user", }, + ], + "modelId": "claude-sonnet-4-5-20250929", +} +`; + +exports[`anthropic → bedrock > reasoningRequest > request 1`] = ` +{ + "inferenceConfig": { + "maxTokens": 20000, + }, + "messages": [ { - "content": "Hi", + "content": [ + { + "text": "Solve this step by step: If a train travels 60 mph for 2 hours, then 80 mph for 1 hour, what's the average speed?", + }, + ], "role": "user", }, ], - "model": "gpt-5-nano", + "modelId": "claude-sonnet-4-5-20250929", } `; -exports[`anthropic → chat-completions > cacheControl5mParam > response 1`] = ` +exports[`anthropic → bedrock > reasoningRequest > response 1`] = ` { "content": [ { - "text": "Hi! How can I help today? I can answer questions, explain concepts, draft or edit text, help with coding, plan a trip, summarize articles, translate, brainstorm ideas, and more. What would you like to do?", + "text": "# Solving for Average Speed + +## Step 1: Find the distance for each segment + +**First segment:** +- Speed = 60 mph, Time = 2 hours +- Distance = Speed × Time = 60 × 2 = **120 miles** + +**Second segment:** +- Speed = 80 mph, Time = 1 hour +- Distance = Speed × Time = 80 × 1 = **80 miles** + +## Step 2: Find the total distance and total time + +- **Total distance** = 120 + 80 = **200 miles** +- **Total time** = 2 + 1 = **3 hours** + +## Step 3: Calculate average speed + +$$\\text{Average Speed} = \\frac{\\text{Total Distance}}{\\text{Total Time}} = \\frac{200}{3} = \\mathbf{66.\\overline{6} \\text{ mph}}$$ + +**Answer: 66⅔ mph (or approximately 66.67 mph)**", "type": "text", }, ], - "id": "msg_DPVSo4YeK4792uQkf25XXVn5hWVIp", - "model": "gpt-5-nano-2025-08-07", + "id": "msg_transformed", + "model": "transformed", "role": "assistant", "stop_reason": "end_turn", "type": "message", "usage": { + "cache_creation_input_tokens": 0, "cache_read_input_tokens": 0, - "input_tokens": 14, - "output_tokens": 312, + "input_tokens": 45, + "output_tokens": 238, }, } `; -exports[`anthropic → chat-completions > complexReasoningRequest > request 1`] = ` +exports[`anthropic → bedrock > reasoningRequestTruncated > request 1`] = ` { - "max_completion_tokens": 20000, + "inferenceConfig": { + "maxTokens": 100, + }, "messages": [ { - "content": "There is a digital clock, with minutes and hours in the form of 00:00. The clock shows all times from 00:00 to 23:59 and repeating. Imagine you had a list of all these times. Which digit(s) is the most common and which is the rarest? Can you find their percentage?", + "content": [ + { + "text": "Solve this step by step: If a train travels 60 mph for 2 hours, then 80 mph for 1 hour, what's the average speed?", + }, + ], "role": "user", }, ], - "model": "gpt-5-nano", + "modelId": "claude-sonnet-4-5-20250929", } `; -exports[`anthropic → chat-completions > complexReasoningRequest > response 1`] = ` +exports[`anthropic → bedrock > reasoningRequestTruncated > response 1`] = ` { "content": [ { - "text": "Total times: 24 hours × 60 minutes = 1440 times. Each time has 4 digits (HHMM), so 1440 × 4 = 5760 digits in total. - -Count digits in each position: - -- Hour tens (H1): 0 for 00–09 (10 hours) and 1 for 10–19 (10 hours), 2 for 20–23 (4 hours). So H1 contributes: 0→600, 1→600, 2→240, others→0. -- Hour units (H2): digits 0,1,2,3 appear 3 times each (00,10,20 etc. for 0–3), digits 4–9 appear 2 times each. Across all hours: 0→180, 1→180, 2→180, 3→180, 4→120, 5→120, 6→120, 7→120, 8→120, 9→120. -- Minute tens (M1): digits 0–5 each appear 240 times; digits 6–9 never appear here. So 0→240, 1→240, 2→240, 3→240, 4→240, 5→240, others→0. -- Minute units (M2): each digit 0–9 appears 144 times. + "text": "# Average Speed Calculation -Sum per digit (0–9): - -- 0: 600 + 180 + 240 + 144 = 1,164 -- 1: 600 + 180 + 240 + 144 = 1,164 -- 2: 240 + 180 + 240 + 144 = 804 -- 3: 0 + 180 + 240 + 144 = 564 -- 4: 0 + 120 + 240 + 144 = 504 -- 5: 0 + 120 + 240 + 144 = 504 -- 6: 0 + 120 + 0 + 144 = 264 -- 7: 0 + 120 + 0 + 144 = 264 -- 8: 0 + 120 + 0 + 144 = 264 -- 9: 0 + 120 + 0 + 144 = 264 +**Step 1: Find the distance for the first part** +- Speed × Time = Distance +- 60 mph × 2 hours = **120 miles** -From these counts: -- The most common digits are 0 and 1, each appearing 1,164 times (out of 5,760 digits), i.e., 1,164 / 5,760 ≈ 20.21%. -- The rarest digits are 6, 7, 8, and 9, each appearing 264 times, i.e., 264 / 5,760 ≈ 4.58%. +**Step 2: Find the distance for the second part** +- 80 mph × 1 hour = **80 miles** -So: most common - digits 0 and 1 (about 20.21% each); rarest - digits 6–9 (about 4.58% each).", +**Step 3: Find total distance** +- 120 + 80 = **200 miles**", "type": "text", }, ], - "id": "msg_D8WwNOBX3OKWYX8U00UuE09bjaCEU", - "model": "gpt-5-nano-2025-08-07", + "id": "msg_transformed", + "model": "transformed", "role": "assistant", - "stop_reason": "end_turn", + "stop_reason": "max_tokens", "type": "message", "usage": { + "cache_creation_input_tokens": 0, "cache_read_input_tokens": 0, - "input_tokens": 74, - "output_tokens": 6276, + "input_tokens": 45, + "output_tokens": 100, }, } `; -exports[`anthropic → chat-completions > imageContentParam > request 1`] = ` +exports[`anthropic → bedrock > reasoningWithOutput > request 1`] = ` { - "max_completion_tokens": 1024, + "inferenceConfig": { + "maxTokens": 20000, + }, "messages": [ { "content": [ { - "image_url": { - "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==", - }, - "type": "image_url", - }, - { - "text": "Describe.", - "type": "text", + "text": "What color is the sky?", }, ], "role": "user", }, ], - "model": "gpt-5-nano", + "modelId": "claude-sonnet-4-5-20250929", } `; -exports[`anthropic → chat-completions > imageContentParam > response 1`] = ` +exports[`anthropic → bedrock > reasoningWithOutput > response 1`] = ` { "content": [ { - "text": "A bright lime-green circular badge on a white background. The circle has a subtle gradient with a lighter center and slightly darker edge, giving a glossy, 3D feel. There’s a tiny highlight near the top-left and no other elements or text. Overall minimal and clean.", + "text": "The sky typically appears **blue** during the day, caused by sunlight scattering off molecules in the atmosphere (a phenomenon called Rayleigh scattering). + +However, the sky can appear different colors depending on conditions: +- **Orange, red, or pink** at sunrise and sunset +- **Gray or white** on cloudy days +- **Dark blue or black** at night +- **Reddish** during dust storms or air pollution", "type": "text", }, ], - "id": "msg_DPVSrJGAd0053nMmVMjPDD5JbBDDv", - "model": "gpt-5-nano-2025-08-07", + "id": "msg_transformed", + "model": "transformed", "role": "assistant", "stop_reason": "end_turn", "type": "message", "usage": { + "cache_creation_input_tokens": 0, "cache_read_input_tokens": 0, - "input_tokens": 11, - "output_tokens": 705, + "input_tokens": 13, + "output_tokens": 100, }, } `; -exports[`anthropic → chat-completions > instructionsParam > request 1`] = ` +exports[`anthropic → bedrock > simpleRequest > request 1`] = ` { - "max_completion_tokens": 1024, + "inferenceConfig": { + "maxTokens": 20000, + }, "messages": [ { - "content": "Say OK", - "role": "system", - }, - { - "content": "Hi", + "content": [ + { + "text": "What is the capital of France?", + }, + ], "role": "user", }, ], - "model": "gpt-5-nano", + "modelId": "claude-sonnet-4-5-20250929", } `; -exports[`anthropic → chat-completions > instructionsParam > response 1`] = ` +exports[`anthropic → bedrock > simpleRequest > response 1`] = ` { "content": [ { - "text": "OK", + "text": "The capital of France is Paris.", "type": "text", }, ], - "id": "msg_DPVSgekiZBNHXwV8YKmyRk1ZUOxj3", - "model": "gpt-5-nano-2025-08-07", + "id": "msg_transformed", + "model": "transformed", "role": "assistant", "stop_reason": "end_turn", "type": "message", "usage": { + "cache_creation_input_tokens": 0, "cache_read_input_tokens": 0, - "input_tokens": 13, - "output_tokens": 138, + "input_tokens": 14, + "output_tokens": 10, }, } `; -exports[`anthropic → chat-completions > maxCompletionTokensParam > request 1`] = ` +exports[`anthropic → bedrock > systemMessageArrayContent > request 1`] = ` { - "max_completion_tokens": 500, + "inferenceConfig": { + "maxTokens": 300, + }, "messages": [ { - "content": "Say ok.", + "content": [ + { + "text": "System: You are a helpful data analyst. The default data source is project_logs with id abc-123.", + }, + ], + "role": "user", + }, + { + "content": [ + { + "text": "What errors occurred recently?", + }, + ], "role": "user", }, ], - "model": "gpt-5-nano", + "modelId": "claude-sonnet-4-5-20250929", } `; -exports[`anthropic → chat-completions > maxCompletionTokensParam > response 1`] = ` +exports[`anthropic → bedrock > systemMessageArrayContent > response 1`] = ` { "content": [ { - "text": "Ok.", + "text": "# Recent Errors in Project Logs (abc-123) + +I'd be happy to help you analyze recent errors, but I need a bit more information to give you the most useful analysis: + +1. **Time range**: What does "recently" mean for you? + - Last 24 hours? + - Last 7 days? + - Last week? + +2. **Error type**: Are you interested in: + - All errors? + - Specific error categories (e.g., database, API, authentication)? + - Errors above a certain severity level? + +3. **Level of detail**: Would you like: + - A summary count of errors? + - Top errors by frequency? + - Full error logs with stack traces? + - Errors grouped by component/service? + +Once you provide these details, I can query the project_logs (abc-123) database and give you a comprehensive error analysis.", "type": "text", }, ], - "id": "msg_DPVSlQpyvs25fw3xSM7e31P4cOaVt", - "model": "gpt-5-nano-2025-08-07", + "id": "msg_transformed", + "model": "transformed", "role": "assistant", "stop_reason": "end_turn", "type": "message", "usage": { + "cache_creation_input_tokens": 0, "cache_read_input_tokens": 0, - "input_tokens": 9, - "output_tokens": 139, + "input_tokens": 35, + "output_tokens": 209, }, } `; -exports[`anthropic → chat-completions > metadataParam > request 1`] = ` +exports[`anthropic → bedrock > toolCallRequest > request 1`] = ` { - "max_completion_tokens": 1024, - "messages": [ - { - "content": "Say ok.", - "role": "user", - }, - ], - "metadata": { - "user_id": "user-12345", + "inferenceConfig": { + "maxTokens": 20000, }, - "model": "gpt-5-nano", -} -`; - -exports[`anthropic → chat-completions > multimodalRequest > request 1`] = ` -{ - "max_completion_tokens": 300, "messages": [ { "content": [ { - "text": "What do you see in this image?", - "type": "text", - }, - { - "image_url": { - "url": "data:image/jpeg;base64,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", - }, - "type": "image_url", + "text": "What's the weather like in San Francisco?", }, ], "role": "user", }, ], - "model": "gpt-5-nano", + "modelId": "claude-sonnet-4-5-20250929", + "toolConfig": { + "tools": [ + { + "toolSpec": { + "description": "Get the current weather for a location", + "inputSchema": { + "json": { + "properties": { + "location": { + "description": "The city and state, e.g. San Francisco, CA", + "type": "string", + }, + }, + "required": [ + "location", + ], + "type": "object", + }, + }, + "name": "get_weather", + }, + }, + ], + }, } `; -exports[`anthropic → chat-completions > multimodalRequest > response 1`] = ` +exports[`anthropic → bedrock > toolCallRequest > response 1`] = ` { "content": [ { - "text": "", - "type": "text", + "id": "tooluse_LmwV398ieC9MtSQdcAb3dj", + "input": { + "location": "San Francisco, CA", + }, + "name": "get_weather", + "type": "tool_use", }, ], - "id": "msg_D8WwJGn3cD8awZvtT5DIX43pZdj91", - "model": "gpt-5-nano-2025-08-07", + "id": "msg_transformed", + "model": "transformed", "role": "assistant", - "stop_reason": "max_tokens", + "stop_reason": "tool_use", "type": "message", "usage": { + "cache_creation_input_tokens": 0, "cache_read_input_tokens": 0, - "input_tokens": 99, - "output_tokens": 300, + "input_tokens": 585, + "output_tokens": 57, }, } `; -exports[`anthropic → chat-completions > outputConfigEffortWithJsonSchemaParam > request 1`] = ` +exports[`anthropic → chat-completions > cacheControl1hParam > request 1`] = ` { - "max_completion_tokens": 16000, + "max_completion_tokens": 1024, "messages": [ { - "content": "Extract: John is 25.", + "content": [ + { + "text": "Be helpful.", + "type": "text", + }, + ], + "role": "system", + }, + { + "content": "Hi", "role": "user", }, ], "model": "gpt-5-nano", - "reasoning_effort": "medium", - "response_format": { - "json_schema": { - "name": "response", - "schema": { - "additionalProperties": false, - "properties": { - "age": { - "type": "number", - }, - "name": { - "type": "string", - }, - }, - "required": [ - "name", - "age", - ], - "type": "object", - }, - }, - "type": "json_schema", - }, } `; -exports[`anthropic → chat-completions > outputConfigEffortWithJsonSchemaParam > response 1`] = ` +exports[`anthropic → chat-completions > cacheControl1hParam > response 1`] = ` { "content": [ { - "text": "{"name":"John","age":25}", + "text": "Hi there! How can I help today? I can answer questions, help with writing or editing, brainstorm ideas, explain concepts, or assist with code. If you’re not sure, tell me your goal and I’ll suggest something.", "type": "text", }, ], - "id": "msg_DPVSvWDXJtiT44hpCUkfsQIgEwjH4", + "id": "msg_DPVSonDHUFyqkBUAHfVZZu7VBv3wt", "model": "gpt-5-nano-2025-08-07", "role": "assistant", "stop_reason": "end_turn", "type": "message", "usage": { "cache_read_input_tokens": 0, - "input_tokens": 45, - "output_tokens": 533, + "input_tokens": 14, + "output_tokens": 248, }, } `; -exports[`anthropic → chat-completions > outputConfigJsonSchemaParam > request 1`] = ` +exports[`anthropic → chat-completions > cacheControl5mParam > request 1`] = ` { "max_completion_tokens": 1024, "messages": [ { - "content": "Extract: John is 25.", + "content": [ + { + "text": "Be helpful.", + "type": "text", + }, + ], + "role": "system", + }, + { + "content": "Hi", "role": "user", }, ], "model": "gpt-5-nano", - "response_format": { - "json_schema": { - "name": "response", - "schema": { - "additionalProperties": false, - "properties": { - "age": { - "type": "number", - }, - "name": { - "type": "string", - }, - }, - "required": [ - "name", - "age", - ], - "type": "object", - }, - }, - "type": "json_schema", - }, } `; -exports[`anthropic → chat-completions > outputConfigJsonSchemaParam > response 1`] = ` +exports[`anthropic → chat-completions > cacheControl5mParam > response 1`] = ` { "content": [ { - "text": "{"name":"John","age":25}", + "text": "Hi! How can I help today? I can answer questions, explain concepts, draft or edit text, help with coding, plan a trip, summarize articles, translate, brainstorm ideas, and more. What would you like to do?", "type": "text", }, ], - "id": "msg_DPVStSDW7GJlWptHDnOn0NRbquX6U", + "id": "msg_DPVSo4YeK4792uQkf25XXVn5hWVIp", "model": "gpt-5-nano-2025-08-07", "role": "assistant", "stop_reason": "end_turn", "type": "message", "usage": { "cache_read_input_tokens": 0, - "input_tokens": 45, - "output_tokens": 661, + "input_tokens": 14, + "output_tokens": 312, }, } `; -exports[`anthropic → chat-completions > outputFormatJsonSchemaParam > request 1`] = ` +exports[`anthropic → chat-completions > complexReasoningRequest > request 1`] = ` { - "max_completion_tokens": 1024, + "max_completion_tokens": 20000, "messages": [ { - "content": "Extract: John is 25.", + "content": "There is a digital clock, with minutes and hours in the form of 00:00. The clock shows all times from 00:00 to 23:59 and repeating. Imagine you had a list of all these times. Which digit(s) is the most common and which is the rarest? Can you find their percentage?", "role": "user", }, ], "model": "gpt-5-nano", - "response_format": { - "json_schema": { - "name": "response", - "schema": { - "additionalProperties": false, - "properties": { - "age": { - "type": "number", - }, - "name": { - "type": "string", - }, - }, - "required": [ - "name", - "age", - ], - "type": "object", - }, - }, - "type": "json_schema", - }, } `; -exports[`anthropic → chat-completions > outputFormatJsonSchemaParam > response 1`] = ` +exports[`anthropic → chat-completions > complexReasoningRequest > response 1`] = ` { "content": [ { - "text": "{"age":25,"name":"John"}", + "text": "Total times: 24 hours × 60 minutes = 1440 times. Each time has 4 digits (HHMM), so 1440 × 4 = 5760 digits in total. + +Count digits in each position: + +- Hour tens (H1): 0 for 00–09 (10 hours) and 1 for 10–19 (10 hours), 2 for 20–23 (4 hours). So H1 contributes: 0→600, 1→600, 2→240, others→0. +- Hour units (H2): digits 0,1,2,3 appear 3 times each (00,10,20 etc. for 0–3), digits 4–9 appear 2 times each. Across all hours: 0→180, 1→180, 2→180, 3→180, 4→120, 5→120, 6→120, 7→120, 8→120, 9→120. +- Minute tens (M1): digits 0–5 each appear 240 times; digits 6–9 never appear here. So 0→240, 1→240, 2→240, 3→240, 4→240, 5→240, others→0. +- Minute units (M2): each digit 0–9 appears 144 times. + +Sum per digit (0–9): + +- 0: 600 + 180 + 240 + 144 = 1,164 +- 1: 600 + 180 + 240 + 144 = 1,164 +- 2: 240 + 180 + 240 + 144 = 804 +- 3: 0 + 180 + 240 + 144 = 564 +- 4: 0 + 120 + 240 + 144 = 504 +- 5: 0 + 120 + 240 + 144 = 504 +- 6: 0 + 120 + 0 + 144 = 264 +- 7: 0 + 120 + 0 + 144 = 264 +- 8: 0 + 120 + 0 + 144 = 264 +- 9: 0 + 120 + 0 + 144 = 264 + +From these counts: +- The most common digits are 0 and 1, each appearing 1,164 times (out of 5,760 digits), i.e., 1,164 / 5,760 ≈ 20.21%. +- The rarest digits are 6, 7, 8, and 9, each appearing 264 times, i.e., 264 / 5,760 ≈ 4.58%. + +So: most common - digits 0 and 1 (about 20.21% each); rarest - digits 6–9 (about 4.58% each).", "type": "text", }, ], - "id": "msg_DPVSt1QnOo6vIZ1SewBG5ceWxzPMu", + "id": "msg_D8WwNOBX3OKWYX8U00UuE09bjaCEU", "model": "gpt-5-nano-2025-08-07", "role": "assistant", "stop_reason": "end_turn", "type": "message", "usage": { "cache_read_input_tokens": 0, - "input_tokens": 45, - "output_tokens": 213, + "input_tokens": 74, + "output_tokens": 6276, }, } `; -exports[`anthropic → chat-completions > parallelToolCallsDisabledParam > request 1`] = ` +exports[`anthropic → chat-completions > imageContentParam > request 1`] = ` { "max_completion_tokens": 1024, "messages": [ { - "content": "NYC and LA weather", - "role": "user", - }, - ], - "model": "gpt-5-nano", - "parallel_tool_calls": false, - "tool_choice": "auto", - "tools": [ - { - "function": { - "description": "Get weather", - "name": "get_weather", - "parameters": { - "properties": { - "location": { - "type": "string", - }, + "content": [ + { + "image_url": { + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==", }, - "required": [ - "location", - ], - "type": "object", + "type": "image_url", }, - }, - "type": "function", + { + "text": "Describe.", + "type": "text", + }, + ], + "role": "user", }, ], + "model": "gpt-5-nano", } `; -exports[`anthropic → chat-completions > parallelToolCallsDisabledParam > response 1`] = ` +exports[`anthropic → chat-completions > imageContentParam > response 1`] = ` { "content": [ { - "id": "call_xmYLSNHiotRKEEJlptj9BQ8n", - "input": { - "location": "New York City", - }, - "name": "get_weather", - "type": "tool_use", + "text": "A bright lime-green circular badge on a white background. The circle has a subtle gradient with a lighter center and slightly darker edge, giving a glossy, 3D feel. There’s a tiny highlight near the top-left and no other elements or text. Overall minimal and clean.", + "type": "text", }, ], - "id": "msg_DPVSgGCIy63sCabJjHtWd9PwBMlSp", + "id": "msg_DPVSrJGAd0053nMmVMjPDD5JbBDDv", "model": "gpt-5-nano-2025-08-07", "role": "assistant", - "stop_reason": "tool_use", + "stop_reason": "end_turn", "type": "message", "usage": { "cache_read_input_tokens": 0, - "input_tokens": 126, - "output_tokens": 89, + "input_tokens": 11, + "output_tokens": 705, }, } `; -exports[`anthropic → chat-completions > promptCacheKeyParam > request 1`] = ` +exports[`anthropic → chat-completions > instructionsParam > request 1`] = ` { "max_completion_tokens": 1024, "messages": [ { - "content": [ - { - "text": "Be helpful.", - "type": "text", - }, - ], + "content": "Say OK", "role": "system", }, { - "content": "Say ok.", + "content": "Hi", "role": "user", }, ], @@ -575,108 +662,94 @@ exports[`anthropic → chat-completions > promptCacheKeyParam > request 1`] = ` } `; -exports[`anthropic → chat-completions > promptCacheKeyParam > response 1`] = ` +exports[`anthropic → chat-completions > instructionsParam > response 1`] = ` { "content": [ { - "text": "ok", + "text": "OK", "type": "text", }, ], - "id": "msg_DPVSiwqS73gbELbjrlBGAJOhzPaqR", + "id": "msg_DPVSgekiZBNHXwV8YKmyRk1ZUOxj3", "model": "gpt-5-nano-2025-08-07", "role": "assistant", "stop_reason": "end_turn", "type": "message", "usage": { "cache_read_input_tokens": 0, - "input_tokens": 16, + "input_tokens": 13, "output_tokens": 138, }, } `; -exports[`anthropic → chat-completions > reasoningEffortLowParam > request 1`] = ` +exports[`anthropic → chat-completions > maxCompletionTokensParam > request 1`] = ` { - "max_completion_tokens": 16000, + "max_completion_tokens": 500, "messages": [ { - "content": "What is 2+2?", + "content": "Say ok.", "role": "user", }, ], "model": "gpt-5-nano", - "reasoning_effort": "low", } `; -exports[`anthropic → chat-completions > reasoningEffortLowParam > response 1`] = ` +exports[`anthropic → chat-completions > maxCompletionTokensParam > response 1`] = ` { "content": [ { - "text": "4", + "text": "Ok.", "type": "text", }, ], - "id": "msg_DPVSem1L7jmcLwMP9HtxHedyryg8l", + "id": "msg_DPVSlQpyvs25fw3xSM7e31P4cOaVt", "model": "gpt-5-nano-2025-08-07", "role": "assistant", "stop_reason": "end_turn", "type": "message", "usage": { "cache_read_input_tokens": 0, - "input_tokens": 13, - "output_tokens": 10, + "input_tokens": 9, + "output_tokens": 139, }, } `; -exports[`anthropic → chat-completions > reasoningRequest > request 1`] = ` +exports[`anthropic → chat-completions > metadataParam > request 1`] = ` { - "max_completion_tokens": 20000, + "max_completion_tokens": 1024, "messages": [ { - "content": "Solve this step by step: If a train travels 60 mph for 2 hours, then 80 mph for 1 hour, what's the average speed?", + "content": "Say ok.", "role": "user", }, ], + "metadata": { + "user_id": "user-12345", + }, "model": "gpt-5-nano", } `; -exports[`anthropic → chat-completions > reasoningRequest > response 1`] = ` +exports[`anthropic → chat-completions > multimodalRequest > request 1`] = ` { - "content": [ - { - "text": "Step 1: Distance for first part = speed × time = 60 mph × 2 h = 120 miles. -Step 2: Distance for second part = 80 mph × 1 h = 80 miles. -Step 3: Total distance = 120 + 80 = 200 miles. -Step 4: Total time = 2 + 1 = 3 hours. -Step 5: Average speed = total distance / total time = 200 / 3 mph = 66 2/3 mph (about 66.67 mph). - -Answer: 66 2/3 mph.", - "type": "text", - }, - ], - "id": "msg_D8Ww7xQ50eq2Js3P6aJ5bA9RCsucg", - "model": "gpt-5-nano-2025-08-07", - "role": "assistant", - "stop_reason": "end_turn", - "type": "message", - "usage": { - "cache_read_input_tokens": 0, - "input_tokens": 38, - "output_tokens": 454, - }, -} -`; - -exports[`anthropic → chat-completions > reasoningRequestTruncated > request 1`] = ` -{ - "max_completion_tokens": 100, + "max_completion_tokens": 300, "messages": [ { - "content": "Solve this step by step: If a train travels 60 mph for 2 hours, then 80 mph for 1 hour, what's the average speed?", + "content": [ + { + "text": "What do you see in this image?", + "type": "text", + }, + { + "image_url": { + "url": "data:image/jpeg;base64,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", + }, + "type": "image_url", + }, + ], "role": "user", }, ], @@ -684,7 +757,7 @@ exports[`anthropic → chat-completions > reasoningRequestTruncated > request 1` } `; -exports[`anthropic → chat-completions > reasoningRequestTruncated > response 1`] = ` +exports[`anthropic → chat-completions > multimodalRequest > response 1`] = ` { "content": [ { @@ -692,221 +765,332 @@ exports[`anthropic → chat-completions > reasoningRequestTruncated > response 1 "type": "text", }, ], - "id": "msg_D8WwEXbGME8woQ2rReuPCDxRjmHkJ", + "id": "msg_D8WwJGn3cD8awZvtT5DIX43pZdj91", "model": "gpt-5-nano-2025-08-07", "role": "assistant", "stop_reason": "max_tokens", "type": "message", "usage": { "cache_read_input_tokens": 0, - "input_tokens": 38, - "output_tokens": 100, + "input_tokens": 99, + "output_tokens": 300, }, } `; -exports[`anthropic → chat-completions > reasoningSummaryParam > request 1`] = ` +exports[`anthropic → chat-completions > outputConfigEffortWithJsonSchemaParam > request 1`] = ` { "max_completion_tokens": 16000, "messages": [ { - "content": "What is 2+2?", + "content": "Extract: John is 25.", "role": "user", }, ], "model": "gpt-5-nano", "reasoning_effort": "medium", + "response_format": { + "json_schema": { + "name": "response", + "schema": { + "additionalProperties": false, + "properties": { + "age": { + "type": "number", + }, + "name": { + "type": "string", + }, + }, + "required": [ + "name", + "age", + ], + "type": "object", + }, + }, + "type": "json_schema", + }, } `; -exports[`anthropic → chat-completions > reasoningSummaryParam > response 1`] = ` +exports[`anthropic → chat-completions > outputConfigEffortWithJsonSchemaParam > response 1`] = ` { "content": [ { - "text": "4. In base-10, 2 + 2 equals 4.", + "text": "{"name":"John","age":25}", "type": "text", }, ], - "id": "msg_DPVSe8J6PWXsQfoEq2RbnXx3tWBDD", + "id": "msg_DPVSvWDXJtiT44hpCUkfsQIgEwjH4", "model": "gpt-5-nano-2025-08-07", "role": "assistant", "stop_reason": "end_turn", "type": "message", "usage": { "cache_read_input_tokens": 0, - "input_tokens": 13, - "output_tokens": 153, + "input_tokens": 45, + "output_tokens": 533, }, } `; -exports[`anthropic → chat-completions > reasoningWithOutput > request 1`] = ` +exports[`anthropic → chat-completions > outputConfigJsonSchemaParam > request 1`] = ` { - "max_completion_tokens": 20000, + "max_completion_tokens": 1024, "messages": [ { - "content": "What color is the sky?", + "content": "Extract: John is 25.", "role": "user", }, ], "model": "gpt-5-nano", + "response_format": { + "json_schema": { + "name": "response", + "schema": { + "additionalProperties": false, + "properties": { + "age": { + "type": "number", + }, + "name": { + "type": "string", + }, + }, + "required": [ + "name", + "age", + ], + "type": "object", + }, + }, + "type": "json_schema", + }, } `; -exports[`anthropic → chat-completions > reasoningWithOutput > response 1`] = ` +exports[`anthropic → chat-completions > outputConfigJsonSchemaParam > response 1`] = ` { "content": [ { - "text": "Typically blue during the day. The sky looks blue because sunlight scattering by Earth's atmosphere scatters shorter (blue) wavelengths more than longer (red). At sunrise and sunset, the light passes through more air, so more blue is scattered out and the sky takes on red/orange/pink hues. It can appear gray on cloudy days, and dark/black at night. In space, without atmosphere, the sky is black. If you want, tell me your location or time and I can describe the current color.", + "text": "{"name":"John","age":25}", "type": "text", }, ], - "id": "msg_D8WxDDQyIDbSgoSKDJTtTaCxv1tts", + "id": "msg_DPVStSDW7GJlWptHDnOn0NRbquX6U", "model": "gpt-5-nano-2025-08-07", "role": "assistant", "stop_reason": "end_turn", "type": "message", "usage": { "cache_read_input_tokens": 0, - "input_tokens": 12, - "output_tokens": 752, + "input_tokens": 45, + "output_tokens": 661, }, } `; -exports[`anthropic → chat-completions > safetyIdentifierParam > request 1`] = ` +exports[`anthropic → chat-completions > outputFormatJsonSchemaParam > request 1`] = ` { "max_completion_tokens": 1024, "messages": [ { - "content": "Say ok.", + "content": "Extract: John is 25.", "role": "user", }, ], - "metadata": { - "user_id": "hashed-user-id-abc123", - }, "model": "gpt-5-nano", + "response_format": { + "json_schema": { + "name": "response", + "schema": { + "additionalProperties": false, + "properties": { + "age": { + "type": "number", + }, + "name": { + "type": "string", + }, + }, + "required": [ + "name", + "age", + ], + "type": "object", + }, + }, + "type": "json_schema", + }, } `; -exports[`anthropic → chat-completions > serviceTierParam > request 1`] = ` +exports[`anthropic → chat-completions > outputFormatJsonSchemaParam > response 1`] = ` { - "max_tokens": 1024, - "messages": [ + "content": [ { - "content": "Say ok.", - "role": "user", + "text": "{"age":25,"name":"John"}", + "type": "text", }, ], - "model": "gpt-5-nano", - "service_tier": "auto", + "id": "msg_DPVSt1QnOo6vIZ1SewBG5ceWxzPMu", + "model": "gpt-5-nano-2025-08-07", + "role": "assistant", + "stop_reason": "end_turn", + "type": "message", + "usage": { + "cache_read_input_tokens": 0, + "input_tokens": 45, + "output_tokens": 213, + }, } `; -exports[`anthropic → chat-completions > simpleRequest > request 1`] = ` +exports[`anthropic → chat-completions > parallelToolCallsDisabledParam > request 1`] = ` { - "max_completion_tokens": 20000, + "max_completion_tokens": 1024, "messages": [ { - "content": "What is the capital of France?", + "content": "NYC and LA weather", "role": "user", }, ], "model": "gpt-5-nano", + "parallel_tool_calls": false, + "tool_choice": "auto", + "tools": [ + { + "function": { + "description": "Get weather", + "name": "get_weather", + "parameters": { + "properties": { + "location": { + "type": "string", + }, + }, + "required": [ + "location", + ], + "type": "object", + }, + }, + "type": "function", + }, + ], } `; -exports[`anthropic → chat-completions > simpleRequest > response 1`] = ` +exports[`anthropic → chat-completions > parallelToolCallsDisabledParam > response 1`] = ` { "content": [ { - "text": "Paris.", - "type": "text", + "id": "call_xmYLSNHiotRKEEJlptj9BQ8n", + "input": { + "location": "New York City", + }, + "name": "get_weather", + "type": "tool_use", }, ], - "id": "msg_D8Ww5HsFKrIRw7BCuPTadlfOhw97w", + "id": "msg_DPVSgGCIy63sCabJjHtWd9PwBMlSp", "model": "gpt-5-nano-2025-08-07", "role": "assistant", - "stop_reason": "end_turn", + "stop_reason": "tool_use", "type": "message", "usage": { "cache_read_input_tokens": 0, - "input_tokens": 13, - "output_tokens": 203, + "input_tokens": 126, + "output_tokens": 89, }, } `; -exports[`anthropic → chat-completions > stopSequencesParam > request 1`] = ` +exports[`anthropic → chat-completions > promptCacheKeyParam > request 1`] = ` { "max_completion_tokens": 1024, "messages": [ { - "content": "Count to 20.", + "content": [ + { + "text": "Be helpful.", + "type": "text", + }, + ], + "role": "system", + }, + { + "content": "Say ok.", "role": "user", }, ], - "model": "gpt-4o-mini", - "stop": [ - "10", - "ten", - ], + "model": "gpt-5-nano", } `; -exports[`anthropic → chat-completions > stopSequencesParam > response 1`] = ` +exports[`anthropic → chat-completions > promptCacheKeyParam > response 1`] = ` { "content": [ { - "text": "Sure! Here you go: - -1, 2, 3, 4, 5, 6, 7, 8, 9, ", + "text": "ok", "type": "text", }, ], - "id": "msg_DPVSkSgeGtcQob6PxrRG3vPe4XcmV", - "model": "gpt-4o-mini-2024-07-18", + "id": "msg_DPVSiwqS73gbELbjrlBGAJOhzPaqR", + "model": "gpt-5-nano-2025-08-07", "role": "assistant", "stop_reason": "end_turn", "type": "message", "usage": { "cache_read_input_tokens": 0, - "input_tokens": 12, - "output_tokens": 34, + "input_tokens": 16, + "output_tokens": 138, }, } `; -exports[`anthropic → chat-completions > streamParam > request 1`] = ` +exports[`anthropic → chat-completions > reasoningEffortLowParam > request 1`] = ` { - "max_completion_tokens": 1024, + "max_completion_tokens": 16000, "messages": [ { - "content": "Say hi.", + "content": "What is 2+2?", "role": "user", }, ], "model": "gpt-5-nano", - "stream": true, + "reasoning_effort": "low", } `; -exports[`anthropic → chat-completions > systemMessageArrayContent > request 1`] = ` +exports[`anthropic → chat-completions > reasoningEffortLowParam > response 1`] = ` { - "max_completion_tokens": 300, - "messages": [ + "content": [ { - "content": [ - { - "text": "You are a helpful data analyst. The default data source is project_logs with id abc-123.", - "type": "text", - }, - ], - "role": "system", + "text": "4", + "type": "text", }, + ], + "id": "msg_DPVSem1L7jmcLwMP9HtxHedyryg8l", + "model": "gpt-5-nano-2025-08-07", + "role": "assistant", + "stop_reason": "end_turn", + "type": "message", + "usage": { + "cache_read_input_tokens": 0, + "input_tokens": 13, + "output_tokens": 10, + }, +} +`; + +exports[`anthropic → chat-completions > reasoningRequest > request 1`] = ` +{ + "max_completion_tokens": 20000, + "messages": [ { - "content": "What errors occurred recently?", + "content": "Solve this step by step: If a train travels 60 mph for 2 hours, then 80 mph for 1 hour, what's the average speed?", "role": "user", }, ], @@ -914,467 +1098,498 @@ exports[`anthropic → chat-completions > systemMessageArrayContent > request 1` } `; -exports[`anthropic → chat-completions > systemMessageArrayContent > response 1`] = ` +exports[`anthropic → chat-completions > reasoningRequest > response 1`] = ` { "content": [ { - "text": "", + "text": "Step 1: Distance for first part = speed × time = 60 mph × 2 h = 120 miles. +Step 2: Distance for second part = 80 mph × 1 h = 80 miles. +Step 3: Total distance = 120 + 80 = 200 miles. +Step 4: Total time = 2 + 1 = 3 hours. +Step 5: Average speed = total distance / total time = 200 / 3 mph = 66 2/3 mph (about 66.67 mph). + +Answer: 66 2/3 mph.", "type": "text", }, ], - "id": "msg_D8WxKK6CbhVrFzmz27GtpfxAANyUQ", + "id": "msg_D8Ww7xQ50eq2Js3P6aJ5bA9RCsucg", "model": "gpt-5-nano-2025-08-07", "role": "assistant", - "stop_reason": "max_tokens", + "stop_reason": "end_turn", "type": "message", "usage": { "cache_read_input_tokens": 0, - "input_tokens": 11, - "output_tokens": 300, + "input_tokens": 38, + "output_tokens": 454, }, } `; -exports[`anthropic → chat-completions > temperatureParam > request 1`] = ` +exports[`anthropic → chat-completions > reasoningRequestTruncated > request 1`] = ` { - "max_completion_tokens": 1024, + "max_completion_tokens": 100, "messages": [ { - "content": "Say hi.", + "content": "Solve this step by step: If a train travels 60 mph for 2 hours, then 80 mph for 1 hour, what's the average speed?", "role": "user", }, ], - "model": "gpt-4o-mini", - "temperature": 0.7, + "model": "gpt-5-nano", } `; -exports[`anthropic → chat-completions > temperatureParam > response 1`] = ` +exports[`anthropic → chat-completions > reasoningRequestTruncated > response 1`] = ` { "content": [ { - "text": "Hi! How can I assist you today?", + "text": "", "type": "text", }, ], - "id": "msg_DPVSjvUczLF2Bj764myEOQ8qajc4I", - "model": "gpt-4o-mini-2024-07-18", + "id": "msg_D8WwEXbGME8woQ2rReuPCDxRjmHkJ", + "model": "gpt-5-nano-2025-08-07", "role": "assistant", - "stop_reason": "end_turn", + "stop_reason": "max_tokens", "type": "message", "usage": { "cache_read_input_tokens": 0, - "input_tokens": 10, - "output_tokens": 9, + "input_tokens": 38, + "output_tokens": 100, }, } `; -exports[`anthropic → chat-completions > textFormatJsonSchemaParam > request 1`] = ` +exports[`anthropic → chat-completions > reasoningSummaryParam > request 1`] = ` { - "max_completion_tokens": 1024, + "max_completion_tokens": 16000, "messages": [ { - "content": "Extract: John is 25.", + "content": "What is 2+2?", "role": "user", }, ], "model": "gpt-5-nano", - "response_format": { - "json_schema": { - "name": "response", - "schema": { - "additionalProperties": false, - "properties": { - "age": { - "type": "number", - }, - "name": { - "type": "string", - }, - }, - "required": [ - "name", - "age", - ], - "type": "object", - }, - }, - "type": "json_schema", - }, + "reasoning_effort": "medium", } `; -exports[`anthropic → chat-completions > textFormatJsonSchemaParam > response 1`] = ` +exports[`anthropic → chat-completions > reasoningSummaryParam > response 1`] = ` { "content": [ { - "text": "{"age": 25, "name": "John"}", + "text": "4. In base-10, 2 + 2 equals 4.", "type": "text", }, ], - "id": "msg_DPVSehVmSS4aAZNEZnbDg26cOerRK", + "id": "msg_DPVSe8J6PWXsQfoEq2RbnXx3tWBDD", "model": "gpt-5-nano-2025-08-07", "role": "assistant", "stop_reason": "end_turn", "type": "message", "usage": { "cache_read_input_tokens": 0, - "input_tokens": 45, - "output_tokens": 792, + "input_tokens": 13, + "output_tokens": 153, }, } `; -exports[`anthropic → chat-completions > textFormatJsonSchemaWithDescriptionParam > request 1`] = ` +exports[`anthropic → chat-completions > reasoningWithOutput > request 1`] = ` { - "max_completion_tokens": 1024, + "max_completion_tokens": 20000, "messages": [ { - "content": "Extract: John is 25.", + "content": "What color is the sky?", "role": "user", }, ], "model": "gpt-5-nano", - "response_format": { - "json_schema": { - "name": "response", - "schema": { - "additionalProperties": false, - "properties": { - "age": { - "type": "number", - }, - "name": { - "type": "string", - }, - }, - "required": [ - "name", - "age", - ], - "type": "object", - }, - }, - "type": "json_schema", - }, } `; -exports[`anthropic → chat-completions > textFormatJsonSchemaWithDescriptionParam > response 1`] = ` +exports[`anthropic → chat-completions > reasoningWithOutput > response 1`] = ` { "content": [ { - "text": "{"name":"John","age":25}", + "text": "Typically blue during the day. The sky looks blue because sunlight scattering by Earth's atmosphere scatters shorter (blue) wavelengths more than longer (red). At sunrise and sunset, the light passes through more air, so more blue is scattered out and the sky takes on red/orange/pink hues. It can appear gray on cloudy days, and dark/black at night. In space, without atmosphere, the sky is black. If you want, tell me your location or time and I can describe the current color.", "type": "text", }, ], - "id": "msg_DPVSeLbjqby7sJI7uMWXLYEDGq822", + "id": "msg_D8WxDDQyIDbSgoSKDJTtTaCxv1tts", "model": "gpt-5-nano-2025-08-07", "role": "assistant", "stop_reason": "end_turn", "type": "message", "usage": { "cache_read_input_tokens": 0, - "input_tokens": 45, - "output_tokens": 917, + "input_tokens": 12, + "output_tokens": 752, }, } `; -exports[`anthropic → chat-completions > thinkingDisabledParam > request 1`] = ` +exports[`anthropic → chat-completions > safetyIdentifierParam > request 1`] = ` { "max_completion_tokens": 1024, "messages": [ { - "content": "2+2?", + "content": "Say ok.", "role": "user", }, ], + "metadata": { + "user_id": "hashed-user-id-abc123", + }, "model": "gpt-5-nano", } `; -exports[`anthropic → chat-completions > thinkingDisabledParam > response 1`] = ` +exports[`anthropic → chat-completions > serviceTierParam > request 1`] = ` +{ + "max_tokens": 1024, + "messages": [ + { + "content": "Say ok.", + "role": "user", + }, + ], + "model": "gpt-5-nano", + "service_tier": "auto", +} +`; + +exports[`anthropic → chat-completions > simpleRequest > request 1`] = ` +{ + "max_completion_tokens": 20000, + "messages": [ + { + "content": "What is the capital of France?", + "role": "user", + }, + ], + "model": "gpt-5-nano", +} +`; + +exports[`anthropic → chat-completions > simpleRequest > response 1`] = ` { "content": [ { - "text": "4", + "text": "Paris.", "type": "text", }, ], - "id": "msg_DPVSsZJYzYCe5mZEAT6GeHPT0NbIb", + "id": "msg_D8Ww5HsFKrIRw7BCuPTadlfOhw97w", "model": "gpt-5-nano-2025-08-07", "role": "assistant", "stop_reason": "end_turn", "type": "message", "usage": { "cache_read_input_tokens": 0, - "input_tokens": 10, - "output_tokens": 266, + "input_tokens": 13, + "output_tokens": 203, }, } `; -exports[`anthropic → chat-completions > toolCallRequest > request 1`] = ` +exports[`anthropic → chat-completions > stopSequencesParam > request 1`] = ` { - "max_completion_tokens": 20000, + "max_completion_tokens": 1024, "messages": [ { - "content": "What's the weather like in San Francisco?", + "content": "Count to 20.", "role": "user", }, ], - "model": "gpt-5-nano", - "tool_choice": "auto", - "tools": [ - { - "function": { - "description": "Get the current weather for a location", - "name": "get_weather", - "parameters": { - "properties": { - "location": { - "description": "The city and state, e.g. San Francisco, CA", - "type": "string", - }, - }, - "required": [ - "location", - ], - "type": "object", - }, - }, - "type": "function", - }, + "model": "gpt-4o-mini", + "stop": [ + "10", + "ten", ], } `; -exports[`anthropic → chat-completions > toolCallRequest > response 1`] = ` +exports[`anthropic → chat-completions > stopSequencesParam > response 1`] = ` { "content": [ { - "id": "call_a3mN6ADjJKbiKIuOVc0tY4C9", - "input": { - "location": "San Francisco, CA", - }, - "name": "get_weather", - "type": "tool_use", + "text": "Sure! Here you go: + +1, 2, 3, 4, 5, 6, 7, 8, 9, ", + "type": "text", }, ], - "id": "msg_D8WwFTHGcASl8ky2IM7XxBfEHPVw7", - "model": "gpt-5-nano-2025-08-07", + "id": "msg_DPVSkSgeGtcQob6PxrRG3vPe4XcmV", + "model": "gpt-4o-mini-2024-07-18", "role": "assistant", - "stop_reason": "tool_use", + "stop_reason": "end_turn", "type": "message", "usage": { "cache_read_input_tokens": 0, - "input_tokens": 148, - "output_tokens": 218, + "input_tokens": 12, + "output_tokens": 34, }, } `; -exports[`anthropic → chat-completions > toolChoiceAnyParam > request 1`] = ` +exports[`anthropic → chat-completions > streamParam > request 1`] = ` { "max_completion_tokens": 1024, "messages": [ { - "content": "Weather?", + "content": "Say hi.", "role": "user", }, ], "model": "gpt-5-nano", - "tool_choice": "required", - "tools": [ + "stream": true, +} +`; + +exports[`anthropic → chat-completions > systemMessageArrayContent > request 1`] = ` +{ + "max_completion_tokens": 300, + "messages": [ { - "function": { - "description": "Get weather", - "name": "get_weather", - "parameters": { - "properties": { - "location": { - "type": "string", - }, - }, - "required": [ - "location", - ], - "type": "object", + "content": [ + { + "text": "You are a helpful data analyst. The default data source is project_logs with id abc-123.", + "type": "text", }, - }, - "type": "function", + ], + "role": "system", + }, + { + "content": "What errors occurred recently?", + "role": "user", }, ], + "model": "gpt-5-nano", } `; -exports[`anthropic → chat-completions > toolChoiceAnyParam > response 1`] = ` +exports[`anthropic → chat-completions > systemMessageArrayContent > response 1`] = ` { "content": [ { - "id": "call_0ap4hF7p5rp0H0ZGKXQWVVDB", - "input": { - "location": "current location", - }, - "name": "get_weather", - "type": "tool_use", + "text": "", + "type": "text", }, ], - "id": "msg_DPVSoMRa2wXIeMcZEiycmUKn05AV2", + "id": "msg_D8WxKK6CbhVrFzmz27GtpfxAANyUQ", "model": "gpt-5-nano-2025-08-07", "role": "assistant", - "stop_reason": "tool_use", + "stop_reason": "max_tokens", "type": "message", "usage": { "cache_read_input_tokens": 0, - "input_tokens": 123, - "output_tokens": 472, + "input_tokens": 11, + "output_tokens": 300, }, } `; -exports[`anthropic → chat-completions > toolChoiceAutoParam > request 1`] = ` +exports[`anthropic → chat-completions > temperatureParam > request 1`] = ` { "max_completion_tokens": 1024, "messages": [ { - "content": "Weather?", + "content": "Say hi.", "role": "user", }, ], - "model": "gpt-5-nano", - "tool_choice": "auto", - "tools": [ + "model": "gpt-4o-mini", + "temperature": 0.7, +} +`; + +exports[`anthropic → chat-completions > temperatureParam > response 1`] = ` +{ + "content": [ { - "function": { - "description": "Get weather", - "name": "get_weather", - "parameters": { - "properties": { - "location": { - "type": "string", - }, + "text": "Hi! How can I assist you today?", + "type": "text", + }, + ], + "id": "msg_DPVSjvUczLF2Bj764myEOQ8qajc4I", + "model": "gpt-4o-mini-2024-07-18", + "role": "assistant", + "stop_reason": "end_turn", + "type": "message", + "usage": { + "cache_read_input_tokens": 0, + "input_tokens": 10, + "output_tokens": 9, + }, +} +`; + +exports[`anthropic → chat-completions > textFormatJsonSchemaParam > request 1`] = ` +{ + "max_completion_tokens": 1024, + "messages": [ + { + "content": "Extract: John is 25.", + "role": "user", + }, + ], + "model": "gpt-5-nano", + "response_format": { + "json_schema": { + "name": "response", + "schema": { + "additionalProperties": false, + "properties": { + "age": { + "type": "number", + }, + "name": { + "type": "string", }, - "required": [ - "location", - ], - "type": "object", }, + "required": [ + "name", + "age", + ], + "type": "object", }, - "type": "function", }, - ], + "type": "json_schema", + }, } `; -exports[`anthropic → chat-completions > toolChoiceAutoParam > response 1`] = ` +exports[`anthropic → chat-completions > textFormatJsonSchemaParam > response 1`] = ` { "content": [ { - "text": "Sure—what location would you like the weather for? Please provide a city/place (e.g., "Paris, FR" or "New York, NY") or coordinates. If you want, I can also give you hourly or 7-day forecasts—just say which one you need.", + "text": "{"age": 25, "name": "John"}", "type": "text", }, ], - "id": "msg_DPVSm2isXNPpLmpLEjCClod8oo0gc", + "id": "msg_DPVSehVmSS4aAZNEZnbDg26cOerRK", "model": "gpt-5-nano-2025-08-07", "role": "assistant", "stop_reason": "end_turn", "type": "message", "usage": { "cache_read_input_tokens": 0, - "input_tokens": 123, - "output_tokens": 451, + "input_tokens": 45, + "output_tokens": 792, }, } `; -exports[`anthropic → chat-completions > toolChoiceNoneParam > request 1`] = ` +exports[`anthropic → chat-completions > textFormatJsonSchemaWithDescriptionParam > request 1`] = ` { "max_completion_tokens": 1024, "messages": [ { - "content": "Weather?", + "content": "Extract: John is 25.", "role": "user", }, ], "model": "gpt-5-nano", - "tool_choice": "none", - "tools": [ - { - "function": { - "description": "Get weather", - "name": "get_weather", - "parameters": { - "properties": { - "location": { - "type": "string", - }, + "response_format": { + "json_schema": { + "name": "response", + "schema": { + "additionalProperties": false, + "properties": { + "age": { + "type": "number", + }, + "name": { + "type": "string", }, - "required": [ - "location", - ], - "type": "object", }, + "required": [ + "name", + "age", + ], + "type": "object", }, - "type": "function", }, - ], + "type": "json_schema", + }, } `; -exports[`anthropic → chat-completions > toolChoiceNoneParam > response 1`] = ` +exports[`anthropic → chat-completions > textFormatJsonSchemaWithDescriptionParam > response 1`] = ` { "content": [ { - "text": "I don’t have live weather data available here. If you share: - -- Location (city/region and country) -- Whether you want current conditions or a forecast (and for how many hours/days) -- Preferred units (Celsius or Fahrenheit) - -I’ll tailor the answer. If you’d rather check right away, you can search for “weather [location]” on a weather site or app.", + "text": "{"name":"John","age":25}", "type": "text", }, ], - "id": "msg_DPVSoShZm2U29nIRsijGTZjHdJxFd", + "id": "msg_DPVSeLbjqby7sJI7uMWXLYEDGq822", "model": "gpt-5-nano-2025-08-07", "role": "assistant", "stop_reason": "end_turn", "type": "message", "usage": { "cache_read_input_tokens": 0, - "input_tokens": 123, - "output_tokens": 538, + "input_tokens": 45, + "output_tokens": 917, }, } `; -exports[`anthropic → chat-completions > toolChoiceRequiredParam > request 1`] = ` +exports[`anthropic → chat-completions > thinkingDisabledParam > request 1`] = ` { "max_completion_tokens": 1024, "messages": [ { - "content": "Tokyo weather", + "content": "2+2?", "role": "user", }, ], "model": "gpt-5-nano", - "tool_choice": { - "function": { - "name": "get_weather", +} +`; + +exports[`anthropic → chat-completions > thinkingDisabledParam > response 1`] = ` +{ + "content": [ + { + "text": "4", + "type": "text", }, - "type": "function", + ], + "id": "msg_DPVSsZJYzYCe5mZEAT6GeHPT0NbIb", + "model": "gpt-5-nano-2025-08-07", + "role": "assistant", + "stop_reason": "end_turn", + "type": "message", + "usage": { + "cache_read_input_tokens": 0, + "input_tokens": 10, + "output_tokens": 266, }, +} +`; + +exports[`anthropic → chat-completions > toolCallRequest > request 1`] = ` +{ + "max_completion_tokens": 20000, + "messages": [ + { + "content": "What's the weather like in San Francisco?", + "role": "user", + }, + ], + "model": "gpt-5-nano", + "tool_choice": "auto", "tools": [ { "function": { - "description": "Get weather", + "description": "Get the current weather for a location", "name": "get_weather", "parameters": { "properties": { "location": { + "description": "The city and state, e.g. San Francisco, CA", "type": "string", }, }, @@ -1390,42 +1605,281 @@ exports[`anthropic → chat-completions > toolChoiceRequiredParam > request 1`] } `; -exports[`anthropic → chat-completions > toolChoiceRequiredParam > response 1`] = ` +exports[`anthropic → chat-completions > toolCallRequest > response 1`] = ` { "content": [ { - "id": "call_ZO3ShJhTseHSUdt6M3PmPOma", + "id": "call_a3mN6ADjJKbiKIuOVc0tY4C9", "input": { - "location": "Tokyo", + "location": "San Francisco, CA", }, "name": "get_weather", "type": "tool_use", }, ], - "id": "msg_DPVSfQYNmk0Awd0buFY6cNfYOjyya", + "id": "msg_D8WwFTHGcASl8ky2IM7XxBfEHPVw7", "model": "gpt-5-nano-2025-08-07", "role": "assistant", "stop_reason": "tool_use", "type": "message", "usage": { "cache_read_input_tokens": 0, - "input_tokens": 123, - "output_tokens": 279, + "input_tokens": 148, + "output_tokens": 218, }, } `; -exports[`anthropic → chat-completions > topKParam > request 1`] = ` +exports[`anthropic → chat-completions > toolChoiceAnyParam > request 1`] = ` { "max_completion_tokens": 1024, "messages": [ { - "content": "Say hi.", + "content": "Weather?", "role": "user", }, ], "model": "gpt-5-nano", -} + "tool_choice": "required", + "tools": [ + { + "function": { + "description": "Get weather", + "name": "get_weather", + "parameters": { + "properties": { + "location": { + "type": "string", + }, + }, + "required": [ + "location", + ], + "type": "object", + }, + }, + "type": "function", + }, + ], +} +`; + +exports[`anthropic → chat-completions > toolChoiceAnyParam > response 1`] = ` +{ + "content": [ + { + "id": "call_0ap4hF7p5rp0H0ZGKXQWVVDB", + "input": { + "location": "current location", + }, + "name": "get_weather", + "type": "tool_use", + }, + ], + "id": "msg_DPVSoMRa2wXIeMcZEiycmUKn05AV2", + "model": "gpt-5-nano-2025-08-07", + "role": "assistant", + "stop_reason": "tool_use", + "type": "message", + "usage": { + "cache_read_input_tokens": 0, + "input_tokens": 123, + "output_tokens": 472, + }, +} +`; + +exports[`anthropic → chat-completions > toolChoiceAutoParam > request 1`] = ` +{ + "max_completion_tokens": 1024, + "messages": [ + { + "content": "Weather?", + "role": "user", + }, + ], + "model": "gpt-5-nano", + "tool_choice": "auto", + "tools": [ + { + "function": { + "description": "Get weather", + "name": "get_weather", + "parameters": { + "properties": { + "location": { + "type": "string", + }, + }, + "required": [ + "location", + ], + "type": "object", + }, + }, + "type": "function", + }, + ], +} +`; + +exports[`anthropic → chat-completions > toolChoiceAutoParam > response 1`] = ` +{ + "content": [ + { + "text": "Sure—what location would you like the weather for? Please provide a city/place (e.g., "Paris, FR" or "New York, NY") or coordinates. If you want, I can also give you hourly or 7-day forecasts—just say which one you need.", + "type": "text", + }, + ], + "id": "msg_DPVSm2isXNPpLmpLEjCClod8oo0gc", + "model": "gpt-5-nano-2025-08-07", + "role": "assistant", + "stop_reason": "end_turn", + "type": "message", + "usage": { + "cache_read_input_tokens": 0, + "input_tokens": 123, + "output_tokens": 451, + }, +} +`; + +exports[`anthropic → chat-completions > toolChoiceNoneParam > request 1`] = ` +{ + "max_completion_tokens": 1024, + "messages": [ + { + "content": "Weather?", + "role": "user", + }, + ], + "model": "gpt-5-nano", + "tool_choice": "none", + "tools": [ + { + "function": { + "description": "Get weather", + "name": "get_weather", + "parameters": { + "properties": { + "location": { + "type": "string", + }, + }, + "required": [ + "location", + ], + "type": "object", + }, + }, + "type": "function", + }, + ], +} +`; + +exports[`anthropic → chat-completions > toolChoiceNoneParam > response 1`] = ` +{ + "content": [ + { + "text": "I don’t have live weather data available here. If you share: + +- Location (city/region and country) +- Whether you want current conditions or a forecast (and for how many hours/days) +- Preferred units (Celsius or Fahrenheit) + +I’ll tailor the answer. If you’d rather check right away, you can search for “weather [location]” on a weather site or app.", + "type": "text", + }, + ], + "id": "msg_DPVSoShZm2U29nIRsijGTZjHdJxFd", + "model": "gpt-5-nano-2025-08-07", + "role": "assistant", + "stop_reason": "end_turn", + "type": "message", + "usage": { + "cache_read_input_tokens": 0, + "input_tokens": 123, + "output_tokens": 538, + }, +} +`; + +exports[`anthropic → chat-completions > toolChoiceRequiredParam > request 1`] = ` +{ + "max_completion_tokens": 1024, + "messages": [ + { + "content": "Tokyo weather", + "role": "user", + }, + ], + "model": "gpt-5-nano", + "tool_choice": { + "function": { + "name": "get_weather", + }, + "type": "function", + }, + "tools": [ + { + "function": { + "description": "Get weather", + "name": "get_weather", + "parameters": { + "properties": { + "location": { + "type": "string", + }, + }, + "required": [ + "location", + ], + "type": "object", + }, + }, + "type": "function", + }, + ], +} +`; + +exports[`anthropic → chat-completions > toolChoiceRequiredParam > response 1`] = ` +{ + "content": [ + { + "id": "call_ZO3ShJhTseHSUdt6M3PmPOma", + "input": { + "location": "Tokyo", + }, + "name": "get_weather", + "type": "tool_use", + }, + ], + "id": "msg_DPVSfQYNmk0Awd0buFY6cNfYOjyya", + "model": "gpt-5-nano-2025-08-07", + "role": "assistant", + "stop_reason": "tool_use", + "type": "message", + "usage": { + "cache_read_input_tokens": 0, + "input_tokens": 123, + "output_tokens": 279, + }, +} +`; + +exports[`anthropic → chat-completions > topKParam > request 1`] = ` +{ + "max_completion_tokens": 1024, + "messages": [ + { + "content": "Say hi.", + "role": "user", + }, + ], + "model": "gpt-5-nano", +} `; exports[`anthropic → chat-completions > topKParam > response 1`] = ` @@ -7232,35 +7686,520 @@ exports[`chat-completions → anthropic > topPParam > request 1`] = ` "role": "user", }, ], - "model": "claude-sonnet-4-5-20250929", - "top_p": 0.9, + "model": "claude-sonnet-4-5-20250929", + "top_p": 0.9, +} +`; + +exports[`chat-completions → anthropic > topPParam > response 1`] = ` +{ + "choices": [ + { + "finish_reason": "stop", + "index": 0, + "message": { + "annotations": [], + "content": "Hi! How are you doing today?", + "role": "assistant", + }, + }, + ], + "created": 0, + "id": "chatcmpl-011fFxkkz1DRMcUR3KrCKpkj", + "model": "claude-sonnet-4-20250514", + "object": "chat.completion", + "usage": { + "completion_tokens": 11, + "prompt_tokens": 10, + "prompt_tokens_details": { + "cached_tokens": 0, + }, + "total_tokens": 21, + }, +} +`; + +exports[`chat-completions → bedrock > complexReasoningRequest > request 1`] = ` +{ + "inferenceConfig": { + "maxTokens": 20000, + }, + "messages": [ + { + "content": [ + { + "text": "There is a digital clock, with minutes and hours in the form of 00:00. The clock shows all times from 00:00 to 23:59 and repeating. Imagine you had a list of all these times. Which digit(s) is the most common and which is the rarest? Can you find their percentage?", + }, + ], + "role": "user", + }, + ], + "modelId": "gpt-5-nano", +} +`; + +exports[`chat-completions → bedrock > complexReasoningRequest > response 1`] = ` +{ + "choices": [ + { + "finish_reason": "stop", + "index": 0, + "message": { + "annotations": [], + "content": "# Digital Clock Digit Frequency Analysis + +Let me work through this systematically by counting how often each digit (0-9) appears in a complete 24-hour cycle. + +## Breaking Down the Clock Format: HH:MM + +The clock cycles through: +- **Hours**: 00 to 23 (24 values) +- **Minutes**: 00 to 59 (60 values) +- **Total times**: 24 × 60 = 1,440 times per day +- **Total digit positions**: 1,440 × 4 = 5,760 digits + +## Counting Each Digit + +Let me count occurrences in each position: + +**Hours (00-23):** +- Each hour appears 60 times (once per minute) +- Digit frequency in hours: 0,1,2 appear 120 times each; 3,4,5,6,7,8,9 don't appear in tens place +- Tens place: 0(120), 1(120), 2(120) +- Units place: 0(120), 1(120), 2(120), 3(60), 4(60), 5(60), 6(60), 7(60), 8(60), 9(60) + +**Minutes (00-59):** +- Each minute appears 24 times (once per hour) +- Tens place: 0-5 each appear 240 times (24×10) +- Units place: 0-9 each appear 144 times (24×6) + +## Final Count + +| Digit | Count | +|-------|-------| +| **0** | 120+120+240+144 = **624** | +| **1** | 120+120+240+144 = **624** | +| **2** | 120+120+240+144 = **624** | +| **3** | 60+240+144 = **444** | +| **4** | 60+240+144 = **444** | +| **5** | 60+240+144 = **444** | +| **6** | 60+0+144 = **204** | +| **7** | 60+0+144 = **204** | +| **8** | 60+0+144 = **204** | +| **9** | 60+0+144 = **204** | + +## Results + +**Most Common**: **0, 1, 2** +- Frequency: 624 each +- Percentage: **624 ÷ 5,760 = 10.83%** + +**Rarest**: **6, 7, 8, 9** +- Frequency: 204 each +- Percentage: **204 ÷ 5,760 = 3.54%** + +The reason is that higher digits (6-9) can't appear in the hours tens place (only 0-2), making them significantly rarer!", + "role": "assistant", + }, + }, + ], + "created": 0, + "id": "chatcmpl-transformed", + "model": "transformed", + "object": "chat.completion", + "usage": { + "completion_tokens": 700, + "prompt_tokens": 80, + "prompt_tokens_details": { + "cached_tokens": 0, + }, + "total_tokens": 780, + }, +} +`; + +exports[`chat-completions → bedrock > multimodalRequest > request 1`] = ` +{ + "inferenceConfig": { + "maxTokens": 300, + }, + "messages": [ + { + "content": [ + { + "text": "What do you see in this image?", + }, + { + "image": { + "format": "jpeg", + "source": { + "bytes": "https://t3.ftcdn.net/jpg/02/36/99/22/360_F_236992283_sNOxCVQeFLd5pdqaKGh8DRGMZy7P4XKm.jpg", + }, + }, + }, + ], + "role": "user", + }, + ], + "modelId": "gpt-5-nano", +} +`; + +exports[`chat-completions → bedrock > reasoningRequest > request 1`] = ` +{ + "messages": [ + { + "content": [ + { + "text": "Solve this step by step: If a train travels 60 mph for 2 hours, then 80 mph for 1 hour, what's the average speed?", + }, + ], + "role": "user", + }, + ], + "modelId": "gpt-5-nano", +} +`; + +exports[`chat-completions → bedrock > reasoningRequest > response 1`] = ` +{ + "choices": [ + { + "finish_reason": "stop", + "index": 0, + "message": { + "annotations": [], + "content": "# Average Speed Calculation + +## Step 1: Find the distance for each segment + +**First segment:** +- Speed = 60 mph, Time = 2 hours +- Distance = 60 × 2 = **120 miles** + +**Second segment:** +- Speed = 80 mph, Time = 1 hour +- Distance = 80 × 1 = **80 miles** + +## Step 2: Calculate total distance and total time + +- **Total distance** = 120 + 80 = **200 miles** +- **Total time** = 2 + 1 = **3 hours** + +## Step 3: Calculate average speed + +$$\\text{Average Speed} = \\frac{\\text{Total Distance}}{\\text{Total Time}} = \\frac{200}{3} = 66.\\overline{6} \\text{ mph}$$ + +**Answer: The average speed is approximately 66.67 mph** (or 66⅔ mph)", + "role": "assistant", + }, + }, + ], + "created": 0, + "id": "chatcmpl-transformed", + "model": "transformed", + "object": "chat.completion", + "usage": { + "completion_tokens": 229, + "prompt_tokens": 45, + "prompt_tokens_details": { + "cached_tokens": 0, + }, + "total_tokens": 274, + }, +} +`; + +exports[`chat-completions → bedrock > reasoningRequestTruncated > request 1`] = ` +{ + "inferenceConfig": { + "maxTokens": 100, + }, + "messages": [ + { + "content": [ + { + "text": "Solve this step by step: If a train travels 60 mph for 2 hours, then 80 mph for 1 hour, what's the average speed?", + }, + ], + "role": "user", + }, + ], + "modelId": "gpt-5-nano", +} +`; + +exports[`chat-completions → bedrock > reasoningRequestTruncated > response 1`] = ` +{ + "choices": [ + { + "finish_reason": "length", + "index": 0, + "message": { + "annotations": [], + "content": "# Average Speed Calculation + +## Step 1: Find the distance for each segment + +**First segment:** +- Speed = 60 mph, Time = 2 hours +- Distance = 60 × 2 = **120 miles** + +**Second segment:** +- Speed = 80 mph, Time = 1 hour +- Distance = 80 × 1 = **80 miles** + +## Step 2: Calculate total distance", + "role": "assistant", + }, + }, + ], + "created": 0, + "id": "chatcmpl-transformed", + "model": "transformed", + "object": "chat.completion", + "usage": { + "completion_tokens": 100, + "prompt_tokens": 45, + "prompt_tokens_details": { + "cached_tokens": 0, + }, + "total_tokens": 145, + }, +} +`; + +exports[`chat-completions → bedrock > reasoningWithOutput > request 1`] = ` +{ + "messages": [ + { + "content": [ + { + "text": "What color is the sky?", + }, + ], + "role": "user", + }, + ], + "modelId": "gpt-5-nano", +} +`; + +exports[`chat-completions → bedrock > reasoningWithOutput > response 1`] = ` +{ + "choices": [ + { + "finish_reason": "stop", + "index": 0, + "message": { + "annotations": [], + "content": "The sky typically appears **blue** during the day due to Rayleigh scattering, which scatters shorter blue wavelengths of light more than longer red wavelengths. + +However, the sky can appear different colors depending on conditions: +- **Orange, pink, or red** at sunrise and sunset +- **Gray or white** on cloudy days +- **Deep blue or purple** at high altitudes +- **Black** at night (when the sun isn't illuminating the atmosphere)", + "role": "assistant", + }, + }, + ], + "created": 0, + "id": "chatcmpl-transformed", + "model": "transformed", + "object": "chat.completion", + "usage": { + "completion_tokens": 110, + "prompt_tokens": 13, + "prompt_tokens_details": { + "cached_tokens": 0, + }, + "total_tokens": 123, + }, +} +`; + +exports[`chat-completions → bedrock > simpleRequest > request 1`] = ` +{ + "additionalModelRequestFields": { + "thinking": { + "budget_tokens": 1024, + "type": "enabled", + }, + }, + "messages": [ + { + "content": [ + { + "text": "What is the capital of France?", + }, + ], + "role": "user", + }, + ], + "modelId": "gpt-5-nano", +} +`; + +exports[`chat-completions → bedrock > systemMessageArrayContent > request 1`] = ` +{ + "inferenceConfig": { + "maxTokens": 300, + }, + "messages": [ + { + "content": [ + { + "text": "System: You are a helpful data analyst. The default data source is project_logs with id abc-123.", + }, + ], + "role": "user", + }, + { + "content": [ + { + "text": "What errors occurred recently?", + }, + ], + "role": "user", + }, + ], + "modelId": "gpt-5-nano", +} +`; + +exports[`chat-completions → bedrock > systemMessageArrayContent > response 1`] = ` +{ + "choices": [ + { + "finish_reason": "stop", + "index": 0, + "message": { + "annotations": [], + "content": "# Recent Errors in Project Logs (abc-123) + +I'd be happy to help you analyze recent errors! However, I don't have actual access to your database or project logs. To provide you with specific error information, I would need you to: + +1. **Share the error data** - You could provide: + - Recent log entries or error messages + - Error timestamps and frequency + - Error types or categories + - Stack traces or error details + +2. **Clarify the timeframe** - What counts as "recently"? + - Last hour? + - Last 24 hours? + - Last week? + +3. **Specify what you're looking for**: + - Most frequent errors? + - Critical/high-severity errors only? + - Errors affecting specific features or services? + +## Suggested Query (if you can run it) +If you have database access, something like this might help: +\`\`\`sql +SELECT error_type, COUNT(*) as frequency, MAX(timestamp) as last_occurrence +FROM project_logs +WHERE project_id = 'abc-123' + AND timestamp > NOW() - INTERVAL '24 hours' +GROUP BY error_type +ORDER BY frequency DESC; +\`\`\` + +**Please share your error logs or data, and I'll provide a detailed analysis!**", + "role": "assistant", + }, + }, + ], + "created": 0, + "id": "chatcmpl-transformed", + "model": "transformed", + "object": "chat.completion", + "usage": { + "completion_tokens": 297, + "prompt_tokens": 35, + "prompt_tokens_details": { + "cached_tokens": 0, + }, + "total_tokens": 332, + }, +} +`; + +exports[`chat-completions → bedrock > toolCallRequest > request 1`] = ` +{ + "messages": [ + { + "content": [ + { + "text": "What's the weather like in San Francisco?", + }, + ], + "role": "user", + }, + ], + "modelId": "gpt-5-nano", + "toolConfig": { + "tools": [ + { + "toolSpec": { + "description": "Get the current weather for a location", + "inputSchema": { + "json": { + "properties": { + "location": { + "description": "The city and state, e.g. San Francisco, CA", + "type": "string", + }, + }, + "required": [ + "location", + ], + "type": "object", + }, + }, + "name": "get_weather", + }, + }, + ], + }, } `; -exports[`chat-completions → anthropic > topPParam > response 1`] = ` +exports[`chat-completions → bedrock > toolCallRequest > response 1`] = ` { "choices": [ { - "finish_reason": "stop", + "finish_reason": "tool_calls", "index": 0, "message": { "annotations": [], - "content": "Hi! How are you doing today?", "role": "assistant", + "tool_calls": [ + { + "function": { + "arguments": "{"location":"San Francisco, CA"}", + "name": "get_weather", + }, + "id": "tooluse_fIh9Q7KbroQrZmDBVydzTL", + "type": "function", + }, + ], }, }, ], "created": 0, - "id": "chatcmpl-011fFxkkz1DRMcUR3KrCKpkj", - "model": "claude-sonnet-4-20250514", + "id": "chatcmpl-transformed", + "model": "transformed", "object": "chat.completion", "usage": { - "completion_tokens": 11, - "prompt_tokens": 10, + "completion_tokens": 57, + "prompt_tokens": 585, "prompt_tokens_details": { "cached_tokens": 0, }, - "total_tokens": 21, + "total_tokens": 642, }, } `; @@ -14842,6 +15781,337 @@ exports[`responses → anthropic > truncationAutoParam > response 1`] = ` } `; +exports[`responses → bedrock > complexReasoningRequest > request 1`] = ` +{ + "additionalModelRequestFields": { + "thinking": { + "budget_tokens": 15000, + "type": "enabled", + }, + }, + "inferenceConfig": { + "maxTokens": 20000, + }, + "messages": [ + { + "content": [ + { + "text": "There is a digital clock, with minutes and hours in the form of 00:00. The clock shows all times from 00:00 to 23:59 and repeating. Imagine you had a list of all these times. Which digit(s) is the most common and which is the rarest? Can you find their percentage?", + }, + ], + "role": "user", + }, + ], + "modelId": "gpt-5-nano", +} +`; + +exports[`responses → bedrock > multimodalRequest > request 1`] = ` +{ + "inferenceConfig": { + "maxTokens": 300, + }, + "messages": [ + { + "content": [ + { + "text": "What do you see in this image?", + }, + { + "image": { + "format": "jpeg", + "source": { + "bytes": "https://t3.ftcdn.net/jpg/02/36/99/22/360_F_236992283_sNOxCVQeFLd5pdqaKGh8DRGMZy7P4XKm.jpg", + }, + }, + }, + ], + "role": "user", + }, + ], + "modelId": "gpt-5-nano", +} +`; + +exports[`responses → bedrock > reasoningRequest > request 1`] = ` +{ + "additionalModelRequestFields": { + "thinking": { + "budget_tokens": 3072, + "type": "enabled", + }, + }, + "messages": [ + { + "content": [ + { + "text": "Solve this step by step: If a train travels 60 mph for 2 hours, then 80 mph for 1 hour, what's the average speed?", + }, + ], + "role": "user", + }, + ], + "modelId": "gpt-5-nano", +} +`; + +exports[`responses → bedrock > reasoningRequestTruncated > request 1`] = ` +{ + "additionalModelRequestFields": { + "thinking": { + "budget_tokens": 1024, + "type": "enabled", + }, + }, + "inferenceConfig": { + "maxTokens": 100, + }, + "messages": [ + { + "content": [ + { + "text": "Solve this step by step: If a train travels 60 mph for 2 hours, then 80 mph for 1 hour, what's the average speed?", + }, + ], + "role": "user", + }, + ], + "modelId": "gpt-5-nano", +} +`; + +exports[`responses → bedrock > reasoningWithOutput > request 1`] = ` +{ + "additionalModelRequestFields": { + "thinking": { + "budget_tokens": 1024, + "type": "enabled", + }, + }, + "messages": [ + { + "content": [ + { + "text": "What color is the sky?", + }, + ], + "role": "user", + }, + ], + "modelId": "gpt-5-nano", +} +`; + +exports[`responses → bedrock > simpleRequest > request 1`] = ` +{ + "additionalModelRequestFields": { + "thinking": { + "budget_tokens": 1024, + "type": "enabled", + }, + }, + "messages": [ + { + "content": [ + { + "text": "What is the capital of France?", + }, + ], + "role": "user", + }, + ], + "modelId": "gpt-5-nano", +} +`; + +exports[`responses → bedrock > systemMessageArrayContent > request 1`] = ` +{ + "inferenceConfig": { + "maxTokens": 300, + }, + "messages": [ + { + "content": [ + { + "text": "System: You are a helpful data analyst. The default data source is project_logs with id abc-123.", + }, + ], + "role": "user", + }, + { + "content": [ + { + "text": "What errors occurred recently?", + }, + ], + "role": "user", + }, + ], + "modelId": "gpt-5-nano", +} +`; + +exports[`responses → bedrock > systemMessageArrayContent > response 1`] = ` +{ + "created_at": 0, + "id": "resp_transformed", + "incomplete_details": null, + "model": "transformed", + "object": "response", + "output": [ + { + "content": [ + { + "annotations": [], + "text": "# Recent Errors in Project Logs (abc-123) + +I'd be happy to help you analyze recent errors, but I need a bit more information to provide the most useful results: + +1. **Time Range**: How far back should I look? + - Last 24 hours? + - Last 7 days? + - Last 30 days? + - Custom date range? + +2. **Error Scope**: Are you interested in: + - All errors? + - Specific error types? + - Errors from particular services/components? + - Errors above a certain severity level? + +3. **Analysis Focus**: What would be most helpful? + - Error frequency/trends? + - Most common error messages? + - Affected users or features? + - Error timeline/patterns? + +Once you provide these details, I can query the \`project_logs\` dataset and give you a comprehensive error analysis!", + "type": "output_text", + }, + ], + "id": "msg_transformed_item_0", + "role": "assistant", + "status": "completed", + "type": "message", + }, + ], + "output_text": "# Recent Errors in Project Logs (abc-123) + +I'd be happy to help you analyze recent errors, but I need a bit more information to provide the most useful results: + +1. **Time Range**: How far back should I look? + - Last 24 hours? + - Last 7 days? + - Last 30 days? + - Custom date range? + +2. **Error Scope**: Are you interested in: + - All errors? + - Specific error types? + - Errors from particular services/components? + - Errors above a certain severity level? + +3. **Analysis Focus**: What would be most helpful? + - Error frequency/trends? + - Most common error messages? + - Affected users or features? + - Error timeline/patterns? + +Once you provide these details, I can query the \`project_logs\` dataset and give you a comprehensive error analysis!", + "parallel_tool_calls": false, + "status": "completed", + "tool_choice": "none", + "tools": [], + "usage": { + "input_tokens": 35, + "input_tokens_details": { + "cached_tokens": 0, + }, + "output_tokens": 210, + "output_tokens_details": { + "reasoning_tokens": 0, + }, + "total_tokens": 245, + }, +} +`; + +exports[`responses → bedrock > toolCallRequest > request 1`] = ` +{ + "messages": [ + { + "content": [ + { + "text": "What's the weather like in San Francisco?", + }, + ], + "role": "user", + }, + ], + "modelId": "gpt-5-nano", + "toolConfig": { + "tools": [ + { + "toolSpec": { + "description": "Get the current weather for a location", + "inputSchema": { + "json": { + "properties": { + "location": { + "description": "The city and state, e.g. San Francisco, CA", + "type": "string", + }, + }, + "required": [ + "location", + ], + "type": "object", + }, + }, + "name": "get_weather", + }, + }, + ], + }, +} +`; + +exports[`responses → bedrock > toolCallRequest > response 1`] = ` +{ + "created_at": 0, + "id": "resp_transformed", + "incomplete_details": null, + "model": "transformed", + "object": "response", + "output": [ + { + "arguments": "{"location":"San Francisco, CA"}", + "call_id": "tooluse_cpNBxKzSF7PRX54s6VyUjk", + "id": "msg_transformed_item_0", + "name": "get_weather", + "status": "completed", + "type": "function_call", + }, + ], + "output_text": "", + "parallel_tool_calls": false, + "status": "completed", + "tool_choice": "none", + "tools": [], + "usage": { + "input_tokens": 585, + "input_tokens_details": { + "cached_tokens": 0, + }, + "output_tokens": 57, + "output_tokens_details": { + "reasoning_tokens": 0, + }, + "total_tokens": 642, + }, +} +`; + exports[`responses → google > codeInterpreterToolParam > request 1`] = ` { "contents": [ diff --git a/payloads/scripts/transforms/capture-transforms.ts b/payloads/scripts/transforms/capture-transforms.ts index 5e9dbf77..199e13ca 100644 --- a/payloads/scripts/transforms/capture-transforms.ts +++ b/payloads/scripts/transforms/capture-transforms.ts @@ -4,7 +4,13 @@ import { existsSync, mkdirSync, writeFileSync } from "fs"; import { dirname } from "path"; import Anthropic from "@anthropic-ai/sdk"; import OpenAI from "openai"; -import { allTestCases, getCaseForProvider, GOOGLE_MODEL } from "../../cases"; +import { + allTestCases, + getCaseForProvider, + GOOGLE_MODEL, + type BedrockConverseRequest, +} from "../../cases"; +import { executeBedrock } from "../providers/bedrock"; import { TRANSFORM_PAIRS, STREAMING_PAIRS, @@ -36,6 +42,16 @@ async function runConcurrently(tasks: (() => Promise)[]): Promise { let _anthropic: Anthropic | undefined; let _openai: OpenAI | undefined; +function isBedrockConverseRequest( + value: unknown +): value is BedrockConverseRequest { + if (typeof value !== "object" || value === null) return false; + if (!("modelId" in value)) return false; + // eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- type guard needs safe property access on unknown object + const modelId = (value as { modelId?: unknown }).modelId; + return typeof modelId === "string" && modelId.length > 0; +} + function getAnthropic(): Anthropic { if (!_anthropic) _anthropic = new Anthropic(); return _anthropic; @@ -97,6 +113,20 @@ async function callProvider( ); case "google": return callGoogleProvider(request); + case "bedrock": { + if (!isBedrockConverseRequest(request)) { + throw new Error( + "Bedrock capture failed: request is missing required field 'modelId'" + ); + } + const result = await executeBedrock("transform-capture", request, { + stream: false, + }); + if (result.response) { + return result.response; + } + throw new Error(result.error ?? "Bedrock capture failed"); + } } } /* eslint-enable @typescript-eslint/consistent-type-assertions */ @@ -148,12 +178,23 @@ export async function captureTransforms( caseName, p.target ); - request.model = - targetCase && - typeof targetCase === "object" && - "model" in targetCase - ? targetCase.model - : TARGET_MODELS[p.target]; + if (p.target === "bedrock") { + request.modelId = + targetCase && + typeof targetCase === "object" && + targetCase !== null && + "modelId" in targetCase + ? targetCase.modelId + : TARGET_MODELS[p.target]; + } else { + request.model = + targetCase && + typeof targetCase === "object" && + targetCase !== null && + "model" in targetCase + ? targetCase.model + : TARGET_MODELS[p.target]; + } const response = await callProvider(p.target, request); diff --git a/payloads/scripts/transforms/helpers.ts b/payloads/scripts/transforms/helpers.ts index cda5ca4f..596596c7 100644 --- a/payloads/scripts/transforms/helpers.ts +++ b/payloads/scripts/transforms/helpers.ts @@ -5,6 +5,8 @@ import { transform_response, validate_anthropic_request, validate_anthropic_response, + validate_bedrock_request, + validate_bedrock_response, validate_chat_completions_request, validate_chat_completions_response, validate_google_request, @@ -15,6 +17,7 @@ import { import { allTestCases, getCaseNames, getCaseForProvider } from "../../cases"; import { ANTHROPIC_MODEL, + BEDROCK_MODEL, GOOGLE_MODEL, OPENAI_CHAT_COMPLETIONS_MODEL, OPENAI_RESPONSES_MODEL, @@ -24,8 +27,14 @@ export type SourceFormat = | "chat-completions" | "responses" | "anthropic" - | "google"; -export type WasmFormat = "OpenAI" | "Responses" | "Anthropic" | "Google"; + | "google" + | "bedrock"; +export type WasmFormat = + | "OpenAI" + | "Responses" + | "Anthropic" + | "Google" + | "bedrock"; export interface TransformPair { source: SourceFormat; @@ -65,6 +74,24 @@ export const TRANSFORM_PAIRS: TransformPair[] = [ wasmSource: "OpenAI", wasmTarget: "Google", }, + { + source: "chat-completions", + target: "bedrock", + wasmSource: "OpenAI", + wasmTarget: "bedrock", + }, + { + source: "responses", + target: "bedrock", + wasmSource: "Responses", + wasmTarget: "bedrock", + }, + { + source: "anthropic", + target: "bedrock", + wasmSource: "Anthropic", + wasmTarget: "bedrock", + }, { source: "anthropic", target: "google", @@ -103,6 +130,7 @@ const REQUEST_VALIDATORS: Record unknown> = { responses: validate_responses_request, anthropic: validate_anthropic_request, google: validate_google_request, + bedrock: validate_bedrock_request, }; const RESPONSE_VALIDATORS: Record unknown> = { @@ -110,6 +138,7 @@ const RESPONSE_VALIDATORS: Record unknown> = { responses: validate_responses_response, anthropic: validate_anthropic_response, google: validate_google_response, + bedrock: validate_bedrock_response, }; interface TransformResultData { @@ -164,6 +193,7 @@ const WASM_TO_SOURCE: Record = { Responses: "responses", Anthropic: "anthropic", Google: "google", + bedrock: "bedrock", }; // Transform and validate response @@ -217,6 +247,7 @@ export const TARGET_MODELS: Record = { "chat-completions": OPENAI_CHAT_COMPLETIONS_MODEL, responses: OPENAI_RESPONSES_MODEL, google: GOOGLE_MODEL, + bedrock: BEDROCK_MODEL, }; export function getTransformableCases( diff --git a/payloads/transforms/anthropic_to_bedrock/complexReasoningRequest.json b/payloads/transforms/anthropic_to_bedrock/complexReasoningRequest.json new file mode 100644 index 00000000..c41c9e22 --- /dev/null +++ b/payloads/transforms/anthropic_to_bedrock/complexReasoningRequest.json @@ -0,0 +1,29 @@ +{ + "output": { + "message": { + "role": "assistant", + "content": [ + { + "text": "# Digital Clock Digit Analysis\n\nLet me work through this systematically by counting digit occurrences across all 24-hour times.\n\n## Setting Up the Problem\n\nA full day has **1,440 minutes** (00:00 through 23:59), and each time displays 4 digits.\n\n**Total digit positions: 1,440 × 4 = 5,760 digits**\n\n## Counting Each Position\n\nLet me count how often each digit (0-9) appears in each of the 4 positions:\n\n### Hours (00-23)\n- **Tens place**: 0(00-09)×10, 1(10-19)×10, 2(20-23)×4 = cycles 24 times/day\n- **Ones place**: Each digit 0-9 appears in every 10-hour cycle, repeated 2.4 times\n\n### Minutes (00-59)\n- **Tens place**: Each digit 0-5 appears 10 times per hour, so 240 times/day\n- **Ones place**: Each digit 0-9 appears 6 times per hour, so 144 times/day\n\n## Complete Count per Digit\n\n| Digit | Tens(H) | Ones(H) | Tens(M) | Ones(M) | **Total** |\n|-------|---------|---------|---------|---------|-----------|\n| 0 | 264 | 144 | 240 | 144 | **792** |\n| 1 | 240 | 144 | 240 | 144 | **768** |\n| 2 | 240 | 144 | 240 | 144 | **768** |\n| 3 | 144 | 144 | 240 | 144 | **672** |\n| 4 | 144 | 144 | 240 | 144 | **672** |\n| 5 | 144 | 144 | 240 | 144 | **672** |\n| 6 | 0 | 0 | 0 | 144 | **144** |\n| 7 | 0 | 0 | 0 | 144 | **144** |\n| 8 | 0 | 0 | 0 | 144 | **144** |\n| 9 | 0 | 0 | 0 | 144 | **144** |\n\n## Results\n\n**Most Common: 0**\n- Appears: **792 times**\n- Percentage: 792 ÷ 5,760 = **13.75%**\n\n**Rarest: 6, 7, 8, and 9** (tied)\n- Each appears: **144 times**\n- Percentage: 144 ÷ 5,760 = **2.5%**\n\nThe digit 0 dominates because it appears frequently in leading positions (00-09 hours, 00-09 and 00-59 minutes), while 6-9 only appear in the ones place of minutes." + } + ] + } + }, + "stopReason": "end_turn", + "usage": { + "inputTokens": 80, + "outputTokens": 735, + "totalTokens": 815, + "cacheReadInputTokens": 0, + "cacheWriteInputTokens": 0 + }, + "metrics": { + "latencyMs": 5112 + }, + "$metadata": { + "httpStatusCode": 200, + "requestId": "c221271b-78af-4158-b643-a849dcd6eb9c", + "attempts": 1, + "totalRetryDelay": 0 + } +} \ No newline at end of file diff --git a/payloads/transforms/anthropic_to_bedrock/multimodalRequest.json b/payloads/transforms/anthropic_to_bedrock/multimodalRequest.json new file mode 100644 index 00000000..26546f93 --- /dev/null +++ b/payloads/transforms/anthropic_to_bedrock/multimodalRequest.json @@ -0,0 +1,4 @@ +{ + "error": "ValidationException: The model returned the following errors: Could not process image", + "name": "Error" +} \ No newline at end of file diff --git a/payloads/transforms/anthropic_to_bedrock/reasoningRequest.json b/payloads/transforms/anthropic_to_bedrock/reasoningRequest.json new file mode 100644 index 00000000..b170e85e --- /dev/null +++ b/payloads/transforms/anthropic_to_bedrock/reasoningRequest.json @@ -0,0 +1,29 @@ +{ + "output": { + "message": { + "role": "assistant", + "content": [ + { + "text": "# Solving for Average Speed\n\n## Step 1: Find the distance for each segment\n\n**First segment:**\n- Speed = 60 mph, Time = 2 hours\n- Distance = Speed × Time = 60 × 2 = **120 miles**\n\n**Second segment:**\n- Speed = 80 mph, Time = 1 hour\n- Distance = Speed × Time = 80 × 1 = **80 miles**\n\n## Step 2: Find the total distance and total time\n\n- **Total distance** = 120 + 80 = **200 miles**\n- **Total time** = 2 + 1 = **3 hours**\n\n## Step 3: Calculate average speed\n\n$$\\text{Average Speed} = \\frac{\\text{Total Distance}}{\\text{Total Time}} = \\frac{200}{3} = \\mathbf{66.\\overline{6} \\text{ mph}}$$\n\n**Answer: 66⅔ mph (or approximately 66.67 mph)**" + } + ] + } + }, + "stopReason": "end_turn", + "usage": { + "inputTokens": 45, + "outputTokens": 238, + "totalTokens": 283, + "cacheReadInputTokens": 0, + "cacheWriteInputTokens": 0 + }, + "metrics": { + "latencyMs": 2124 + }, + "$metadata": { + "httpStatusCode": 200, + "requestId": "494aa934-c5c6-4439-99e4-ed754b1a4afb", + "attempts": 1, + "totalRetryDelay": 0 + } +} \ No newline at end of file diff --git a/payloads/transforms/anthropic_to_bedrock/reasoningRequestTruncated.json b/payloads/transforms/anthropic_to_bedrock/reasoningRequestTruncated.json new file mode 100644 index 00000000..528e99f0 --- /dev/null +++ b/payloads/transforms/anthropic_to_bedrock/reasoningRequestTruncated.json @@ -0,0 +1,29 @@ +{ + "output": { + "message": { + "role": "assistant", + "content": [ + { + "text": "# Average Speed Calculation\n\n**Step 1: Find the distance for the first part**\n- Speed × Time = Distance\n- 60 mph × 2 hours = **120 miles**\n\n**Step 2: Find the distance for the second part**\n- 80 mph × 1 hour = **80 miles**\n\n**Step 3: Find total distance**\n- 120 + 80 = **200 miles**" + } + ] + } + }, + "stopReason": "max_tokens", + "usage": { + "inputTokens": 45, + "outputTokens": 100, + "totalTokens": 145, + "cacheReadInputTokens": 0, + "cacheWriteInputTokens": 0 + }, + "metrics": { + "latencyMs": 1952 + }, + "$metadata": { + "httpStatusCode": 200, + "requestId": "ef8d8b34-ab88-4d9a-9730-e0bdb4842188", + "attempts": 1, + "totalRetryDelay": 0 + } +} \ No newline at end of file diff --git a/payloads/transforms/anthropic_to_bedrock/reasoningWithOutput.json b/payloads/transforms/anthropic_to_bedrock/reasoningWithOutput.json new file mode 100644 index 00000000..ab11d5f5 --- /dev/null +++ b/payloads/transforms/anthropic_to_bedrock/reasoningWithOutput.json @@ -0,0 +1,29 @@ +{ + "output": { + "message": { + "role": "assistant", + "content": [ + { + "text": "The sky typically appears **blue** during the day, caused by sunlight scattering off molecules in the atmosphere (a phenomenon called Rayleigh scattering).\n\nHowever, the sky can appear different colors depending on conditions:\n- **Orange, red, or pink** at sunrise and sunset\n- **Gray or white** on cloudy days\n- **Dark blue or black** at night\n- **Reddish** during dust storms or air pollution" + } + ] + } + }, + "stopReason": "end_turn", + "usage": { + "inputTokens": 13, + "outputTokens": 100, + "totalTokens": 113, + "cacheReadInputTokens": 0, + "cacheWriteInputTokens": 0 + }, + "metrics": { + "latencyMs": 1810 + }, + "$metadata": { + "httpStatusCode": 200, + "requestId": "6df2e674-e545-458f-95b4-1bb00f10c6be", + "attempts": 1, + "totalRetryDelay": 0 + } +} \ No newline at end of file diff --git a/payloads/transforms/anthropic_to_bedrock/simpleRequest.json b/payloads/transforms/anthropic_to_bedrock/simpleRequest.json new file mode 100644 index 00000000..5ff9cb89 --- /dev/null +++ b/payloads/transforms/anthropic_to_bedrock/simpleRequest.json @@ -0,0 +1,29 @@ +{ + "output": { + "message": { + "role": "assistant", + "content": [ + { + "text": "The capital of France is Paris." + } + ] + } + }, + "stopReason": "end_turn", + "usage": { + "inputTokens": 14, + "outputTokens": 10, + "totalTokens": 24, + "cacheReadInputTokens": 0, + "cacheWriteInputTokens": 0 + }, + "metrics": { + "latencyMs": 1720 + }, + "$metadata": { + "httpStatusCode": 200, + "requestId": "f7b9e33f-fa75-4bcc-9c2e-ed2c7286bead", + "attempts": 1, + "totalRetryDelay": 0 + } +} \ No newline at end of file diff --git a/payloads/transforms/anthropic_to_bedrock/systemMessageArrayContent.json b/payloads/transforms/anthropic_to_bedrock/systemMessageArrayContent.json new file mode 100644 index 00000000..f0dfb6c4 --- /dev/null +++ b/payloads/transforms/anthropic_to_bedrock/systemMessageArrayContent.json @@ -0,0 +1,29 @@ +{ + "output": { + "message": { + "role": "assistant", + "content": [ + { + "text": "# Recent Errors in Project Logs (abc-123)\n\nI'd be happy to help you analyze recent errors, but I need a bit more information to give you the most useful analysis:\n\n1. **Time range**: What does \"recently\" mean for you? \n - Last 24 hours?\n - Last 7 days?\n - Last week?\n\n2. **Error type**: Are you interested in:\n - All errors?\n - Specific error categories (e.g., database, API, authentication)?\n - Errors above a certain severity level?\n\n3. **Level of detail**: Would you like:\n - A summary count of errors?\n - Top errors by frequency?\n - Full error logs with stack traces?\n - Errors grouped by component/service?\n\nOnce you provide these details, I can query the project_logs (abc-123) database and give you a comprehensive error analysis." + } + ] + } + }, + "stopReason": "end_turn", + "usage": { + "inputTokens": 35, + "outputTokens": 209, + "totalTokens": 244, + "cacheReadInputTokens": 0, + "cacheWriteInputTokens": 0 + }, + "metrics": { + "latencyMs": 2406 + }, + "$metadata": { + "httpStatusCode": 200, + "requestId": "4d94fb79-c465-4532-bb65-9953e795f56a", + "attempts": 1, + "totalRetryDelay": 0 + } +} \ No newline at end of file diff --git a/payloads/transforms/anthropic_to_bedrock/toolCallRequest.json b/payloads/transforms/anthropic_to_bedrock/toolCallRequest.json new file mode 100644 index 00000000..e27c483e --- /dev/null +++ b/payloads/transforms/anthropic_to_bedrock/toolCallRequest.json @@ -0,0 +1,36 @@ +{ + "output": { + "message": { + "role": "assistant", + "content": [ + { + "toolUse": { + "toolUseId": "tooluse_LmwV398ieC9MtSQdcAb3dj", + "name": "get_weather", + "input": { + "location": "San Francisco, CA" + }, + "type": "tool_use" + } + } + ] + } + }, + "stopReason": "tool_use", + "usage": { + "inputTokens": 585, + "outputTokens": 57, + "totalTokens": 642, + "cacheReadInputTokens": 0, + "cacheWriteInputTokens": 0 + }, + "metrics": { + "latencyMs": 993 + }, + "$metadata": { + "httpStatusCode": 200, + "requestId": "5565c282-8495-4bc5-bb35-977a223de712", + "attempts": 1, + "totalRetryDelay": 0 + } +} \ No newline at end of file diff --git a/payloads/transforms/chat-completions_to_bedrock/complexReasoningRequest.json b/payloads/transforms/chat-completions_to_bedrock/complexReasoningRequest.json new file mode 100644 index 00000000..1149a1b2 --- /dev/null +++ b/payloads/transforms/chat-completions_to_bedrock/complexReasoningRequest.json @@ -0,0 +1,29 @@ +{ + "output": { + "message": { + "role": "assistant", + "content": [ + { + "text": "# Digital Clock Digit Frequency Analysis\n\nLet me work through this systematically by counting how often each digit (0-9) appears in a complete 24-hour cycle.\n\n## Breaking Down the Clock Format: HH:MM\n\nThe clock cycles through:\n- **Hours**: 00 to 23 (24 values)\n- **Minutes**: 00 to 59 (60 values)\n- **Total times**: 24 × 60 = 1,440 times per day\n- **Total digit positions**: 1,440 × 4 = 5,760 digits\n\n## Counting Each Digit\n\nLet me count occurrences in each position:\n\n**Hours (00-23):**\n- Each hour appears 60 times (once per minute)\n- Digit frequency in hours: 0,1,2 appear 120 times each; 3,4,5,6,7,8,9 don't appear in tens place\n- Tens place: 0(120), 1(120), 2(120)\n- Units place: 0(120), 1(120), 2(120), 3(60), 4(60), 5(60), 6(60), 7(60), 8(60), 9(60)\n\n**Minutes (00-59):**\n- Each minute appears 24 times (once per hour)\n- Tens place: 0-5 each appear 240 times (24×10)\n- Units place: 0-9 each appear 144 times (24×6)\n\n## Final Count\n\n| Digit | Count |\n|-------|-------|\n| **0** | 120+120+240+144 = **624** |\n| **1** | 120+120+240+144 = **624** |\n| **2** | 120+120+240+144 = **624** |\n| **3** | 60+240+144 = **444** |\n| **4** | 60+240+144 = **444** |\n| **5** | 60+240+144 = **444** |\n| **6** | 60+0+144 = **204** |\n| **7** | 60+0+144 = **204** |\n| **8** | 60+0+144 = **204** |\n| **9** | 60+0+144 = **204** |\n\n## Results\n\n**Most Common**: **0, 1, 2**\n- Frequency: 624 each\n- Percentage: **624 ÷ 5,760 = 10.83%**\n\n**Rarest**: **6, 7, 8, 9**\n- Frequency: 204 each\n- Percentage: **204 ÷ 5,760 = 3.54%**\n\nThe reason is that higher digits (6-9) can't appear in the hours tens place (only 0-2), making them significantly rarer!" + } + ] + } + }, + "stopReason": "end_turn", + "usage": { + "inputTokens": 80, + "outputTokens": 700, + "totalTokens": 780, + "cacheReadInputTokens": 0, + "cacheWriteInputTokens": 0 + }, + "metrics": { + "latencyMs": 4921 + }, + "$metadata": { + "httpStatusCode": 200, + "requestId": "d94fd954-505a-4657-9555-9a9c5bc23c19", + "attempts": 1, + "totalRetryDelay": 0 + } +} \ No newline at end of file diff --git a/payloads/transforms/chat-completions_to_bedrock/multimodalRequest.json b/payloads/transforms/chat-completions_to_bedrock/multimodalRequest.json new file mode 100644 index 00000000..26546f93 --- /dev/null +++ b/payloads/transforms/chat-completions_to_bedrock/multimodalRequest.json @@ -0,0 +1,4 @@ +{ + "error": "ValidationException: The model returned the following errors: Could not process image", + "name": "Error" +} \ No newline at end of file diff --git a/payloads/transforms/chat-completions_to_bedrock/reasoningRequest.json b/payloads/transforms/chat-completions_to_bedrock/reasoningRequest.json new file mode 100644 index 00000000..f6c7b92d --- /dev/null +++ b/payloads/transforms/chat-completions_to_bedrock/reasoningRequest.json @@ -0,0 +1,29 @@ +{ + "output": { + "message": { + "role": "assistant", + "content": [ + { + "text": "# Average Speed Calculation\n\n## Step 1: Find the distance for each segment\n\n**First segment:**\n- Speed = 60 mph, Time = 2 hours\n- Distance = 60 × 2 = **120 miles**\n\n**Second segment:**\n- Speed = 80 mph, Time = 1 hour\n- Distance = 80 × 1 = **80 miles**\n\n## Step 2: Calculate total distance and total time\n\n- **Total distance** = 120 + 80 = **200 miles**\n- **Total time** = 2 + 1 = **3 hours**\n\n## Step 3: Calculate average speed\n\n$$\\text{Average Speed} = \\frac{\\text{Total Distance}}{\\text{Total Time}} = \\frac{200}{3} = 66.\\overline{6} \\text{ mph}$$\n\n**Answer: The average speed is approximately 66.67 mph** (or 66⅔ mph)" + } + ] + } + }, + "stopReason": "end_turn", + "usage": { + "inputTokens": 45, + "outputTokens": 229, + "totalTokens": 274, + "cacheReadInputTokens": 0, + "cacheWriteInputTokens": 0 + }, + "metrics": { + "latencyMs": 1926 + }, + "$metadata": { + "httpStatusCode": 200, + "requestId": "4312f962-8fe7-40f6-9e88-108778057975", + "attempts": 1, + "totalRetryDelay": 0 + } +} \ No newline at end of file diff --git a/payloads/transforms/chat-completions_to_bedrock/reasoningRequestTruncated.json b/payloads/transforms/chat-completions_to_bedrock/reasoningRequestTruncated.json new file mode 100644 index 00000000..2bf615ad --- /dev/null +++ b/payloads/transforms/chat-completions_to_bedrock/reasoningRequestTruncated.json @@ -0,0 +1,29 @@ +{ + "output": { + "message": { + "role": "assistant", + "content": [ + { + "text": "# Average Speed Calculation\n\n## Step 1: Find the distance for each segment\n\n**First segment:**\n- Speed = 60 mph, Time = 2 hours\n- Distance = 60 × 2 = **120 miles**\n\n**Second segment:**\n- Speed = 80 mph, Time = 1 hour\n- Distance = 80 × 1 = **80 miles**\n\n## Step 2: Calculate total distance" + } + ] + } + }, + "stopReason": "max_tokens", + "usage": { + "inputTokens": 45, + "outputTokens": 100, + "totalTokens": 145, + "cacheReadInputTokens": 0, + "cacheWriteInputTokens": 0 + }, + "metrics": { + "latencyMs": 1559 + }, + "$metadata": { + "httpStatusCode": 200, + "requestId": "edec9094-7778-4b89-b6e2-fe0acd659463", + "attempts": 1, + "totalRetryDelay": 0 + } +} \ No newline at end of file diff --git a/payloads/transforms/chat-completions_to_bedrock/reasoningWithOutput.json b/payloads/transforms/chat-completions_to_bedrock/reasoningWithOutput.json new file mode 100644 index 00000000..dabccf81 --- /dev/null +++ b/payloads/transforms/chat-completions_to_bedrock/reasoningWithOutput.json @@ -0,0 +1,29 @@ +{ + "output": { + "message": { + "role": "assistant", + "content": [ + { + "text": "The sky typically appears **blue** during the day due to Rayleigh scattering, which scatters shorter blue wavelengths of light more than longer red wavelengths.\n\nHowever, the sky can appear different colors depending on conditions:\n- **Orange, pink, or red** at sunrise and sunset\n- **Gray or white** on cloudy days\n- **Deep blue or purple** at high altitudes\n- **Black** at night (when the sun isn't illuminating the atmosphere)" + } + ] + } + }, + "stopReason": "end_turn", + "usage": { + "inputTokens": 13, + "outputTokens": 110, + "totalTokens": 123, + "cacheReadInputTokens": 0, + "cacheWriteInputTokens": 0 + }, + "metrics": { + "latencyMs": 1735 + }, + "$metadata": { + "httpStatusCode": 200, + "requestId": "cff218a9-79a5-45b6-9df3-08e24f89282a", + "attempts": 1, + "totalRetryDelay": 0 + } +} \ No newline at end of file diff --git a/payloads/transforms/chat-completions_to_bedrock/simpleRequest.json b/payloads/transforms/chat-completions_to_bedrock/simpleRequest.json new file mode 100644 index 00000000..96e9e2c0 --- /dev/null +++ b/payloads/transforms/chat-completions_to_bedrock/simpleRequest.json @@ -0,0 +1,3 @@ +{ + "error": "Deserialization failed: data did not match any variant of untagged enum BedrockOutputContentBlock at line 14 column 8" +} \ No newline at end of file diff --git a/payloads/transforms/chat-completions_to_bedrock/systemMessageArrayContent.json b/payloads/transforms/chat-completions_to_bedrock/systemMessageArrayContent.json new file mode 100644 index 00000000..27de60df --- /dev/null +++ b/payloads/transforms/chat-completions_to_bedrock/systemMessageArrayContent.json @@ -0,0 +1,29 @@ +{ + "output": { + "message": { + "role": "assistant", + "content": [ + { + "text": "# Recent Errors in Project Logs (abc-123)\n\nI'd be happy to help you analyze recent errors! However, I don't have actual access to your database or project logs. To provide you with specific error information, I would need you to:\n\n1. **Share the error data** - You could provide:\n - Recent log entries or error messages\n - Error timestamps and frequency\n - Error types or categories\n - Stack traces or error details\n\n2. **Clarify the timeframe** - What counts as \"recently\"?\n - Last hour?\n - Last 24 hours?\n - Last week?\n\n3. **Specify what you're looking for**:\n - Most frequent errors?\n - Critical/high-severity errors only?\n - Errors affecting specific features or services?\n\n## Suggested Query (if you can run it)\nIf you have database access, something like this might help:\n```sql\nSELECT error_type, COUNT(*) as frequency, MAX(timestamp) as last_occurrence\nFROM project_logs\nWHERE project_id = 'abc-123'\n AND timestamp > NOW() - INTERVAL '24 hours'\nGROUP BY error_type\nORDER BY frequency DESC;\n```\n\n**Please share your error logs or data, and I'll provide a detailed analysis!**" + } + ] + } + }, + "stopReason": "end_turn", + "usage": { + "inputTokens": 35, + "outputTokens": 297, + "totalTokens": 332, + "cacheReadInputTokens": 0, + "cacheWriteInputTokens": 0 + }, + "metrics": { + "latencyMs": 3049 + }, + "$metadata": { + "httpStatusCode": 200, + "requestId": "24b81a2c-d863-4549-80b0-d6ea30aa092a", + "attempts": 1, + "totalRetryDelay": 0 + } +} \ No newline at end of file diff --git a/payloads/transforms/chat-completions_to_bedrock/toolCallRequest.json b/payloads/transforms/chat-completions_to_bedrock/toolCallRequest.json new file mode 100644 index 00000000..aed2a967 --- /dev/null +++ b/payloads/transforms/chat-completions_to_bedrock/toolCallRequest.json @@ -0,0 +1,36 @@ +{ + "output": { + "message": { + "role": "assistant", + "content": [ + { + "toolUse": { + "toolUseId": "tooluse_fIh9Q7KbroQrZmDBVydzTL", + "name": "get_weather", + "input": { + "location": "San Francisco, CA" + }, + "type": "tool_use" + } + } + ] + } + }, + "stopReason": "tool_use", + "usage": { + "inputTokens": 585, + "outputTokens": 57, + "totalTokens": 642, + "cacheReadInputTokens": 0, + "cacheWriteInputTokens": 0 + }, + "metrics": { + "latencyMs": 1632 + }, + "$metadata": { + "httpStatusCode": 200, + "requestId": "5bc81afa-df3d-46da-95bd-8f00b1a595a1", + "attempts": 1, + "totalRetryDelay": 0 + } +} \ No newline at end of file diff --git a/payloads/transforms/responses_to_bedrock/complexReasoningRequest.json b/payloads/transforms/responses_to_bedrock/complexReasoningRequest.json new file mode 100644 index 00000000..96e9e2c0 --- /dev/null +++ b/payloads/transforms/responses_to_bedrock/complexReasoningRequest.json @@ -0,0 +1,3 @@ +{ + "error": "Deserialization failed: data did not match any variant of untagged enum BedrockOutputContentBlock at line 14 column 8" +} \ No newline at end of file diff --git a/payloads/transforms/responses_to_bedrock/multimodalRequest.json b/payloads/transforms/responses_to_bedrock/multimodalRequest.json new file mode 100644 index 00000000..26546f93 --- /dev/null +++ b/payloads/transforms/responses_to_bedrock/multimodalRequest.json @@ -0,0 +1,4 @@ +{ + "error": "ValidationException: The model returned the following errors: Could not process image", + "name": "Error" +} \ No newline at end of file diff --git a/payloads/transforms/responses_to_bedrock/reasoningRequest.json b/payloads/transforms/responses_to_bedrock/reasoningRequest.json new file mode 100644 index 00000000..96e9e2c0 --- /dev/null +++ b/payloads/transforms/responses_to_bedrock/reasoningRequest.json @@ -0,0 +1,3 @@ +{ + "error": "Deserialization failed: data did not match any variant of untagged enum BedrockOutputContentBlock at line 14 column 8" +} \ No newline at end of file diff --git a/payloads/transforms/responses_to_bedrock/reasoningRequestTruncated.json b/payloads/transforms/responses_to_bedrock/reasoningRequestTruncated.json new file mode 100644 index 00000000..6758d9e8 --- /dev/null +++ b/payloads/transforms/responses_to_bedrock/reasoningRequestTruncated.json @@ -0,0 +1,4 @@ +{ + "error": "ValidationException: The model returned the following errors: `max_tokens` must be greater than `thinking.budget_tokens`. Please consult our documentation at https://docs.claude.com/en/docs/build-with-claude/extended-thinking#max-tokens-and-context-window-size", + "name": "Error" +} \ No newline at end of file diff --git a/payloads/transforms/responses_to_bedrock/reasoningWithOutput.json b/payloads/transforms/responses_to_bedrock/reasoningWithOutput.json new file mode 100644 index 00000000..96e9e2c0 --- /dev/null +++ b/payloads/transforms/responses_to_bedrock/reasoningWithOutput.json @@ -0,0 +1,3 @@ +{ + "error": "Deserialization failed: data did not match any variant of untagged enum BedrockOutputContentBlock at line 14 column 8" +} \ No newline at end of file diff --git a/payloads/transforms/responses_to_bedrock/simpleRequest.json b/payloads/transforms/responses_to_bedrock/simpleRequest.json new file mode 100644 index 00000000..96e9e2c0 --- /dev/null +++ b/payloads/transforms/responses_to_bedrock/simpleRequest.json @@ -0,0 +1,3 @@ +{ + "error": "Deserialization failed: data did not match any variant of untagged enum BedrockOutputContentBlock at line 14 column 8" +} \ No newline at end of file diff --git a/payloads/transforms/responses_to_bedrock/systemMessageArrayContent.json b/payloads/transforms/responses_to_bedrock/systemMessageArrayContent.json new file mode 100644 index 00000000..152b1b09 --- /dev/null +++ b/payloads/transforms/responses_to_bedrock/systemMessageArrayContent.json @@ -0,0 +1,29 @@ +{ + "output": { + "message": { + "role": "assistant", + "content": [ + { + "text": "# Recent Errors in Project Logs (abc-123)\n\nI'd be happy to help you analyze recent errors, but I need a bit more information to provide the most useful results:\n\n1. **Time Range**: How far back should I look?\n - Last 24 hours?\n - Last 7 days?\n - Last 30 days?\n - Custom date range?\n\n2. **Error Scope**: Are you interested in:\n - All errors?\n - Specific error types?\n - Errors from particular services/components?\n - Errors above a certain severity level?\n\n3. **Analysis Focus**: What would be most helpful?\n - Error frequency/trends?\n - Most common error messages?\n - Affected users or features?\n - Error timeline/patterns?\n\nOnce you provide these details, I can query the `project_logs` dataset and give you a comprehensive error analysis!" + } + ] + } + }, + "stopReason": "end_turn", + "usage": { + "inputTokens": 35, + "outputTokens": 210, + "totalTokens": 245, + "cacheReadInputTokens": 0, + "cacheWriteInputTokens": 0 + }, + "metrics": { + "latencyMs": 2531 + }, + "$metadata": { + "httpStatusCode": 200, + "requestId": "c5adeff1-9253-467c-8371-2e42a7b4b83f", + "attempts": 1, + "totalRetryDelay": 0 + } +} \ No newline at end of file diff --git a/payloads/transforms/responses_to_bedrock/toolCallRequest.json b/payloads/transforms/responses_to_bedrock/toolCallRequest.json new file mode 100644 index 00000000..002738c6 --- /dev/null +++ b/payloads/transforms/responses_to_bedrock/toolCallRequest.json @@ -0,0 +1,36 @@ +{ + "output": { + "message": { + "role": "assistant", + "content": [ + { + "toolUse": { + "toolUseId": "tooluse_cpNBxKzSF7PRX54s6VyUjk", + "name": "get_weather", + "input": { + "location": "San Francisco, CA" + }, + "type": "tool_use" + } + } + ] + } + }, + "stopReason": "tool_use", + "usage": { + "inputTokens": 585, + "outputTokens": 57, + "totalTokens": 642, + "cacheReadInputTokens": 0, + "cacheWriteInputTokens": 0 + }, + "metrics": { + "latencyMs": 984 + }, + "$metadata": { + "httpStatusCode": 200, + "requestId": "7b4ebb62-d1fd-42f6-81fb-20feb4fe3490", + "attempts": 1, + "totalRetryDelay": 0 + } +} \ No newline at end of file diff --git a/payloads/transforms/transform_errors.json b/payloads/transforms/transform_errors.json index 6bc1ccbe..9f3a3527 100644 --- a/payloads/transforms/transform_errors.json +++ b/payloads/transforms/transform_errors.json @@ -61,5 +61,20 @@ "toolChoiceAnyParam": "OpenAI rejected: tool parameter schema must be 'object' or 'boolean', not null", "toolChoiceNoneParam": "OpenAI rejected: tool parameter schema must be 'object' or 'boolean', not null", "toolModeValidatedParam": "OpenAI rejected: tool parameter schema must be 'object' or 'boolean', not null" + }, + "chat-completions_to_bedrock": { + "simpleRequest": "BedrockOutputContentBlock enum missing reasoningContent variant; Claude 3.7 Sonnet returns thinking blocks even for simple requests", + "multimodalRequest": "Bedrock ValidationException: Could not process image; likely a URL-based or unsupported image encoding" + }, + "responses_to_bedrock": { + "simpleRequest": "BedrockOutputContentBlock enum missing reasoningContent variant; Claude 3.7 Sonnet returns thinking blocks even for simple requests", + "reasoningRequest": "BedrockOutputContentBlock enum missing reasoningContent variant; Bedrock extended thinking response cannot be deserialized", + "reasoningRequestTruncated": "Bedrock ValidationException: max_tokens (100) must be greater than thinking.budget_tokens (minimum 1024)", + "multimodalRequest": "Bedrock ValidationException: Could not process image; likely a URL-based or unsupported image encoding", + "complexReasoningRequest": "BedrockOutputContentBlock enum missing reasoningContent variant; Bedrock extended thinking response cannot be deserialized", + "reasoningWithOutput": "BedrockOutputContentBlock enum missing reasoningContent variant; Bedrock extended thinking response cannot be deserialized" + }, + "anthropic_to_bedrock": { + "multimodalRequest": "Bedrock ValidationException: Could not process image; likely a URL-based or unsupported image encoding" } }