diff --git a/CHANGELOG.md b/CHANGELOG.md index f64d1d1f3..28a22c3a4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ All notable changes to this project will be documented in this file. See [conventional commits](https://www.conventionalcommits.org/) for commit guidelines. -## [0.70.4](https://github.com/boundaryml/baml/compare/0.70.1..0.70.4) - 2024-12-13 +## [0.70.5](https://github.com/boundaryml/baml/compare/0.70.1..0.70.5) - 2024-12-13 ### Bug Fixes diff --git a/engine/Cargo.lock b/engine/Cargo.lock index 47e3a822a..5006542f1 100644 --- a/engine/Cargo.lock +++ b/engine/Cargo.lock @@ -785,7 +785,7 @@ dependencies = [ [[package]] name = "baml-cli" -version = "0.70.4" +version = "0.70.5" dependencies = [ "ambassador", "anyhow", @@ -873,7 +873,7 @@ dependencies = [ [[package]] name = "baml-lib" -version = "0.70.4" +version = "0.70.5" dependencies = [ "base64 0.13.1", "dissimilar", @@ -913,7 +913,7 @@ dependencies = [ [[package]] name = "baml-runtime" -version = "0.70.4" +version = "0.70.5" dependencies = [ "ambassador", "anyhow", @@ -1010,7 +1010,7 @@ dependencies = [ [[package]] name = "baml-schema-build" -version = "0.70.4" +version = "0.70.5" dependencies = [ "anyhow", "baml-runtime", @@ -1048,7 +1048,7 @@ dependencies = [ [[package]] name = "baml-types" -version = "0.70.4" +version = "0.70.5" dependencies = [ "anyhow", "clap", @@ -1177,7 +1177,7 @@ dependencies = [ [[package]] name = "bstd" -version = "0.70.4" +version = "0.70.5" dependencies = [ "anyhow", "assert_cmd", @@ -2571,7 +2571,7 @@ dependencies = [ [[package]] name = "internal-baml-codegen" -version = "0.70.4" +version = "0.70.5" dependencies = [ "anyhow", "askama", @@ -2596,7 +2596,7 @@ dependencies = [ [[package]] name = "internal-baml-core" -version = "0.70.4" +version = "0.70.5" dependencies = [ "anyhow", "baml-types", @@ -2633,7 +2633,7 @@ dependencies = [ [[package]] name = "internal-baml-diagnostics" -version = "0.70.4" +version = "0.70.5" dependencies = [ "anyhow", "colored", @@ -2646,7 +2646,7 @@ dependencies = [ [[package]] name = "internal-baml-jinja" -version = "0.70.4" +version = "0.70.5" dependencies = [ "anyhow", "askama", @@ -2667,7 +2667,7 @@ dependencies = [ [[package]] name = "internal-baml-jinja-types" -version = "0.70.4" +version = "0.70.5" dependencies = [ "anyhow", "askama", @@ -2686,7 +2686,7 @@ dependencies = [ [[package]] name = "internal-baml-parser-database" -version = "0.70.4" +version = "0.70.5" dependencies = [ "anyhow", "baml-types", @@ -2711,7 +2711,7 @@ dependencies = [ [[package]] name = "internal-baml-prompt-parser" -version = "0.70.4" +version = "0.70.5" dependencies = [ "internal-baml-diagnostics", "internal-baml-schema-ast", @@ -2723,7 +2723,7 @@ dependencies = [ [[package]] name = "internal-baml-schema-ast" -version = "0.70.4" +version = "0.70.5" dependencies = [ "anyhow", "baml-types", @@ -2742,7 +2742,7 @@ dependencies = [ [[package]] name = "internal-llm-client" -version = "0.70.4" +version = "0.70.5" dependencies = [ "anyhow", "baml-types", @@ -2840,7 +2840,7 @@ checksum = "9dbbfed4e59ba9750e15ba154fdfd9329cee16ff3df539c2666b70f58cc32105" [[package]] name = "jsonish" -version = "0.70.4" +version = "0.70.5" dependencies = [ "anyhow", "assert-json-diff", diff --git a/engine/Cargo.toml b/engine/Cargo.toml index 794483be4..5206fcd5d 100644 --- a/engine/Cargo.toml +++ b/engine/Cargo.toml @@ -95,7 +95,7 @@ internal-baml-jinja = { path = "baml-lib/jinja" } internal-baml-schema-ast = { path = "baml-lib/schema-ast" } [workspace.package] -version = "0.70.4" +version = "0.70.5" authors = ["Boundary "] description = "BAML Toolchain" diff --git a/engine/language_client_python/pyproject.toml b/engine/language_client_python/pyproject.toml index 701dad675..f8fddc48a 100644 --- a/engine/language_client_python/pyproject.toml +++ b/engine/language_client_python/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "baml-py" -version = "0.70.4" +version = "0.70.5" description = "BAML python bindings (pyproject.toml)" readme = "README.md" authors = [["Boundary", "contact@boundaryml.com"]] diff --git a/engine/language_client_ruby/baml.gemspec b/engine/language_client_ruby/baml.gemspec index 614847ac9..b0fe42f8b 100644 --- a/engine/language_client_ruby/baml.gemspec +++ b/engine/language_client_ruby/baml.gemspec @@ -2,7 +2,7 @@ Gem::Specification.new do |spec| spec.name = "baml" - spec.version = "0.70.4" + spec.version = "0.70.5" spec.authors = ["BoundaryML"] spec.email = ["contact@boundaryml.com"] diff --git a/engine/language_client_typescript/package.json b/engine/language_client_typescript/package.json index 0bd8ab9fe..ce111573d 100644 --- a/engine/language_client_typescript/package.json +++ b/engine/language_client_typescript/package.json @@ -1,6 +1,6 @@ { "name": "@boundaryml/baml", - "version": "0.70.4", + "version": "0.70.5", "description": "BAML typescript bindings (package.json)", "repository": { "type": "git", diff --git a/integ-tests/baml_src/generators.baml b/integ-tests/baml_src/generators.baml index d5f2bad70..fef5b4e88 100644 --- a/integ-tests/baml_src/generators.baml +++ b/integ-tests/baml_src/generators.baml @@ -1,24 +1,24 @@ generator lang_python { output_type python/pydantic output_dir "../python" - version "0.70.4" + version "0.70.5" } generator lang_typescript { output_type typescript output_dir "../typescript" - version "0.70.4" + version "0.70.5" } generator lang_ruby { output_type ruby/sorbet output_dir "../ruby" - version "0.70.4" + version "0.70.5" } // generator openapi { // output_type rest/openapi // output_dir "../openapi" -// version "0.70.4" +// version "0.70.5" // on_generate "rm .gitignore" // } diff --git a/integ-tests/python/baml_client/inlinedbaml.py b/integ-tests/python/baml_client/inlinedbaml.py index 5ad6ca5a3..7af9855cb 100644 --- a/integ-tests/python/baml_client/inlinedbaml.py +++ b/integ-tests/python/baml_client/inlinedbaml.py @@ -25,7 +25,7 @@ "fiddle-examples/extract-receipt-info.baml": "class ReceiptItem {\n name string\n description string?\n quantity int\n price float\n}\n\nclass ReceiptInfo {\n items ReceiptItem[]\n total_cost float?\n venue \"barisa\" | \"ox_burger\"\n}\n\nfunction ExtractReceiptInfo(email: string, reason: \"curiosity\" | \"personal_finance\") -> ReceiptInfo {\n client GPT4o\n prompt #\"\n Given the receipt below:\n\n ```\n {{email}}\n ```\n\n {{ ctx.output_format }}\n \"#\n}\n\n", "fiddle-examples/images/image.baml": "function DescribeImage(img: image) -> string {\n client GPT4o\n prompt #\"\n {{ _.role(\"user\") }}\n\n\n Describe the image below in 20 words:\n {{ img }}\n \"#\n\n}\n\nclass FakeImage {\n url string\n}\n\nclass ClassWithImage {\n myImage image\n param2 string\n fake_image FakeImage\n}\n\n// chat role user present\nfunction DescribeImage2(classWithImage: ClassWithImage, img2: image) -> string { \n client GPT4Turbo\n prompt #\"\n {{ _.role(\"user\") }}\n You should return 2 answers that answer the following commands.\n\n 1. Describe this in 5 words:\n {{ classWithImage.myImage }}\n\n 2. Also tell me what's happening here in one sentence:\n {{ img2 }}\n \"#\n}\n\n// no chat role\nfunction DescribeImage3(classWithImage: ClassWithImage, img2: image) -> string {\n client GPT4Turbo\n prompt #\"\n Describe this in 5 words:\n {{ classWithImage.myImage }}\n\n Tell me also what's happening here in one sentence and relate it to the word {{ classWithImage.param2 }}:\n {{ img2 }}\n \"#\n}\n\n\n// system prompt and chat prompt\nfunction DescribeImage4(classWithImage: ClassWithImage, img2: image) -> string {\n client GPT4Turbo\n prompt #\"\n {{ _.role(\"system\")}}\n\n Describe this in 5 words:\n {{ classWithImage.myImage }}\n\n Tell me also what's happening here in one sentence and relate it to the word {{ classWithImage.param2 }}:\n {{ img2 }}\n \"#\n}\n\ntest TestName {\n functions [DescribeImage]\n args {\n img { url \"https://imgs.xkcd.com/comics/standards.png\"}\n }\n}\n", "fiddle-examples/symbol-tuning.baml": "enum Category3 {\n Refund @alias(\"k1\")\n @description(\"Customer wants to refund a product\")\n\n CancelOrder @alias(\"k2\")\n @description(\"Customer wants to cancel an order\")\n\n TechnicalSupport @alias(\"k3\")\n @description(\"Customer needs help with a technical issue unrelated to account creation or login\")\n\n AccountIssue @alias(\"k4\")\n @description(\"Specifically relates to account-login or account-creation\")\n\n Question @alias(\"k5\")\n @description(\"Customer has a question\")\n}\n\nfunction ClassifyMessage3(input: string) -> Category {\n client GPT4\n\n prompt #\"\n Classify the following INPUT into ONE\n of the following categories:\n\n INPUT: {{ input }}\n\n {{ ctx.output_format }}\n\n Response:\n \"#\n}", - "generators.baml": "generator lang_python {\n output_type python/pydantic\n output_dir \"../python\"\n version \"0.70.4\"\n}\n\ngenerator lang_typescript {\n output_type typescript\n output_dir \"../typescript\"\n version \"0.70.4\"\n}\n\ngenerator lang_ruby {\n output_type ruby/sorbet\n output_dir \"../ruby\"\n version \"0.70.4\"\n}\n\n// generator openapi {\n// output_type rest/openapi\n// output_dir \"../openapi\"\n// version \"0.70.4\"\n// on_generate \"rm .gitignore\"\n// }\n", + "generators.baml": "generator lang_python {\n output_type python/pydantic\n output_dir \"../python\"\n version \"0.70.5\"\n}\n\ngenerator lang_typescript {\n output_type typescript\n output_dir \"../typescript\"\n version \"0.70.5\"\n}\n\ngenerator lang_ruby {\n output_type ruby/sorbet\n output_dir \"../ruby\"\n version \"0.70.5\"\n}\n\n// generator openapi {\n// output_type rest/openapi\n// output_dir \"../openapi\"\n// version \"0.70.5\"\n// on_generate \"rm .gitignore\"\n// }\n", "test-files/aliases/aliased-inputs.baml": "\nclass InputClass {\n key string @alias(\"color\")\n key2 string\n}\n\n\nclass InputClassNested {\n key string\n nested InputClass @alias(\"interesting-key\")\n}\n \n\nfunction AliasedInputClass(input: InputClass) -> string {\n client GPT35\n prompt #\"\n\n {{input}}\n\n This is a test. What's the name of the first json key above? Remember, tell me the key, not value.\n \"#\n}\n \nfunction AliasedInputClass2(input: InputClass) -> string {\n client GPT35\n prompt #\"\n\n {# making sure we can still access the original key #}\n {%if input.key == \"tiger\"%}\n Repeat this value back to me, and nothing else: {{input.key}}\n {%endif%}\n \"#\n}\n \n function AliasedInputClassNested(input: InputClassNested) -> string {\n client GPT35\n prompt #\"\n {{ _.role(\"user\")}}\n\n {{input}}\n\n This is a test. What's the name of the second json key above? Remember, tell me the key, not value.\n \"#\n }\n\n\nenum AliasedEnum {\n KEY_ONE @alias(\"tiger\")\n KEY_TWO\n}\n\nfunction AliasedInputEnum(input: AliasedEnum) -> string {\n client GPT4o\n prompt #\"\n {{ _.role(\"user\")}}\n\n\n Write out this word only in your response, in lowercase:\n ---\n {{input}}\n ---\n Answer:\n \"#\n}\n\n\nfunction AliasedInputList(input: AliasedEnum[]) -> string {\n client GPT35\n prompt #\"\n {{ _.role(\"user\")}}\n Given this array:\n ---\n {{input}}\n ---\n\n Return the first element in the array:\n \"#\n}\n\n", "test-files/aliases/classes.baml": "class TestClassAlias {\n key string @alias(\"key-dash\") @description(#\"\n This is a description for key\n af asdf\n \"#)\n key2 string @alias(\"key21\")\n key3 string @alias(\"key with space\")\n key4 string //unaliased\n key5 string @alias(\"key.with.punctuation/123\")\n}\n\nfunction FnTestClassAlias(input: string) -> TestClassAlias {\n client GPT35\n prompt #\"\n {{ctx.output_format}}\n \"#\n}\n\ntest FnTestClassAlias {\n functions [FnTestClassAlias]\n args {\n input \"example input\"\n }\n}\n", "test-files/aliases/enums.baml": "enum TestEnum {\n A @alias(\"k1\") @description(#\"\n User is angry\n \"#)\n B @alias(\"k22\") @description(#\"\n User is happy\n \"#)\n // tests whether k1 doesnt incorrectly get matched with k11\n C @alias(\"k11\") @description(#\"\n User is sad\n \"#)\n D @alias(\"k44\") @description(\n User is confused\n )\n E @description(\n User is excited\n )\n F @alias(\"k5\") // only alias\n \n G @alias(\"k6\") @description(#\"\n User is bored\n With a long description\n \"#)\n \n @@alias(\"Category\")\n}\n\nfunction FnTestAliasedEnumOutput(input: string) -> TestEnum {\n client GPT35\n prompt #\"\n Classify the user input into the following category\n \n {{ ctx.output_format }}\n\n {{ _.role('user') }}\n {{input}}\n\n {{ _.role('assistant') }}\n Category ID:\n \"#\n}\n\ntest FnTestAliasedEnumOutput {\n functions [FnTestAliasedEnumOutput]\n args {\n input \"mehhhhh\"\n }\n}", diff --git a/integ-tests/python/report.html b/integ-tests/python/report.html index c0d92aea1..a2bf7f2b2 100644 --- a/integ-tests/python/report.html +++ b/integ-tests/python/report.html @@ -3,107 +3,107 @@
Test Report

Summary

102
102 passed

Tests

tests/test_functions.py 97 0:03:22.465711

PASSED test_env_vars_reset 0:00:01.585552

Setup

Call

Captured stdout call
Context depth is greater than 0!
+    
Test Report

Summary

102
102 passed

Tests

tests/test_functions.py 97 0:03:46.102683

PASSED test_env_vars_reset 0:00:01.724247

Setup

Call

Captured stdout call
Context depth is greater than 0!
 Except but ending trace!
 Context depth is greater than 0!
-

Teardown

PASSED test_sync 0:00:00.354235

Setup

Call

Captured stdout call
got response key
+

Teardown

PASSED test_sync 0:00:00.711866

Setup

Call

Captured stdout call
got response key
 true
 52
-

Teardown

PASSED TestAllInputs::test_single_bool 0:00:00.353408

Setup

Call

Teardown

PASSED TestAllInputs::test_single_string_list 0:00:00.405568

Setup

Call

Teardown

PASSED TestAllInputs::test_return_literal_union 0:00:00.428085

Setup

Call

Teardown

PASSED TestAllInputs::test_constraints 0:00:00.699829

Setup

Call

Teardown

PASSED TestAllInputs::test_constraint_union_variant_checking 0:00:00.669447

Setup

Call

Teardown

PASSED TestAllInputs::test_return_malformed_constraint 0:00:00.444137

Setup

Call

Teardown

PASSED TestAllInputs::test_use_malformed_constraint 0:00:00.001372

Setup

Call

Captured stderr call
[2024-12-13T15:04:04Z ERROR baml_runtime::tracing]   Error: a: Failed to evaluate assert: Error evaluating constraint: unknown method: object has no method named length (in <string>:1)
+

Teardown

PASSED TestAllInputs::test_single_bool 0:00:00.390461

Setup

Call

Teardown

PASSED TestAllInputs::test_single_string_list 0:00:00.541253

Setup

Call

Teardown

PASSED TestAllInputs::test_return_literal_union 0:00:00.638103

Setup

Call

Teardown

PASSED TestAllInputs::test_constraints 0:00:00.707337

Setup

Call

Teardown

PASSED TestAllInputs::test_constraint_union_variant_checking 0:00:00.751209

Setup

Call

Teardown

PASSED TestAllInputs::test_return_malformed_constraint 0:00:00.520349

Setup

Call

Teardown

PASSED TestAllInputs::test_use_malformed_constraint 0:00:00.001717

Setup

Call

Captured stderr call
[2024-12-13T15:37:30Z ERROR baml_runtime::tracing]   Error: a: Failed to evaluate assert: Error evaluating constraint: unknown method: object has no method named length (in <string>:1)
     
-

Teardown

PASSED TestAllInputs::test_single_class 0:00:00.421985

Setup

Call

Teardown

PASSED TestAllInputs::test_multiple_args 0:00:00.475687

Setup

Call

Teardown

PASSED TestAllInputs::test_single_enum_list 0:00:00.429657

Setup

Call

Teardown

PASSED TestAllInputs::test_single_float 0:00:00.303339

Setup

Call

Teardown

PASSED TestAllInputs::test_single_int 0:00:00.317512

Setup

Call

Teardown

PASSED TestAllInputs::test_single_literal_int 0:00:00.286368

Setup

Call

Teardown

PASSED TestAllInputs::test_single_literal_bool 0:00:00.543175

Setup

Call

Teardown

PASSED TestAllInputs::test_single_literal_string 0:00:00.456703

Setup

Call

Teardown

PASSED TestAllInputs::test_class_with_literal_prop 0:00:02.918372

Setup

Call

Teardown

PASSED TestAllInputs::test_literal_classs_with_literal_union_prop 0:00:00.482259

Setup

Call

Teardown

PASSED TestAllInputs::test_single_map_string_to_string 0:00:00.790809

Setup

Call

Teardown

PASSED TestAllInputs::test_single_map_string_to_class 0:00:00.573659

Setup

Call

Teardown

PASSED TestAllInputs::test_single_map_string_to_map 0:00:00.500889

Setup

Call

Teardown

PASSED TestAllInputs::test_enum_key_in_map 0:00:01.214129

Setup

Call

Teardown

PASSED TestAllInputs::test_literal_string_union_key_in_map 0:00:00.663402

Setup

Call

Teardown

PASSED TestAllInputs::test_single_literal_string_key_in_map 0:00:00.394802

Setup

Call

Teardown

PASSED test_should_work_for_all_outputs 0:00:04.185906

Setup

Call

Teardown

PASSED test_should_work_with_image_url 0:00:01.573777

Setup

Call

Teardown

PASSED test_should_work_with_image_list 0:00:01.319235

Setup

Call

Teardown

PASSED test_should_work_with_vertex 0:00:08.744991

Setup

Call

Teardown

PASSED test_should_work_with_image_base64 0:00:01.471288

Setup

Call

Teardown

PASSED test_should_work_with_audio_base64 0:00:01.439186

Setup

Call

Teardown

PASSED test_should_work_with_audio_url 0:00:01.702215

Setup

Call

Teardown

PASSED test_works_with_retries2 0:00:02.212101

Setup

Call

Captured stdout call
Expected error LLM call failed: LLMErrorResponse { client: "RetryClientExponential", model: None, prompt: Chat([RenderedChatMessage { role: "system", allow_duplicate_role: false, parts: [Text("Say a haiku")] }]), request_options: {"model": String("gpt-3.5-turbo")}, start_time: SystemTime { tv_sec: 1734102277, tv_nsec: 591369000 }, latency: 250.555083ms, message: "Request failed: https://api.openai.com/v1/chat/completions\n{\n    \"error\": {\n        \"message\": \"Incorrect API key provided: blahh. You can find your API key at https://platform.openai.com/account/api-keys.\",\n        \"type\": \"invalid_request_error\",\n        \"param\": null,\n        \"code\": \"invalid_api_key\"\n    }\n}\n", code: InvalidAuthentication }
-

Teardown

PASSED test_works_with_fallbacks 0:00:01.982022

Setup

Call

Teardown

PASSED test_works_with_failing_azure_fallback 0:00:00.032832

Setup

Call

Teardown

PASSED test_claude 0:00:01.146224

Setup

Call

Teardown

PASSED test_gemini 0:00:08.398163

Setup

Call

Captured stdout call
LLM output from Gemini: Dr. Pepper wasn't a real doctor, of course. He was just a little firefly, the smallest one in his whole family. But Dr. Pepper had big dreams. He didn't just want to flicker; he wanted to shine, to light up the whole meadow with his bioluminescent brilliance.
+

Teardown

PASSED TestAllInputs::test_single_class 0:00:00.640746

Setup

Call

Teardown

PASSED TestAllInputs::test_multiple_args 0:00:00.677625

Setup

Call

Teardown

PASSED TestAllInputs::test_single_enum_list 0:00:00.391208

Setup

Call

Teardown

PASSED TestAllInputs::test_single_float 0:00:00.338163

Setup

Call

Teardown

PASSED TestAllInputs::test_single_int 0:00:00.449043

Setup

Call

Teardown

PASSED TestAllInputs::test_single_literal_int 0:00:00.307882

Setup

Call

Teardown

PASSED TestAllInputs::test_single_literal_bool 0:00:00.306098

Setup

Call

Teardown

PASSED TestAllInputs::test_single_literal_string 0:00:00.342438

Setup

Call

Teardown

PASSED TestAllInputs::test_class_with_literal_prop 0:00:00.574151

Setup

Call

Teardown

PASSED TestAllInputs::test_literal_classs_with_literal_union_prop 0:00:01.234555

Setup

Call

Teardown

PASSED TestAllInputs::test_single_map_string_to_string 0:00:00.619017

Setup

Call

Teardown

PASSED TestAllInputs::test_single_map_string_to_class 0:00:00.525969

Setup

Call

Teardown

PASSED TestAllInputs::test_single_map_string_to_map 0:00:05.381838

Setup

Call

Teardown

PASSED TestAllInputs::test_enum_key_in_map 0:00:00.725482

Setup

Call

Teardown

PASSED TestAllInputs::test_literal_string_union_key_in_map 0:00:00.944775

Setup

Call

Teardown

PASSED TestAllInputs::test_single_literal_string_key_in_map 0:00:01.689217

Setup

Call

Teardown

PASSED test_should_work_for_all_outputs 0:00:09.106303

Setup

Call

Teardown

PASSED test_should_work_with_image_url 0:00:01.247719

Setup

Call

Teardown

PASSED test_should_work_with_image_list 0:00:01.860304

Setup

Call

Teardown

PASSED test_should_work_with_vertex 0:00:09.442870

Setup

Call

Teardown

PASSED test_should_work_with_image_base64 0:00:01.575767

Setup

Call

Teardown

PASSED test_should_work_with_audio_base64 0:00:01.127755

Setup

Call

Teardown

PASSED test_should_work_with_audio_url 0:00:01.295709

Setup

Call

Teardown

PASSED test_works_with_retries2 0:00:02.286246

Setup

Call

Captured stdout call
Expected error LLM call failed: LLMErrorResponse { client: "RetryClientExponential", model: None, prompt: Chat([RenderedChatMessage { role: "system", allow_duplicate_role: false, parts: [Text("Say a haiku")] }]), request_options: {"model": String("gpt-3.5-turbo")}, start_time: SystemTime { tv_sec: 1734104292, tv_nsec: 898945000 }, latency: 213.33125ms, message: "Request failed: https://api.openai.com/v1/chat/completions\n{\n    \"error\": {\n        \"message\": \"Incorrect API key provided: blahh. You can find your API key at https://platform.openai.com/account/api-keys.\",\n        \"type\": \"invalid_request_error\",\n        \"param\": null,\n        \"code\": \"invalid_api_key\"\n    }\n}\n", code: InvalidAuthentication }
+

Teardown

PASSED test_works_with_fallbacks 0:00:01.883552

Setup

Call

Teardown

PASSED test_works_with_failing_azure_fallback 0:00:00.034322

Setup

Call

Teardown

PASSED test_claude 0:00:01.074194

Setup

Call

Teardown

PASSED test_gemini 0:00:08.252263

Setup

Call

Captured stdout call
LLM output from Gemini: Dr. Pete Pepper wasn't a medical doctor, no matter what his name tag proclaimed.  He was a botanist, specializing in, of all things, peppers. Not the bell peppers you'd find in your salad, but their wilder, spicier cousins.  His small shop, tucked between a bakery and a vintage clothing store, was a haven for chili heads. 
 
-"Aim for the moon, little brother," his eldest sister, Flicker, would always tell him. "Even if you miss, you'll land among the stars." 
+One afternoon, a young woman named Lily hurried in, desperation etched on her face. "Dr. Pepper? Please, you have to help!"
 
-Inspired, Dr. Pepper spent his days collecting dewdrops, convinced they held the secret to a brighter glow. He'd mix them with pollen and moonlight, meticulously recording each recipe in a tiny notebook he kept tucked under his wing. 
+Dr. Pepper, a portly man with a pepper-shaped birthmark on his cheek, peered at her over his spectacles. "What seems to be the trouble?" 
 
-One cool evening, a group of fireflies huddled together, their light noticeably dimmer. A storm was brewing, and they relied on their glow to communicate.
+Lily held out a withered plant. "This," she whispered, "is Beatrice. She's a Carolina Reaper, and she's… well, she's dying!"
 
-"My signal is failing!" one cried. "I can't reach my cousin Barry!"
+Dr. Pepper examined the plant.  "Hmm, overwatering, I see.  And a touch of aphid infestation.  Don't worry, we can fix this."
 
-Dr. Pepper, who had been studying a particularly shimmering dewdrop, knew this was his moment. He scurried over, his tiny heart thumping. 
+For the next hour, Lily watched, captivated, as Dr. Pepper treated Beatrice with a gentle touch and a pharmacist's precision, mixing homemade concoctions and whispering words of encouragement. 
 
-"Don't worry!" he declared. "I, Dr. Pepper, have just the thing!"
+When he finished, he smiled.  "There you go. She'll be right as rain in no time."
 
-He presented his latest concoction: a blend of dawn dew and firefly pollen, energized by a sliver of moonlight. He carefully applied a drop to each firefly's lantern. 
+Lily beamed, relief flooding her features. "Thank you, Dr. Pepper!  Beatrice is very special to me."
 
-As if by magic, their lights blazed with renewed intensity, brighter than ever before. The meadow was bathed in a warm, pulsating glow. 
+Dr. Pepper chuckled.  "They all are, my dear.  Each pepper has its own story, its own unique fire."
 
-From then on, Dr. Pepper, the little firefly with the big dream, became the official glow-boosting doctor of the meadow. He might not have been a real doctor, but he proved that even the smallest among us can make a brilliant difference. 
+From then on, Lily became a regular, bringing Dr. Pepper fresh-baked cookies shaped like chili peppers and listening to his tales of pepper expeditions around the world.  And Beatrice? She thrived, producing the hottest, most delicious Carolina Reapers anyone had ever tasted – a testament to the magic touch of the one and only Dr. Pepper. 
 
-

Teardown

PASSED test_gemini_streaming 0:00:09.820687

Setup

Call

Captured stdout call
LLM output from Gemini: Dottie "Dr. Pepper" Peterson wasn't actually a doctor. Not the kind that hung a shingle or wore a stethoscope anyway. Dottie was a mechanic, the best shade-tree, grease-stained, wrench-wielding mechanic this side of the Mississippi. 
+

Teardown

PASSED test_gemini_streaming 0:00:09.945069

Setup

Call

Captured stdout call
LLM output from Gemini: Dr. Pete Pepper wasn't a doctor of medicine, but everyone called him "Doc" anyway.  He owned the Pepper Place Soda Fountain, a cozy shop on Main Street where the cherry-red booths and checkered floor had seen generations of gossip, first dates, and ice cream dreams. 
 
-Her "office" was a rambling old gas station on the outskirts of Harmony Creek, a town content to live in the shadow of its brighter, bigger brother city just a stone's throw away. The air always smelled faintly of gasoline and something sugary sweet Dottie added to her legendary homemade root beer. 
+Doc, with his twinkling eyes and a handlebar mustache that seemed to hold a lifetime of stories, wasn't just a soda jerk, he was a craftsman. He concocted his own syrups, each a secret recipe passed down from his grandfather: sarsaparilla with a hint of nutmeg, creamy vanilla bean, and his most popular, a spicy, effervescent blend he called "Doc's Pep." 
 
-Folks said Dottie could coax life back into anything with an engine. They brought her beat-up pickups, sputtering motorcycles, even the occasional rusty tractor. And Dottie, with a twinkle in her eye and a smudge of grease across her cheek, always delivered. 
+One sweltering afternoon, a young girl named Lily sat forlornly at the counter.  She picked at her vanilla ice cream, her face as droopy as a wilted daisy. 
 
-One sweltering summer day, a vintage cherry-red convertible sputtered its way onto Dottie's lot, trailing a plume of smoke. A young man, all slicked-back hair and nervous energy, hopped out. This was Billy, heir to the Carson fortune, and his grandfather's prized possession was coughing its last.
+"What's got you down, little one?" Doc asked, drying a glass. 
 
-Dottie, unfazed by the fancy car or the worry etched on Billy's face, popped the hood. She poked, prodded, and muttered to herself in a language only she and the car seemed to understand.  Finally, with a triumphant grin, she held up a tiny, corroded part. 
+"It's my Pa," Lily sighed, "He's been working too hard.  He needs a pep in his step, but nothing seems to work."
 
-"Fuel pump's had its day, sonny. But don't you worry," she winked, "Dr. Pepper's got just the cure."
+Doc's eyes twinkled. He knew just the thing. He mixed together a tall glass of his special soda, adding a scoop of vanilla ice cream and a splash of Lily’s favorite cherry syrup. 
 
-Two days later, Billy sat on a stool by the open garage door, sipping Dottie's homemade root beer, its sweet, spicy flavor a revelation. The setting sun bathed the lot in a warm glow as Dottie tinkered with the final touches. When she finally turned the key, the engine roared to life, smoother and stronger than ever.
+Lily brought the drink to her Pa, a tired construction worker with kind eyes. He took a sip, and his face lit up like a Christmas tree. "Now that's what I call a pick-me-up!" he exclaimed. 
 
-Billy beamed, gratitude shining in his eyes. He knew he hadn't just found a mechanic; he'd found someone who understood the language of passion and dedication that whispered from the heart of a vintage engine. He'd found Dr. Pepper, and she was just what he, and his grandfather's car, needed. 
+From that day on, the drink became a local legend.  People came from miles around to try "Lily's Pep," a drink that tasted like sunshine and hope. Doc's Soda Fountain, overflowing with laughter and the sweet scent of success, became a place where people didn't just come to quench their thirst, but to find a little bit of joy, all thanks to a special girl, a caring soda jerk, and a drink that truly put the pep back in their step. 
 
-

Teardown

PASSED test_aws 0:00:01.693974

Setup

Call

Teardown

PASSED test_openai_shorthand 0:00:18.634061

Setup

Call

Teardown

PASSED test_openai_shorthand_streaming 0:00:09.031010

Setup

Call

Teardown

PASSED test_anthropic_shorthand 0:00:03.987248

Setup

Call

Teardown

PASSED test_anthropic_shorthand_streaming 0:00:02.828325

Setup

Call

Teardown

PASSED test_fallback_to_shorthand 0:00:01.221166

Setup

Call

Teardown

PASSED test_aws_streaming 0:00:01.693609

Setup

Call

Teardown

PASSED test_streaming 0:00:03.932973

Setup

Call

Teardown

PASSED test_streaming_uniterated 0:00:02.449438

Setup

Call

Teardown

PASSED test_streaming_sync 0:00:02.844836

Setup

Call

Teardown

PASSED test_streaming_uniterated_sync 0:00:02.818222

Setup

Call

Teardown

PASSED test_streaming_claude 0:00:01.109030

Setup

Call

Captured stdout call
msgs:
+

Teardown

PASSED test_aws 0:00:02.873132

Setup

Call

Teardown

PASSED test_openai_shorthand 0:00:16.978485

Setup

Call

Teardown

PASSED test_openai_shorthand_streaming 0:00:20.264603

Setup

Call

Captured log call
WARNING  asyncio:base_events.py:1982 Executing <Task pending name='Task-44' coro=<BamlStream.__drive_to_completion() running at /Users/vbv/repos/gloo-lang/engine/language_client_python/python_src/baml_py/stream.py:48> wait_for=<Future pending cb=[<builtins.PyDoneCallback object at 0x11a41f350>(), Task.task_wakeup()] created at /opt/homebrew/Cellar/python@3.12/3.12.4/Frameworks/Python.framework/Versions/3.12/lib/python3.12/asyncio/base_events.py:449> cb=[_run_until_complete_cb() at /opt/homebrew/Cellar/python@3.12/3.12.4/Frameworks/Python.framework/Versions/3.12/lib/python3.12/asyncio/base_events.py:182] created at /opt/homebrew/Cellar/python@3.12/3.12.4/Frameworks/Python.framework/Versions/3.12/lib/python3.12/asyncio/runners.py:100> took 0.418 seconds

Teardown

PASSED test_anthropic_shorthand 0:00:03.639071

Setup

Call

Teardown

PASSED test_anthropic_shorthand_streaming 0:00:04.997820

Setup

Call

Captured log call
WARNING  asyncio:base_events.py:1982 Executing <Handle <builtins.CheckedCompletor object at 0x11a41f390>(<Future finis...events.py:449>, <built-in met...t 0x1193fc5e0>, <baml_py.baml...t 0x11a58b5a0>)> took 0.149 seconds

Teardown

PASSED test_fallback_to_shorthand 0:00:01.786834

Setup

Call

Teardown

PASSED test_aws_streaming 0:00:01.634205

Setup

Call

Teardown

PASSED test_streaming 0:00:03.029945

Setup

Call

Teardown

PASSED test_streaming_uniterated 0:00:03.856884

Setup

Call

Teardown

PASSED test_streaming_sync 0:00:04.308863

Setup

Call

Teardown

PASSED test_streaming_uniterated_sync 0:00:02.649873

Setup

Call

Teardown

PASSED test_streaming_claude 0:00:02.280925

Setup

Call

Captured stdout call
msgs:
 Here's a haiku about Mt. Rainier:
 
-Rainier stands proud, strong
-Piercing through clouds to bright sky
-Mountain king supreme
+Rainier towers high
+Ancient glacier-crowned giant
+Watches Puget Sound
 final:
 Here's a haiku about Mt. Rainier:
 
-Rainier stands proud, strong
-Piercing through clouds to bright sky
-Mountain king supreme
-

Teardown

PASSED test_streaming_gemini 0:00:09.248398

Setup

Call

Captured stdout call
msgs:
-The old diner hummed with the familiar tune of sizzling burgers and clinking silverware. The air, thick with the scent of frying onions and coffee, felt like a warm hug on a cold day. At a corner booth, sat a man, his fedora casting a shadow over his wrinkled face. He nursed a cup of coffee, his gaze lost somewhere beyond the checkered floor tiles. 
+Rainier towers high
+Ancient glacier-crowned giant
+Watches Puget Sound
+

Teardown

PASSED test_streaming_gemini 0:00:10.312743

Setup

Call

Captured stdout call
msgs:
+Dr. Pepper wasn't actually a doctor, though many in his small town jokingly called him that. His real name was Edward, but everyone knew him by his peculiar habit of always having a can of Dr Pepper in hand. He wasn't addicted, not really, but the caramel-colored fizz seemed to fuel his days.
 
-His name was William, and for as long as anyone could remember, he'd been a regular at Millie's Diner. He always ordered the same thing - black coffee and a slice of apple pie. But today, something was different. He looked…lost.
+Edward ran the local clock tower, a beautiful, if slightly crooked, structure that loomed over their quaint town square. Every day, rain or shine, he climbed its winding steps, his trusty Dr Pepper accompanying him, to wind the ancient mechanism and ensure the town kept ticking. 
 
-Millie, the owner with a heart as big as her legendary blueberry pancakes, noticed his somber mood.  She poured him a fresh cup of coffee and placed a familiar red can next to it. "Something a little stronger than usual, hon?" she asked, her voice a warm melody.
+One day, a young girl named Lily started visiting him. Her eyes, wide with wonder, would follow Edward's every move as he oiled gears and tightened springs. Lily, much like the town, seemed drawn to Edward's quiet dedication, his gentle humming as he worked, and yes, even his ever-present Dr Pepper.
 
-William looked up, surprised. "Dr. Pepper? For me?" 
+One particularly dreary afternoon, Lily arrived at the clock tower with a worried frown. "Mr. Edward," she began, her voice small, "the clock, it seems sad today. It doesn't chime like it used to."
 
-Millie chuckled. "Saw you staring at the young couple at booth three sharing one. Figured you could use a trip down memory lane."
+Edward chuckled, taking a sip from his can. He always told Lily the clock talked to him, that it whispered its woes through creaks and groans. To Lily, who looked at him with the unshakeable trust only a child could possess, this wasn't a matter of fantasy, it was simply fact.
 
-He took a slow sip, the sweet, spicy taste instantly transporting him back decades. He was back in his college days, young and nervous, mustering the courage to talk to the beautiful redhead at the soda fountain. Her laugh echoed in his ears, the memory as vivid as the day it was made. She was gone now, but the feeling… that never faded.
+Together, they examined the clock's giant pendulum, its swing sluggish and slow.  "Ah," Edward said finally, pointing to a worn-out spring, "Looks like our friend needs a little pick-me-up, just like you sometimes need a good night's sleep."
 
-A small smile touched his lips. "Thank you, Millie," he murmured. 
+As Edward replaced the spring, Lily, much like her mother did every week, offered him a freshly baked cookie. This time, however, alongside it sat a can of Dr Pepper, its condensation forming a perfect, tiny halo around the base. 
 
-He spent the rest of the afternoon lost in memories, each sip of Dr. Pepper a sip of the past. The familiar taste wasn't just a drink, it was a time machine, a reminder of love, laughter, and life lived to the fullest.  
+"For when the clock makes you thirsty," Lily said with a shy smile.
 
-And as the sun dipped low, casting long shadows across the diner, William knew he wouldn't trade those memories for anything. They were bittersweet, tinged with sadness, but they were his. And for that, he was grateful, just as he was grateful for Millie and the unexpected comfort of a simple Dr. Pepper. 
+Edward's heart, much like the revitalized clock, felt a warmth spread through it, a feeling as comforting and familiar as his favorite drink. He realized then that perhaps he wasn't just keeping time in this town, but also making memories, one can of Dr Pepper and one chime at a time. 
 
 final:
-The old diner hummed with the familiar tune of sizzling burgers and clinking silverware. The air, thick with the scent of frying onions and coffee, felt like a warm hug on a cold day. At a corner booth, sat a man, his fedora casting a shadow over his wrinkled face. He nursed a cup of coffee, his gaze lost somewhere beyond the checkered floor tiles. 
+Dr. Pepper wasn't actually a doctor, though many in his small town jokingly called him that. His real name was Edward, but everyone knew him by his peculiar habit of always having a can of Dr Pepper in hand. He wasn't addicted, not really, but the caramel-colored fizz seemed to fuel his days.
 
-His name was William, and for as long as anyone could remember, he'd been a regular at Millie's Diner. He always ordered the same thing - black coffee and a slice of apple pie. But today, something was different. He looked…lost.
+Edward ran the local clock tower, a beautiful, if slightly crooked, structure that loomed over their quaint town square. Every day, rain or shine, he climbed its winding steps, his trusty Dr Pepper accompanying him, to wind the ancient mechanism and ensure the town kept ticking. 
 
-Millie, the owner with a heart as big as her legendary blueberry pancakes, noticed his somber mood.  She poured him a fresh cup of coffee and placed a familiar red can next to it. "Something a little stronger than usual, hon?" she asked, her voice a warm melody.
+One day, a young girl named Lily started visiting him. Her eyes, wide with wonder, would follow Edward's every move as he oiled gears and tightened springs. Lily, much like the town, seemed drawn to Edward's quiet dedication, his gentle humming as he worked, and yes, even his ever-present Dr Pepper.
 
-William looked up, surprised. "Dr. Pepper? For me?" 
+One particularly dreary afternoon, Lily arrived at the clock tower with a worried frown. "Mr. Edward," she began, her voice small, "the clock, it seems sad today. It doesn't chime like it used to."
 
-Millie chuckled. "Saw you staring at the young couple at booth three sharing one. Figured you could use a trip down memory lane."
+Edward chuckled, taking a sip from his can. He always told Lily the clock talked to him, that it whispered its woes through creaks and groans. To Lily, who looked at him with the unshakeable trust only a child could possess, this wasn't a matter of fantasy, it was simply fact.
 
-He took a slow sip, the sweet, spicy taste instantly transporting him back decades. He was back in his college days, young and nervous, mustering the courage to talk to the beautiful redhead at the soda fountain. Her laugh echoed in his ears, the memory as vivid as the day it was made. She was gone now, but the feeling… that never faded.
+Together, they examined the clock's giant pendulum, its swing sluggish and slow.  "Ah," Edward said finally, pointing to a worn-out spring, "Looks like our friend needs a little pick-me-up, just like you sometimes need a good night's sleep."
 
-A small smile touched his lips. "Thank you, Millie," he murmured. 
+As Edward replaced the spring, Lily, much like her mother did every week, offered him a freshly baked cookie. This time, however, alongside it sat a can of Dr Pepper, its condensation forming a perfect, tiny halo around the base. 
 
-He spent the rest of the afternoon lost in memories, each sip of Dr. Pepper a sip of the past. The familiar taste wasn't just a drink, it was a time machine, a reminder of love, laughter, and life lived to the fullest.  
+"For when the clock makes you thirsty," Lily said with a shy smile.
 
-And as the sun dipped low, casting long shadows across the diner, William knew he wouldn't trade those memories for anything. They were bittersweet, tinged with sadness, but they were his. And for that, he was grateful, just as he was grateful for Millie and the unexpected comfort of a simple Dr. Pepper. 
+Edward's heart, much like the revitalized clock, felt a warmth spread through it, a feeling as comforting and familiar as his favorite drink. He realized then that perhaps he wasn't just keeping time in this town, but also making memories, one can of Dr Pepper and one chime at a time. 
 
-

Teardown

PASSED test_tracing_async_only 0:00:04.643830

Setup

Call

Captured stdout call
STATS TraceStats(failed=0, started=15, finalized=15, submitted=15, sent=15, done=15)
-

Teardown

PASSED test_tracing_sync 0:00:00.000368

Setup

Call

Teardown

PASSED test_tracing_thread_pool 0:00:01.469023

Setup

Call

Teardown

PASSED test_tracing_thread_pool_async 0:00:14.592067

Setup

Call

Teardown

PASSED test_tracing_async_gather 0:00:01.479932

Setup

Call

Teardown

PASSED test_tracing_async_gather_top_level 0:00:01.306652

Setup

Call

Teardown

PASSED test_dynamic 0:00:01.252011

Setup

Call

Captured stdout call
{'name': 'Harrison', 'hair_color': <Color.BLACK: 'BLACK'>, 'last_name': [], 'height': 1.8288, 'hobbies': [<Hobby.SPORTS: 'SPORTS'>]}
-

Teardown

PASSED test_dynamic_class_output 0:00:00.963628

Setup

Call

Captured stdout call
[]
+

Teardown

PASSED test_tracing_async_only 0:00:06.292172

Setup

Call

Captured stdout call
STATS TraceStats(failed=0, started=15, finalized=15, submitted=15, sent=15, done=15)
+

Teardown

PASSED test_tracing_sync 0:00:00.000395

Setup

Call

Teardown

PASSED test_tracing_thread_pool 0:00:01.502396

Setup

Call

Teardown

PASSED test_tracing_thread_pool_async 0:00:13.928513

Setup

Call

Teardown

PASSED test_tracing_async_gather 0:00:01.500037

Setup

Call

Teardown

PASSED test_tracing_async_gather_top_level 0:00:01.459186

Setup

Call

Teardown

PASSED test_dynamic 0:00:00.787106

Setup

Call

Captured stdout call
{'name': 'Harrison', 'hair_color': <Color.BLACK: 'BLACK'>, 'last_name': [], 'height': 1.83, 'hobbies': [<Hobby.SPORTS: 'SPORTS'>]}
+

Teardown

PASSED test_dynamic_class_output 0:00:01.239744

Setup

Call

Captured stdout call
[]
 {"hair_color":"black"}
-

Teardown

PASSED test_dynamic_class_nested_output_no_stream 0:00:00.900188

Setup

Call

Captured stdout call
{"name":{"first_name":"Mark","last_name":"Gonzalez","middle_name":null},"address":null,"hair_color":"black","height":6.0}
-

Teardown

PASSED test_dynamic_class_nested_output_stream 0:00:00.727351

Setup

Call

Captured stdout call
streamed  name=None hair_color=None
+

Teardown

PASSED test_dynamic_class_nested_output_no_stream 0:00:00.830211

Setup

Call

Captured stdout call
{"name":{"first_name":"Mark","last_name":"Gonzalez","middle_name":null},"address":null,"hair_color":"black","height":6.0}
+

Teardown

PASSED test_dynamic_class_nested_output_stream 0:00:00.755168

Setup

Call

Captured stdout call
streamed  name=None hair_color=None
 streamed  {'name': None, 'hair_color': None}
 streamed  name=None hair_color=None
 streamed  {'name': None, 'hair_color': None}
@@ -180,7 +180,7 @@
 streamed  name={'first_name': 'Mark', 'last_name': 'Gonzalez'} hair_color='black'
 streamed  {'name': {'first_name': 'Mark', 'last_name': 'Gonzalez'}, 'hair_color': 'black'}
 {"name":{"first_name":"Mark","last_name":"Gonzalez"},"hair_color":"black"}
-

Teardown

PASSED test_stream_dynamic_class_output 0:00:00.619440

Setup

Call

Captured stdout call
[]
+

Teardown

PASSED test_stream_dynamic_class_output 0:00:00.514480

Setup

Call

Captured stdout call
[]
 streamed  {'hair_color': '{'}
 streamed  {'hair_color': '{'}
 streamed  {'hair_color': '{\n  "'}
@@ -197,21 +197,18 @@
 final  hair_color='black'
 final  {'hair_color': 'black'}
 final  {"hair_color":"black"}
-

Teardown

PASSED test_dynamic_inputs_list2 0:00:01.244929

Setup

Call

Teardown

PASSED test_dynamic_types_new_enum 0:00:00.899329

Setup

Call

Teardown

PASSED test_dynamic_types_existing_enum 0:00:00.670222

Setup

Call

Teardown

PASSED test_dynamic_literals 0:00:00.914224

Setup

Call

Teardown

PASSED test_dynamic_inputs_list 0:00:01.274591

Setup

Call

Teardown

PASSED test_dynamic_output_map 0:00:00.622982

Setup

Call

Captured stdout call
[]
+

Teardown

PASSED test_dynamic_inputs_list2 0:00:01.167632

Setup

Call

Teardown

PASSED test_dynamic_types_new_enum 0:00:01.248098

Setup

Call

Teardown

PASSED test_dynamic_types_existing_enum 0:00:00.879871

Setup

Call

Teardown

PASSED test_dynamic_literals 0:00:00.815644

Setup

Call

Teardown

PASSED test_dynamic_inputs_list 0:00:01.074834

Setup

Call

Teardown

PASSED test_dynamic_output_map 0:00:00.733588

Setup

Call

Captured stdout call
[]
 final  hair_color='black' attributes={'height': '6 feet', 'eye_color': 'blue', 'facial_hair': 'beard'}
 final  {'hair_color': 'black', 'attributes': {'height': '6 feet', 'eye_color': 'blue', 'facial_hair': 'beard'}}
 final  {"hair_color":"black","attributes":{"height":"6 feet","eye_color":"blue","facial_hair":"beard"}}
-

Teardown

PASSED test_dynamic_output_union 0:00:03.483122

Setup

Call

Captured stdout call
[]
-final  hair_color='black' attributes={'eye_color': 'blue', 'facial_hair': 'beard', 'age': '30'} height={'feet': 6.0, 'inches': None}
-final  {'hair_color': 'black', 'attributes': {'eye_color': 'blue', 'facial_hair': 'beard', 'age': '30'}, 'height': {'feet': 6.0, 'inches': None}}
-final  {"hair_color":"black","attributes":{"eye_color":"blue","facial_hair":"beard","age":"30"},"height":{"feet":6.0,"inches":null}}
-final  hair_color='black' attributes={'eye_color': 'blue', 'facial_hair': 'beard'} height={'meters': 1.8}
-final  {'hair_color': 'black', 'attributes': {'eye_color': 'blue', 'facial_hair': 'beard'}, 'height': {'meters': 1.8}}
-final  {"hair_color":"black","attributes":{"eye_color":"blue","facial_hair":"beard"},"height":{"meters":1.8}}
-

Teardown

PASSED test_nested_class_streaming 0:00:04.964836

Setup

Call

Captured stdout call
streamed  {'prop1': None, 'prop2': None}
-streamed  {'prop1': None, 'prop2': None}
-streamed  {'prop1': None, 'prop2': None}
-streamed  {'prop1': None, 'prop2': None}
+

Teardown

PASSED test_dynamic_output_union 0:00:02.036545

Setup

Call

Captured stdout call
[]
+final  hair_color='black' attributes={'eye_color': 'blue', 'facial_hair': 'beard', 'age': '30 years old'} height={'feet': 6.0, 'inches': None}
+final  {'hair_color': 'black', 'attributes': {'eye_color': 'blue', 'facial_hair': 'beard', 'age': '30 years old'}, 'height': {'feet': 6.0, 'inches': None}}
+final  {"hair_color":"black","attributes":{"eye_color":"blue","facial_hair":"beard","age":"30 years old"},"height":{"feet":6.0,"inches":null}}
+final  hair_color='black' attributes={'eye_color': 'blue', 'facial_hair': 'beard', 'age': '30'} height={'meters': 1.8}
+final  {'hair_color': 'black', 'attributes': {'eye_color': 'blue', 'facial_hair': 'beard', 'age': '30'}, 'height': {'meters': 1.8}}
+final  {"hair_color":"black","attributes":{"eye_color":"blue","facial_hair":"beard","age":"30"},"height":{"meters":1.8}}
+

Teardown

PASSED test_nested_class_streaming 0:00:03.660840

Setup

Call

Captured stdout call
streamed  {'prop1': None, 'prop2': None}
 streamed  {'prop1': None, 'prop2': None}
 streamed  {'prop1': None, 'prop2': None}
 streamed  {'prop1': None, 'prop2': None}
@@ -262,190 +259,175 @@
 streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': None, 'inner': None}}
 streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': None, 'inner': None}}
 streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '', 'inner': None}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '2', 'inner': None}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20', 'inner': None}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.', 'inner': None}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': None}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': None}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': None}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': None}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': None}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': None}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': None}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': None}}}
