diff --git a/CHANGELOG.md b/CHANGELOG.md index e42b65a98..b3c2959e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,23 @@ All notable changes to this project will be documented in this file. See [conventional commits](https://www.conventionalcommits.org/) for commit guidelines. +## [0.70.2](https://github.com/boundaryml/baml/compare/0.70.1..0.70.2) - 2024-12-13 + +### Bug Fixes + +- Remove log statements (#1230) - ([4bcdd19](https://github.com/boundaryml/baml/commit/4bcdd198f219cd016ee64cc6444dd62e69f796fb)) - hellovai +- Fix playground proxy related issues (#1228, #1229, #1237) - ([7384ba8](https://github.com/boundaryml/baml/commit/7384ba8cb5d1f012c50ddfb2a44a142ec9654397)) ([7bb6df4](https://github.com/boundaryml/baml/commit/7bb6df40fe37753b946ceeec6b30c4d9cdcc4ce7)) ([16054f5](https://github.com/boundaryml/baml/commit/16054f5f858dcaf80f013d466ceb9354c6a160b7)) - aaronvg + +### DOCS + +- deno run instead of dpx (#1225) - ([7c64299](https://github.com/boundaryml/baml/commit/7c642992cd7d52b7e7cd718542dfa68c41b5aab3)) - Jeffrey Konowitch +- Fix broken links (#1235) - ([859c699](https://github.com/boundaryml/baml/commit/859c6998cef7950d52cc3287f51d74106a58d89d)) - Samuel Lijin + +### Features + +- Support parsing primitive values from single-key objects (#1224) - ([935a190](https://github.com/boundaryml/baml/commit/935a190556d12077f961ce083723e7c1f816f387)) - revidious + + ## [0.70.1](https://github.com/boundaryml/baml/compare/0.70.0..0.70.1) - 2024-12-05 ### Bug Fixes diff --git a/engine/Cargo.lock b/engine/Cargo.lock index e3e3ef421..7594e2ee8 100644 --- a/engine/Cargo.lock +++ b/engine/Cargo.lock @@ -785,7 +785,7 @@ dependencies = [ [[package]] name = "baml-cli" -version = "0.70.1" +version = "0.70.2" dependencies = [ "ambassador", "anyhow", @@ -873,7 +873,7 @@ dependencies = [ [[package]] name = "baml-lib" -version = "0.70.1" +version = "0.70.2" dependencies = [ "base64 0.13.1", "dissimilar", @@ -913,7 +913,7 @@ dependencies = [ [[package]] name = "baml-runtime" -version = "0.70.1" +version = "0.70.2" dependencies = [ "ambassador", "anyhow", @@ -1010,7 +1010,7 @@ dependencies = [ [[package]] name = "baml-schema-build" -version = "0.70.1" +version = "0.70.2" dependencies = [ "anyhow", "baml-runtime", @@ -1048,7 +1048,7 @@ dependencies = [ [[package]] name = "baml-types" -version = "0.70.1" +version = "0.70.2" dependencies = [ "anyhow", "clap", @@ -1177,7 +1177,7 @@ dependencies = [ [[package]] name = "bstd" -version = "0.70.1" +version = "0.70.2" dependencies = [ "anyhow", "assert_cmd", @@ -2571,7 +2571,7 @@ dependencies = [ [[package]] name = "internal-baml-codegen" -version = "0.70.1" +version = "0.70.2" dependencies = [ "anyhow", "askama", @@ -2596,7 +2596,7 @@ dependencies = [ [[package]] name = "internal-baml-core" -version = "0.70.1" +version = "0.70.2" dependencies = [ "anyhow", "baml-types", @@ -2633,7 +2633,7 @@ dependencies = [ [[package]] name = "internal-baml-diagnostics" -version = "0.70.1" +version = "0.70.2" dependencies = [ "anyhow", "colored", @@ -2646,7 +2646,7 @@ dependencies = [ [[package]] name = "internal-baml-jinja" -version = "0.70.1" +version = "0.70.2" dependencies = [ "anyhow", "askama", @@ -2667,7 +2667,7 @@ dependencies = [ [[package]] name = "internal-baml-jinja-types" -version = "0.70.1" +version = "0.70.2" dependencies = [ "anyhow", "askama", @@ -2686,7 +2686,7 @@ dependencies = [ [[package]] name = "internal-baml-parser-database" -version = "0.70.1" +version = "0.70.2" dependencies = [ "anyhow", "baml-types", @@ -2711,7 +2711,7 @@ dependencies = [ [[package]] name = "internal-baml-prompt-parser" -version = "0.70.1" +version = "0.70.2" dependencies = [ "internal-baml-diagnostics", "internal-baml-schema-ast", @@ -2723,7 +2723,7 @@ dependencies = [ [[package]] name = "internal-baml-schema-ast" -version = "0.70.1" +version = "0.70.2" dependencies = [ "anyhow", "baml-types", @@ -2742,7 +2742,7 @@ dependencies = [ [[package]] name = "internal-llm-client" -version = "0.70.1" +version = "0.70.2" dependencies = [ "anyhow", "baml-types", @@ -2840,7 +2840,7 @@ checksum = "9dbbfed4e59ba9750e15ba154fdfd9329cee16ff3df539c2666b70f58cc32105" [[package]] name = "jsonish" -version = "0.70.1" +version = "0.70.2" dependencies = [ "anyhow", "assert-json-diff", diff --git a/engine/Cargo.toml b/engine/Cargo.toml index 2f408ea46..8dc32a383 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.1" +version = "0.70.2" authors = ["Boundary "] description = "BAML Toolchain" diff --git a/engine/language_client_python/pyproject.toml b/engine/language_client_python/pyproject.toml index 0038e6796..1656c7004 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.1" +version = "0.70.2" 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 d0e3c1a12..b5ca4262f 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.1" + spec.version = "0.70.2" 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 9b582ec1e..1a5870973 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.1", + "version": "0.70.2", "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 2080ba649..d666fd8a9 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.1" + version "0.70.2" } generator lang_typescript { output_type typescript output_dir "../typescript" - version "0.70.1" + version "0.70.2" } generator lang_ruby { output_type ruby/sorbet output_dir "../ruby" - version "0.70.1" + version "0.70.2" } // generator openapi { // output_type rest/openapi // output_dir "../openapi" -// version "0.70.1" +// version "0.70.2" // on_generate "rm .gitignore" // } diff --git a/integ-tests/python/baml_client/inlinedbaml.py b/integ-tests/python/baml_client/inlinedbaml.py index b07375e7b..0e46ddfcb 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.1\"\n}\n\ngenerator lang_typescript {\n output_type typescript\n output_dir \"../typescript\"\n version \"0.70.1\"\n}\n\ngenerator lang_ruby {\n output_type ruby/sorbet\n output_dir \"../ruby\"\n version \"0.70.1\"\n}\n\n// generator openapi {\n// output_type rest/openapi\n// output_dir \"../openapi\"\n// version \"0.70.1\"\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.2\"\n}\n\ngenerator lang_typescript {\n output_type typescript\n output_dir \"../typescript\"\n version \"0.70.2\"\n}\n\ngenerator lang_ruby {\n output_type ruby/sorbet\n output_dir \"../ruby\"\n version \"0.70.2\"\n}\n\n// generator openapi {\n// output_type rest/openapi\n// output_dir \"../openapi\"\n// version \"0.70.2\"\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 8839053a9..c1bd0bb53 100644 --- a/integ-tests/python/report.html +++ b/integ-tests/python/report.html @@ -3,82 +3,123 @@
Test Report

Summary

100
1 failed 99 passed

Tests

tests/test_functions.py 196 0:03:06.912160

PASSED test_env_vars_reset 0:00:01.598847

Setup

Call

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

Summary

102
1 failed 101 passed

Tests

tests/test_functions.py 196 0:03:33.568695

PASSED test_env_vars_reset 0:00:01.820627

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.447907

Setup

Call

Captured stdout call
got response key
+

Teardown

PASSED test_sync 0:00:00.472794

Setup

Call

Captured stdout call
got response key
 true
 52
-

Teardown

PASSED TestAllInputs::test_single_bool 0:00:00.306592

Setup

Call

Teardown

PASSED TestAllInputs::test_single_string_list 0:00:00.506679

Setup

Call

Teardown

PASSED TestAllInputs::test_return_literal_union 0:00:00.289915

Setup

Call

Teardown

PASSED TestAllInputs::test_constraints 0:00:00.624947

Setup

Call

Teardown

PASSED TestAllInputs::test_constraint_union_variant_checking 0:00:00.728360

Setup

Call

Teardown

PASSED TestAllInputs::test_return_malformed_constraint 0:00:00.453278

Setup

Call

Teardown

PASSED TestAllInputs::test_use_malformed_constraint 0:00:00.001295

Setup

Call

Captured stderr call
[2024-12-04T06:30:44Z 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.618615

Setup

Call

Teardown

PASSED TestAllInputs::test_single_string_list 0:00:00.714492

Setup

Call

Teardown

PASSED TestAllInputs::test_return_literal_union 0:00:00.299170

Setup

Call

Teardown

PASSED TestAllInputs::test_constraints 0:00:00.632056

Setup

Call

Teardown

PASSED TestAllInputs::test_constraint_union_variant_checking 0:00:00.716871

Setup

Call

Teardown

PASSED TestAllInputs::test_return_malformed_constraint 0:00:00.684505

Setup

Call

Teardown

PASSED TestAllInputs::test_use_malformed_constraint 0:00:00.001355

Setup

Call

Captured stderr call
[2024-12-13T14:21:47Z 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.368634

Setup

Call

Teardown

PASSED TestAllInputs::test_multiple_args 0:00:00.445836

Setup

Call

Teardown

PASSED TestAllInputs::test_single_enum_list 0:00:00.344927

Setup

Call

Teardown

PASSED TestAllInputs::test_single_float 0:00:00.427340

Setup

Call

Teardown

PASSED TestAllInputs::test_single_int 0:00:00.354604

Setup

Call

Teardown

PASSED TestAllInputs::test_single_literal_int 0:00:00.471760

Setup

Call

Teardown

PASSED TestAllInputs::test_single_literal_bool 0:00:00.776402

Setup

Call

Teardown

PASSED TestAllInputs::test_single_literal_string 0:00:00.512772

Setup

Call

Teardown

PASSED TestAllInputs::test_class_with_literal_prop 0:00:00.372423

Setup

Call

Teardown

PASSED TestAllInputs::test_literal_classs_with_literal_union_prop 0:00:00.702836

Setup

Call

Teardown

PASSED TestAllInputs::test_single_map_string_to_string 0:00:00.460990

Setup

Call

Teardown

PASSED TestAllInputs::test_single_map_string_to_class 0:00:00.568221

Setup

Call

Teardown

PASSED TestAllInputs::test_single_map_string_to_map 0:00:00.384364

Setup

Call

Teardown

PASSED TestAllInputs::test_enum_key_in_map 0:00:00.750769

Setup

Call

Teardown

PASSED TestAllInputs::test_literal_string_union_key_in_map 0:00:00.649376

Setup

Call

Teardown

PASSED TestAllInputs::test_single_literal_string_key_in_map 0:00:00.499413

Setup

Call

Teardown

PASSED test_should_work_for_all_outputs 0:00:05.532121

Setup

Call

Teardown

PASSED test_should_work_with_image_url 0:00:01.750962

Setup

Call

Teardown

PASSED test_should_work_with_image_list 0:00:02.252015

Setup

Call

Teardown

PASSED test_should_work_with_vertex 0:00:08.748015

Setup

Call

Teardown

PASSED test_should_work_with_image_base64 0:00:01.301831

Setup

Call

Teardown

PASSED test_should_work_with_audio_base64 0:00:01.151316

Setup

Call

Teardown

PASSED test_should_work_with_audio_url 0:00:01.193011

Setup

Call

Teardown

PASSED test_works_with_retries2 0:00:02.273093

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: 1733293876, tv_nsec: 974347000 }, latency: 171.149125ms, 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.816097

Setup

Call

Teardown

PASSED test_works_with_failing_azure_fallback 0:00:00.033483

Setup

Call

Teardown

PASSED test_claude 0:00:00.972559

Setup

Call

Teardown

PASSED test_gemini 0:00:09.202791

Setup

Call

Captured stdout call
LLM output from Gemini: Mildred adjusted her cat-eye glasses, squinting at the neon sign flickering above the dusty gas station. "Dr. Pepper," it buzzed, half the letters burnt out. "You sure this is the place, Earl?"
+

Teardown

PASSED TestAllInputs::test_single_class 0:00:00.522007

Setup

Call

Teardown

PASSED TestAllInputs::test_multiple_args 0:00:00.524706

Setup

Call

Teardown

PASSED TestAllInputs::test_single_enum_list 0:00:00.360591

Setup

Call

Teardown

PASSED TestAllInputs::test_single_float 0:00:00.443447

Setup

Call

Teardown

PASSED TestAllInputs::test_single_int 0:00:00.313055

Setup

Call

Teardown

PASSED TestAllInputs::test_single_literal_int 0:00:00.452723

Setup

Call

Teardown

PASSED TestAllInputs::test_single_literal_bool 0:00:00.380532

Setup

Call

Teardown

PASSED TestAllInputs::test_single_literal_string 0:00:00.323265

Setup

Call

Teardown

PASSED TestAllInputs::test_class_with_literal_prop 0:00:00.497995

Setup

Call

Teardown

PASSED TestAllInputs::test_literal_classs_with_literal_union_prop 0:00:00.643937

Setup

Call

Teardown

PASSED TestAllInputs::test_single_map_string_to_string 0:00:00.475970

Setup

Call

Teardown

PASSED TestAllInputs::test_single_map_string_to_class 0:00:00.445885

Setup

Call

Teardown

PASSED TestAllInputs::test_single_map_string_to_map 0:00:00.419887

Setup

Call

Teardown

PASSED TestAllInputs::test_enum_key_in_map 0:00:01.046794

Setup

Call

Teardown

PASSED TestAllInputs::test_literal_string_union_key_in_map 0:00:00.735357

Setup

Call

Teardown

PASSED TestAllInputs::test_single_literal_string_key_in_map 0:00:00.380765

Setup

Call

Teardown

PASSED test_should_work_for_all_outputs 0:00:04.608649

Setup

Call

Teardown

PASSED test_should_work_with_image_url 0:00:01.381997

Setup

Call

Teardown

PASSED test_should_work_with_image_list 0:00:01.422734

Setup

Call

Teardown

PASSED test_should_work_with_vertex 0:00:09.970103

Setup

Call

Teardown

PASSED test_should_work_with_image_base64 0:00:01.379067

Setup

Call

Teardown

PASSED test_should_work_with_audio_base64 0:00:01.057976

Setup

Call

Teardown

PASSED test_should_work_with_audio_url 0:00:01.101493

Setup

Call

Teardown

PASSED test_works_with_retries2 0:00:02.139693

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: 1734099738, tv_nsec: 399323000 }, latency: 236.591084ms, 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.990924

Setup

Call

Teardown

PASSED test_works_with_failing_azure_fallback 0:00:00.036548

Setup

Call

Teardown

PASSED test_claude 0:00:01.445531

Setup

Call

Teardown

PASSED test_gemini 0:00:09.097367

Setup

Call

Captured stdout call
LLM output from Gemini: Bartholomew "Bart" Pepper was, by all accounts, a strange man. He spoke in riddles, tinkered with contraptions that defied logic, and smelled perpetually of licorice and burnt sugar.  His small shop, nestled in a forgotten corner of a bustling city, was a testament to his eccentricities.  Bells jingled incessantly from the ceiling, gears spun on walls adorned with cryptic diagrams, and the air crackled with a peculiar energy. 
 
-Earl, a portly beagle mix, snuffled at the cracked asphalt. "Positive. This is where the legend sleeps."
+Bart claimed he was a doctor, not of the body, but of the soul.  His medicine? A concoction he called "Dr. Pepper," a bubbling, fizzing elixir brewed in giant copper kettles that hissed and groaned with ancient secrets. 
 
-Mildred, a renowned historian specializing in the obscure and forgotten, patted her companion's head. They were on the trail of the fabled Dr. Pepper, not the sugary drink, but the man rumored to have invented it. Legend claimed he vanished decades ago, leaving behind whispers and a single, cryptic message: "The answer lies where the bubbles dance."
+One dreary afternoon, a young woman named Amelia wandered into his shop. Burdened with grief over a recent loss, she felt drawn to its warmth and the strange, comforting aroma.  Bart, with eyes that held the wisdom of a thousand lifetimes,  simply smiled and handed her a steaming mug of his concoction.
 
-The gas station attendant, a teenager with a bored expression and a name tag that read "Scooter," shrugged when Mildred inquired about Dr. Pepper. "Never heard of him. This place has been abandoned for years."
+Amelia took a tentative sip. The taste was like nothing she'd ever experienced: a kaleidoscope of flavors, sweet and tangy, with a hint of something indescribable.  As she drank, a warmth spread through her, melting away the chill in her heart.  She looked up, eyes wide with wonder.
 
-Undeterred, Mildred explored the dusty aisles. Earl, sniffing at a forgotten bag of chips, suddenly barked. He pawed at a loose floorboard, revealing a hidden compartment. Inside, nestled amongst cobwebs and faded newspaper clippings, lay a leather-bound journal.
+"What is this magic?" she breathed.
 
-"This is it," Mildred whispered, her heart pounding.
+Bart chuckled, his eyes twinkling. "It's not magic, my dear. It's the taste of possibility, of joy, of a thousand tiny sparks of hope, all bottled up for a rainy day."
 
-The journal chronicled Dr. Pepper's journey, his quest to create a drink that captured the feeling of joy, the fizz of excitement. The final entry detailed his creation, a recipe using a secret blend of 23 flavors.
+And as Amelia finished her mug, she realized he was right. The world outside might have remained gray, but within her, something had shifted.  A flicker of hope, ignited by the doctor's strange brew, had begun to burn. She left the shop that day, lighter in spirit, carrying with her the sweet, fizzy taste of possibility. 
 
-And then, the cryptic message: "The answer lies where the bubbles dance."
+Bart, watching her go, smiled. He knew his concoction couldn't erase her pain, but perhaps, it could help her remember the sweetness life still held. And that, he believed, was a kind of medicine all its own. 
 
-Mildred reread the line, then looked up. Through the dusty window, the setting sun cast an orange glow on a forgotten soda fountain. The bubbles in the forgotten syrup bottles danced in the light.
+

Teardown

PASSED test_gemini_streaming 0:00:08.035179

Setup

Call

Captured stdout call
LLM output from Gemini: The old diner was quiet, the only sound the gentle whir of the ceiling fan struggling against the Texas heat. Behind the counter, Mabel hummed along to a song only she could hear, polishing a glass until it gleamed. 
 
-With trembling hands, Mildred mixed the ingredients from the recipe, adding a final touch - a sprinkle of sunset-colored dust collected from the windowsill. She took a sip, the 23 flavors bursting on her tongue. It tasted of forgotten dreams and joyous memories, a symphony of sweetness and light.
+Suddenly, the bell above the door chimed, announcing a customer. A young woman, her face hidden by a worn cowboy hat, slumped into a booth by the window. Mabel recognized the look of someone who'd lost their way, a look she'd seen a thousand times reflected in the chrome of the napkin dispenser.
 
-Earl barked in agreement, lapping at a spilled drop. The legend wasn't about a drink, Mildred realized, but about capturing a feeling. And Dr. Pepper, the man, had bottled pure happiness. 
+"Howdy," Mabel greeted, setting down the glass. "What can I get you, hon?"
 
-

Teardown

PASSED test_gemini_streaming 0:00:01.480657

Setup

Call

Captured stdout call
LLM output from Gemini: Dr. Pete Pepper wasn't a real doctor, not in the medical sense anyway
-

Teardown

PASSED test_aws 0:00:01.698838

Setup

Call

Teardown

PASSED test_openai_shorthand 0:00:07.257032

Setup

Call

Teardown

PASSED test_openai_shorthand_streaming 0:00:12.582135

Setup

Call

Teardown

PASSED test_anthropic_shorthand 0:00:02.904237

Setup

Call

Teardown

PASSED test_anthropic_shorthand_streaming 0:00:02.755303

Setup

Call

Teardown

PASSED test_fallback_to_shorthand 0:00:01.038533

Setup

Call

Teardown

PASSED test_aws_streaming 0:00:01.456936

Setup

Call

Teardown

PASSED test_streaming 0:00:02.959838

Setup

Call

Teardown

PASSED test_streaming_uniterated 0:00:02.410336

Setup

Call

Teardown

PASSED test_streaming_sync 0:00:02.568135

Setup

Call

Captured log call
WARNING  asyncio:base_events.py:1982 Executing <Task finished name='Task-64' coro=<BaseEventLoop.shutdown_default_executor() done, defined at /opt/homebrew/Cellar/python@3.12/3.12.4/Frameworks/Python.framework/Versions/3.12/lib/python3.12/asyncio/base_events.py:586> result=None created at /opt/homebrew/Cellar/python@3.12/3.12.4/Frameworks/Python.framework/Versions/3.12/lib/python3.12/asyncio/tasks.py:695> took 0.464 seconds

Teardown

PASSED test_streaming_uniterated_sync 0:00:02.717052

Setup

Call

Teardown

PASSED test_streaming_claude 0:00:00.978513

Setup

Call

Captured stdout call
msgs:
-Here's a haiku about Mt. Rainier:
+The woman sighed, pushing the hat back to reveal tired eyes. "Just coffee, black as my boots."
 
-Rainier stands alone
-Fourteen thousand feet skyward
-Guardian of clouds
+Mabel raised an eyebrow. "Now, I don't know about all that. How about a Dr. Pepper instead? It's got just the right amount of pep to chase away any blues."
+
+The woman hesitated, then a small smile flickered across her lips. "Alright, a Dr. Pepper it is."
+
+Mabel returned a moment later with a frosty glass, condensation clinging to its sides like tiny diamonds. The woman took a long sip, her eyes widening in surprise. 
+
+"This is... delicious." She took another gulp. "It tastes like...like hope mixed with a little bit of mischief."
+
+Mabel chuckled. "That's Dr. Pepper for ya. Ain't no problem it can't fix, at least for a little while."
+
+And as the woman finished her Dr. Pepper, sharing stories with Mabel and the few other patrons who wandered in, the diner didn't feel quite so quiet anymore. The air was filled with the clinking of glasses, the murmur of conversation, and the sweet, spicy scent of Dr. Pepper, a reminder that even on the loneliest of roads, a little bit of comfort could always be found. 
+
+

Teardown

PASSED test_aws 0:00:01.829658

Setup

Call

Teardown

PASSED test_openai_shorthand 0:00:10.503789

Setup

Call

Teardown

PASSED test_openai_shorthand_streaming 0:00:10.879226

Setup

Call

Teardown

PASSED test_anthropic_shorthand 0:00:03.933997

Setup

Call

Teardown

PASSED test_anthropic_shorthand_streaming 0:00:03.735164

Setup

Call

Teardown

PASSED test_fallback_to_shorthand 0:00:00.860333

Setup

Call

Teardown

PASSED test_aws_streaming 0:00:01.449588

Setup

Call

Teardown

PASSED test_streaming 0:00:02.517329

Setup

Call

Teardown

PASSED test_streaming_uniterated 0:00:03.343076

Setup

Call

Teardown

PASSED test_streaming_sync 0:00:03.880195

Setup

Call

Teardown

PASSED test_streaming_uniterated_sync 0:00:05.060981

Setup

Call

Teardown

PASSED test_streaming_claude 0:00:01.059323

Setup

Call

Captured stdout call
msgs:
+Here's a haiku about Mt. Rainier's height:
+
+Rainier stands proud, high
+Fourteen thousand feet of snow
+Pierce the summer sky
 final:
-Here's a haiku about Mt. Rainier:
+Here's a haiku about Mt. Rainier's height:
+
+Rainier stands proud, high
+Fourteen thousand feet of snow
+Pierce the summer sky
+

Teardown

PASSED test_streaming_gemini 0:00:09.398223

Setup

Call

Captured stdout call
msgs:
+Barnaby Butterfield, a man of discerning taste and handlebar mustache to match, slammed his newspaper on the table, rattling his wife Agnes' teacup. "Preposterous!" he boomed.
 
-Rainier stands alone
-Fourteen thousand feet skyward
-Guardian of clouds
-

Teardown

PASSED test_streaming_gemini 0:00:08.033064

Setup

Call

Captured stdout call
msgs:
-Dottie Mae clutched her lukewarm Dr Pepper, the condensation forming a sticky ring on the porch swing. A symphony of cicadas played in the muggy summer air. It was her Pawpaw's favorite drink, and even though he'd been gone a year, she still couldn't bring herself to buy the diet kind he'd switched to in his later years. 
+Agnes, a woman unfazed by decades of Barnaby's pronouncements, merely raised an eyebrow. "What is it now, dear?"
 
-She popped the top, the familiar fizz a comforting sound. Pawpaw always said Dr Pepper tasted like summer evenings and fireflies. Back then, Dottie Mae thought it tasted too grown-up, preferring the sickly sweetness of store-brand grape soda. Now, the unique blend of flavors – cherry, licorice, maybe even a hint of  that grape she used to love – brought a wave of bittersweet nostalgia. 
+"This newfangled soda fountain," Barnaby sputtered, jabbing the newspaper with his index finger. "Claims to have 23 flavors! Twenty-three! Utter poppycock, I say. Why, a man can barely discern five flavors in a lifetime, let alone twenty-three!"
 
-Pawpaw had a knack for making the ordinary extraordinary. He'd spin tales of how the 23 flavors in Dr Pepper represented the 23 adventures a person should have in their life. Each sip, he’d say, was a reminder to live life to the fullest. He'd even convinced her it could cure anything from hiccups to heartache. 
+Agnes sighed. Barnaby's disdain for anything new was as predictable as the sunrise. 
 
-Dottie Mae took a long swig, the carbonation biting her tongue. It didn't cure her grief, not exactly, but it did bring a smile to her face. It tasted like Pawpaw, like fireflies, like those endless summer evenings that stretched on forever. 
+Later that day, curiosity gnawing at him like a persistent squirrel, Barnaby found himself standing before the offending soda fountain. A young man with slicked-back hair and a charming smile greeted him.
 
-She imagined him now, sitting beside her on the porch swing, a mischievous twinkle in his eye. "Don't you go wastin' a good Dr Pepper frownin', Dottie Mae," he'd say, his voice raspy with laughter. "Life's too short, even with 23 adventures."
+"Welcome, sir! Care to try a Dr. Pepper? It's got 23 distinct flavors, guaranteed to tantalize your taste buds!"
 
-She took another sip, the bittersweetness comforting on her tongue. He was right, she realized. Life was too short. And maybe, just maybe, she had a few adventures left to experience.  
+Barnaby scoffed. "Twenty-three flavors, you say? Humbug!" But intrigued nonetheless, he relented.
+
+The young man filled a glass with a bubbly, caramel-colored concoction. Barnaby took a tentative sip. His eyes widened. He took another, larger gulp. And another.
+
+A slow smile spread across his face, his mustache twitching. He tasted licorice, cherry, even a hint of... was that amaretto? The flavors danced on his tongue, a delightful mystery he couldn't quite decipher.
+
+He finished the glass in stunned silence. 
+
+"Well, sir?" the young man asked, a twinkle in his eye. 
+
+Barnaby cleared his throat, his previous indignation forgotten. "Young man," he declared, adjusting his hat, "I may have been wrong about the number of flavors in a lifetime. But by Jove, this Dr. Pepper just might prove me wrong about everything else." 
+
+From that day forward, Barnaby Butterfield became Dr. Pepper's most enthusiastic convert, his handlebar mustache perpetually adorned with a telltale fizz. He never did figure out all 23 flavors, but the joy, he discovered, was in the delicious mystery of it all. 
 
 final:
-Dottie Mae clutched her lukewarm Dr Pepper, the condensation forming a sticky ring on the porch swing. A symphony of cicadas played in the muggy summer air. It was her Pawpaw's favorite drink, and even though he'd been gone a year, she still couldn't bring herself to buy the diet kind he'd switched to in his later years. 
+Barnaby Butterfield, a man of discerning taste and handlebar mustache to match, slammed his newspaper on the table, rattling his wife Agnes' teacup. "Preposterous!" he boomed.
+
+Agnes, a woman unfazed by decades of Barnaby's pronouncements, merely raised an eyebrow. "What is it now, dear?"
+
+"This newfangled soda fountain," Barnaby sputtered, jabbing the newspaper with his index finger. "Claims to have 23 flavors! Twenty-three! Utter poppycock, I say. Why, a man can barely discern five flavors in a lifetime, let alone twenty-three!"
 
-She popped the top, the familiar fizz a comforting sound. Pawpaw always said Dr Pepper tasted like summer evenings and fireflies. Back then, Dottie Mae thought it tasted too grown-up, preferring the sickly sweetness of store-brand grape soda. Now, the unique blend of flavors – cherry, licorice, maybe even a hint of  that grape she used to love – brought a wave of bittersweet nostalgia. 
+Agnes sighed. Barnaby's disdain for anything new was as predictable as the sunrise. 
 
-Pawpaw had a knack for making the ordinary extraordinary. He'd spin tales of how the 23 flavors in Dr Pepper represented the 23 adventures a person should have in their life. Each sip, he’d say, was a reminder to live life to the fullest. He'd even convinced her it could cure anything from hiccups to heartache. 
+Later that day, curiosity gnawing at him like a persistent squirrel, Barnaby found himself standing before the offending soda fountain. A young man with slicked-back hair and a charming smile greeted him.
 
-Dottie Mae took a long swig, the carbonation biting her tongue. It didn't cure her grief, not exactly, but it did bring a smile to her face. It tasted like Pawpaw, like fireflies, like those endless summer evenings that stretched on forever. 
+"Welcome, sir! Care to try a Dr. Pepper? It's got 23 distinct flavors, guaranteed to tantalize your taste buds!"
 
-She imagined him now, sitting beside her on the porch swing, a mischievous twinkle in his eye. "Don't you go wastin' a good Dr Pepper frownin', Dottie Mae," he'd say, his voice raspy with laughter. "Life's too short, even with 23 adventures."
+Barnaby scoffed. "Twenty-three flavors, you say? Humbug!" But intrigued nonetheless, he relented.
 
-She took another sip, the bittersweetness comforting on her tongue. He was right, she realized. Life was too short. And maybe, just maybe, she had a few adventures left to experience.  
+The young man filled a glass with a bubbly, caramel-colored concoction. Barnaby took a tentative sip. His eyes widened. He took another, larger gulp. And another.
 
-

Teardown

PASSED test_tracing_async_only 0:00:05.250146

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.000317

Setup

Call

Teardown

PASSED test_tracing_thread_pool 0:00:01.393780

Setup

Call

Teardown

PASSED test_tracing_thread_pool_async 0:00:14.048189

Setup

Call

Teardown

PASSED test_tracing_async_gather 0:00:01.139718

Setup

Call

Teardown

PASSED test_tracing_async_gather_top_level 0:00:01.325910

Setup

Call

Teardown

PASSED test_dynamic 0:00:01.049657

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:00.955351

Setup

Call

Captured stdout call
[]
+A slow smile spread across his face, his mustache twitching. He tasted licorice, cherry, even a hint of... was that amaretto? The flavors danced on his tongue, a delightful mystery he couldn't quite decipher.
+
+He finished the glass in stunned silence. 
+
+"Well, sir?" the young man asked, a twinkle in his eye. 
+
+Barnaby cleared his throat, his previous indignation forgotten. "Young man," he declared, adjusting his hat, "I may have been wrong about the number of flavors in a lifetime. But by Jove, this Dr. Pepper just might prove me wrong about everything else." 
+
+From that day forward, Barnaby Butterfield became Dr. Pepper's most enthusiastic convert, his handlebar mustache perpetually adorned with a telltale fizz. He never did figure out all 23 flavors, but the joy, he discovered, was in the delicious mystery of it all. 
+
+

Teardown

PASSED test_tracing_async_only 0:00:04.823691

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.000351

Setup

Call

Teardown

PASSED test_tracing_thread_pool 0:00:01.394251

Setup

Call

Teardown

PASSED test_tracing_thread_pool_async 0:00:14.024693

Setup

Call

Teardown

PASSED test_tracing_async_gather 0:00:01.441707

Setup

Call

Teardown

PASSED test_tracing_async_gather_top_level 0:00:01.484387

Setup

Call

Teardown

PASSED test_dynamic 0:00:01.525739

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:00.993926

Setup

Call

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

Teardown

PASSED test_dynamic_class_nested_output_no_stream 0:00:00.877010

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.527380

Setup

Call

Captured stdout call
streamed  name=None hair_color=None
+

Teardown

PASSED test_dynamic_class_nested_output_no_stream 0:00:00.772107

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.580021

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}
@@ -155,7 +196,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.630070