-final  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '20.5', 'inner': {'prop2': 43, 'prop3': 3.14}}}
-

Teardown

PASSED test_dynamic_client_with_openai 0:00:00.414254

Setup

Call

Teardown

PASSED test_dynamic_client_with_vertex_json_str_creds 0:00:01.102953

Setup

Call

Teardown

PASSED test_dynamic_client_with_vertex_json_object_creds 0:00:01.229239

Setup

Call

Teardown

PASSED test_event_log_hook 0:00:01.018153

Setup

Call

Captured stdout call
Event log hook1: 
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'fo', 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': None}}}
+final  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'foobar', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+

Teardown

PASSED test_dynamic_client_with_openai 0:00:00.391049

Setup

Call

Teardown

PASSED test_dynamic_client_with_vertex_json_str_creds 0:00:00.890284

Setup

Call

Teardown

PASSED test_dynamic_client_with_vertex_json_object_creds 0:00:01.153630

Setup

Call

Teardown

PASSED test_event_log_hook 0:00:01.496045

Setup

Call

Captured stdout call
Event log hook1: 
 Event log event  BamlLogEvent {
     metadata: {
-        event_id: "0fad094a-7b15-4103-b2d0-4004c72cf447",
+        event_id: "583e4e49-bd71-4328-808c-c2ab71ab7d2f",
         parent_id: None,
-        root_event_id: "0fad094a-7b15-4103-b2d0-4004c72cf447"
+        root_event_id: "583e4e49-bd71-4328-808c-c2ab71ab7d2f"
     },
     prompt: "[
   {
@@ -459,124 +441,124 @@
 ]",
     raw_output: "["a", "b", "c"]",
     parsed_output: "["a", "b", "c"]",
-    start_time: "2024-12-13T15:06:45.817Z"
+    start_time: "2024-12-13T15:40:37.185Z"
 }
-

Teardown

PASSED test_aws_bedrock 0:00:03.034956

Setup

Call

Captured stdout call
unstreamed 
+

Teardown

PASSED test_aws_bedrock 0:00:03.226659

Setup

Call

Captured stdout call
unstreamed 
 
-In the heart of the ancient forest, there was a peculiar rock that stood out from the rest. It was a deep, rich brown color, almost like the earth itself, and it seemed to glow with an inner light. The locals called it the "Heartrock," and whispered stories about its mysterious powers.
+The old geologist, Dr. Maria, had spent her entire career studying the ancient rocks of the Appalachian Mountains. She had seen it all - the layers of sediment, the fossilized creatures, the veins of precious metals. But nothing had ever prepared her for the discovery she was about to make.
 
-One stormy night, a bolt of lightning struck the Heartrock, sending a shiver through the forest. The air was electric with anticipation as the villagers gathered around the rock, watching
+As she climbed up the rocky slope, her eyes scanned the ground for any sign of the unusual rock formation she had heard rumors about. It was said to be a rare type of quartz, one
 streamed  '\n\n'
-streamed  '\n\nIn'
-streamed  '\n\nIn the'
-streamed  '\n\nIn the heart'
-streamed  '\n\nIn the heart of'
-streamed  '\n\nIn the heart of the'
-streamed  '\n\nIn the heart of the ancient'
-streamed  '\n\nIn the heart of the ancient forest'
-streamed  '\n\nIn the heart of the ancient forest,'
-streamed  '\n\nIn the heart of the ancient forest, there'
-streamed  '\n\nIn the heart of the ancient forest, there was'
-streamed  '\n\nIn the heart of the ancient forest, there was a'
-streamed  '\n\nIn the heart of the ancient forest, there was a rock'
-streamed  '\n\nIn the heart of the ancient forest, there was a rock unlike'
-streamed  '\n\nIn the heart of the ancient forest, there was a rock unlike any'
-streamed  '\n\nIn the heart of the ancient forest, there was a rock unlike any other'
-streamed  '\n\nIn the heart of the ancient forest, there was a rock unlike any other.'
-streamed  '\n\nIn the heart of the ancient forest, there was a rock unlike any other. It'
-streamed  '\n\nIn the heart of the ancient forest, there was a rock unlike any other. It was'
-streamed  '\n\nIn the heart of the ancient forest, there was a rock unlike any other. It was a'
-streamed  '\n\nIn the heart of the ancient forest, there was a rock unlike any other. It was a massive'
-streamed  '\n\nIn the heart of the ancient forest, there was a rock unlike any other. It was a massive b'
-streamed  '\n\nIn the heart of the ancient forest, there was a rock unlike any other. It was a massive boulder'
-streamed  '\n\nIn the heart of the ancient forest, there was a rock unlike any other. It was a massive boulder,'
-streamed  'he heart of the ancient forest, there was a rock unlike any other. It was a massive boulder, weather'
-streamed  ' heart of the ancient forest, there was a rock unlike any other. It was a massive boulder, weathered'
-streamed  'art of the ancient forest, there was a rock unlike any other. It was a massive boulder, weathered by'
-streamed  'f the ancient forest, there was a rock unlike any other. It was a massive boulder, weathered by time'
-streamed  'e ancient forest, there was a rock unlike any other. It was a massive boulder, weathered by time and'
-streamed  'cient forest, there was a rock unlike any other. It was a massive boulder, weathered by time and the'
-streamed  'est, there was a rock unlike any other. It was a massive boulder, weathered by time and the elements'
-streamed  'st, there was a rock unlike any other. It was a massive boulder, weathered by time and the elements,'
-streamed  'here was a rock unlike any other. It was a massive boulder, weathered by time and the elements, with'
-streamed  're was a rock unlike any other. It was a massive boulder, weathered by time and the elements, with a'
-streamed  ' rock unlike any other. It was a massive boulder, weathered by time and the elements, with a strange'
-streamed  ' unlike any other. It was a massive boulder, weathered by time and the elements, with a strange glow'
-streamed  'ke any other. It was a massive boulder, weathered by time and the elements, with a strange glow eman'
-streamed  'y other. It was a massive boulder, weathered by time and the elements, with a strange glow emanating'
-streamed  'er. It was a massive boulder, weathered by time and the elements, with a strange glow emanating from'
-streamed  'was a massive boulder, weathered by time and the elements, with a strange glow emanating from within'
-streamed  'as a massive boulder, weathered by time and the elements, with a strange glow emanating from within.'
-streamed  ' massive boulder, weathered by time and the elements, with a strange glow emanating from within. The'
-streamed  'e boulder, weathered by time and the elements, with a strange glow emanating from within. The locals'
-streamed  'er, weathered by time and the elements, with a strange glow emanating from within. The locals called'
-streamed  ' weathered by time and the elements, with a strange glow emanating from within. The locals called it'
-streamed  'thered by time and the elements, with a strange glow emanating from within. The locals called it the'
-streamed  'ered by time and the elements, with a strange glow emanating from within. The locals called it the "'
-streamed  'by time and the elements, with a strange glow emanating from within. The locals called it the "Heart'
-streamed  'me and the elements, with a strange glow emanating from within. The locals called it the "Heartstone'
-streamed  ' and the elements, with a strange glow emanating from within. The locals called it the "Heartstone,"'
-streamed  ' the elements, with a strange glow emanating from within. The locals called it the "Heartstone," and'
-streamed  'nts, with a strange glow emanating from within. The locals called it the "Heartstone," and whispered'
-streamed  'h a strange glow emanating from within. The locals called it the "Heartstone," and whispered stories'
-streamed  ' strange glow emanating from within. The locals called it the "Heartstone," and whispered stories of'
-streamed  'ange glow emanating from within. The locals called it the "Heartstone," and whispered stories of its'
-streamed  ' emanating from within. The locals called it the "Heartstone," and whispered stories of its mystical'
-streamed  'ing from within. The locals called it the "Heartstone," and whispered stories of its mystical powers'
-streamed  ' from within. The locals called it the "Heartstone," and whispered stories of its mystical powers.\n\n'
-streamed  'om within. The locals called it the "Heartstone," and whispered stories of its mystical powers.\n\nOne'
-streamed  'hin. The locals called it the "Heartstone," and whispered stories of its mystical powers.\n\nOne storm'
-streamed  'in. The locals called it the "Heartstone," and whispered stories of its mystical powers.\n\nOne stormy'
-streamed  'e locals called it the "Heartstone," and whispered stories of its mystical powers.\n\nOne stormy night'
-streamed  ' locals called it the "Heartstone," and whispered stories of its mystical powers.\n\nOne stormy night,'
-streamed  'ocals called it the "Heartstone," and whispered stories of its mystical powers.\n\nOne stormy night, a'
-streamed  'called it the "Heartstone," and whispered stories of its mystical powers.\n\nOne stormy night, a young'
-streamed  'd it the "Heartstone," and whispered stories of its mystical powers.\n\nOne stormy night, a young girl'
-streamed  'he "Heartstone," and whispered stories of its mystical powers.\n\nOne stormy night, a young girl named'
-streamed  'eartstone," and whispered stories of its mystical powers.\n\nOne stormy night, a young girl named Lily'
-streamed  '," and whispered stories of its mystical powers.\n\nOne stormy night, a young girl named Lily wandered'
-streamed  'd whispered stories of its mystical powers.\n\nOne stormy night, a young girl named Lily wandered into'
-streamed  'ispered stories of its mystical powers.\n\nOne stormy night, a young girl named Lily wandered into the'
-streamed  ' stories of its mystical powers.\n\nOne stormy night, a young girl named Lily wandered into the forest'
-streamed  'stories of its mystical powers.\n\nOne stormy night, a young girl named Lily wandered into the forest,'
-streamed  'of its mystical powers.\n\nOne stormy night, a young girl named Lily wandered into the forest, seeking'
-streamed  'ystical powers.\n\nOne stormy night, a young girl named Lily wandered into the forest, seeking shelter'
-streamed  'al powers.\n\nOne stormy night, a young girl named Lily wandered into the forest, seeking shelter from'
-streamed  'owers.\n\nOne stormy night, a young girl named Lily wandered into the forest, seeking shelter from the'
-streamed  'One stormy night, a young girl named Lily wandered into the forest, seeking shelter from the torrent'
-streamed  ' stormy night, a young girl named Lily wandered into the forest, seeking shelter from the torrential'
-streamed  'my night, a young girl named Lily wandered into the forest, seeking shelter from the torrential rain'
-streamed  'y night, a young girl named Lily wandered into the forest, seeking shelter from the torrential rain.'
-streamed  'ight, a young girl named Lily wandered into the forest, seeking shelter from the torrential rain. As'
-streamed  ', a young girl named Lily wandered into the forest, seeking shelter from the torrential rain. As she'
-streamed  ' girl named Lily wandered into the forest, seeking shelter from the torrential rain. As she stumbled'
-streamed  'med Lily wandered into the forest, seeking shelter from the torrential rain. As she stumbled through'
-streamed  'Lily wandered into the forest, seeking shelter from the torrential rain. As she stumbled through the'
-streamed  'ered into the forest, seeking shelter from the torrential rain. As she stumbled through the darkness'
-streamed  'red into the forest, seeking shelter from the torrential rain. As she stumbled through the darkness,'
-streamed  'into the forest, seeking shelter from the torrential rain. As she stumbled through the darkness, the'
-streamed  'the forest, seeking shelter from the torrential rain. As she stumbled through the darkness, the wind'
-streamed  'forest, seeking shelter from the torrential rain. As she stumbled through the darkness, the wind how'
-streamed  'est, seeking shelter from the torrential rain. As she stumbled through the darkness, the wind howled'
-streamed  ' seeking shelter from the torrential rain. As she stumbled through the darkness, the wind howled and'
-streamed  'king shelter from the torrential rain. As she stumbled through the darkness, the wind howled and the'
-streamed  'lter from the torrential rain. As she stumbled through the darkness, the wind howled and the thunder'
-streamed  'r from the torrential rain. As she stumbled through the darkness, the wind howled and the thunder bo'
-streamed  'om the torrential rain. As she stumbled through the darkness, the wind howled and the thunder boomed'
-streamed  'm the torrential rain. As she stumbled through the darkness, the wind howled and the thunder boomed,'
-streamed  'orrential rain. As she stumbled through the darkness, the wind howled and the thunder boomed, making'
-streamed  'ntial rain. As she stumbled through the darkness, the wind howled and the thunder boomed, making her'
-streamed  'ntial rain. As she stumbled through the darkness, the wind howled and the thunder boomed, making her'
-streamed  'ntial rain. As she stumbled through the darkness, the wind howled and the thunder boomed, making her'
-streamed  'ntial rain. As she stumbled through the darkness, the wind howled and the thunder boomed, making her'
+streamed  '\n\nThe'
+streamed  '\n\nThe old'
+streamed  '\n\nThe old ge'
+streamed  '\n\nThe old geologist'
+streamed  '\n\nThe old geologist,'
+streamed  '\n\nThe old geologist, Emma'
+streamed  '\n\nThe old geologist, Emma,'
+streamed  '\n\nThe old geologist, Emma, had'
+streamed  '\n\nThe old geologist, Emma, had spent'
+streamed  '\n\nThe old geologist, Emma, had spent her'
+streamed  '\n\nThe old geologist, Emma, had spent her entire'
+streamed  '\n\nThe old geologist, Emma, had spent her entire career'
+streamed  '\n\nThe old geologist, Emma, had spent her entire career studying'
+streamed  '\n\nThe old geologist, Emma, had spent her entire career studying the'
+streamed  '\n\nThe old geologist, Emma, had spent her entire career studying the ancient'
+streamed  '\n\nThe old geologist, Emma, had spent her entire career studying the ancient rocks'
+streamed  '\n\nThe old geologist, Emma, had spent her entire career studying the ancient rocks of'
+streamed  '\n\nThe old geologist, Emma, had spent her entire career studying the ancient rocks of the'
+streamed  '\n\nThe old geologist, Emma, had spent her entire career studying the ancient rocks of the Appalachian'
+streamed  'geologist, Emma, had spent her entire career studying the ancient rocks of the Appalachian Mountains'
+streamed  'eologist, Emma, had spent her entire career studying the ancient rocks of the Appalachian Mountains.'
+streamed  'gist, Emma, had spent her entire career studying the ancient rocks of the Appalachian Mountains. She'
+streamed  ', Emma, had spent her entire career studying the ancient rocks of the Appalachian Mountains. She had'
+streamed  'a, had spent her entire career studying the ancient rocks of the Appalachian Mountains. She had seen'
+streamed  'had spent her entire career studying the ancient rocks of the Appalachian Mountains. She had seen it'
+streamed  'spent her entire career studying the ancient rocks of the Appalachian Mountains. She had seen it all'
+streamed  'ent her entire career studying the ancient rocks of the Appalachian Mountains. She had seen it all -'
+streamed  'her entire career studying the ancient rocks of the Appalachian Mountains. She had seen it all - the'
+streamed  'ire career studying the ancient rocks of the Appalachian Mountains. She had seen it all - the fossil'
+streamed  'career studying the ancient rocks of the Appalachian Mountains. She had seen it all - the fossilized'
+streamed  ' studying the ancient rocks of the Appalachian Mountains. She had seen it all - the fossilized trees'
+streamed  'studying the ancient rocks of the Appalachian Mountains. She had seen it all - the fossilized trees,'
+streamed  'ying the ancient rocks of the Appalachian Mountains. She had seen it all - the fossilized trees, the'
+streamed  'e ancient rocks of the Appalachian Mountains. She had seen it all - the fossilized trees, the quartz'
+streamed  ' rocks of the Appalachian Mountains. She had seen it all - the fossilized trees, the quartz crystals'
+streamed  'rocks of the Appalachian Mountains. She had seen it all - the fossilized trees, the quartz crystals,'
+streamed  's of the Appalachian Mountains. She had seen it all - the fossilized trees, the quartz crystals, the'
+streamed  'he Appalachian Mountains. She had seen it all - the fossilized trees, the quartz crystals, the veins'
+streamed  'Appalachian Mountains. She had seen it all - the fossilized trees, the quartz crystals, the veins of'
+streamed  'achian Mountains. She had seen it all - the fossilized trees, the quartz crystals, the veins of gold'
+streamed  'chian Mountains. She had seen it all - the fossilized trees, the quartz crystals, the veins of gold.'
+streamed  'n Mountains. She had seen it all - the fossilized trees, the quartz crystals, the veins of gold. But'
+streamed  'ins. She had seen it all - the fossilized trees, the quartz crystals, the veins of gold. But nothing'
+streamed  'he had seen it all - the fossilized trees, the quartz crystals, the veins of gold. But nothing could'
+streamed  'd seen it all - the fossilized trees, the quartz crystals, the veins of gold. But nothing could have'
+streamed  ' all - the fossilized trees, the quartz crystals, the veins of gold. But nothing could have prepared'
+streamed  ' - the fossilized trees, the quartz crystals, the veins of gold. But nothing could have prepared her'
+streamed  'he fossilized trees, the quartz crystals, the veins of gold. But nothing could have prepared her for'
+streamed  'ssilized trees, the quartz crystals, the veins of gold. But nothing could have prepared her for what'
+streamed  'ized trees, the quartz crystals, the veins of gold. But nothing could have prepared her for what she'
+streamed  ' trees, the quartz crystals, the veins of gold. But nothing could have prepared her for what she was'
+streamed  ', the quartz crystals, the veins of gold. But nothing could have prepared her for what she was about'
+streamed  'he quartz crystals, the veins of gold. But nothing could have prepared her for what she was about to'
+streamed  ' crystals, the veins of gold. But nothing could have prepared her for what she was about to discover'
+streamed  'ystals, the veins of gold. But nothing could have prepared her for what she was about to discover.\n\n'
+streamed  'tals, the veins of gold. But nothing could have prepared her for what she was about to discover.\n\nAs'
+streamed  ', the veins of gold. But nothing could have prepared her for what she was about to discover.\n\nAs she'
+streamed  ' veins of gold. But nothing could have prepared her for what she was about to discover.\n\nAs she made'
+streamed  'ns of gold. But nothing could have prepared her for what she was about to discover.\n\nAs she made her'
+streamed  'f gold. But nothing could have prepared her for what she was about to discover.\n\nAs she made her way'
+streamed  'But nothing could have prepared her for what she was about to discover.\n\nAs she made her way through'
+streamed  'nothing could have prepared her for what she was about to discover.\n\nAs she made her way through the'
+streamed  'g could have prepared her for what she was about to discover.\n\nAs she made her way through the dense'
+streamed  ' have prepared her for what she was about to discover.\n\nAs she made her way through the dense forest'
+streamed  'have prepared her for what she was about to discover.\n\nAs she made her way through the dense forest,'
+streamed  ' prepared her for what she was about to discover.\n\nAs she made her way through the dense forest, her'
+streamed  'ared her for what she was about to discover.\n\nAs she made her way through the dense forest, her eyes'
+streamed  'for what she was about to discover.\n\nAs she made her way through the dense forest, her eyes scanning'
+streamed  'what she was about to discover.\n\nAs she made her way through the dense forest, her eyes scanning the'
+streamed  'e was about to discover.\n\nAs she made her way through the dense forest, her eyes scanning the ground'
+streamed  's about to discover.\n\nAs she made her way through the dense forest, her eyes scanning the ground for'
+streamed  'out to discover.\n\nAs she made her way through the dense forest, her eyes scanning the ground for any'
+streamed  'o discover.\n\nAs she made her way through the dense forest, her eyes scanning the ground for any sign'
+streamed  'iscover.\n\nAs she made her way through the dense forest, her eyes scanning the ground for any sign of'
+streamed  ' she made her way through the dense forest, her eyes scanning the ground for any sign of interesting'
+streamed  'made her way through the dense forest, her eyes scanning the ground for any sign of interesting rock'
+streamed  'y through the dense forest, her eyes scanning the ground for any sign of interesting rock formations'
+streamed  ' through the dense forest, her eyes scanning the ground for any sign of interesting rock formations,'
+streamed  'ugh the dense forest, her eyes scanning the ground for any sign of interesting rock formations, Emma'
+streamed  'ense forest, her eyes scanning the ground for any sign of interesting rock formations, Emma stumbled'
+streamed  'forest, her eyes scanning the ground for any sign of interesting rock formations, Emma stumbled upon'
+streamed  'rest, her eyes scanning the ground for any sign of interesting rock formations, Emma stumbled upon a'
+streamed  ' eyes scanning the ground for any sign of interesting rock formations, Emma stumbled upon a peculiar'
+streamed  's scanning the ground for any sign of interesting rock formations, Emma stumbled upon a peculiar out'
+streamed  'canning the ground for any sign of interesting rock formations, Emma stumbled upon a peculiar outcro'
+streamed  'ng the ground for any sign of interesting rock formations, Emma stumbled upon a peculiar outcropping'
+streamed  'g the ground for any sign of interesting rock formations, Emma stumbled upon a peculiar outcropping.'
+streamed  'e ground for any sign of interesting rock formations, Emma stumbled upon a peculiar outcropping. The'
+streamed  'und for any sign of interesting rock formations, Emma stumbled upon a peculiar outcropping. The rock'
+streamed  'for any sign of interesting rock formations, Emma stumbled upon a peculiar outcropping. The rock was'
+streamed  ' sign of interesting rock formations, Emma stumbled upon a peculiar outcropping. The rock was unlike'
+streamed  'n of interesting rock formations, Emma stumbled upon a peculiar outcropping. The rock was unlike any'
+streamed  ' interesting rock formations, Emma stumbled upon a peculiar outcropping. The rock was unlike any she'
+streamed  'eresting rock formations, Emma stumbled upon a peculiar outcropping. The rock was unlike any she had'
+streamed  'ing rock formations, Emma stumbled upon a peculiar outcropping. The rock was unlike any she had seen'
+streamed  'k formations, Emma stumbled upon a peculiar outcropping. The rock was unlike any she had seen before'
+streamed  'formations, Emma stumbled upon a peculiar outcropping. The rock was unlike any she had seen before -'
+streamed  'ations, Emma stumbled upon a peculiar outcropping. The rock was unlike any she had seen before - its'
+streamed  'Emma stumbled upon a peculiar outcropping. The rock was unlike any she had seen before - its surface'
+streamed  'Emma stumbled upon a peculiar outcropping. The rock was unlike any she had seen before - its surface'
+streamed  'Emma stumbled upon a peculiar outcropping. The rock was unlike any she had seen before - its surface'
+streamed  'Emma stumbled upon a peculiar outcropping. The rock was unlike any she had seen before - its surface'
 streamed final 
 