Setup

Call

Captured stdout call
[]
+

Teardown

PASSED test_stream_dynamic_class_output 0:00:00.646184

Setup

Call

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

Teardown

PASSED test_dynamic_inputs_list2 0:00:00.933096

Setup

Call

Teardown

PASSED test_dynamic_types_new_enum 0:00:01.227953

Setup

Call

Teardown

PASSED test_dynamic_types_existing_enum 0:00:00.667437

Setup

Call

Teardown

PASSED test_dynamic_literals 0:00:03.292589

Setup

Call

Teardown

PASSED test_dynamic_inputs_list 0:00:00.998444

Setup

Call

Teardown

PASSED test_dynamic_output_map 0:00:00.608324

Setup

Call

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

Teardown

PASSED test_dynamic_output_union 0:00:01.733173

Setup

Call

Captured stdout call
[]
+

Teardown

PASSED test_dynamic_inputs_list2 0:00:01.215553

Setup

Call

Teardown

PASSED test_dynamic_types_new_enum 0:00:01.613053

Setup

Call

Teardown

PASSED test_dynamic_types_existing_enum 0:00:00.541909

Setup

Call

Teardown

PASSED test_dynamic_literals 0:00:00.734552

Setup

Call

Teardown

PASSED test_dynamic_inputs_list 0:00:00.901091

Setup

Call

Teardown

PASSED test_dynamic_output_map 0:00:00.657098

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:01.769073

Setup

Call

Captured stdout call
[]
 final  hair_color='black' attributes={'eye_color': 'blue', 'facial_hair': 'beard'} height={'feet': 6.0, 'inches': None}
 final  {'hair_color': 'black', 'attributes': {'eye_color': 'blue', 'facial_hair': 'beard'}, 'height': {'feet': 6.0, 'inches': None}}
 final  {"hair_color":"black","attributes":{"eye_color":"blue","facial_hair":"beard"},"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:01.424581

Setup

Call

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

Teardown

PASSED test_nested_class_streaming 0:00:05.007773

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}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
 streamed  {'prop1': None, 'prop2': None}
 streamed  {'prop1': None, 'prop2': None}
 streamed  {'prop1': None, 'prop2': None}
@@ -191,80 +251,269 @@
 streamed  {'prop1': None, 'prop2': None}
 streamed  {'prop1': None, 'prop2': None}
 streamed  {'prop1': '', 'prop2': None}
-streamed  {'prop1': 'value', 'prop2': None}
-streamed  {'prop1': 'value1', 'prop2': None}
-streamed  {'prop1': 'value1', 'prop2': None}
-streamed  {'prop1': 'value1', 'prop2': None}
-streamed  {'prop1': 'value1', 'prop2': None}
-streamed  {'prop1': 'value1', 'prop2': None}
-streamed  {'prop1': 'value1', 'prop2': None}
-streamed  {'prop1': 'value1', 'prop2': None}
-streamed  {'prop1': 'value1', 'prop2': None}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': '', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': None, 'inner': None}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': '', 'inner': None}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value', 'inner': None}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': None}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': None}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': None}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': None}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': None}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': None}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': None}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-final  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-