-In the heart of the ancient forest, there was a rock unlike any other. It was a massive boulder, weathered by time and the elements, with a strange glow emanating from within. The locals called it the "Heartstone," and whispered stories of its mystical powers.
+The old geologist, Emma, had spent her entire career studying the ancient rocks of the Appalachian Mountains. She had seen it all - the fossilized trees, the quartz crystals, the veins of gold. But nothing could have prepared her for what she was about to discover.
 
-One stormy night, a young girl named Lily wandered into the forest, seeking shelter from the torrential rain. As she stumbled through the darkness, the wind howled and the thunder boomed, making her
-

Teardown

PASSED test_aws_bedrock_invalid_region 0:00:00.049519

Setup

Call

Teardown

PASSED test_serialization_exception 0:00:00.505185

Setup

Call

Captured stdout call
Exception message from test:  <ExceptionInfo BamlValidationError(message=Failed to parse LLM response: Failed to coerce value: <root>: Failed while parsing require...required field: nonce2, raw_output=Hello there! How can I assist you today?, prompt=[chat] system: Say "hello there".
+As she made her way through the dense forest, her eyes scanning the ground for any sign of interesting rock formations, Emma stumbled upon a peculiar outcropping. The rock was unlike any she had seen before - its surface
+

Teardown

PASSED test_aws_bedrock_invalid_region 0:00:00.005077

Setup

Call

Teardown

PASSED test_serialization_exception 0:00:00.414764

Setup

Call

Captured stdout call
Exception message from test:  <ExceptionInfo BamlValidationError(message=Failed to parse LLM response: Failed to coerce value: <root>: Failed while parsing require...required field: nonce2, raw_output=Hello there! How can I assist you today?, prompt=[chat] system: Say "hello there".
 ) tblen=2>
-

Teardown

PASSED test_stream_serialization_exception 0:00:00.395514

Setup

Call

Captured stdout call
streamed  nonce=None nonce2=None
+

Teardown

PASSED test_stream_serialization_exception 0:00:00.525969

Setup

Call

Captured stdout call
streamed  nonce=None nonce2=None
 streamed  nonce=None nonce2=None
 streamed  nonce=None nonce2=None
 streamed  nonce=None nonce2=None
@@ -589,9 +571,9 @@
 streamed  nonce=None nonce2=None
 streamed  nonce=None nonce2=None
 streamed  nonce=None nonce2=None
-Exception message:  <ExceptionInfo BamlValidationError(message=Failed to parse LLM response: Failed to coerce value: <root>: Failed while parsing require...g required field: nonce2, raw_output=Hello there! How can I help you today?, prompt=[chat] system: Say "hello there".
+Exception message:  <ExceptionInfo BamlValidationError(message=Failed to parse LLM response: Failed to coerce value: <root>: Failed while parsing require...required field: nonce2, raw_output=Hello there! How can I assist you today?, prompt=[chat] system: Say "hello there".
 ) tblen=3>
-

Teardown

PASSED test_stream2_serialization_exception 0:00:00.400340

Setup

Call

Captured stdout call
streamed  nonce=None nonce2=None nonce3=None
+

Teardown

PASSED test_stream2_serialization_exception 0:00:00.475911

Setup

Call

Captured stdout call
streamed  nonce=None nonce2=None nonce3=None
 streamed  nonce=None nonce2=None nonce3=None
 streamed  nonce=None nonce2=None nonce3=None
 streamed  nonce=None nonce2=None nonce3=None
@@ -606,43 +588,19 @@
 streamed  nonce=None nonce2=None nonce3=None
 Exception message:  <ExceptionInfo BamlValidationError(message=Failed to parse LLM response: Failed to coerce value: <root>: Failed while parsing require...g required field: nonce3, raw_output=Hello there! How can I help you today?, prompt=[chat] system: Say "hello there".
 ) tblen=3>
-

Teardown

PASSED test_descriptions 0:00:01.975074

Setup

Call

Teardown

PASSED test_caching 0:00:07.776454

Setup

Call

Captured stdout call
Duration no caching:  4.188543081283569
-Duration with caching:  3.5870521068573
-

Teardown

PASSED test_arg_exceptions 0:00:00.755149

Setup

Call

Captured stderr call
[2024-12-13T15:07:00Z ERROR baml_runtime::tracing]   Error: input: Expected type String, got `Number(111)`
+

Teardown

PASSED test_descriptions 0:00:01.901301

Setup

Call

Teardown

PASSED test_caching 0:00:06.765143

Setup

Call

Captured stdout call
Duration no caching:  3.484745979309082
+Duration with caching:  3.279601812362671
+

Teardown

PASSED test_arg_exceptions 0:00:00.823517

Setup

Call

Captured stderr call
[2024-12-13T15:40:51Z ERROR baml_runtime::tracing]   Error: input: Expected type String, got `Number(111)`
     
-

Teardown

PASSED test_map_as_param 0:00:00.001055

Setup

Call

Captured stderr call
[2024-12-13T15:07:01Z ERROR baml_runtime::tracing]   Error: myMap: a: Expected map, got `String("b")`
+

Teardown

PASSED test_map_as_param 0:00:00.001031

Setup

Call

Captured stderr call
[2024-12-13T15:40:52Z ERROR baml_runtime::tracing]   Error: myMap: a: Expected map, got `String("b")`
     
-

Teardown

PASSED test_baml_validation_error_format 0:00:00.488643

Setup

Call

Captured stdout call
Error:  BamlValidationError(message=Failed to parse LLM response: Failed to coerce value: <root>: Failed while parsing required fields: missing=2, unparsed=0
+

Teardown

PASSED test_baml_validation_error_format 0:00:00.615744

Setup

Call

Captured stdout call
Error:  BamlValidationError(message=Failed to parse LLM response: Failed to coerce value: <root>: Failed while parsing required fields: missing=2, unparsed=0
   - <root>: Missing required field: nonce
   - <root>: Missing required field: nonce2, raw_output=Hello there! How can I assist you today?, prompt=[chat] system: Say "hello there".
 )
-

Teardown

PASSED test_no_stream_big_integer 0:00:00.529150

Setup

Call

Teardown

PASSED test_no_stream_object_with_numbers 0:00:00.631862

Setup

Call

Teardown

PASSED test_no_stream_compound_object 0:00:05.253739

Setup

Call

Teardown

PASSED test_no_stream_compound_object_with_yapping 0:00:03.953582

Setup

Call

Teardown

PASSED test_differing_unions 0:00:00.915790

Setup

Call

Teardown

PASSED test_return_failing_assert 0:00:00.358101

Setup

Call

Teardown

PASSED test_parameter_failing_assert 0:00:00.001212

Setup

Call

Captured stderr call
[2024-12-13T15:07:13Z ERROR baml_runtime::tracing]   Error: inp: Failed assert: small_int
+

Teardown

PASSED test_no_stream_big_integer 0:00:01.048209

Setup

Call

Teardown

PASSED test_no_stream_object_with_numbers 0:00:00.662949

Setup

Call

Teardown

PASSED test_no_stream_compound_object 0:00:03.712300

Setup

Call

Teardown

PASSED test_no_stream_compound_object_with_yapping 0:00:02.777885

Setup

Call

Teardown

PASSED test_differing_unions 0:00:00.860191

Setup

Call

Teardown

PASSED test_return_failing_assert 0:00:00.372300

Setup

Call

Teardown

PASSED test_parameter_failing_assert 0:00:00.001057

Setup

Call

Captured stderr call
[2024-12-13T15:41:02Z ERROR baml_runtime::tracing]   Error: inp: Failed assert: small_int
     
-

Teardown

PASSED test_failing_assert_can_stream 0:00:02.406054

Setup

Call

Captured stdout call
None
-None
-None
-None
-None
-None
-None
-None
-None
-None
-None
-None
-None
-None
-None
-None
-None
-None
-None
-None
-None
-None
-None
-None
-None
+

Teardown

PASSED test_failing_assert_can_stream 0:00:03.449452

Setup

Call

Captured stdout call
None
 None
 None
 None
@@ -1222,9 +1180,9 @@
 None
 None
 None
-

Teardown

PASSED test_simple_recursive_type 0:00:03.369275

Setup

Call

Teardown

PASSED test_mutually_recursive_type 0:00:01.546244

Setup

Call

Teardown

PASSED test_block_constraints 0:00:00.511981

Setup

Call

Teardown

PASSED test_nested_block_constraints 0:00:00.576220

Setup

Call

Captured stdout call
nbc=Checked[BlockConstraint, Literal['cross_field']](value=BlockConstraint(foo=1, bar='hello'), checks={'cross_field': Check(name='cross_field', expression='this.bar|length > this.foo', status='succeeded')})
-

Teardown

PASSED test_block_constraint_arguments 0:00:00.001984

Setup

Call

Captured stderr call
[2024-12-13T15:07:21Z ERROR baml_runtime::tracing]   Error: inp: Failed assert: hi
+

Teardown

PASSED test_simple_recursive_type 0:00:01.959081

Setup

Call

Teardown

PASSED test_mutually_recursive_type 0:00:02.151441

Setup

Call

Teardown

PASSED test_block_constraints 0:00:00.575196

Setup

Call

Teardown

PASSED test_nested_block_constraints 0:00:00.537941

Setup

Call

Captured stdout call
nbc=Checked[BlockConstraint, Literal['cross_field']](value=BlockConstraint(foo=1, bar='hello'), checks={'cross_field': Check(name='cross_field', expression='this.bar|length > this.foo', status='succeeded')})
+

Teardown

PASSED test_block_constraint_arguments 0:00:00.001888

Setup

Call

Captured stderr call
[2024-12-13T15:41:11Z ERROR baml_runtime::tracing]   Error: inp: Failed assert: hi
     
-[2024-12-13T15:07:21Z ERROR baml_runtime::tracing]   Error: inp: Failed assert: hi
+[2024-12-13T15:41:11Z ERROR baml_runtime::tracing]   Error: inp: Failed assert: hi
     
-

Teardown

tests/test_pydantic.py 3 0:00:00.001412

PASSED test_model_validate_success 0:00:00.000357

Setup

Call

Teardown

PASSED test_model_validate_failure 0:00:00.000516

Setup

Call

Teardown

PASSED test_model_dump 0:00:00.000539

Setup

Call

Teardown

tests/test_python.py 2 0:00:00.022357

PASSED test_inspect 0:00:00.021980

Assert that baml_py is compatible with the inspect module.

This is a regression test for a bug where inspect.stack() would implode if the pyo3 code called PyModule::from_code without specifying the file_name arg (i.e. without specifying the source file metadata for the inline Python snippet).

Setup

Call

Teardown

PASSED test_pickle 0:00:00.000377

Setup

Call

Teardown

\ No newline at end of file +

Teardown

tests/test_pydantic.py 3 0:00:00.002336

PASSED test_model_validate_success 0:00:00.001317

Setup

Call

Teardown

PASSED test_model_validate_failure 0:00:00.000530

Setup

Call

Teardown

PASSED test_model_dump 0:00:00.000489

Setup

Call

Teardown

tests/test_python.py 2 0:00:00.024115

PASSED test_inspect 0:00:00.023680

Assert that baml_py is compatible with the inspect module.

This is a regression test for a bug where inspect.stack() would implode if the pyo3 code called PyModule::from_code without specifying the file_name arg (i.e. without specifying the source file metadata for the inline Python snippet).

Setup

Call

Teardown

PASSED test_pickle 0:00:00.000435

Setup

Call

Teardown

\ No newline at end of file diff --git a/integ-tests/ruby/baml_client/inlined.rb b/integ-tests/ruby/baml_client/inlined.rb index 468fc80cd..a24270955 100644 --- a/integ-tests/ruby/baml_client/inlined.rb +++ b/integ-tests/ruby/baml_client/inlined.rb @@ -25,7 +25,7 @@ module Inlined "fiddle-examples/extract-receipt-info.baml" => "class ReceiptItem {\n name string\n description string?\n quantity int\n price float\n}\n\nclass ReceiptInfo {\n items ReceiptItem[]\n total_cost float?\n venue \"barisa\" | \"ox_burger\"\n}\n\nfunction ExtractReceiptInfo(email: string, reason: \"curiosity\" | \"personal_finance\") -> ReceiptInfo {\n client GPT4o\n prompt #\"\n Given the receipt below:\n\n ```\n {{email}}\n ```\n\n {{ ctx.output_format }}\n \"#\n}\n\n", "fiddle-examples/images/image.baml" => "function DescribeImage(img: image) -> string {\n client GPT4o\n prompt #\"\n {{ _.role(\"user\") }}\n\n\n Describe the image below in 20 words:\n {{ img }}\n \"#\n\n}\n\nclass FakeImage {\n url string\n}\n\nclass ClassWithImage {\n myImage image\n param2 string\n fake_image FakeImage\n}\n\n// chat role user present\nfunction DescribeImage2(classWithImage: ClassWithImage, img2: image) -> string { \n client GPT4Turbo\n prompt #\"\n {{ _.role(\"user\") }}\n You should return 2 answers that answer the following commands.\n\n 1. Describe this in 5 words:\n {{ classWithImage.myImage }}\n\n 2. Also tell me what's happening here in one sentence:\n {{ img2 }}\n \"#\n}\n\n// no chat role\nfunction DescribeImage3(classWithImage: ClassWithImage, img2: image) -> string {\n client GPT4Turbo\n prompt #\"\n Describe this in 5 words:\n {{ classWithImage.myImage }}\n\n Tell me also what's happening here in one sentence and relate it to the word {{ classWithImage.param2 }}:\n {{ img2 }}\n \"#\n}\n\n\n// system prompt and chat prompt\nfunction DescribeImage4(classWithImage: ClassWithImage, img2: image) -> string {\n client GPT4Turbo\n prompt #\"\n {{ _.role(\"system\")}}\n\n Describe this in 5 words:\n {{ classWithImage.myImage }}\n\n Tell me also what's happening here in one sentence and relate it to the word {{ classWithImage.param2 }}:\n {{ img2 }}\n \"#\n}\n\ntest TestName {\n functions [DescribeImage]\n args {\n img { url \"https://imgs.xkcd.com/comics/standards.png\"}\n }\n}\n", "fiddle-examples/symbol-tuning.baml" => "enum Category3 {\n Refund @alias(\"k1\")\n @description(\"Customer wants to refund a product\")\n\n CancelOrder @alias(\"k2\")\n @description(\"Customer wants to cancel an order\")\n\n TechnicalSupport @alias(\"k3\")\n @description(\"Customer needs help with a technical issue unrelated to account creation or login\")\n\n AccountIssue @alias(\"k4\")\n @description(\"Specifically relates to account-login or account-creation\")\n\n Question @alias(\"k5\")\n @description(\"Customer has a question\")\n}\n\nfunction ClassifyMessage3(input: string) -> Category {\n client GPT4\n\n prompt #\"\n Classify the following INPUT into ONE\n of the following categories:\n\n INPUT: {{ input }}\n\n {{ ctx.output_format }}\n\n Response:\n \"#\n}", - "generators.baml" => "generator lang_python {\n output_type python/pydantic\n output_dir \"../python\"\n version \"0.70.4\"\n}\n\ngenerator lang_typescript {\n output_type typescript\n output_dir \"../typescript\"\n version \"0.70.4\"\n}\n\ngenerator lang_ruby {\n output_type ruby/sorbet\n output_dir \"../ruby\"\n version \"0.70.4\"\n}\n\n// generator openapi {\n// output_type rest/openapi\n// output_dir \"../openapi\"\n// version \"0.70.4\"\n// on_generate \"rm .gitignore\"\n// }\n", + "generators.baml" => "generator lang_python {\n output_type python/pydantic\n output_dir \"../python\"\n version \"0.70.5\"\n}\n\ngenerator lang_typescript {\n output_type typescript\n output_dir \"../typescript\"\n version \"0.70.5\"\n}\n\ngenerator lang_ruby {\n output_type ruby/sorbet\n output_dir \"../ruby\"\n version \"0.70.5\"\n}\n\n// generator openapi {\n// output_type rest/openapi\n// output_dir \"../openapi\"\n// version \"0.70.5\"\n// on_generate \"rm .gitignore\"\n// }\n", "test-files/aliases/aliased-inputs.baml" => "\nclass InputClass {\n key string @alias(\"color\")\n key2 string\n}\n\n\nclass InputClassNested {\n key string\n nested InputClass @alias(\"interesting-key\")\n}\n \n\nfunction AliasedInputClass(input: InputClass) -> string {\n client GPT35\n prompt #\"\n\n {{input}}\n\n This is a test. What's the name of the first json key above? Remember, tell me the key, not value.\n \"#\n}\n \nfunction AliasedInputClass2(input: InputClass) -> string {\n client GPT35\n prompt #\"\n\n {# making sure we can still access the original key #}\n {%if input.key == \"tiger\"%}\n Repeat this value back to me, and nothing else: {{input.key}}\n {%endif%}\n \"#\n}\n \n function AliasedInputClassNested(input: InputClassNested) -> string {\n client GPT35\n prompt #\"\n {{ _.role(\"user\")}}\n\n {{input}}\n\n This is a test. What's the name of the second json key above? Remember, tell me the key, not value.\n \"#\n }\n\n\nenum AliasedEnum {\n KEY_ONE @alias(\"tiger\")\n KEY_TWO\n}\n\nfunction AliasedInputEnum(input: AliasedEnum) -> string {\n client GPT4o\n prompt #\"\n {{ _.role(\"user\")}}\n\n\n Write out this word only in your response, in lowercase:\n ---\n {{input}}\n ---\n Answer:\n \"#\n}\n\n\nfunction AliasedInputList(input: AliasedEnum[]) -> string {\n client GPT35\n prompt #\"\n {{ _.role(\"user\")}}\n Given this array:\n ---\n {{input}}\n ---\n\n Return the first element in the array:\n \"#\n}\n\n", "test-files/aliases/classes.baml" => "class TestClassAlias {\n key string @alias(\"key-dash\") @description(#\"\n This is a description for key\n af asdf\n \"#)\n key2 string @alias(\"key21\")\n key3 string @alias(\"key with space\")\n key4 string //unaliased\n key5 string @alias(\"key.with.punctuation/123\")\n}\n\nfunction FnTestClassAlias(input: string) -> TestClassAlias {\n client GPT35\n prompt #\"\n {{ctx.output_format}}\n \"#\n}\n\ntest FnTestClassAlias {\n functions [FnTestClassAlias]\n args {\n input \"example input\"\n }\n}\n", "test-files/aliases/enums.baml" => "enum TestEnum {\n A @alias(\"k1\") @description(#\"\n User is angry\n \"#)\n B @alias(\"k22\") @description(#\"\n User is happy\n \"#)\n // tests whether k1 doesnt incorrectly get matched with k11\n C @alias(\"k11\") @description(#\"\n User is sad\n \"#)\n D @alias(\"k44\") @description(\n User is confused\n )\n E @description(\n User is excited\n )\n F @alias(\"k5\") // only alias\n \n G @alias(\"k6\") @description(#\"\n User is bored\n With a long description\n \"#)\n \n @@alias(\"Category\")\n}\n\nfunction FnTestAliasedEnumOutput(input: string) -> TestEnum {\n client GPT35\n prompt #\"\n Classify the user input into the following category\n \n {{ ctx.output_format }}\n\n {{ _.role('user') }}\n {{input}}\n\n {{ _.role('assistant') }}\n Category ID:\n \"#\n}\n\ntest FnTestAliasedEnumOutput {\n functions [FnTestAliasedEnumOutput]\n args {\n input \"mehhhhh\"\n }\n}", diff --git a/integ-tests/typescript/baml_client/inlinedbaml.ts b/integ-tests/typescript/baml_client/inlinedbaml.ts index 891188dc1..58c92e590 100644 --- a/integ-tests/typescript/baml_client/inlinedbaml.ts +++ b/integ-tests/typescript/baml_client/inlinedbaml.ts @@ -26,7 +26,7 @@ const fileMap = { "fiddle-examples/extract-receipt-info.baml": "class ReceiptItem {\n name string\n description string?\n quantity int\n price float\n}\n\nclass ReceiptInfo {\n items ReceiptItem[]\n total_cost float?\n venue \"barisa\" | \"ox_burger\"\n}\n\nfunction ExtractReceiptInfo(email: string, reason: \"curiosity\" | \"personal_finance\") -> ReceiptInfo {\n client GPT4o\n prompt #\"\n Given the receipt below:\n\n ```\n {{email}}\n ```\n\n {{ ctx.output_format }}\n \"#\n}\n\n", "fiddle-examples/images/image.baml": "function DescribeImage(img: image) -> string {\n client GPT4o\n prompt #\"\n {{ _.role(\"user\") }}\n\n\n Describe the image below in 20 words:\n {{ img }}\n \"#\n\n}\n\nclass FakeImage {\n url string\n}\n\nclass ClassWithImage {\n myImage image\n param2 string\n fake_image FakeImage\n}\n\n// chat role user present\nfunction DescribeImage2(classWithImage: ClassWithImage, img2: image) -> string { \n client GPT4Turbo\n prompt #\"\n {{ _.role(\"user\") }}\n You should return 2 answers that answer the following commands.\n\n 1. Describe this in 5 words:\n {{ classWithImage.myImage }}\n\n 2. Also tell me what's happening here in one sentence:\n {{ img2 }}\n \"#\n}\n\n// no chat role\nfunction DescribeImage3(classWithImage: ClassWithImage, img2: image) -> string {\n client GPT4Turbo\n prompt #\"\n Describe this in 5 words:\n {{ classWithImage.myImage }}\n\n Tell me also what's happening here in one sentence and relate it to the word {{ classWithImage.param2 }}:\n {{ img2 }}\n \"#\n}\n\n\n// system prompt and chat prompt\nfunction DescribeImage4(classWithImage: ClassWithImage, img2: image) -> string {\n client GPT4Turbo\n prompt #\"\n {{ _.role(\"system\")}}\n\n Describe this in 5 words:\n {{ classWithImage.myImage }}\n\n Tell me also what's happening here in one sentence and relate it to the word {{ classWithImage.param2 }}:\n {{ img2 }}\n \"#\n}\n\ntest TestName {\n functions [DescribeImage]\n args {\n img { url \"https://imgs.xkcd.com/comics/standards.png\"}\n }\n}\n", "fiddle-examples/symbol-tuning.baml": "enum Category3 {\n Refund @alias(\"k1\")\n @description(\"Customer wants to refund a product\")\n\n CancelOrder @alias(\"k2\")\n @description(\"Customer wants to cancel an order\")\n\n TechnicalSupport @alias(\"k3\")\n @description(\"Customer needs help with a technical issue unrelated to account creation or login\")\n\n AccountIssue @alias(\"k4\")\n @description(\"Specifically relates to account-login or account-creation\")\n\n Question @alias(\"k5\")\n @description(\"Customer has a question\")\n}\n\nfunction ClassifyMessage3(input: string) -> Category {\n client GPT4\n\n prompt #\"\n Classify the following INPUT into ONE\n of the following categories:\n\n INPUT: {{ input }}\n\n {{ ctx.output_format }}\n\n Response:\n \"#\n}", - "generators.baml": "generator lang_python {\n output_type python/pydantic\n output_dir \"../python\"\n version \"0.70.4\"\n}\n\ngenerator lang_typescript {\n output_type typescript\n output_dir \"../typescript\"\n version \"0.70.4\"\n}\n\ngenerator lang_ruby {\n output_type ruby/sorbet\n output_dir \"../ruby\"\n version \"0.70.4\"\n}\n\n// generator openapi {\n// output_type rest/openapi\n// output_dir \"../openapi\"\n// version \"0.70.4\"\n// on_generate \"rm .gitignore\"\n// }\n", + "generators.baml": "generator lang_python {\n output_type python/pydantic\n output_dir \"../python\"\n version \"0.70.5\"\n}\n\ngenerator lang_typescript {\n output_type typescript\n output_dir \"../typescript\"\n version \"0.70.5\"\n}\n\ngenerator lang_ruby {\n output_type ruby/sorbet\n output_dir \"../ruby\"\n version \"0.70.5\"\n}\n\n// generator openapi {\n// output_type rest/openapi\n// output_dir \"../openapi\"\n// version \"0.70.5\"\n// on_generate \"rm .gitignore\"\n// }\n", "test-files/aliases/aliased-inputs.baml": "\nclass InputClass {\n key string @alias(\"color\")\n key2 string\n}\n\n\nclass InputClassNested {\n key string\n nested InputClass @alias(\"interesting-key\")\n}\n \n\nfunction AliasedInputClass(input: InputClass) -> string {\n client GPT35\n prompt #\"\n\n {{input}}\n\n This is a test. What's the name of the first json key above? Remember, tell me the key, not value.\n \"#\n}\n \nfunction AliasedInputClass2(input: InputClass) -> string {\n client GPT35\n prompt #\"\n\n {# making sure we can still access the original key #}\n {%if input.key == \"tiger\"%}\n Repeat this value back to me, and nothing else: {{input.key}}\n {%endif%}\n \"#\n}\n \n function AliasedInputClassNested(input: InputClassNested) -> string {\n client GPT35\n prompt #\"\n {{ _.role(\"user\")}}\n\n {{input}}\n\n This is a test. What's the name of the second json key above? Remember, tell me the key, not value.\n \"#\n }\n\n\nenum AliasedEnum {\n KEY_ONE @alias(\"tiger\")\n KEY_TWO\n}\n\nfunction AliasedInputEnum(input: AliasedEnum) -> string {\n client GPT4o\n prompt #\"\n {{ _.role(\"user\")}}\n\n\n Write out this word only in your response, in lowercase:\n ---\n {{input}}\n ---\n Answer:\n \"#\n}\n\n\nfunction AliasedInputList(input: AliasedEnum[]) -> string {\n client GPT35\n prompt #\"\n {{ _.role(\"user\")}}\n Given this array:\n ---\n {{input}}\n ---\n\n Return the first element in the array:\n \"#\n}\n\n", "test-files/aliases/classes.baml": "class TestClassAlias {\n key string @alias(\"key-dash\") @description(#\"\n This is a description for key\n af asdf\n \"#)\n key2 string @alias(\"key21\")\n key3 string @alias(\"key with space\")\n key4 string //unaliased\n key5 string @alias(\"key.with.punctuation/123\")\n}\n\nfunction FnTestClassAlias(input: string) -> TestClassAlias {\n client GPT35\n prompt #\"\n {{ctx.output_format}}\n \"#\n}\n\ntest FnTestClassAlias {\n functions [FnTestClassAlias]\n args {\n input \"example input\"\n }\n}\n", "test-files/aliases/enums.baml": "enum TestEnum {\n A @alias(\"k1\") @description(#\"\n User is angry\n \"#)\n B @alias(\"k22\") @description(#\"\n User is happy\n \"#)\n // tests whether k1 doesnt incorrectly get matched with k11\n C @alias(\"k11\") @description(#\"\n User is sad\n \"#)\n D @alias(\"k44\") @description(\n User is confused\n )\n E @description(\n User is excited\n )\n F @alias(\"k5\") // only alias\n \n G @alias(\"k6\") @description(#\"\n User is bored\n With a long description\n \"#)\n \n @@alias(\"Category\")\n}\n\nfunction FnTestAliasedEnumOutput(input: string) -> TestEnum {\n client GPT35\n prompt #\"\n Classify the user input into the following category\n \n {{ ctx.output_format }}\n\n {{ _.role('user') }}\n {{input}}\n\n {{ _.role('assistant') }}\n Category ID:\n \"#\n}\n\ntest FnTestAliasedEnumOutput {\n functions [FnTestAliasedEnumOutput]\n args {\n input \"mehhhhh\"\n }\n}", diff --git a/integ-tests/typescript/test-report.html b/integ-tests/typescript/test-report.html index 5889a4d2e..7576857d3 100644 --- a/integ-tests/typescript/test-report.html +++ b/integ-tests/typescript/test-report.html @@ -257,19 +257,7 @@ font-size: 1rem; padding: 0 0.5rem; } -

Test Report

Started: 2024-12-13 06:58:53
Suites (1)
0 passed
1 failed
0 pending
Tests (67)
66 passed
1 failed
0 pending
Integ tests > should work for all inputs
single bool
passed
0.49s
Integ tests > should work for all inputs
single string list
passed
0.38s
Integ tests > should work for all inputs
return literal union
passed
0.356s
Integ tests > should work for all inputs
single class
passed
0.389s
Integ tests > should work for all inputs
multiple classes
passed
0.438s
Integ tests > should work for all inputs
single enum list
passed
0.315s
Integ tests > should work for all inputs
single float
passed
2.675s
Integ tests > should work for all inputs
single int
passed
0.355s
Integ tests > should work for all inputs
single literal int
passed
0.38s
Integ tests > should work for all inputs
single literal bool
passed
0.34s
Integ tests > should work for all inputs
single literal string
passed
0.389s
Integ tests > should work for all inputs
single class with literal prop
passed
0.514s
Integ tests > should work for all inputs
single class with literal union prop
passed
0.524s
Integ tests > should work for all inputs
single optional string
passed
0.383s
Integ tests > should work for all inputs
single map string to string
passed
0.969s
Integ tests > should work for all inputs
single map string to class
passed
0.696s
Integ tests > should work for all inputs
single map string to map
passed
0.524s
Integ tests > should work for all inputs
enum key in map
passed
0.522s
Integ tests > should work for all inputs
literal string union key in map
passed
0.751s
Integ tests > should work for all inputs
single literal string key in map
passed
0.485s
Integ tests
should work for all outputs
passed
4.308s
Integ tests
works with retries1
passed
1.035s
Integ tests
works with retries2
passed
2.34s
Integ tests
works with fallbacks
passed
1.769s
Integ tests
should work with image from url
passed
1.767s
Integ tests
should work with image from base 64
passed
1.426s
Integ tests
should work with audio base 64
passed
1.108s
Integ tests
should work with audio from url
passed
1.298s
Integ tests
should support streaming in OpenAI
passed
1.929s
Integ tests
should support streaming in Gemini
passed
7.575s
Integ tests
should support AWS
passed
1.996s
Integ tests
should support streaming in AWS
passed
1.519s
Integ tests
should allow overriding the region
passed
0.003s
Integ tests
should support OpenAI shorthand
passed
14.733s
Integ tests
should support OpenAI shorthand streaming
passed
8.501s
Integ tests
should support anthropic shorthand
failed
30.001s
Error: thrown: "Exceeded timeout of 30000 ms for a test.
-Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."
-    at it (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:318:3)
-    at _dispatchDescribe (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/index.js:91:26)
-    at describe (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/index.js:55:5)
-    at Object.describe (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:28:1)
-    at Runtime._execModule (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-runtime@29.7.0/node_modules/jest-runtime/build/index.js:1439:24)
-    at Runtime._loadModule (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-runtime@29.7.0/node_modules/jest-runtime/build/index.js:1022:12)
-    at Runtime.requireModule (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-runtime@29.7.0/node_modules/jest-runtime/build/index.js:882:12)
-    at jestAdapter (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:77:13)
-    at processTicksAndRejections (node:internal/process/task_queues:95:5)
-    at runTestInternal (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-runner@29.7.0/node_modules/jest-runner/build/runTest.js:367:16)
-    at runTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-runner@29.7.0/node_modules/jest-runner/build/runTest.js:444:34)
Integ tests
should support anthropic shorthand streaming
passed
2.929s
Integ tests
should support streaming without iterating
passed
3.446s
Integ tests
should support streaming in Claude
passed
1.717s
Integ tests
should support vertex
passed
13.683s
Integ tests
supports tracing sync
passed
0.009s
Integ tests
supports tracing async
passed
3.727s
Integ tests
should work with dynamic types single
passed
1.356s
Integ tests
should work with dynamic types enum
passed
0.928s
Integ tests
should work with dynamic literals
passed
0.796s
Integ tests
should work with dynamic types class
passed
1.106s
Integ tests
should work with dynamic inputs class
passed
0.494s
Integ tests
should work with dynamic inputs list
passed
0.67s
Integ tests
should work with dynamic output map
passed
0.74s
Integ tests
should work with dynamic output union
passed
2.388s
Integ tests
should work with nested classes
passed
8.08s
Integ tests
should work with dynamic client
passed
0.675s
Integ tests
should work with 'onLogEvent'
passed
2.081s
Integ tests
should work with a sync client
passed
0.427s
Integ tests
should raise an error when appropriate
passed
0.825s
Integ tests
should raise a BAMLValidationError
passed
0.401s
Integ tests
should reset environment variables correctly
passed
1.208s
Integ tests
should use aliases when serializing input objects - classes
passed
0.934s
Integ tests
should use aliases when serializing, but still have original keys in jinja
passed
1.019s
Integ tests
should use aliases when serializing input objects - enums
passed
0.442s
Integ tests
should use aliases when serializing input objects - lists
passed
0.355s
Integ tests
constraints: should handle checks in return types
passed
0.692s
Integ tests
constraints: should handle checks in returned unions
passed
0.726s
Integ tests
constraints: should handle block-level checks
passed
0.542s
Integ tests
constraints: should handle nested-block-level checks
passed
0.589s
Integ tests
simple recursive type
passed
3.388s
Integ tests
mutually recursive type
passed
2.093s
Console Log
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:48:15)
+

Test Report

Started: 2024-12-13 07:35:13
Suites (1)
1 passed
0 failed
0 pending
Tests (67)
67 passed
0 failed
0 pending
Integ tests > should work for all inputs
single bool
passed
0.941s
Integ tests > should work for all inputs
single string list
passed
0.384s
Integ tests > should work for all inputs
return literal union
passed
0.401s
Integ tests > should work for all inputs
single class
passed
0.636s
Integ tests > should work for all inputs
multiple classes
passed
0.469s
Integ tests > should work for all inputs
single enum list
passed
0.466s
Integ tests > should work for all inputs
single float
passed
0.365s
Integ tests > should work for all inputs
single int
passed
0.313s
Integ tests > should work for all inputs
single literal int
passed
0.4s
Integ tests > should work for all inputs
single literal bool
passed
0.363s
Integ tests > should work for all inputs
single literal string
passed
0.425s
Integ tests > should work for all inputs
single class with literal prop
passed
0.466s
Integ tests > should work for all inputs
single class with literal union prop
passed
0.661s
Integ tests > should work for all inputs
single optional string
passed
0.466s
Integ tests > should work for all inputs
single map string to string
passed
0.487s
Integ tests > should work for all inputs
single map string to class
passed
0.65s
Integ tests > should work for all inputs
single map string to map
passed
0.786s
Integ tests > should work for all inputs
enum key in map
passed
0.909s
Integ tests > should work for all inputs
literal string union key in map
passed
0.922s
Integ tests > should work for all inputs
single literal string key in map
passed
0.549s
Integ tests
should work for all outputs
passed
5.774s
Integ tests
works with retries1
passed
1.159s
Integ tests
works with retries2
passed
2.221s
Integ tests
works with fallbacks
passed
1.988s
Integ tests
should work with image from url
passed
1.413s
Integ tests
should work with image from base 64
passed
1.698s
Integ tests
should work with audio base 64
passed
1.085s
Integ tests
should work with audio from url
passed
1.332s
Integ tests
should support streaming in OpenAI
passed
1.927s
Integ tests
should support streaming in Gemini
passed
7.571s
Integ tests
should support AWS
passed
1.722s
Integ tests
should support streaming in AWS
passed
1.618s
Integ tests
should allow overriding the region
passed
0.042s
Integ tests
should support OpenAI shorthand
passed
19.04s
Integ tests
should support OpenAI shorthand streaming
passed
9.894s
Integ tests
should support anthropic shorthand
passed
2.456s
Integ tests
should support anthropic shorthand streaming
passed
2.835s
Integ tests
should support streaming without iterating
passed
2.147s
Integ tests
should support streaming in Claude
passed
1.513s
Integ tests
should support vertex
passed
10.78s
Integ tests
supports tracing sync
passed
0.009s
Integ tests
supports tracing async
passed
3.32s
Integ tests
should work with dynamic types single
passed
3.489s
Integ tests
should work with dynamic types enum
passed
0.86s
Integ tests
should work with dynamic literals
passed
0.787s
Integ tests
should work with dynamic types class
passed
1.544s
Integ tests
should work with dynamic inputs class
passed
0.508s
Integ tests
should work with dynamic inputs list
passed
0.545s
Integ tests
should work with dynamic output map
passed
0.62s
Integ tests
should work with dynamic output union
passed
1.536s
Integ tests
should work with nested classes
passed
7.784s
Integ tests
should work with dynamic client
passed
0.494s
Integ tests
should work with 'onLogEvent'
passed
1.945s
Integ tests
should work with a sync client
passed
0.411s
Integ tests
should raise an error when appropriate
passed
0.893s
Integ tests
should raise a BAMLValidationError
passed
0.422s
Integ tests
should reset environment variables correctly
passed
1.046s
Integ tests
should use aliases when serializing input objects - classes
passed
0.802s
Integ tests
should use aliases when serializing, but still have original keys in jinja
passed
0.769s
Integ tests
should use aliases when serializing input objects - enums
passed
0.368s
Integ tests
should use aliases when serializing input objects - lists
passed
0.421s
Integ tests
constraints: should handle checks in return types
passed
0.784s
Integ tests
constraints: should handle checks in returned unions
passed
0.797s
Integ tests
constraints: should handle block-level checks
passed
0.568s
Integ tests
constraints: should handle nested-block-level checks
passed
0.793s
Integ tests
simple recursive type
passed
3.139s
Integ tests
mutually recursive type
passed
2.043s
Console Log
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:48:15)
     at Promise.then.completed (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/utils.js:298:28)
     at new Promise (<anonymous>)
     at callAsyncCircusFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/utils.js:231:10)
@@ -284,11 +272,11 @@
     at runTestInternal (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-runner@29.7.0/node_modules/jest-runner/build/runTest.js:367:16)
     at runTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-runner@29.7.0/node_modules/jest-runner/build/runTest.js:444:34)
calling with class
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:54:15)
got response key
 true
-52
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:194:15)
Expected error Error: BamlError: BamlClientError: BamlClientHttpError: LLM call failed: LLMErrorResponse { client: "RetryClientConstant", model: None, prompt: Chat([RenderedChatMessage { role: "system", allow_duplicate_role: false, parts: [Text("Say a haiku")] }]), request_options: {"model": String("gpt-3.5-turbo")}, start_time: SystemTime { tv_sec: 1734101951, tv_nsec: 185276000 }, latency: 163.761042ms, message: "Request failed: https://api.openai.com/v1/chat/completions\n{\n    \"error\": {\n        \"message\": \"Incorrect API key provided: blah. You can find your API key at https://platform.openai.com/account/api-keys.\",\n        \"type\": \"invalid_request_error\",\n        \"param\": null,\n        \"code\": \"invalid_api_key\"\n    }\n}\n", code: InvalidAuthentication }
+52
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:194:15)
Expected error Error: BamlError: BamlClientError: BamlClientHttpError: LLM call failed: LLMErrorResponse { client: "RetryClientConstant", model: None, prompt: Chat([RenderedChatMessage { role: "system", allow_duplicate_role: false, parts: [Text("Say a haiku")] }]), request_options: {"model": String("gpt-3.5-turbo")}, start_time: SystemTime { tv_sec: 1734104132, tv_nsec: 832000 }, latency: 148.325833ms, message: "Request failed: https://api.openai.com/v1/chat/completions\n{\n    \"error\": {\n        \"message\": \"Incorrect API key provided: blah. You can find your API key at https://platform.openai.com/account/api-keys.\",\n        \"type\": \"invalid_request_error\",\n        \"param\": null,\n        \"code\": \"invalid_api_key\"\n    }\n}\n", code: InvalidAuthentication }
     at BamlAsyncClient.parsed [as TestRetryConstant] (/Users/vbv/repos/gloo-lang/integ-tests/typescript/baml_client/async_client.ts:2810:18)
     at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:191:7) {
   code: 'GenericFailure'
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:203:15)
Expected error Error: BamlError: BamlClientError: BamlClientHttpError: LLM call failed: LLMErrorResponse { client: "RetryClientExponential", model: None, prompt: Chat([RenderedChatMessage { role: "system", allow_duplicate_role: false, parts: [Text("Say a haiku")] }]), request_options: {"model": String("gpt-3.5-turbo")}, start_time: SystemTime { tv_sec: 1734101953, tv_nsec: 484408000 }, latency: 227.111042ms, message: "Request failed: https://api.openai.com/v1/chat/completions\n{\n    \"error\": {\n        \"message\": \"Incorrect API key provided: blahh. You can find your API key at https://platform.openai.com/account/api-keys.\",\n        \"type\": \"invalid_request_error\",\n        \"param\": null,\n        \"code\": \"invalid_api_key\"\n    }\n}\n", code: InvalidAuthentication }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:203:15)
Expected error Error: BamlError: BamlClientError: BamlClientHttpError: LLM call failed: LLMErrorResponse { client: "RetryClientExponential", model: None, prompt: Chat([RenderedChatMessage { role: "system", allow_duplicate_role: false, parts: [Text("Say a haiku")] }]), request_options: {"model": String("gpt-3.5-turbo")}, start_time: SystemTime { tv_sec: 1734104134, tv_nsec: 158534000 }, latency: 230.130959ms, message: "Request failed: https://api.openai.com/v1/chat/completions\n{\n    \"error\": {\n        \"message\": \"Incorrect API key provided: blahh. You can find your API key at https://platform.openai.com/account/api-keys.\",\n        \"type\": \"invalid_request_error\",\n        \"param\": null,\n        \"code\": \"invalid_api_key\"\n    }\n}\n", code: InvalidAuthentication }
     at BamlAsyncClient.parsed [as TestRetryExponential] (/Users/vbv/repos/gloo-lang/integ-tests/typescript/baml_client/async_client.ts:2835:18)
     at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:200:7) {
   code: 'GenericFailure'
@@ -692,370 +680,172 @@
   hair_color: 'black',
   attributes: { eye_color: 'blue', facial_hair: 'beard' },
   height: { meters: 1.8 }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: '', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'value', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'value1', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'value1', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'value1', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'value1', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'value1', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'value1', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'value1', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'value1', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'value1', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'value1', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'value1', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'value1', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'value1', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'value1', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'value1', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'value1', prop2: { prop1: '', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: { prop1: 'value', prop2: null, inner: null }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: { prop1: 'value2', prop2: null, inner: null }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: { prop1: 'value2', prop2: null, inner: null }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: { prop1: 'value2', prop2: null, inner: null }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: { prop1: 'value2', prop2: null, inner: null }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: { prop1: 'value2', prop2: null, inner: null }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: '', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: '', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: 'world', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: 'world', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: 'world', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: 'world', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: 'world', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: 'world', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: 'world', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: 'world', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: 'world', prop2: '', inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'hello', prop2: { prop1: 'world', prop2: 'ag', inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: null }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: { prop1: 'value2', prop2: null, inner: null }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: null }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: { prop1: 'value2', prop2: null, inner: null }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: null }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: { prop1: 'value2', prop2: null, inner: null }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg { prop1: 'value1', prop2: { prop1: 'value2', prop2: '', inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: { prop1: 'value2', prop2: 'value', inner: null }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: null }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: { prop1: 'value2', prop2: 'value3', inner: null }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: null }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: { prop1: 'value2', prop2: 'value3', inner: null }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: null }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: { prop1: 'value2', prop2: 'value3', inner: null }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: null }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: { prop1: 'value2', prop2: 'value3', inner: null }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: { prop1: 'value2', prop2: 'value3', inner: null }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: { prop1: 'value2', prop2: 'value3', inner: null }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: { prop1: 'value2', prop2: 'value3', inner: null }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