Teardown

PASSED test_dynamic_client_with_openai 0:00:00.426431

Setup

Call

Teardown

PASSED test_dynamic_client_with_vertex_json_str_creds 0:00:01.472761

Setup

Call

Teardown

PASSED test_dynamic_client_with_vertex_json_object_creds 0:00:01.233944

Setup

Call

Teardown

PASSED test_event_log_hook 0:00:01.221894

Setup

Call

Captured stdout call
Event log hook1: 
+streamed  {'prop1': 'hello', 'prop2': None}
+streamed  {'prop1': 'hello', 'prop2': None}
+streamed  {'prop1': 'hello', 'prop2': None}
+streamed  {'prop1': 'hello', 'prop2': None}
+streamed  {'prop1': 'hello', 'prop2': None}
+streamed  {'prop1': 'hello', 'prop2': None}
+streamed  {'prop1': 'hello', 'prop2': None}
+streamed  {'prop1': 'hello', 'prop2': None}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': '', 'prop2': None, 'inner': None}}
+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': None, 'inner': None}}
+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': None, 'inner': None}}
+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': 'ag', 'inner': None}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': None}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': None}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': None}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': None}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': None}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': None}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': None}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': None}}}
+final  {'prop1': 'hello', 'prop2': {'prop1': 'world', 'prop2': 'again', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+

Teardown

PASSED test_dynamic_client_with_openai 0:00:00.760949

Setup

Call

Teardown

PASSED test_dynamic_client_with_vertex_json_str_creds 0:00:01.095419

Setup

Call

Teardown

PASSED test_dynamic_client_with_vertex_json_object_creds 0:00:00.824506

Setup

Call

Teardown

PASSED test_event_log_hook 0:00:01.131149

Setup

Call

Captured stdout call
Event log hook1: 
 Event log event  BamlLogEvent {
     metadata: {
-        event_id: "65de820f-a524-4e75-b641-ad1d7ebedd54",
+        event_id: "78dc8c9b-f55c-437d-a06c-18928848d89e",
         parent_id: None,
-        root_event_id: "65de820f-a524-4e75-b641-ad1d7ebedd54"
+        root_event_id: "78dc8c9b-f55c-437d-a06c-18928848d89e"
     },
     prompt: "[
   {
@@ -278,124 +527,124 @@
 ]",
     raw_output: "["a", "b", "c"]",
     parsed_output: "["a", "b", "c"]",
-    start_time: "2024-12-04T06:33:01.559Z"
+    start_time: "2024-12-13T14:24:20.930Z"
 }
-

Teardown

PASSED test_aws_bedrock 0:00:03.490771

Setup

Call

Captured stdout call
unstreamed 
+

Teardown

PASSED test_aws_bedrock 0:00:03.121428

Setup

Call

Captured stdout call
unstreamed 
 
-In the heart of the ancient forest, there was a peculiar rock that had been passed down through generations of the local tribe. It was said that the rock held a secret, a spark of magic that only revealed itself to those who possessed a pure heart and a curious mind.
+The old geologist, Dr. Maria, had spent her entire career studying the ancient rocks of the Appalachian Mountains. She had seen it all - the twisted granite, the layered sandstone, the glittering quartz. But nothing could have prepared her for what she was about to discover.
 
-The rock was a deep, rich brown, with veins of silver that seemed to shimmer in the sunlight. It was smooth to the touch, as if it had been worn down by the gentle touch of countless hands over the
+As she made her way through the dense forest, her eyes scanning the ground for the perfect specimen, she stumbled upon a peculiar rock. It was unlike any she had ever seen before - a deep, rich blue
 streamed  '\n\n'
-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, Professor'
-streamed  '\n\nThe old geologist, Professor Thompson'
-streamed  '\n\nThe old geologist, Professor Thompson,'
-streamed  '\n\nThe old geologist, Professor Thompson, had'
-streamed  '\n\nThe old geologist, Professor Thompson, had spent'
-streamed  '\n\nThe old geologist, Professor Thompson, had spent his'
-streamed  '\n\nThe old geologist, Professor Thompson, had spent his entire'
-streamed  '\n\nThe old geologist, Professor Thompson, had spent his entire career'
-streamed  '\n\nThe old geologist, Professor Thompson, had spent his entire career studying'
-streamed  '\n\nThe old geologist, Professor Thompson, had spent his entire career studying the'
-streamed  '\n\nThe old geologist, Professor Thompson, had spent his entire career studying the ancient'
-streamed  '\n\nThe old geologist, Professor Thompson, had spent his entire career studying the ancient rocks'
-streamed  '\n\nThe old geologist, Professor Thompson, had spent his entire career studying the ancient rocks of'
-streamed  'The old geologist, Professor Thompson, had spent his entire career studying the ancient rocks of the'
-streamed  'ogist, Professor Thompson, had spent his entire career studying the ancient rocks of the Appalachian'
-streamed  'fessor Thompson, had spent his entire career studying the ancient rocks of the Appalachian Mountains'
-streamed  'essor Thompson, had spent his entire career studying the ancient rocks of the Appalachian Mountains.'
-streamed  'or Thompson, had spent his entire career studying the ancient rocks of the Appalachian Mountains. He'
-streamed  'hompson, had spent his entire career studying the ancient rocks of the Appalachian Mountains. He had'
-streamed  'on, had spent his entire career studying the ancient rocks of the Appalachian Mountains. He had seen'
-streamed  ' had spent his entire career studying the ancient rocks of the Appalachian Mountains. He had seen it'
-streamed  ' spent his entire career studying the ancient rocks of the Appalachian Mountains. He had seen it all'
-streamed  'pent his entire career studying the ancient rocks of the Appalachian Mountains. He had seen it all -'
-streamed  ' his entire career studying the ancient rocks of the Appalachian Mountains. He had seen it all - the'
-streamed  'tire career studying the ancient rocks of the Appalachian Mountains. He had seen it all - the fossil'
-streamed  ' career studying the ancient rocks of the Appalachian Mountains. He had seen it all - the fossilized'
-streamed  'reer studying the ancient rocks of the Appalachian Mountains. He had seen it all - the fossilized tr'
-streamed  'er studying the ancient rocks of the Appalachian Mountains. He had seen it all - the fossilized tril'
-streamed  ' studying the ancient rocks of the Appalachian Mountains. He had seen it all - the fossilized trilob'
-streamed  'dying the ancient rocks of the Appalachian Mountains. He had seen it all - the fossilized trilobites'
-streamed  'ying the ancient rocks of the Appalachian Mountains. He had seen it all - the fossilized trilobites,'
-streamed  ' the ancient rocks of the Appalachian Mountains. He had seen it all - the fossilized trilobites, the'
-streamed  'cient rocks of the Appalachian Mountains. He had seen it all - the fossilized trilobites, the quartz'
-streamed  'ks of the Appalachian Mountains. He had seen it all - the fossilized trilobites, the quartz crystals'
-streamed  's of the Appalachian Mountains. He had seen it all - the fossilized trilobites, the quartz crystals,'
-streamed  ' the Appalachian Mountains. He had seen it all - the fossilized trilobites, the quartz crystals, the'
-streamed  'ppalachian Mountains. He had seen it all - the fossilized trilobites, the quartz crystals, the veins'
-streamed  'lachian Mountains. He had seen it all - the fossilized trilobites, the quartz crystals, the veins of'
-streamed  'an Mountains. He had seen it all - the fossilized trilobites, the quartz crystals, the veins of gold'
-streamed  'n Mountains. He had seen it all - the fossilized trilobites, the quartz crystals, the veins of gold.'
-streamed  'untains. He had seen it all - the fossilized trilobites, the quartz crystals, the veins of gold. But'
-streamed  ' He had seen it all - the fossilized trilobites, the quartz crystals, the veins of gold. But nothing'
-streamed  'had seen it all - the fossilized trilobites, the quartz crystals, the veins of gold. But nothing had'
-streamed  'een it all - the fossilized trilobites, the quartz crystals, the veins of gold. But nothing had ever'
-streamed  '- the fossilized trilobites, the quartz crystals, the veins of gold. But nothing had ever fascinated'
-streamed  'e fossilized trilobites, the quartz crystals, the veins of gold. But nothing had ever fascinated him'
-streamed  'silized trilobites, the quartz crystals, the veins of gold. But nothing had ever fascinated him more'
-streamed  'ed trilobites, the quartz crystals, the veins of gold. But nothing had ever fascinated him more than'
-streamed  'rilobites, the quartz crystals, the veins of gold. But nothing had ever fascinated him more than the'
-streamed  's, the quartz crystals, the veins of gold. But nothing had ever fascinated him more than the strange'
-streamed  ', the quartz crystals, the veins of gold. But nothing had ever fascinated him more than the strange,'
-streamed  'artz crystals, the veins of gold. But nothing had ever fascinated him more than the strange, glowing'
-streamed  'crystals, the veins of gold. But nothing had ever fascinated him more than the strange, glowing rock'
-streamed  'stals, the veins of gold. But nothing had ever fascinated him more than the strange, glowing rock he'
-streamed  's, the veins of gold. But nothing had ever fascinated him more than the strange, glowing rock he had'
-streamed  's of gold. But nothing had ever fascinated him more than the strange, glowing rock he had discovered'
-streamed  'gold. But nothing had ever fascinated him more than the strange, glowing rock he had discovered deep'
-streamed  'd. But nothing had ever fascinated him more than the strange, glowing rock he had discovered deep in'
-streamed  'ut nothing had ever fascinated him more than the strange, glowing rock he had discovered deep in the'
-streamed  'hing had ever fascinated him more than the strange, glowing rock he had discovered deep in the heart'
-streamed  'g had ever fascinated him more than the strange, glowing rock he had discovered deep in the heart of'
-streamed  'd ever fascinated him more than the strange, glowing rock he had discovered deep in the heart of the'
-streamed  'cinated him more than the strange, glowing rock he had discovered deep in the heart of the mountains'
-streamed  'ated him more than the strange, glowing rock he had discovered deep in the heart of the mountains.\n\n'
-streamed  'ed him more than the strange, glowing rock he had discovered deep in the heart of the mountains.\n\nIt'
-streamed  'im more than the strange, glowing rock he had discovered deep in the heart of the mountains.\n\nIt was'
-streamed  ' more than the strange, glowing rock he had discovered deep in the heart of the mountains.\n\nIt was a'
-streamed  'n the strange, glowing rock he had discovered deep in the heart of the mountains.\n\nIt was a peculiar'
-streamed  'strange, glowing rock he had discovered deep in the heart of the mountains.\n\nIt was a peculiar thing'
-streamed  'trange, glowing rock he had discovered deep in the heart of the mountains.\n\nIt was a peculiar thing,'
-streamed  'e, glowing rock he had discovered deep in the heart of the mountains.\n\nIt was a peculiar thing, this'
-streamed  'owing rock he had discovered deep in the heart of the mountains.\n\nIt was a peculiar thing, this rock'
-streamed  'wing rock he had discovered deep in the heart of the mountains.\n\nIt was a peculiar thing, this rock.'
-streamed  'g rock he had discovered deep in the heart of the mountains.\n\nIt was a peculiar thing, this rock. It'
-streamed  'he had discovered deep in the heart of the mountains.\n\nIt was a peculiar thing, this rock. It looked'
-streamed  'd discovered deep in the heart of the mountains.\n\nIt was a peculiar thing, this rock. It looked like'
-streamed  'scovered deep in the heart of the mountains.\n\nIt was a peculiar thing, this rock. It looked like any'
-streamed  'ed deep in the heart of the mountains.\n\nIt was a peculiar thing, this rock. It looked like any other'
-streamed  'in the heart of the mountains.\n\nIt was a peculiar thing, this rock. It looked like any other granite'
-streamed  'n the heart of the mountains.\n\nIt was a peculiar thing, this rock. It looked like any other granite,'
-streamed  'e heart of the mountains.\n\nIt was a peculiar thing, this rock. It looked like any other granite, but'
-streamed  'rt of the mountains.\n\nIt was a peculiar thing, this rock. It looked like any other granite, but when'
-streamed  'mountains.\n\nIt was a peculiar thing, this rock. It looked like any other granite, but when Professor'
-streamed  '.\n\nIt was a peculiar thing, this rock. It looked like any other granite, but when Professor Thompson'
-streamed  ' was a peculiar thing, this rock. It looked like any other granite, but when Professor Thompson held'
-streamed  's a peculiar thing, this rock. It looked like any other granite, but when Professor Thompson held it'
-streamed  ' peculiar thing, this rock. It looked like any other granite, but when Professor Thompson held it up'
-streamed  'culiar thing, this rock. It looked like any other granite, but when Professor Thompson held it up to'
-streamed  'ar thing, this rock. It looked like any other granite, but when Professor Thompson held it up to the'
-streamed  'ng, this rock. It looked like any other granite, but when Professor Thompson held it up to the light'
-streamed  'g, this rock. It looked like any other granite, but when Professor Thompson held it up to the light,'
-streamed  'this rock. It looked like any other granite, but when Professor Thompson held it up to the light, he'
-streamed  'ock. It looked like any other granite, but when Professor Thompson held it up to the light, he could'
-streamed  't looked like any other granite, but when Professor Thompson held it up to the light, he could swear'
-streamed  't looked like any other granite, but when Professor Thompson held it up to the light, he could swear'
-streamed  't looked like any other granite, but when Professor Thompson held it up to the light, he could swear'
-streamed  't looked like any other granite, but when Professor Thompson held it up to the light, he could swear'
+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 peculiar'
+streamed  '\n\nIn the heart of the ancient forest, there was a peculiar rock'
+streamed  '\n\nIn the heart of the ancient forest, there was a peculiar rock formation'
+streamed  '\n\nIn the heart of the ancient forest, there was a peculiar rock formation that'
+streamed  '\n\nIn the heart of the ancient forest, there was a peculiar rock formation that had'
+streamed  '\n\nIn the heart of the ancient forest, there was a peculiar rock formation that had been'
+streamed  '\n\nIn the heart of the ancient forest, there was a peculiar rock formation that had been passed'
+streamed  '\n\nIn the heart of the ancient forest, there was a peculiar rock formation that had been passed down'
+streamed  'e heart of the ancient forest, there was a peculiar rock formation that had been passed down through'
+streamed  'he ancient forest, there was a peculiar rock formation that had been passed down through generations'
+streamed  'ancient forest, there was a peculiar rock formation that had been passed down through generations of'
+streamed  't forest, there was a peculiar rock formation that had been passed down through generations of local'
+streamed  't, there was a peculiar rock formation that had been passed down through generations of local legend'
+streamed  ', there was a peculiar rock formation that had been passed down through generations of local legend.'
+streamed  'here was a peculiar rock formation that had been passed down through generations of local legend. It'
+streamed  ' was a peculiar rock formation that had been passed down through generations of local legend. It was'
+streamed  'a peculiar rock formation that had been passed down through generations of local legend. It was said'
+streamed  'uliar rock formation that had been passed down through generations of local legend. It was said that'
+streamed  'iar rock formation that had been passed down through generations of local legend. It was said that a'
+streamed  'ock formation that had been passed down through generations of local legend. It was said that a bolt'
+streamed  ' formation that had been passed down through generations of local legend. It was said that a bolt of'
+streamed  ' that had been passed down through generations of local legend. It was said that a bolt of lightning'
+streamed  't had been passed down through generations of local legend. It was said that a bolt of lightning had'
+streamed  'een passed down through generations of local legend. It was said that a bolt of lightning had struck'
+streamed  'passed down through generations of local legend. It was said that a bolt of lightning had struck the'
+streamed  'd down through generations of local legend. It was said that a bolt of lightning had struck the rock'
+streamed  'ough generations of local legend. It was said that a bolt of lightning had struck the rock centuries'
+streamed  ' generations of local legend. It was said that a bolt of lightning had struck the rock centuries ago'
+streamed  'generations of local legend. It was said that a bolt of lightning had struck the rock centuries ago,'
+streamed  'rations of local legend. It was said that a bolt of lightning had struck the rock centuries ago, imb'
+streamed  'ons of local legend. It was said that a bolt of lightning had struck the rock centuries ago, imbuing'
+streamed  ' of local legend. It was said that a bolt of lightning had struck the rock centuries ago, imbuing it'
+streamed  'ocal legend. It was said that a bolt of lightning had struck the rock centuries ago, imbuing it with'
+streamed  'al legend. It was said that a bolt of lightning had struck the rock centuries ago, imbuing it with a'
+streamed  'd. It was said that a bolt of lightning had struck the rock centuries ago, imbuing it with a strange'
+streamed  't was said that a bolt of lightning had struck the rock centuries ago, imbuing it with a strange and'
+streamed  'was said that a bolt of lightning had struck the rock centuries ago, imbuing it with a strange and w'
+streamed  'd that a bolt of lightning had struck the rock centuries ago, imbuing it with a strange and wondrous'
+streamed  ' a bolt of lightning had struck the rock centuries ago, imbuing it with a strange and wondrous power'
+streamed  'bolt of lightning had struck the rock centuries ago, imbuing it with a strange and wondrous power.\n\n'
+streamed  't of lightning had struck the rock centuries ago, imbuing it with a strange and wondrous power.\n\nThe'
+streamed  'lightning had struck the rock centuries ago, imbuing it with a strange and wondrous power.\n\nThe rock'
+streamed  'ightning had struck the rock centuries ago, imbuing it with a strange and wondrous power.\n\nThe rock,'
+streamed  'ng had struck the rock centuries ago, imbuing it with a strange and wondrous power.\n\nThe rock, known'
+streamed  'had struck the rock centuries ago, imbuing it with a strange and wondrous power.\n\nThe rock, known as'
+streamed  'd struck the rock centuries ago, imbuing it with a strange and wondrous power.\n\nThe rock, known as "'
+streamed  'truck the rock centuries ago, imbuing it with a strange and wondrous power.\n\nThe rock, known as "The'
+streamed  'the rock centuries ago, imbuing it with a strange and wondrous power.\n\nThe rock, known as "The Heart'
+streamed  'ock centuries ago, imbuing it with a strange and wondrous power.\n\nThe rock, known as "The Heartstone'
+streamed  'k centuries ago, imbuing it with a strange and wondrous power.\n\nThe rock, known as "The Heartstone,"'
+streamed  'nturies ago, imbuing it with a strange and wondrous power.\n\nThe rock, known as "The Heartstone," was'
+streamed  'uries ago, imbuing it with a strange and wondrous power.\n\nThe rock, known as "The Heartstone," was a'
+streamed  ' ago, imbuing it with a strange and wondrous power.\n\nThe rock, known as "The Heartstone," was a deep'
+streamed  'ago, imbuing it with a strange and wondrous power.\n\nThe rock, known as "The Heartstone," was a deep,'
+streamed  'imbuing it with a strange and wondrous power.\n\nThe rock, known as "The Heartstone," was a deep, rich'
+streamed  'g it with a strange and wondrous power.\n\nThe rock, known as "The Heartstone," was a deep, rich brown'
+streamed  'ith a strange and wondrous power.\n\nThe rock, known as "The Heartstone," was a deep, rich brown color'
+streamed  'th a strange and wondrous power.\n\nThe rock, known as "The Heartstone," was a deep, rich brown color,'
+streamed  'strange and wondrous power.\n\nThe rock, known as "The Heartstone," was a deep, rich brown color, with'
+streamed  'e and wondrous power.\n\nThe rock, known as "The Heartstone," was a deep, rich brown color, with veins'
+streamed  'nd wondrous power.\n\nThe rock, known as "The Heartstone," was a deep, rich brown color, with veins of'
+streamed  'ous power.\n\nThe rock, known as "The Heartstone," was a deep, rich brown color, with veins of glitter'
+streamed  ' power.\n\nThe rock, known as "The Heartstone," was a deep, rich brown color, with veins of glittering'
+streamed  '\n\nThe rock, known as "The Heartstone," was a deep, rich brown color, with veins of glittering quartz'
+streamed  ' rock, known as "The Heartstone," was a deep, rich brown color, with veins of glittering quartz that'
+streamed  'known as "The Heartstone," was a deep, rich brown color, with veins of glittering quartz that seemed'
+streamed  'wn as "The Heartstone," was a deep, rich brown color, with veins of glittering quartz that seemed to'
+streamed  '"The Heartstone," was a deep, rich brown color, with veins of glittering quartz that seemed to pulse'
+streamed  'Heartstone," was a deep, rich brown color, with veins of glittering quartz that seemed to pulse with'
+streamed  'rtstone," was a deep, rich brown color, with veins of glittering quartz that seemed to pulse with an'
+streamed  'e," was a deep, rich brown color, with veins of glittering quartz that seemed to pulse with an inner'
+streamed  's a deep, rich brown color, with veins of glittering quartz that seemed to pulse with an inner light'
+streamed  ' a deep, rich brown color, with veins of glittering quartz that seemed to pulse with an inner light.'
+streamed  'deep, rich brown color, with veins of glittering quartz that seemed to pulse with an inner light. It'
+streamed  'rich brown color, with veins of glittering quartz that seemed to pulse with an inner light. It stood'
+streamed  'brown color, with veins of glittering quartz that seemed to pulse with an inner light. It stood tall'
+streamed  'n color, with veins of glittering quartz that seemed to pulse with an inner light. It stood tall and'
+streamed  'r, with veins of glittering quartz that seemed to pulse with an inner light. It stood tall and proud'
+streamed  ', with veins of glittering quartz that seemed to pulse with an inner light. It stood tall and proud,'
+streamed  'with veins of glittering quartz that seemed to pulse with an inner light. It stood tall and proud, a'
+streamed  's of glittering quartz that seemed to pulse with an inner light. It stood tall and proud, a sentinel'
+streamed  'f glittering quartz that seemed to pulse with an inner light. It stood tall and proud, a sentinel of'
+streamed  'ittering quartz that seemed to pulse with an inner light. It stood tall and proud, a sentinel of the'
+streamed  'g quartz that seemed to pulse with an inner light. It stood tall and proud, a sentinel of the forest'
+streamed  'tz that seemed to pulse with an inner light. It stood tall and proud, a sentinel of the forest floor'
+streamed  'z that seemed to pulse with an inner light. It stood tall and proud, a sentinel of the forest floor,'
+streamed  'at seemed to pulse with an inner light. It stood tall and proud, a sentinel of the forest floor, and'
+streamed  'eemed to pulse with an inner light. It stood tall and proud, a sentinel of the forest floor, and was'
+streamed  'eemed to pulse with an inner light. It stood tall and proud, a sentinel of the forest floor, and was'
+streamed  'eemed to pulse with an inner light. It stood tall and proud, a sentinel of the forest floor, and was'
+streamed  'eemed to pulse with an inner light. It stood tall and proud, a sentinel of the forest floor, and was'
 streamed final 
 
-The old geologist, Professor Thompson, had spent his entire career studying the ancient rocks of the Appalachian Mountains. He had seen it all - the fossilized trilobites, the quartz crystals, the veins of gold. But nothing had ever fascinated him more than the strange, glowing rock he had discovered deep in the heart of the mountains.
+In the heart of the ancient forest, there was a peculiar rock formation that had been passed down through generations of local legend. It was said that a bolt of lightning had struck the rock centuries ago, imbuing it with a strange and wondrous power.
 
-It was a peculiar thing, this rock. It looked like any other granite, but when Professor Thompson held it up to the light, he could swear
-

Teardown

PASSED test_aws_bedrock_invalid_region 0:00:00.005549

Setup

Call

Teardown

PASSED test_serialization_exception 0:00:00.437666

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".
+The rock, known as "The Heartstone," was a deep, rich brown color, with veins of glittering quartz that seemed to pulse with an inner light. It stood tall and proud, a sentinel of the forest floor, and was
+

Teardown

PASSED test_aws_bedrock_invalid_region 0:00:00.005544

Setup

Call

Teardown

PASSED test_serialization_exception 0:00:01.364374

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.528396

Setup

Call

Captured stdout call
streamed  nonce=None nonce2=None
+

Teardown

PASSED test_stream_serialization_exception 0:00:00.500441

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
@@ -408,9 +657,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...required field: nonce2, raw_output=Hello there! How can I assist 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...g required field: nonce2, raw_output=Hello there! How can I help you today?, prompt=[chat] system: Say "hello there".
 ) tblen=3>
-

Teardown

PASSED test_stream2_serialization_exception 0:00:01.058700

Setup

Call

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

Teardown

PASSED test_stream2_serialization_exception 0:00:00.413288

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
@@ -425,36 +674,59 @@
 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...required field: nonce3, raw_output=Hello there! How can I assist you today?, prompt=[chat] system: Say "hello there".
 ) tblen=3>
-

Teardown

PASSED test_descriptions 0:00:06.361985

Setup

Call

Teardown

FAILED test_caching 0:00:06.736878

AssertionError: 3.5142571926116943 < 3.2215769290924072. Expected second call to be faster than first by a large margin.
-assert 3.5142571926116943 < 3.2215769290924072

Setup

Call

>   ???
-E   AssertionError: 3.5142571926116943 < 3.2215769290924072. Expected second call to be faster than first by a large margin.
-E   assert 3.5142571926116943 < 3.2215769290924072
+

Teardown

PASSED test_descriptions 0:00:06.557638

Setup

Call

Teardown

FAILED test_caching 0:00:07.004457

AssertionError: 3.624055862426758 < 3.379484176635742. Expected second call to be faster than first by a large margin.
+assert 3.624055862426758 < 3.379484176635742

Setup

Call

@pytest.mark.asyncio
+    async def test_caching():
+        story_idea = f"""
+    In a futuristic world where dreams are a marketable asset and collective experience, an introverted and socially inept teenager named Alex realizes they have a unique and potent skill to not only observe but also alter the dreams of others. Initially excited by this newfound talent, Alex starts discreetly modifying the dreams of peers and relatives, aiding them in conquering fears, boosting self-esteem, or embarking on fantastical journeys. As Alex's abilities expand, so does their sway. They begin marketing exclusive dream experiences on the underground market, designing complex and captivating dreamscapes for affluent clients. However, the boundary between dream and reality starts to fade for those subjected to Alex's creations. Some clients find it difficult to distinguish between their genuine memories and the fabricated ones inserted by Alex's dream manipulation.
+    
+    Challenges emerge when a secretive government organization becomes aware of Alex's distinct talents. They propose Alex utilize their gift for "the greater good," suggesting uses in therapy, criminal reform, and even national defense. Concurrently, a covert resistance group contacts Alex, cautioning them about the risks of dream manipulation and the potential for widespread control and exploitation. Trapped between these conflicting forces, Alex must navigate a tangled web of moral dilemmas. They wrestle with issues of free will, the essence of consciousness, and the duty that comes with having influence over people's minds. As the repercussions of their actions ripple outward, impacting the lives of loved ones and strangers alike, Alex is compelled to face the true nature of their power and decide how—or if—it should be wielded.
+    
+    The narrative investigates themes of identity, the subconscious, the ethics of technology, and the power of creativity. It explores the possible outcomes of a world where our most intimate thoughts and experiences are no longer truly our own, and scrutinizes the fine line between aiding others and manipulating them for personal benefit or a perceived greater good. The story further delves into the societal ramifications of such abilities, questioning the moral limits of altering consciousness and the potential for misuse in a world where dreams can be commercialized. It challenges the reader to contemplate the impact of technology on personal freedom and the ethical duties of those who wield such power.
+    
+    As Alex's journey progresses, they meet various individuals whose lives have been influenced by their dream manipulations, each offering a distinct viewpoint on the ethical issues at hand. From a peer who gains newfound confidence to a wealthy client who becomes dependent on the dreamscapes, the ripple effects of Alex's actions are significant and extensive. The government agency's interest in Alex's abilities raises questions about the potential for state control and surveillance, while the resistance movement underscores the dangers of unchecked power and the necessity of protecting individual freedoms.
+    
+    Ultimately, Alex's story is one of self-discovery and moral reflection, as they must choose whether to use their abilities for personal gain, align with the government's vision of a controlled utopia, or join the resistance in their struggle for freedom and autonomy. The narrative encourages readers to reflect on the nature of reality, the boundaries of human experience, and the ethical implications of a world where dreams are no longer private sanctuaries but shared and manipulated commodities. It also examines the psychological impact on Alex, who must cope with the burden of knowing the intimate fears and desires of others, and the isolation that comes from being unable to share their own dreams without altering them.
+    
+    The story further investigates the technological progress that has made dream manipulation feasible, questioning the role of innovation in society and the potential for both advancement and peril. It considers the societal divide between those who can afford to purchase enhanced dream experiences and those who cannot, highlighting issues of inequality and access. As Alex becomes more ensnared in the web of their own making, they must confront the possibility that their actions could lead to unintended consequences, not just for themselves but for the fabric of society as a whole.
+    
+    In the end, Alex's journey is a cautionary tale about the power of dreams and the responsibilities that come with wielding such influence. It serves as a reminder of the importance of ethical considerations in the face of technological advancement and the need to balance innovation with humanity. The story leaves readers pondering the true cost of a world where dreams are no longer sacred, and the potential for both wonder and danger in the uncharted territories of the mind. But it's also a story about the power of imagination and the potential for change, even in a world where our deepest thoughts are no longer our own. And it's a story about the power of choice, and the importance of fighting for the freedom to dream.
+    
+    In conclusion, this story is a reflection on the power of dreams and the responsibilities that come with wielding such influence. It serves as a reminder of the importance of ethical considerations in the face of technological advancement and the need to balance innovation with humanity. The story leaves readers pondering the true cost of a world where dreams are no longer sacred, and the potential for both wonder and danger in the uncharted territories of the mind. But it's also a story about the power of imagination and the potential for change, even in a world where our deepest thoughts are no longer our own. And it's a story about the power of choice, and the importance of fighting for the freedom to dream.
+    """
+        rand = uuid.uuid4().hex
+        story_idea = rand + story_idea
+    
+        start = time.time()
+        _ = await b.TestCaching(story_idea, "1. try to be funny")
+        duration = time.time() - start
+    
+        start = time.time()
+        _ = await b.TestCaching(story_idea, "1. try to be funny")
+        duration2 = time.time() - start
+    
+        print("Duration no caching: ", duration)
+        print("Duration with caching: ", duration2)
+    
+>       assert (
+            duration2 < duration
+        ), f"{duration2} < {duration}. Expected second call to be faster than first by a large margin."
+E       AssertionError: 3.624055862426758 < 3.379484176635742. Expected second call to be faster than first by a large margin.
+E       assert 3.624055862426758 < 3.379484176635742
 