+  prop1: 'hello',
   prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
+    prop1: 'world',
+    prop2: 'again',
     inner: { prop2: null, prop3: null }
   }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
+  prop1: 'hello',
   prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
+    prop1: 'world',
+    prop2: 'again',
     inner: { prop2: null, prop3: null }
   }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
+  prop1: 'hello',
   prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
+    prop1: 'world',
+    prop2: 'again',
     inner: { prop2: null, prop3: null }
   }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
+  prop1: 'hello',
   prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
+    prop1: 'world',
+    prop2: 'again',
     inner: { prop2: null, prop3: null }
   }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
+  prop1: 'hello',
   prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
+    prop1: 'world',
+    prop2: 'again',
     inner: { prop2: null, prop3: null }
   }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
+  prop1: 'hello',
   prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
+    prop1: 'world',
+    prop2: 'again',
     inner: { prop2: null, prop3: null }
   }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
+  prop1: 'hello',
   prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
+    prop1: 'world',
+    prop2: 'again',
     inner: { prop2: null, prop3: null }
   }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
+  prop1: 'hello',
   prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
+    prop1: 'world',
+    prop2: 'again',
     inner: { prop2: null, prop3: null }
   }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
+  prop1: 'hello',
   prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
+    prop1: 'world',
+    prop2: 'again',
     inner: { prop2: null, prop3: null }
   }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