-tests/test_functions.py:1271: AssertionError
Captured stdout call
Duration no caching:  3.2215769290924072
-Duration with caching:  3.5142571926116943
-

Teardown

PASSED test_arg_exceptions 0:00:00.796212

Setup

Call

Captured stderr call
[2024-12-04T06:33:21Z ERROR baml_runtime::tracing]   Error: input: Expected type String, got `Number(111)`
+tests/test_functions.py:1271: AssertionError
Captured stdout call
Duration no caching:  3.379484176635742
+Duration with caching:  3.624055862426758
+

Teardown

PASSED test_arg_exceptions 0:00:01.166600

Setup

Call

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

Teardown

PASSED test_map_as_param 0:00:00.001158

Setup

Call

Captured stderr call
[2024-12-04T06:33:21Z ERROR baml_runtime::tracing]   Error: myMap: a: Expected map, got `String("b")`
+

Teardown

PASSED test_map_as_param 0:00:00.001121

Setup

Call

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

Teardown

PASSED test_baml_validation_error_format 0:00:00.384686

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.476185

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 help you today?, prompt=[chat] system: Say "hello there".
+  - <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.523697

Setup

Call

Teardown

PASSED test_no_stream_object_with_numbers 0:00:00.483117

Setup

Call

Teardown

PASSED test_no_stream_compound_object 0:00:06.729537

Setup

Call

Teardown

PASSED test_no_stream_compound_object_with_yapping 0:00:05.083854

Setup

Call

Teardown

PASSED test_differing_unions 0:00:02.546719

Setup

Call

Teardown

PASSED test_return_failing_assert 0:00:00.302599

Setup

Call

Teardown

PASSED test_parameter_failing_assert 0:00:00.001364

Setup

Call

Captured stderr call
[2024-12-04T06:33:37Z ERROR baml_runtime::tracing]   Error: inp: Failed assert: small_int
+

Teardown

PASSED test_no_stream_big_integer 0:00:00.625432

Setup

Call

Teardown

PASSED test_no_stream_object_with_numbers 0:00:00.461699

Setup

Call

Teardown

PASSED test_no_stream_compound_object 0:00:04.063495

Setup

Call

Teardown

PASSED test_no_stream_compound_object_with_yapping 0:00:16.651412

Setup

Call

Teardown

PASSED test_differing_unions 0:00:00.809205

Setup

Call

Teardown

PASSED test_return_failing_assert 0:00:00.351492

Setup

Call

Teardown

PASSED test_parameter_failing_assert 0:00:00.001113

Setup

Call

Captured stderr call
[2024-12-13T14:25:05Z ERROR baml_runtime::tracing]   Error: inp: Failed assert: small_int
     
-

Teardown

PASSED test_failing_assert_can_stream 0:00:02.397616

Setup

Call

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

Teardown

PASSED test_failing_assert_can_stream 0:00:03.925711

Setup

Call

Captured stdout call
None
 None
 None
 None
@@ -1080,9 +1352,9 @@
 None
 None
 None
-

Teardown

PASSED test_simple_recursive_type 0:00:02.784238

Setup

Call

Teardown

PASSED test_mutually_recursive_type 0:00:02.297518

Setup

Call

Teardown

PASSED test_block_constraints 0:00:00.800160

Setup

Call

Teardown

PASSED test_nested_block_constraints 0:00:00.603441

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.001755

Setup

Call

Captured stderr call
[2024-12-04T06:33:46Z ERROR baml_runtime::tracing]   Error: inp: Failed assert: hi
+

Teardown

PASSED test_simple_recursive_type 0:00:02.897785

Setup

Call

Teardown

PASSED test_mutually_recursive_type 0:00:02.089253

Setup

Call

Teardown

PASSED test_block_constraints 0:00:00.576212

Setup

Call

Teardown

PASSED test_nested_block_constraints 0:00:00.518378

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.001701

Setup

Call

Captured stderr call
[2024-12-13T14:25:15Z ERROR baml_runtime::tracing]   Error: inp: Failed assert: hi
     
-[2024-12-04T06:33:46Z ERROR baml_runtime::tracing]   Error: inp: Failed assert: hi
+[2024-12-13T14:25:15Z ERROR baml_runtime::tracing]   Error: inp: Failed assert: hi
     
-

Teardown

tests/test_pydantic.py 3 0:00:00.003358

PASSED test_model_validate_success 0:00:00.001464

Setup

Call

Teardown

PASSED test_model_validate_failure 0:00:00.000840

Setup

Call

Teardown

PASSED test_model_dump 0:00:00.001054

Setup

Call

Teardown

\ No newline at end of file +

Teardown

tests/test_pydantic.py 3 0:00:00.001558

PASSED test_model_validate_success 0:00:00.000497

Setup

Call

Teardown

PASSED test_model_validate_failure 0:00:00.000529

Setup

Call

Teardown

PASSED test_model_dump 0:00:00.000532

Setup

Call

Teardown

tests/test_python.py 2 0:00:00.005403

PASSED test_inspect 0:00:00.005053

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.000351

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 d3d1f5a73..993eeb0c1 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.1\"\n}\n\ngenerator lang_typescript {\n output_type typescript\n output_dir \"../typescript\"\n version \"0.70.1\"\n}\n\ngenerator lang_ruby {\n output_type ruby/sorbet\n output_dir \"../ruby\"\n version \"0.70.1\"\n}\n\n// generator openapi {\n// output_type rest/openapi\n// output_dir \"../openapi\"\n// version \"0.70.1\"\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.2\"\n}\n\ngenerator lang_typescript {\n output_type typescript\n output_dir \"../typescript\"\n version \"0.70.2\"\n}\n\ngenerator lang_ruby {\n output_type ruby/sorbet\n output_dir \"../ruby\"\n version \"0.70.2\"\n}\n\n// generator openapi {\n// output_type rest/openapi\n// output_dir \"../openapi\"\n// version \"0.70.2\"\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 8d011450c..2139e8c6f 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.1\"\n}\n\ngenerator lang_typescript {\n output_type typescript\n output_dir \"../typescript\"\n version \"0.70.1\"\n}\n\ngenerator lang_ruby {\n output_type ruby/sorbet\n output_dir \"../ruby\"\n version \"0.70.1\"\n}\n\n// generator openapi {\n// output_type rest/openapi\n// output_dir \"../openapi\"\n// version \"0.70.1\"\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.2\"\n}\n\ngenerator lang_typescript {\n output_type typescript\n output_dir \"../typescript\"\n version \"0.70.2\"\n}\n\ngenerator lang_ruby {\n output_type ruby/sorbet\n output_dir \"../ruby\"\n version \"0.70.2\"\n}\n\n// generator openapi {\n// output_type rest/openapi\n// output_dir \"../openapi\"\n// version \"0.70.2\"\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 b15e66c77..d1d5fad24 100644 --- a/integ-tests/typescript/test-report.html +++ b/integ-tests/typescript/test-report.html @@ -257,65 +257,24 @@ font-size: 1rem; padding: 0 0.5rem; } -

Test Report

Started: 2024-12-03 22:28:38
Suites (1)
0 passed
1 failed
0 pending
Tests (67)
65 passed
2 failed
0 pending
Integ tests > should work for all inputs
single bool
passed
0.783s
Integ tests > should work for all inputs
single string list
passed
0.427s
Integ tests > should work for all inputs
return literal union
passed
0.379s
Integ tests > should work for all inputs
single class
passed
0.455s
Integ tests > should work for all inputs
multiple classes
passed
0.354s
Integ tests > should work for all inputs
single enum list
passed
0.382s
Integ tests > should work for all inputs
single float
passed
0.424s
Integ tests > should work for all inputs
single int
passed
0.455s
Integ tests > should work for all inputs
single literal int
passed
0.3s
Integ tests > should work for all inputs
single literal bool
passed
0.601s
Integ tests > should work for all inputs
single literal string
passed
0.316s
Integ tests > should work for all inputs
single class with literal prop
passed
0.524s
Integ tests > should work for all inputs
single class with literal union prop
passed
3.24s
Integ tests > should work for all inputs
single optional string
passed
0.43s
Integ tests > should work for all inputs
single map string to string
passed
0.524s
Integ tests > should work for all inputs
single map string to class
passed
0.558s
Integ tests > should work for all inputs
single map string to map
passed
0.521s
Integ tests > should work for all inputs
enum key in map
passed
0.805s
Integ tests > should work for all inputs
literal string union key in map
passed
0.735s
Integ tests > should work for all inputs
single literal string key in map
passed
0.546s
Integ tests
should work for all outputs
passed
4.698s
Integ tests
works with retries1
passed
1.184s
Integ tests
works with retries2
passed
2.143s
Integ tests
works with fallbacks
passed
1.991s
Integ tests
should work with image from url
passed
1.839s
Integ tests
should work with image from base 64
passed
1.328s
Integ tests
should work with audio base 64
passed
1.158s
Integ tests
should work with audio from url
passed
1.171s
Integ tests
should support streaming in OpenAI
passed
3.161s
Integ tests
should support streaming in Gemini
passed
7.739s
Integ tests
should support AWS
passed
1.883s
Integ tests
should support streaming in AWS
passed
1.524s
Integ tests
should allow overriding the region
passed
0.08s
Integ tests
should support OpenAI shorthand
passed
9.47s
Integ tests
should support OpenAI shorthand streaming
passed
7.945s
Integ tests
should support anthropic shorthand
passed
3.566s
Integ tests
should support anthropic shorthand streaming
passed
3.256s
Integ tests
should support streaming without iterating
passed
2.014s
Integ tests
should support streaming in Claude
passed
1.12s
Integ tests
should support vertex
passed
11.387s
Integ tests
supports tracing sync
passed
0.01s
Integ tests
supports tracing async
passed
2.306s
Integ tests
should work with dynamic types single
passed
1.641s
Integ tests
should work with dynamic types enum
passed
0.848s
Integ tests
should work with dynamic literals
passed
0.961s
Integ tests
should work with dynamic types class
passed
1.049s
Integ tests
should work with dynamic inputs class
passed
0.597s
Integ tests
should work with dynamic inputs list
passed
0.995s
Integ tests
should work with dynamic output map
passed
0.759s
Integ tests
should work with dynamic output union
passed
1.62s
Integ tests
should work with nested classes
failed
10.39s
Error: expect(received).toEqual(expected) // deep equality
+

Test Report

Started: 2024-12-13 06:19:24
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.519s
Integ tests > should work for all inputs
single string list
passed
0.413s
Integ tests > should work for all inputs
return literal union
passed
0.491s
Integ tests > should work for all inputs
single class
passed
0.667s
Integ tests > should work for all inputs
multiple classes
passed
0.525s
Integ tests > should work for all inputs
single enum list
passed
0.325s
Integ tests > should work for all inputs
single float
passed
0.364s
Integ tests > should work for all inputs
single int
passed
0.358s
Integ tests > should work for all inputs
single literal int
passed
0.318s
Integ tests > should work for all inputs
single literal bool
passed
0.42s
Integ tests > should work for all inputs
single literal string
passed
0.36s
Integ tests > should work for all inputs
single class with literal prop
passed
0.76s
Integ tests > should work for all inputs
single class with literal union prop
passed
0.592s
Integ tests > should work for all inputs
single optional string
passed
0.273s
Integ tests > should work for all inputs
single map string to string
passed
0.466s
Integ tests > should work for all inputs
single map string to class
passed
0.653s
Integ tests > should work for all inputs
single map string to map
passed
0.542s
Integ tests > should work for all inputs
enum key in map
passed
3.123s
Integ tests > should work for all inputs
literal string union key in map
passed
0.882s
Integ tests > should work for all inputs
single literal string key in map
passed
0.431s
Integ tests
should work for all outputs
passed
5.12s
Integ tests
works with retries1
passed
1.027s
Integ tests
works with retries2
passed
2.329s
Integ tests
works with fallbacks
passed
1.671s
Integ tests
should work with image from url
passed
1.523s
Integ tests
should work with image from base 64
passed
1.843s
Integ tests
should work with audio base 64
passed
1.37s
Integ tests
should work with audio from url
passed
1.114s
Integ tests
should support streaming in OpenAI
passed
2.027s
Integ tests
should support streaming in Gemini
passed
9.788s
Integ tests
should support AWS
passed
1.777s
Integ tests
should support streaming in AWS
passed
1.416s
Integ tests
should allow overriding the region
passed
0.046s
Integ tests
should support OpenAI shorthand
passed
17.821s
Integ tests
should support OpenAI shorthand streaming
passed
9.413s
Integ tests
should support anthropic shorthand
passed
3.275s
Integ tests
should support anthropic shorthand streaming
passed
3.013s
Integ tests
should support streaming without iterating
passed
3.361s
Integ tests
should support streaming in Claude
passed
1.412s
Integ tests
should support vertex
passed
10.957s
Integ tests
supports tracing sync
passed
0.009s
Integ tests
supports tracing async
passed
3.22s
Integ tests
should work with dynamic types single
passed
0.985s
Integ tests
should work with dynamic types enum
passed
1.212s
Integ tests
should work with dynamic literals
passed
1.211s
Integ tests
should work with dynamic types class
passed
1.75s
Integ tests
should work with dynamic inputs class
passed
0.524s
Integ tests
should work with dynamic inputs list
passed
0.597s
Integ tests
should work with dynamic output map
passed
1.157s
Integ tests
should work with dynamic output union
passed
1.951s
Integ tests
should work with nested classes
failed
12.333s
Error: expect(received).toEqual(expected) // deep equality
 
 - Expected  - 1
 + Received  + 1
 
   Object {
-    "prop1": "hello",
+    "prop1": "Hello",
     "prop2": Object {
       "inner": Object {
         "prop2": 42,
--       "prop3": 3.14,
+-       "prop3": 3.14159,
 +       "prop3": null,
       },
-      "prop1": "world",
-      "prop2": "again",
+      "prop1": "World",
+      "prop2": "JSON is coolest thing ever",
     },
   }