+  prop1: 'hello',
   prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
+    prop1: 'world',
+    prop2: 'again',
     inner: { prop2: null, prop3: null }
   }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: null }
-  }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: null }
-  }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: null }
-  }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: null }
-  }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: null }
-  }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
+  prop1: 'hello',
   prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
+    prop1: 'world',
+    prop2: 'again',
     inner: { prop2: null, prop3: null }
   }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: null }
-  }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: null }
-  }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: null }
-  }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: null }
-  }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: null }
-  }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: null }
-  }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'hello',
+  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
 }
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:623:15)
     at callback (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:70:17)
onLogEvent {
   metadata: {
-    eventId: '76a936f8-e133-4ea1-a58e-ce86919c1893',
-    rootEventId: '76a936f8-e133-4ea1-a58e-ce86919c1893'
+    eventId: '9ad5196c-2fe4-428b-bf00-1191272356cf',
+    rootEventId: '9ad5196c-2fe4-428b-bf00-1191272356cf'
   },
   prompt: '[\n' +
     '  {\n' +
@@ -1069,12 +859,12 @@
     ']',
   rawOutput: '["a", "b", "c"]',
   parsedOutput: '["a", "b", "c"]',
-  startTime: '2024-12-13T15:01:10.937Z'
+  startTime: '2024-12-13T15:37:05.264Z'
 }
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:623:15)
     at callback (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:70:17)