-    at Object.toEqual (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:604:25)
Integ tests
should work with dynamic client
passed
0.377s
Integ tests
should work with 'onLogEvent'
passed
1.83s
Integ tests
should work with a sync client
passed
0.718s
Integ tests
should raise an error when appropriate
passed
0.734s
Integ tests
should raise a BAMLValidationError
passed
0.496s
Integ tests
should reset environment variables correctly
passed
1.114s
Integ tests
should use aliases when serializing input objects - classes
passed
0.801s
Integ tests
should use aliases when serializing, but still have original keys in jinja
passed
0.944s
Integ tests
should use aliases when serializing input objects - enums
passed
0.531s
Integ tests
should use aliases when serializing input objects - lists
passed
0.518s
Integ tests
constraints: should handle checks in return types
passed
0.703s
Integ tests
constraints: should handle checks in returned unions
passed
0.614s
Integ tests
constraints: should handle block-level checks
passed
0.512s
Integ tests
constraints: should handle nested-block-level checks
passed
0.583s
Integ tests
simple recursive type
passed
3.062s
Integ tests
mutually recursive type
failed
1.974s
Error: expect(received).toEqual(expected) // deep equality
-
-- Expected  - 6
-+ Received  + 5
-
-@@ -4,30 +4,29 @@
-        Object {
-          "children": Object {
-            "trees": Array [
-              Object {
-                "children": Object {
--                 "trees": Array [
-+                 "trees": Array [],
-+               },
-+               "data": 1,
-+             },
-              Object {
-                "children": Object {
-                  "trees": Array [],
-                },
-                "data": 2,
-              },
-            ],
-          },
--               "data": 1,
-+         "data": 3,
-        },
-        Object {
-          "children": Object {
-            "trees": Array [],
-          },
-          "data": 4,
--             },
--           ],
--         },
--         "data": 3,
-        },
-        Object {
-          "children": Object {
-            "trees": Array [
-              Object {
-    at Object.toEqual (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:838:17)
Console Log
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:48:15)
+    at Object.toEqual (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:604:25)
Integ tests
should work with dynamic client
passed
0.404s
Integ tests
should work with 'onLogEvent'
passed
1.754s
Integ tests
should work with a sync client
passed
0.546s
Integ tests
should raise an error when appropriate
passed
1.02s
Integ tests
should raise a BAMLValidationError
passed
0.447s
Integ tests
should reset environment variables correctly
passed
1.274s
Integ tests
should use aliases when serializing input objects - classes
passed
1.22s
Integ tests
should use aliases when serializing, but still have original keys in jinja
passed
0.752s
Integ tests
should use aliases when serializing input objects - enums
passed
0.511s
Integ tests
should use aliases when serializing input objects - lists
passed
0.461s
Integ tests
constraints: should handle checks in return types
passed
0.894s
Integ tests
constraints: should handle checks in returned unions
passed
0.713s
Integ tests
constraints: should handle block-level checks
passed
0.569s
Integ tests
constraints: should handle nested-block-level checks
passed
0.652s
Integ tests
simple recursive type
passed
2.685s
Integ tests
mutually recursive type
passed
1.828s
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)
@@ -330,11 +289,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: 1733293736, tv_nsec: 692524000 }, latency: 260.464458ms, 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: 1734099582, tv_nsec: 912302000 }, latency: 167.358ms, 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: 1733293738, tv_nsec: 928829000 }, latency: 188.79025ms, 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: 1734099585, tv_nsec: 226179000 }, latency: 206.093041ms, 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'
@@ -584,6 +543,9 @@
     at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
     at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
     at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:407:17)
samDummyNested nested1
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:383:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
     at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
     at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
     at async Promise.all (index 1)
@@ -668,7 +630,7 @@
     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)
Property: attributes
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:540:13)
final  {
   hair_color: 'black',
-  attributes: { height: '6 feet', eye_color: 'blue', facial_hair: 'beard' }
+  attributes: { eye_color: 'blue', facial_hair: 'beard' }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:564:13)
     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>)
@@ -729,718 +691,1747 @@
     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)
Property: height
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:574:13)
final  {
   hair_color: 'black',
-  attributes: { eye_color: 'blue', facial_hair: 'beard' },
+  attributes: { eye_color: 'blue', facial_hair: 'beard', age: '30' },
   height: { feet: 6, inches: null }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:585:13)
final  {
   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: '', 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: 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: '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: 'JSON', 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: 'JSON is', 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: 'JSON is cool', 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 }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'JSON is coolest', 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 }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'JSON is coolest thing', 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 }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'JSON is coolest thing ever', 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 }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'JSON is coolest thing ever', 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 }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'JSON is coolest thing ever', 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 }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'JSON is coolest thing ever', inner: null }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:15)
msg {
-  prop1: 'hello',
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'JSON is coolest thing ever', 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: 'JSON is coolest thing ever', 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: 'JSON is coolest thing ever', 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',
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
     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: 'hello',
+  prop1: 'Hello',
   prop2: {
-    prop1: 'world',
-    prop2: 'again',
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
     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: 'hello',
+  prop1: 'Hello',
   prop2: {
-    prop1: 'world',
-    prop2: 'again',
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
     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: 'hello',
+  prop1: 'Hello',
   prop2: {
-    prop1: 'world',
-    prop2: 'again',
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
     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: 'hello',
+  prop1: 'Hello',
   prop2: {
-    prop1: 'world',
-    prop2: 'again',
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
     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: 'hello',
+  prop1: 'Hello',
   prop2: {
-    prop1: 'world',
-    prop2: 'again',
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
     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: 'hello',
+  prop1: 'Hello',
   prop2: {
-    prop1: 'world',
-    prop2: 'again',
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
     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: 'hello',
+  prop1: 'Hello',
   prop2: {
-    prop1: 'world',
-    prop2: 'again',
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
     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: 'hello',
+  prop1: 'Hello',
   prop2: {
-    prop1: 'world',
-    prop2: 'again',
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
     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: 'hello',
+  prop1: 'Hello',
   prop2: {
-    prop1: 'world',
-    prop2: 'again',
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
     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: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    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: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    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: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    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: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    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: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    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: 'hello',
+  prop1: 'Hello',
   prop2: {
-    prop1: 'world',
-    prop2: 'again',
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
     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: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    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: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    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: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    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: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    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: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    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: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    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: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    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: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    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: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    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: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    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: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    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: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    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: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    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: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    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: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    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: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    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: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    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: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    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: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    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: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    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: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    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: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    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: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    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: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    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: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    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: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    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: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    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: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    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: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    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: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    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: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    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: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    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: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    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: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: 3.14 } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    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: 'hello',
-  prop2: { prop1: 'world', prop2: 'again', inner: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    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: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    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: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    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: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    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: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    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: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    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: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    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: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    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: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    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: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    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: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
 }
    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: { prop2: 42, prop3: null } }
+  prop1: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    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: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    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: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    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: 'JSON is coolest thing ever',
+    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: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    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: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    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: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    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: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    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: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    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: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    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: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    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: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    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: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    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: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    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: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    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: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    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: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    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: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    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: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: 3.14159 }
+  }
+}
    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: 'JSON is coolest thing ever',
+    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: 'Hello',
+  prop2: {
+    prop1: 'World',
+    prop2: 'JSON is coolest thing ever',
+    inner: { prop2: 42, prop3: null }
+  }
 }
    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: '3ba42dd3-7328-4270-b476-0d52a0c451b9',
-    rootEventId: '3ba42dd3-7328-4270-b476-0d52a0c451b9'
+    eventId: '698b0f9e-abd8-427b-b30f-7110633ad6cf',
+    rootEventId: '698b0f9e-abd8-427b-b30f-7110633ad6cf'
   },
   prompt: '[\n' +
     '  {\n' +
@@ -1454,12 +2445,12 @@
     ']',
   rawOutput: '["a", "b", "c"]',
   parsedOutput: '["a", "b", "c"]',
-  startTime: '2024-12-04T06:30:21.857Z'
+  startTime: '2024-12-13T14:21:23.051Z'
 }
    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: '85f3901f-ce3e-4eda-bf67-1e6b1164a424',
-    rootEventId: '85f3901f-ce3e-4eda-bf67-1e6b1164a424'
+    eventId: '31cf7c7e-0dac-429d-ad4c-b8bd2e12b83b',
+    rootEventId: '31cf7c7e-0dac-429d-ad4c-b8bd2e12b83b'
   },
   prompt: '[\n' +
     '  {\n' +
@@ -1473,8 +2464,8 @@
     ']',
   rawOutput: '["d", "e", "f"]',
   parsedOutput: '["d", "e", "f"]',
-  startTime: '2024-12-04T06:30:22.354Z'
-}
    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: 1733293824, tv_nsec: 6034000 }, latency: 139.540125ms, 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-13T14:21:23.475Z'
+}
    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: 1734099685, tv_nsec: 155253000 }, latency: 137.060167ms, 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'
diff --git a/tools/versions/engine.cfg b/tools/versions/engine.cfg
index 229df7b0d..b885fafbf 100644
--- a/tools/versions/engine.cfg
+++ b/tools/versions/engine.cfg
@@ -1,5 +1,5 @@
 [bumpversion]
-current_version = 0.70.1
+current_version = 0.70.2
 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 bac0af901..48e067ef0 100644
--- a/tools/versions/integ-tests.cfg
+++ b/tools/versions/integ-tests.cfg
@@ -1,5 +1,5 @@
 [bumpversion]
-current_version = 0.70.1
+current_version = 0.70.2
 commit = False
 tag = False
 parse = ^(?P\d+)\.(?P\d+).(?P\d+)$
diff --git a/tools/versions/python.cfg b/tools/versions/python.cfg
index 2da5d49b6..060dbfb24 100644
--- a/tools/versions/python.cfg
+++ b/tools/versions/python.cfg
@@ -1,5 +1,5 @@
 [bumpversion]
-current_version = 0.70.1
+current_version = 0.70.2
 commit = False
 tag = False
 parse = ^(?P\d+)\.(?P\d+).(?P\d+)$
diff --git a/tools/versions/ruby.cfg b/tools/versions/ruby.cfg
index 026c85ce6..236e2ce41 100644
--- a/tools/versions/ruby.cfg
+++ b/tools/versions/ruby.cfg
@@ -1,5 +1,5 @@
 [bumpversion]
-current_version = 0.70.1
+current_version = 0.70.2
 commit = False
 tag = False
 parse = ^(?P\d+)\.(?P\d+).(?P\d+)$
diff --git a/tools/versions/typescript.cfg b/tools/versions/typescript.cfg
index af21949a8..358d57e8a 100644
--- a/tools/versions/typescript.cfg
+++ b/tools/versions/typescript.cfg
@@ -1,5 +1,5 @@
 [bumpversion]
-current_version = 0.70.1
+current_version = 0.70.2
 commit = False
 tag = False
 parse = ^(?P\d+)\.(?P\d+).(?P\d+)$
diff --git a/tools/versions/vscode.cfg b/tools/versions/vscode.cfg
index 083289496..5b6257586 100644
--- a/tools/versions/vscode.cfg
+++ b/tools/versions/vscode.cfg
@@ -1,5 +1,5 @@
 [bumpversion]
-current_version = 0.70.1
+current_version = 0.70.2
 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 04057c9fa..08cd8c3ec 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.1",
+  "version": "0.70.2",
   "publisher": "Boundary",
   "repository": "https://github.com/BoundaryML/baml",
   "homepage": "https://www.boundaryml.com",