onLogEvent {
   metadata: {
-    eventId: 'd0febbcd-9aa4-48f0-a4da-0c29167c4f5f',
-    rootEventId: 'd0febbcd-9aa4-48f0-a4da-0c29167c4f5f'
+    eventId: '3ed3c62a-4348-46bf-924c-047cfa0f93a8',
+    rootEventId: '3ed3c62a-4348-46bf-924c-047cfa0f93a8'
   },
   prompt: '[\n' +
     '  {\n' +
@@ -1088,8 +878,8 @@
     ']',
   rawOutput: '["d", "e", "f"]',
   parsedOutput: '["d", "e", "f"]',
-  startTime: '2024-12-13T15:01:11.368Z'
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:657:15)
Error: Error: BamlError: BamlClientError: BamlClientHttpError: LLM call failed: LLMErrorResponse { client: "MyClient", model: None, prompt: Chat([RenderedChatMessage { role: "system", allow_duplicate_role: false, parts: [Text("Given a string, extract info using the schema:\n\nMy name is Harrison. My hair is black and I'm 6 feet tall.\n\nAnswer in JSON using this schema:\n{\n}")] }]), request_options: {"model": String("gpt-4o-mini")}, start_time: SystemTime { tv_sec: 1734102072, tv_nsec: 835255000 }, latency: 153.168ms, message: "Request failed: https://api.openai.com/v1/chat/completions\n{\n    \"error\": {\n        \"message\": \"Incorrect API key provided: INVALID_KEY. You can find your API key at https://platform.openai.com/account/api-keys.\",\n        \"type\": \"invalid_request_error\",\n        \"param\": null,\n        \"code\": \"invalid_api_key\"\n    }\n}\n", code: InvalidAuthentication }
+  startTime: '2024-12-13T15:37:05.907Z'
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:657:15)
Error: Error: BamlError: BamlClientError: BamlClientHttpError: LLM call failed: LLMErrorResponse { client: "MyClient", model: None, prompt: Chat([RenderedChatMessage { role: "system", allow_duplicate_role: false, parts: [Text("Given a string, extract info using the schema:\n\nMy name is Harrison. My hair is black and I'm 6 feet tall.\n\nAnswer in JSON using this schema:\n{\n}")] }]), request_options: {"model": String("gpt-4o-mini")}, start_time: SystemTime { tv_sec: 1734104227, tv_nsec: 481679000 }, latency: 228.444916ms, message: "Request failed: https://api.openai.com/v1/chat/completions\n{\n    \"error\": {\n        \"message\": \"Incorrect API key provided: INVALID_KEY. You can find your API key at https://platform.openai.com/account/api-keys.\",\n        \"type\": \"invalid_request_error\",\n        \"param\": null,\n        \"code\": \"invalid_api_key\"\n    }\n}\n", code: InvalidAuthentication }
     at BamlAsyncClient.parsed (/Users/vbv/repos/gloo-lang/integ-tests/typescript/baml_client/async_client.ts:1585:18)
     at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:654:7) {
   code: 'GenericFailure'
@@ -1103,7 +893,7 @@
     at /Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:663:9
     at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:661:5) {
   prompt: '[\x1B[2mchat\x1B[0m] \x1B[43msystem: \x1B[0mSay "hello there".\n',
-  raw_output: 'Hello there! How can I assist you today?'
+  raw_output: 'Hello there! How can I help you today?'
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:677:17)
error BamlValidationError: BamlValidationError: Failed to parse LLM response: Failed to coerce value: <root>: Failed while parsing required fields: missing=2, unparsed=0
   - <root>: Missing required field: nonce
   - <root>: Missing required field: nonce2
diff --git a/tools/versions/engine.cfg b/tools/versions/engine.cfg
index 681f0e69e..7b0297730 100644
--- a/tools/versions/engine.cfg
+++ b/tools/versions/engine.cfg
@@ -1,5 +1,5 @@
 [bumpversion]
-current_version = 0.70.4
+current_version = 0.70.5
 commit = False
 tag = False
 parse = ^(?P\d+)\.(?P\d+).(?P\d+)$
diff --git a/tools/versions/integ-tests.cfg b/tools/versions/integ-tests.cfg
index f264e5a83..48a1bcd28 100644
--- a/tools/versions/integ-tests.cfg
+++ b/tools/versions/integ-tests.cfg
@@ -1,5 +1,5 @@
 [bumpversion]
-current_version = 0.70.4
+current_version = 0.70.5
 commit = False
 tag = False
 parse = ^(?P\d+)\.(?P\d+).(?P\d+)$
diff --git a/tools/versions/python.cfg b/tools/versions/python.cfg
index c670f6858..f2ee856be 100644
--- a/tools/versions/python.cfg
+++ b/tools/versions/python.cfg
@@ -1,5 +1,5 @@
 [bumpversion]
-current_version = 0.70.4
+current_version = 0.70.5
 commit = False
 tag = False
 parse = ^(?P\d+)\.(?P\d+).(?P\d+)$
diff --git a/tools/versions/ruby.cfg b/tools/versions/ruby.cfg
index f5a8fca9d..f8f0b8ca5 100644
--- a/tools/versions/ruby.cfg
+++ b/tools/versions/ruby.cfg
@@ -1,5 +1,5 @@
 [bumpversion]
-current_version = 0.70.4
+current_version = 0.70.5
 commit = False
 tag = False
 parse = ^(?P\d+)\.(?P\d+).(?P\d+)$
diff --git a/tools/versions/typescript.cfg b/tools/versions/typescript.cfg
index c83e523f3..5f2984fcd 100644
--- a/tools/versions/typescript.cfg
+++ b/tools/versions/typescript.cfg
@@ -1,5 +1,5 @@
 [bumpversion]
-current_version = 0.70.4
+current_version = 0.70.5
 commit = False
 tag = False
 parse = ^(?P\d+)\.(?P\d+).(?P\d+)$
diff --git a/tools/versions/vscode.cfg b/tools/versions/vscode.cfg
index ceb445f07..f4c02a2da 100644
--- a/tools/versions/vscode.cfg
+++ b/tools/versions/vscode.cfg
@@ -1,5 +1,5 @@
 [bumpversion]
-current_version = 0.70.4
+current_version = 0.70.5
 commit = False
 tag = False
 parse = ^(?P\d+)\.(?P\d+).(?P\d+)$
diff --git a/typescript/vscode-ext/packages/package.json b/typescript/vscode-ext/packages/package.json
index 0b16ac4ef..676e5f684 100644
--- a/typescript/vscode-ext/packages/package.json
+++ b/typescript/vscode-ext/packages/package.json
@@ -2,7 +2,7 @@
   "name": "baml-extension",
   "displayName": "Baml",
   "description": "BAML is a DSL for AI applications.",
-  "version": "0.70.4",
+  "version": "0.70.5",
   "publisher": "Boundary",
   "repository": "https://github.com/BoundaryML/baml",
   "homepage": "https://www.boundaryml.com",