diff --git a/CHANGELOG.md b/CHANGELOG.md index 3cd2c8529..345053204 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,9 +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.54.2](https://github.com/boundaryml/baml/compare/0.54.1..0.54.2) - 2024-09-05 + +### Features +- Add a setting to disable restarting TS server in VSCode (#920) - ([628f236](https://github.com/boundaryml/baml/commit/628f2360c415fa8a7b0cd90d7249733ff06acaa9)) - aaronvg +- Add prompt prefix for map types in ctx.output_format and add more type validation for map params (#919) - ([4d304c5](https://github.com/boundaryml/baml/commit/4d304c583b9188c1963a34e2a153baaf003e36ac)) - hellovai + +### Bug fixes +- Fix glibC issues for python linux-x86_64 (#922) - ([9161bec](https://github.com/boundaryml/baml/commit/9161becccf626f8d13a15626481720f29e0f992c)) - Samuel Lijin + + +### Documentation +- Add nextjs hooks (#921) - ([fe14f5a](https://github.com/boundaryml/baml/commit/fe14f5a4ef95c9ccda916ff80ce852d3855554a3)) - aaronvg + + ## [0.54.1](https://github.com/boundaryml/baml/compare/0.54.0..0.54.1) - 2024-09-03 -## BREAKING CHANGE +### BREAKING CHANGE - Fix escape characters in quoted strings (#905) - ([9ba6eb8](https://github.com/boundaryml/baml/commit/9ba6eb834e0145f4c57e582b63730d3d0ac9b2e9)) - hellovai diff --git a/engine/Cargo.lock b/engine/Cargo.lock index 89d8cfa11..be9743817 100644 --- a/engine/Cargo.lock +++ b/engine/Cargo.lock @@ -687,7 +687,7 @@ dependencies = [ [[package]] name = "baml" -version = "0.54.1" +version = "0.54.2" dependencies = [ "anyhow", "baml-lib", @@ -728,7 +728,7 @@ dependencies = [ [[package]] name = "baml-fmt" -version = "0.54.1" +version = "0.54.2" dependencies = [ "anyhow", "base64 0.22.1", @@ -749,7 +749,7 @@ dependencies = [ [[package]] name = "baml-lib" -version = "0.54.1" +version = "0.54.2" dependencies = [ "base64 0.13.1", "dissimilar", @@ -787,7 +787,7 @@ dependencies = [ [[package]] name = "baml-runtime" -version = "0.54.1" +version = "0.54.2" dependencies = [ "ambassador", "anyhow", @@ -868,7 +868,7 @@ dependencies = [ [[package]] name = "baml-schema-build" -version = "0.54.1" +version = "0.54.2" dependencies = [ "anyhow", "baml-runtime", @@ -903,7 +903,7 @@ dependencies = [ [[package]] name = "baml-types" -version = "0.54.1" +version = "0.54.2" dependencies = [ "anyhow", "indexmap 2.2.6", @@ -2302,7 +2302,7 @@ dependencies = [ [[package]] name = "internal-baml-codegen" -version = "0.54.1" +version = "0.54.2" dependencies = [ "anyhow", "askama", @@ -2325,7 +2325,7 @@ dependencies = [ [[package]] name = "internal-baml-core" -version = "0.54.1" +version = "0.54.2" dependencies = [ "anyhow", "baml-types", @@ -2359,7 +2359,7 @@ dependencies = [ [[package]] name = "internal-baml-diagnostics" -version = "0.54.1" +version = "0.54.2" dependencies = [ "anyhow", "colored", @@ -2372,7 +2372,7 @@ dependencies = [ [[package]] name = "internal-baml-jinja" -version = "0.54.1" +version = "0.54.2" dependencies = [ "anyhow", "askama", @@ -2390,7 +2390,7 @@ dependencies = [ [[package]] name = "internal-baml-parser-database" -version = "0.54.1" +version = "0.54.2" dependencies = [ "anyhow", "baml-types", @@ -2413,7 +2413,7 @@ dependencies = [ [[package]] name = "internal-baml-prompt-parser" -version = "0.54.1" +version = "0.54.2" dependencies = [ "internal-baml-diagnostics", "internal-baml-schema-ast", @@ -2425,7 +2425,7 @@ dependencies = [ [[package]] name = "internal-baml-schema-ast" -version = "0.54.1" +version = "0.54.2" dependencies = [ "baml-types", "either", @@ -2502,7 +2502,7 @@ checksum = "9dbbfed4e59ba9750e15ba154fdfd9329cee16ff3df539c2666b70f58cc32105" [[package]] name = "jsonish" -version = "0.54.1" +version = "0.54.2" dependencies = [ "anyhow", "assert-json-diff", diff --git a/engine/Cargo.toml b/engine/Cargo.toml index 1a79ca1fd..a0583dc54 100644 --- a/engine/Cargo.toml +++ b/engine/Cargo.toml @@ -62,7 +62,7 @@ internal-baml-jinja = { path = "baml-lib/jinja" } internal-baml-schema-ast = { path = "baml-lib/schema-ast" } [workspace.package] -version = "0.54.1" +version = "0.54.2" authors = ["Boundary "] description = "BAML Toolchain" diff --git a/engine/language_client_python/pyproject.toml b/engine/language_client_python/pyproject.toml index 9e1c9446b..d7a5dee56 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.54.1" +version = "0.54.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 42b608145..0757e7d70 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.54.1" + spec.version = "0.54.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 86fd82d5e..736967c7f 100644 --- a/engine/language_client_typescript/package.json +++ b/engine/language_client_typescript/package.json @@ -1,6 +1,6 @@ { "name": "@boundaryml/baml", - "version": "0.54.1", + "version": "0.54.2", "description": "BAML typescript bindings (package.json)", "repository": { "type": "git", diff --git a/integ-tests/baml_src/main.baml b/integ-tests/baml_src/main.baml index 62c5315aa..a6ef96f1d 100644 --- a/integ-tests/baml_src/main.baml +++ b/integ-tests/baml_src/main.baml @@ -1,17 +1,17 @@ generator lang_python { output_type python/pydantic output_dir "../python" - version "0.54.1" + version "0.54.2" } generator lang_typescript { output_type typescript output_dir "../typescript" - version "0.54.1" + version "0.54.2" } generator lang_ruby { output_type ruby/sorbet output_dir "../ruby" - version "0.54.1" + version "0.54.2" } diff --git a/integ-tests/python/baml_client/inlinedbaml.py b/integ-tests/python/baml_client/inlinedbaml.py index 3ed51ebf2..9e6761cbe 100644 --- a/integ-tests/python/baml_client/inlinedbaml.py +++ b/integ-tests/python/baml_client/inlinedbaml.py @@ -24,7 +24,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}\n\nfunction ExtractReceiptInfo(email: string) -> 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 AwsBedrock\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}", - "main.baml": "generator lang_python {\n output_type python/pydantic\n output_dir \"../python\"\n version \"0.54.1\"\n}\n\ngenerator lang_typescript {\n output_type typescript\n output_dir \"../typescript\"\n version \"0.54.1\"\n}\n\ngenerator lang_ruby {\n output_type ruby/sorbet\n output_dir \"../ruby\"\n version \"0.54.1\"\n}\n", + "main.baml": "generator lang_python {\n output_type python/pydantic\n output_dir \"../python\"\n version \"0.54.2\"\n}\n\ngenerator lang_typescript {\n output_type typescript\n output_dir \"../typescript\"\n version \"0.54.2\"\n}\n\ngenerator lang_ruby {\n output_type ruby/sorbet\n output_dir \"../ruby\"\n version \"0.54.2\"\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}", "test-files/comments/comments.baml": "// add some functions, classes, enums etc with comments all over.", diff --git a/integ-tests/python/report.html b/integ-tests/python/report.html index 6fdfbe0e8..252e59f68 100644 --- a/integ-tests/python/report.html +++ b/integ-tests/python/report.html @@ -3,18 +3,32 @@
Test Report

Summary

62
4 failed 58 passed

Tests

tests/test_functions.py 358 0:02:30.601963

PASSED test_sync 0:00:00.631920

Setup

Call

Captured stdout call
got response key
+    
Test Report

Summary

62
5 failed 57 passed

Tests

tests/test_functions.py 557 0:02:27.741738

PASSED test_sync 0:00:01.318181

Setup

Call

Captured stdout call
got response key
 true
 52
-

Teardown

FAILED TestAllInputs::test_single_bool 0:00:00.007140

baml_py.BamlClientError: Something went wrong with the LLM client: LLM call failed: LLMErrorResponse { client: "Vertex", model: None, prompt: Chat([RenderedChatMessage { role: "user", allow_duplicate_role: false, parts: [Text("Return this value back to me: true")] }]), request_options: {}, start_time: SystemTime { tv_sec: 1725379696, tv_nsec: 996968000 }, latency: 796.25µs, message: "Error {\n    context: \"Failed to build request\",\n    source: \"Service account not found\",\n}", code: Other(2) }

Setup

Call

self = 
+
Captured stderr call
[2024-09-05T13:54:43Z INFO  baml_events] Function TestFnNamedArgsSingleClass:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 1197ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Print these values back to me:
+    key
+    true
+    52
+    
+    ---LLM REPLY---
+    key
+    true
+    52
+    ---Parsed Response (string)---
+    "key\ntrue\n52"
+

Teardown

FAILED TestAllInputs::test_single_bool 0:00:00.007360

baml_py.BamlClientError: Something went wrong with the LLM client: LLM call failed: LLMErrorResponse { client: "Vertex", model: None, prompt: Chat([RenderedChatMessage { role: "user", allow_duplicate_role: false, parts: [Text("Return this value back to me: true")] }]), request_options: {}, start_time: SystemTime { tv_sec: 1725544483, tv_nsec: 239800000 }, latency: 954.667µs, message: "Error {\n    context: \"Failed to build request\",\n    source: \"Service account not found\",\n}", code: Other(2) }

Setup

Call

self = 
 
 >   ???
 
 tests/test_functions.py:46: 
-_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
+_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
 
-self = , myBool = True
-baml_options = {}
+self = 
+myBool = True, baml_options = {}
 
     async def TestFnNamedArgsSingleBool(
         self,
@@ -39,17 +53,296 @@
       )
       mdl = create_model("TestFnNamedArgsSingleBoolReturnType", inner=(str, ...))
 >     return coerce(mdl, raw.parsed())
-E     baml_py.BamlClientError: Something went wrong with the LLM client: LLM call failed: LLMErrorResponse { client: "Vertex", model: None, prompt: Chat([RenderedChatMessage { role: "user", allow_duplicate_role: false, parts: [Text("Return this value back to me: true")] }]), request_options: {}, start_time: SystemTime { tv_sec: 1725379696, tv_nsec: 996968000 }, latency: 796.25µs, message: "Error {\n    context: \"Failed to build request\",\n    source: \"Service account not found\",\n}", code: Other(2) }
+E     baml_py.BamlClientError: Something went wrong with the LLM client: LLM call failed: LLMErrorResponse { client: "Vertex", model: None, prompt: Chat([RenderedChatMessage { role: "user", allow_duplicate_role: false, parts: [Text("Return this value back to me: true")] }]), request_options: {}, start_time: SystemTime { tv_sec: 1725544483, tv_nsec: 239800000 }, latency: 954.667µs, message: "Error {\n    context: \"Failed to build request\",\n    source: \"Service account not found\",\n}", code: Other(2) }
 
-baml_client/async_client.py:1356: BamlClientError

Teardown

PASSED TestAllInputs::test_single_string_list 0:00:00.487268

Setup

Call

Teardown

PASSED TestAllInputs::test_single_class 0:00:00.452363

Setup

Call

Teardown

PASSED TestAllInputs::test_multiple_args 0:00:00.576935

Setup

Call

Teardown

PASSED TestAllInputs::test_single_enum_list 0:00:00.700424

Setup

Call

Teardown

PASSED TestAllInputs::test_single_float 0:00:00.367807

Setup

Call

Teardown

PASSED TestAllInputs::test_single_int 0:00:00.376627

Setup

Call

Teardown

PASSED TestAllInputs::test_single_map_string_to_string 0:00:00.603980

Setup

Call

Teardown

PASSED TestAllInputs::test_single_map_string_to_class 0:00:00.528408

Setup

Call

Teardown

PASSED TestAllInputs::test_single_map_string_to_map 0:00:00.506582

Setup

Call

Teardown

PASSED test_should_work_for_all_outputs 0:00:03.666436

Setup

Call

Teardown

PASSED test_should_work_with_image_url 0:00:01.282579

Setup

Call

Teardown

PASSED test_should_work_with_image_list 0:00:01.920672

Setup

Call

Teardown

FAILED test_should_work_with_vertex 0:00:00.004474

baml_py.BamlClientError: Something went wrong with the LLM client: LLM call failed: LLMErrorResponse { client: "Vertex", model: None, prompt: Chat([RenderedChatMessage { role: "user", allow_duplicate_role: false, parts: [Text("Write a nice short story about donkey kong")] }]), request_options: {}, start_time: SystemTime { tv_sec: 1725379708, tv_nsec: 545902000 }, latency: 180.75µs, message: "Error {\n    context: \"Failed to build request\",\n    source: \"Service account not found\",\n}", code: Other(2) }

Setup

Call

@pytest.mark.asyncio
+baml_client/async_client.py:1356: BamlClientError
Captured stderr call
[2024-09-05T13:54:43Z WARN  baml_events] Function TestFnNamedArgsSingleBool:
+    Client: Vertex (<unknown>) - 0ms
+    ---PROMPT---
+    [chat] user: Return this value back to me: true
+    
+    ---REQUEST OPTIONS---
+    ---ERROR (Unspecified error code: 2)---
+    Error {
+        context: "Failed to build request",
+        source: "Service account not found",
+    }
+

Teardown

PASSED TestAllInputs::test_single_string_list 0:00:00.595044

Setup

Call

Captured stderr call
[2024-09-05T13:54:43Z INFO  baml_events] Function TestFnNamedArgsSingleStringList:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 589ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Return this value back to me: ["a", "b", "c"]
+    
+    ---LLM REPLY---
+    ["a", "b", "c"]
+    ---Parsed Response (string)---
+    "[\"a\", \"b\", \"c\"]"
+

Teardown

PASSED TestAllInputs::test_single_class 0:00:00.410191

Setup

Call

Captured stderr call
[2024-09-05T13:54:44Z INFO  baml_events] Function TestFnNamedArgsSingleClass:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 402ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Print these values back to me:
+    key
+    true
+    52
+    
+    ---LLM REPLY---
+    key
+    true
+    52
+    ---Parsed Response (string)---
+    "key\ntrue\n52"
+

Teardown

PASSED TestAllInputs::test_multiple_args 0:00:00.498484

Setup

Call

Captured stderr call
[2024-09-05T13:54:44Z INFO  baml_events] Function TestMulticlassNamedArgs:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 490ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Print these values back to me:
+    key
+    true
+    52
+    key
+    true
+    64
+    
+    ---LLM REPLY---
+    key
+    true
+    52
+    key
+    true
+    64
+    ---Parsed Response (string)---
+    "key\ntrue\n52\nkey\ntrue\n64"
+

Teardown

PASSED TestAllInputs::test_single_enum_list 0:00:00.498749

Setup

Call

Captured stderr call
[2024-09-05T13:54:45Z INFO  baml_events] Function TestFnNamedArgsSingleEnumList:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 492ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Print these values back to me:
+    ["TWO"]
+    
+    ---LLM REPLY---
+    ["TWO"]
+    ---Parsed Response (string)---
+    "[\"TWO\"]"
+

Teardown

PASSED TestAllInputs::test_single_float 0:00:00.521826

Setup

Call

Captured stderr call
[2024-09-05T13:54:45Z INFO  baml_events] Function TestFnNamedArgsSingleFloat:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 513ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Return this value back to me: 3.12
+    
+    ---LLM REPLY---
+    3.12
+    ---Parsed Response (string)---
+    "3.12"
+

Teardown

PASSED TestAllInputs::test_single_int 0:00:00.523990

Setup

Call

Captured stderr call
[2024-09-05T13:54:46Z INFO  baml_events] Function TestFnNamedArgsSingleInt:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 516ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Return this value back to me: 3566
+    
+    ---LLM REPLY---
+    3566
+    ---Parsed Response (string)---
+    "3566"
+

Teardown

PASSED TestAllInputs::test_single_map_string_to_string 0:00:00.587192

Setup

Call

Captured stderr call
[2024-09-05T13:54:46Z INFO  baml_events] Function TestFnNamedArgsSingleMapStringToString:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 567ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Return this value back to me: {"lorem": "ipsum", "dolor": "sit"}
+    
+    ---LLM REPLY---
+    {"lorem": "ipsum", "dolor": "sit"}
+    ---Parsed Response (map<string, string>)---
+    {
+      "lorem": "ipsum",
+      "dolor": "sit"
+    }
+

Teardown

PASSED TestAllInputs::test_single_map_string_to_class 0:00:00.587740

Setup

Call

Captured stderr call
[2024-09-05T13:54:47Z INFO  baml_events] Function TestFnNamedArgsSingleMapStringToClass:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 575ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Return this value back to me: {"lorem": {"word": "ipsum"}}
+    
+    ---LLM REPLY---
+    {"lorem": {"word": "ipsum"}}
+    ---Parsed Response (map<string, class StringToClassEntry>)---
+    {
+      "lorem": {
+        "word": "ipsum"
+      }
+    }
+

Teardown

PASSED TestAllInputs::test_single_map_string_to_map 0:00:00.919760

Setup

Call

Captured stderr call
[2024-09-05T13:54:48Z INFO  baml_events] Function TestFnNamedArgsSingleMapStringToMap:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 911ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Return this value back to me: {"lorem": {"word": "ipsum"}}
+    
+    ---LLM REPLY---
+    {"lorem": {"word": "ipsum"}}
+    ---Parsed Response (map<string, map<string, string>>)---
+    {
+      "lorem": {
+        "word": "ipsum"
+      }
+    }
+

Teardown

PASSED test_should_work_for_all_outputs 0:00:04.745434

Setup

Call

Captured stderr call
[2024-09-05T13:54:49Z INFO  baml_events] Function FnOutputBool:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 588ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Return a true: Answer as a: bool
+    
+    ---LLM REPLY---
+    True
+    ---Parsed Response (bool)---
+    true
+[2024-09-05T13:54:50Z INFO  baml_events] Function FnOutputClassList:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 1319ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Return a JSON array that follows this schema: 
+    Answer with a JSON Array using this schema:
+    [
+      {
+        prop1: string,
+        prop2: int,
+      }
+    ]
+    
+    JSON:
+    
+    ---LLM REPLY---
+    [
+      {
+        "prop1": "apple",
+        "prop2": 5
+      },
+      {
+        "prop1": "banana",
+        "prop2": 3
+      },
+      {
+        "prop1": "orange",
+        "prop2": 7
+      }
+    ]
+    ---Parsed Response (list<class TestOutputClass>)---
+    [
+      {
+        "prop1": "apple",
+        "prop2": 5
+      },
+      {
+        "prop1": "banana",
+        "prop2": 3
+      },
+      {
+        "prop1": "orange",
+        "prop2": 7
+      }
+    ]
+[2024-09-05T13:54:51Z INFO  baml_events] Function FnOutputClassWithEnum:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 737ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Return a made up json blob that matches this schema:
+    Answer in JSON using this schema:
+    {
+      prop1: string,
+      prop2: 'ONE' or 'TWO',
+    }
+    ---
+    
+    JSON:
+    
+    ---LLM REPLY---
+    {
+      "prop1": "Hello, world!",
+      "prop2": "ONE"
+    }
+    ---Parsed Response (class TestClassWithEnum)---
+    {
+      "prop1": "Hello, world!",
+      "prop2": "ONE"
+    }
+[2024-09-05T13:54:51Z INFO  baml_events] Function FnOutputClass:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 745ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Return a JSON blob with this schema: 
+    Answer in JSON using this schema:
+    {
+      prop1: string,
+      prop2: int,
+    }
+    
+    For the prop2, always return a 540
+    
+    JSON:
+    
+    ---LLM REPLY---
+    {
+      "prop1": "Hello, World!",
+      "prop2": 540
+    }
+    ---Parsed Response (class TestOutputClass)---
+    {
+      "prop1": "Hello, World!",
+      "prop2": 540
+    }
+[2024-09-05T13:54:52Z INFO  baml_events] Function FnEnumListOutput:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 509ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Print out two of these values randomly selected from the list below in a json array.
+    
+    Answer with a JSON Array using this schema:
+    [
+      'ONE' or 'TWO' or 'THREE'
+    ]
+    
+    Answer:
+    
+    ---LLM REPLY---
+    [
+      'ONE',
+      'THREE'
+    ]
+    ---Parsed Response (list<enum EnumOutput>)---
+    [
+      "ONE",
+      "THREE"
+    ]
+[2024-09-05T13:54:53Z INFO  baml_events] Function FnEnumOutput:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 796ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Choose one of these values randomly. Before you give the answer, write out an unrelated haiku about the ocean.
+    
+    VALUE_ENUM
+    ----
+    - ONE
+    - TWO
+    - THREE
+    
+    ---LLM REPLY---
+    Beneath the calm tide  
+    Secrets hidden in the depths  
+    Mystery unfolds  
+    
+    I choose... TWO.
+    ---Parsed Response (enum EnumOutput)---
+    "TWO"
+

Teardown

PASSED test_should_work_with_image_url 0:00:01.030876

Setup

Call

Captured stderr call
[2024-09-05T13:54:54Z INFO  baml_events] Function TestImageInput:
+    Client: GPT4o (gpt-4o-2024-05-13) - 1022ms. StopReason: stop
+    ---PROMPT---
+    [chat] user: Describe this in 4 words. One word must be the color<image_placeholder: https://upload.wikimedia.org/wikipedia/en/4/4d/Shrek_%28character%29.png>
+    
+    ---LLM REPLY---
+    Green animated ogre smiling.
+    ---Parsed Response (string)---
+    "Green animated ogre smiling."
+

Teardown

PASSED test_should_work_with_image_list 0:00:01.864544

Setup

Call

Captured stderr call
[2024-09-05T13:54:56Z INFO  baml_events] Function TestImageListInput:
+    Client: GPT4o (gpt-4o-2024-05-13) - 1855ms. StopReason: stop
+    ---PROMPT---
+    [chat] user: What colors do these have in common? [<image_placeholder: https://upload.wikimedia.org/wikipedia/en/4/4d/Shrek_%28character%29.png>,<image_placeholder: https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_92x30dp.png>]
+    
+    ---LLM REPLY---
+    The colors that the two images have in common are green and brown. Shrek's image contains shades of green (his skin) and brown (his vest and boots), while the Google logo contains green (in the letters "l" and "e") and blue, although brown is not present in the Google logo.
+    ---Parsed Response (string)---
+    "The colors that the two images have in common are green and brown. Shrek's image contains shades of green (his skin) and brown (his vest and boots), while the Google logo contains green (in the letters \"l\" and \"e\") and blue, although brown is not present in the Google logo."
+

Teardown

FAILED test_should_work_with_vertex 0:00:00.004918

baml_py.BamlClientError: Something went wrong with the LLM client: LLM call failed: LLMErrorResponse { client: "Vertex", model: None, prompt: Chat([RenderedChatMessage { role: "user", allow_duplicate_role: false, parts: [Text("Write a nice short story about donkey kong")] }]), request_options: {}, start_time: SystemTime { tv_sec: 1725544496, tv_nsec: 87610000 }, latency: 232.667µs, message: "Error {\n    context: \"Failed to build request\",\n    source: \"Service account not found\",\n}", code: Other(2) }

Setup

Call

@pytest.mark.asyncio
     async def test_should_work_with_vertex():
 >       res = await b.TestVertex("donkey kong")
 
 tests/test_functions.py:182: 
-_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
+_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
 
-self = , input = 'donkey kong'
-baml_options = {}
+self = 
+input = 'donkey kong', baml_options = {}
 
     async def TestVertex(
         self,
@@ -74,95 +367,666 @@
       )
       mdl = create_model("TestVertexReturnType", inner=(str, ...))
 >     return coerce(mdl, raw.parsed())
-E     baml_py.BamlClientError: Something went wrong with the LLM client: LLM call failed: LLMErrorResponse { client: "Vertex", model: None, prompt: Chat([RenderedChatMessage { role: "user", allow_duplicate_role: false, parts: [Text("Write a nice short story about donkey kong")] }]), request_options: {}, start_time: SystemTime { tv_sec: 1725379708, tv_nsec: 545902000 }, latency: 180.75µs, message: "Error {\n    context: \"Failed to build request\",\n    source: \"Service account not found\",\n}", code: Other(2) }
-
-baml_client/async_client.py:1860: BamlClientError

Teardown

PASSED test_should_work_with_image_base64 0:00:01.549557

Setup

Call

Teardown

PASSED test_should_work_with_audio_base64 0:00:01.363957

Setup

Call

Teardown

PASSED test_should_work_with_audio_url 0:00:01.029083

Setup

Call

Teardown

PASSED test_works_with_retries2 0:00:01.937170

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: 1725379714, tv_nsec: 351301000 }, latency: 130.473584ms, message: "Request failed: {\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.736288

Setup

Call

Teardown

PASSED test_claude 0:00:00.534231

Setup

Call

Teardown

PASSED test_gemini 0:00:08.374846

Setup

Call

Captured stdout call
LLM output from Gemini: Barnaby Butterfield, a man of routine, sat on his usual park bench. Every day, at precisely 10:03 am, Barnaby would enjoy a Dr. Pepper, savoring the 23 flavors dancing on his tongue. But today was different. His bench, usually empty, was occupied by a young girl, her face buried in a book. 
-
-Barnaby cleared his throat, "Excuse me, miss," he began, his voice gruff from years of silence, "This is my bench."
+E     baml_py.BamlClientError: Something went wrong with the LLM client: LLM call failed: LLMErrorResponse { client: "Vertex", model: None, prompt: Chat([RenderedChatMessage { role: "user", allow_duplicate_role: false, parts: [Text("Write a nice short story about donkey kong")] }]), request_options: {}, start_time: SystemTime { tv_sec: 1725544496, tv_nsec: 87610000 }, latency: 232.667µs, message: "Error {\n    context: \"Failed to build request\",\n    source: \"Service account not found\",\n}", code: Other(2) }
 
-The girl looked up, startled, then broke into a wide smile. "Oh, I'm so sorry," she chirped, scooting over. "I'm Lily. What's your name?" 
-
-Barnaby, disarmed by her sunny disposition, found himself answering. Soon, they were chatting away, Lily’s youthful energy chipping away at Barnaby’s gruff exterior. He even found himself offering her half his Dr. Pepper, a thing unheard of in the history of Barnaby Butterfield.
-
-Lily, to his surprise, wrinkled her nose. "Is that Dr. Pepper? My grandpa drinks that!" she exclaimed, her nose crinkling further. "He says it tastes like..." she paused, searching for the right words, "a happy memory you can't quite place."
+baml_client/async_client.py:1860: BamlClientError
Captured stderr call
[2024-09-05T13:54:56Z WARN  baml_events] Function TestVertex:
+    Client: Vertex (<unknown>) - 0ms
+    ---PROMPT---
+    [chat] user: Write a nice short story about donkey kong
+    
+    ---REQUEST OPTIONS---
+    ---ERROR (Unspecified error code: 2)---
+    Error {
+        context: "Failed to build request",
+        source: "Service account not found",
+    }
+

Teardown

PASSED test_should_work_with_image_base64 0:00:01.299562

Setup

Call

Captured stderr call
[2024-09-05T13:54:57Z INFO  baml_events] Function TestImageInput:
+    Client: GPT4o (gpt-4o-2024-05-13) - 1280ms. StopReason: stop
+    ---PROMPT---
+    [chat] user: Describe this in 4 words. One word must be the color<image_placeholder base64>
+    
+    ---LLM REPLY---
+    Green animated ogre smiling.
+    ---Parsed Response (string)---
+    "Green animated ogre smiling."
+

Teardown

PASSED test_should_work_with_audio_base64 0:00:01.573248

Setup

Call

Captured stderr call
[2024-09-05T13:54:59Z INFO  baml_events] Function AudioInput:
+    Client: Gemini () - 1560ms. StopReason: "STOP"
+    ---PROMPT---
+    [chat] user: Does this sound like a roar? Yes or no? One word no other characters.<image_placeholder base64>
+    
+    ---LLM REPLY---
+    Yes 
+    
+    ---Parsed Response (string)---
+    "Yes \n"
+

Teardown

PASSED test_should_work_with_audio_url 0:00:01.106339

Setup

Call

Captured stderr call
[2024-09-05T13:55:00Z INFO  baml_events] Function AudioInput:
+    Client: Gemini () - 973ms. StopReason: "STOP"
+    ---PROMPT---
+    [chat] user: Does this sound like a roar? Yes or no? One word no other characters.<audio_placeholder base64>
+    
+    ---LLM REPLY---
+    No 
+    
+    ---Parsed Response (string)---
+    "No \n"
+

Teardown

PASSED test_works_with_retries2 0:00:01.944758

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: 1725544501, tv_nsec: 885605000 }, latency: 175.950709ms, message: "Request failed: {\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 }
+
Captured stderr call
[2024-09-05T13:55:02Z WARN  baml_events] Function TestRetryExponential:
+    (3 other previous tries)
+    Client: RetryClientExponential (<unknown>) - 175ms
+    ---PROMPT---
+    [chat] system: Say a haiku
+    
+    ---REQUEST OPTIONS---
+    model: "gpt-3.5-turbo"
+    ---ERROR (InvalidAuthentication (401))---
+    Request failed: {
+        "error": {
+            "message": "Incorrect API key provided: blahh. You can find your API key at https://platform.openai.com/account/api-keys.",
+            "type": "invalid_request_error",
+            "param": null,
+            "code": "invalid_api_key"
+        }
+    }
+    
+

Teardown

PASSED test_works_with_fallbacks 0:00:01.649697

Setup

Call

Captured stderr call
[2024-09-05T13:55:03Z INFO  baml_events] Function TestFallbackClient:
+    (5 other previous tries)
+    Client: GPT35 (gpt-3.5-turbo-0125) - 598ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Say a haiku about mexico.
+    
+    ---LLM REPLY---
+    Vibrant colors dance
+    Mariachi serenade
+    Mexico's spirit
+    ---Parsed Response (string)---
+    "Vibrant colors dance\nMariachi serenade\nMexico's spirit"
+

Teardown

PASSED test_claude 0:00:00.637708

Setup

Call

Captured stderr call
[2024-09-05T13:55:04Z INFO  baml_events] Function PromptTestClaude:
+    Client: Claude (claude-3-haiku-20240307) - 629ms. StopReason: "end_turn"
+    ---PROMPT---
+    [chat] user: Tell me a haiku about Mt Rainier is tall
+    
+    ---LLM REPLY---
+    Here is a haiku about Mt. Rainier:
+    
+    Majestic Rainier,
+    Towering high in the sky,
+    Glaciers glisten bright.
+    ---Parsed Response (string)---
+    "Here is a haiku about Mt. Rainier:\n\nMajestic Rainier,\nTowering high in the sky,\nGlaciers glisten bright."
+

Teardown

PASSED test_gemini 0:00:07.545418

Setup

Call

Captured stdout call
LLM output from Gemini: The antique shop smelled of dust and dreams. Eliza, her nose wrinkled, trailed behind her grandmother, her gaze skimming over chipped china dolls and faded velvet hats. Nothing ever interested her in these shops, until her eyes landed on it. 
 
-Barnaby chuckled. "That's one way to put it."  
+A Dr Pepper bottle. 
 
-From then on, Barnaby and Lily shared his bench every day. Lily, with her boundless energy, brought a new spark to Barnaby’s routine. And Barnaby, with his quiet wisdom, brought a sense of calm to Lily’s boundless energy. And every day, at precisely 10:03 am, Barnaby would open two Dr. Peppers, a testament to the unlikely friendship forged over a shared bench and a drink that tasted like a happy memory, even if you couldn't quite place it. 
+Not just any bottle, though. This one was made of thick, rippled glass, the iconic logo etched deeply into its surface. It was beautiful, a forgotten relic from a time when soda came in glass, not plastic. Eliza had to have it. 
 
-

Teardown

PASSED test_gemini_streaming 0:00:07.014888

Setup

Call

Captured stdout call
LLM output from Gemini: Dr. Pepper didn't have a first name. At least, not one anyone could remember. He’d been Dr. Pepper since he was a boy, concocting strange brews in his mother's kitchen.  Back then it was "Dr. Pepper's Cure-All Tonic," promising everything from shiny hair to a sunny disposition. Mostly, it just made his little sister giggle. 
+She bought the bottle for a dollar, a steal in her opinion.  At home, she scrubbed away the years of grime, the cool glass smooth under her fingertips.  As she polished, she noticed something etched discreetly on the bottom: 1955.
 
-Years passed, the city grew up around him, and Dr. Pepper's concoctions became more sophisticated.  He opened a small shop, a haven of bubbling beakers and the tantalizing aroma of a thousand exotic spices. People came with their ailments – heartache, writer's block, a desperate need for adventure. Dr. Pepper had a potion for everything. 
+That night, Eliza couldn't sleep. Images of poodle skirts and sock hops filled her mind, fueled by the bottle on her nightstand.  She swore she could almost taste the sweet, spicy soda, hear the fizz as the cap twisted off. 
 
-One rainy Tuesday, a woman with eyes the color of a stormy sea walked in.  She didn't ask for a potion, just a cup of the steaming, spicy liquid that simmered on Dr. Pepper’s stove. He poured her a cup, the aroma swirling around them like a whispered secret.
+When she woke up, something felt different.  Lighter, maybe?  She rushed to the mirror, her jaw dropping. Gone were her jeans and t-shirt, replaced by a pastel-blue dress with a wide, twirling skirt.
 
-“What is this magic?” she asked, her voice husky with wonder.
+The Dr Pepper bottle lay on its side, empty. 
 
-Dr. Pepper, a man of few words, simply smiled. “It's a little bit of this, and a little bit of that.” 
+Eliza's heart pounded. Had the bottle... transported her? To 1955? A thrill shot through her. Maybe dreams did come in dusty antique shops, after all.  Maybe, with a little Dr Pepper magic, she was about to have the most exciting summer of her life. 
 
-The woman visited every day after that, her laughter echoing through the shop, chasing away the rain clouds that seemed to follow her. She never shared her name, and he never asked.  Sometimes, the most potent potions are the ones that need no names, brewed with a bit of magic, and a whole lot of heart.  
+
Captured stderr call
[2024-09-05T13:55:11Z INFO  baml_events] Function TestGemini:
+    Client: Gemini () - 7536ms. StopReason: "STOP"
+    ---PROMPT---
+    [chat] user: Write a nice short story about Dr. Pepper
+    
+    ---LLM REPLY---
+    The antique shop smelled of dust and dreams. Eliza, her nose wrinkled, trailed behind her grandmother, her gaze skimming over chipped china dolls and faded velvet hats. Nothing ever interested her in these shops, until her eyes landed on it. 
+    
+    A Dr Pepper bottle. 
+    
+    Not just any bottle, though. This one was made of thick, rippled glass, the iconic logo etched deeply into its surface. It was beautiful, a forgotten relic from a time when soda came in glass, not plastic. Eliza had to have it. 
+    
+    She bought the bottle for a dollar, a steal in her opinion.  At home, she scrubbed away the years of grime, the cool glass smooth under her fingertips.  As she polished, she noticed something etched discreetly on the bottom: 1955.
+    
+    That night, Eliza couldn't sleep. Images of poodle skirts and sock hops filled her mind, fueled by the bottle on her nightstand.  She swore she could almost taste the sweet, spicy soda, hear the fizz as the cap twisted off. 
+    
+    When she woke up, something felt different.  Lighter, maybe?  She rushed to the mirror, her jaw dropping. Gone were her jeans and t-shirt, replaced by a pastel-blue dress with a wide, twirling skirt.
+    
+    The Dr Pepper bottle lay on its side, empty. 
+    
+    Eliza's heart pounded. Had the bottle... transported her? To 1955? A thrill shot through her. Maybe dreams did come in dusty antique shops, after all.  Maybe, with a little Dr Pepper magic, she was about to have the most exciting summer of her life. 
+    
+    ---Parsed Response (string)---
+    "The antique shop smelled of dust and dreams. Eliza, her nose wrinkled, trailed behind her grandmother, her gaze skimming over chipped china dolls and faded velvet hats. Nothing ever interested her in these shops, until her eyes landed on it. \n\nA Dr Pepper bottle. \n\nNot just any bottle, though. This one was made of thick, rippled glass, the iconic logo etched deeply into its surface. It was beautiful, a forgotten relic from a time when soda came in glass, not plastic. Eliza had to have it. \n\nShe bought the bottle for a dollar, a steal in her opinion.  At home, she scrubbed away the years of grime, the cool glass smooth under her fingertips.  As she polished, she noticed something etched discreetly on the bottom: 1955.\n\nThat night, Eliza couldn't sleep. Images of poodle skirts and sock hops filled her mind, fueled by the bottle on her nightstand.  She swore she could almost taste the sweet, spicy soda, hear the fizz as the cap twisted off. \n\nWhen she woke up, something felt different.  Lighter, maybe?  She rushed to the mirror, her jaw dropping. Gone were her jeans and t-shirt, replaced by a pastel-blue dress with a wide, twirling skirt.\n\nThe Dr Pepper bottle lay on its side, empty. \n\nEliza's heart pounded. Had the bottle... transported her? To 1955? A thrill shot through her. Maybe dreams did come in dusty antique shops, after all.  Maybe, with a little Dr Pepper magic, she was about to have the most exciting summer of her life. \n"
+

Teardown

PASSED test_gemini_streaming 0:00:10.659996

Setup

Call

Captured stdout call
LLM output from Gemini: Dr. Pepper didn’t have a first name. No one knew if it was “Doctor” as in a title, or “doctor” as in someone who fixed leaky faucets. Not even he knew anymore. It had been so long since he’d been bottled, so long since he’d felt the fizz of youth. Now, he sat on the dusty shelf of a forgotten general store, nestled between a can of pickled pigs’ feet and a box of stale crackers. 
 
-

Teardown

PASSED test_aws 0:00:02.262503

Setup

Call

Teardown

PASSED test_openai_shorthand 0:00:07.337657

Setup

Call

Teardown

PASSED test_openai_shorthand_streaming 0:00:06.812855

Setup

Call

Teardown

PASSED test_anthropic_shorthand 0:00:02.880345

Setup

Call

Teardown

PASSED test_anthropic_shorthand_streaming 0:00:03.624549

Setup

Call

Teardown

PASSED test_fallback_to_shorthand 0:00:00.979746

Setup

Call

Teardown

PASSED test_aws_streaming 0:00:02.481343

Setup

Call

Teardown

PASSED test_streaming 0:00:06.643740

Setup

Call

Teardown

PASSED test_streaming_uniterated 0:00:06.085553

Setup

Call

Teardown

PASSED test_streaming_sync 0:00:05.282357

Setup

Call

Captured log call
WARNING  asyncio:base_events.py:1982 Executing <Task finished name='Task-49' 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.396 seconds

Teardown

PASSED test_streaming_uniterated_sync 0:00:06.619593

Setup

Call

Teardown

PASSED test_streaming_claude 0:00:00.810410

Setup

Call

Captured stdout call
msgs:
-Majestic and tall,
-Rainier stands proud in the sky,
-Snow-capped wonder waits.
-final:
-Majestic and tall,
-Rainier stands proud in the sky,
-Snow-capped wonder waits.
-

Teardown

PASSED test_streaming_gemini 0:00:10.196029

Setup

Call

Captured stdout call
msgs:
-Dr. Pepper wasn't a real doctor, not in the way of stethoscopes and anatomy charts. He was a soda fountain, a whimsical contraption of polished brass and stained glass, nestled in the corner of Millie's Malt Shop. 
+He wasn’t bitter, not really. He missed the laughter of children, the satisfying clink of ice cubes, the way the world seemed brighter after a long, refreshing gulp. But Dr. Pepper had learned to appreciate the quiet. He had long conversations with the pigs’ feet (surprisingly philosophical, those piggies) and shared nostalgic stories with the crackers about their days in the sunbeams by the cash register.
 
-He'd been there for decades, a silent observer to countless first dates, whispered secrets, and shared milkshakes. He'd dispensed his fizzy wisdom alongside creamy root beer floats and cherry-topped sundaes. People said there was a certain magic to Dr. Pepper's concoctions, a little something extra that warmed you from the inside out. 
+One afternoon, the bell above the door jingled. A girl, all scraped knees and pigtails, wandered down the aisle. Her eyes, the color of melted chocolate, landed on Dr. Pepper. 
 
-One particularly slow Tuesday, a young woman named Clara slumped onto the stool opposite him. Her eyes were red-rimmed, and the cherry red paint on her fingernails matched the shade of her lipstick – a sure sign of a broken heart. 
+“What’s this?” she whispered, her voice filled with wonder. She carefully lifted him from the shelf, her touch gentle.
 
-Dr. Pepper, ever the gentleman, didn't pry. He simply offered a gentle gurgle, a question mark formed in his bubbling depths. 
+Dr. Pepper, dusty and forgotten, felt a long-dormant fizz tickle his insides. Maybe, just maybe, his story wasn’t over yet.  He smiled, his label crinkling, and for the first time in what felt like forever, he felt a surge of hope. 
+ 
+The girl traced his label with her finger, her brow furrowed in thought. Then, with a grin that could outshine the sun, she announced, "You look like you have stories to tell. You're coming with me." 
 
-Clara sighed, the sound a weary exhale. "He said I wasn't ambitious enough," she confessed, her voice barely a whisper.
+And with that, Dr. Pepper’s adventure began again. He was no longer just a dusty bottle on a forgotten shelf. He was a story waiting to be told, a memory waiting to be made, a friend waiting to be discovered. He was Dr. Pepper, and he was home. 
 
-Dr. Pepper, with the wisdom of years and countless heartbreaks witnessed, dispensed a generous pour of his signature drink. The ice clinked, a soothing sound in the quiet shop. 
+
Captured stderr call
[2024-09-05T13:55:22Z INFO  baml_events] Function TestGemini:
+    Client: Gemini (gemini-1.5-pro-001) - 10644ms. StopReason: Stop
+    ---PROMPT---
+    [chat] user: Write a nice short story about Dr. Pepper
+    
+    ---LLM REPLY---
+    Dr. Pepper didn’t have a first name. No one knew if it was “Doctor” as in a title, or “doctor” as in someone who fixed leaky faucets. Not even he knew anymore. It had been so long since he’d been bottled, so long since he’d felt the fizz of youth. Now, he sat on the dusty shelf of a forgotten general store, nestled between a can of pickled pigs’ feet and a box of stale crackers. 
+    
+    He wasn’t bitter, not really. He missed the laughter of children, the satisfying clink of ice cubes, the way the world seemed brighter after a long, refreshing gulp. But Dr. Pepper had learned to appreciate the quiet. He had long conversations with the pigs’ feet (surprisingly philosophical, those piggies) and shared nostalgic stories with the crackers about their days in the sunbeams by the cash register.
+    
+    One afternoon, the bell above the door jingled. A girl, all scraped knees and pigtails, wandered down the aisle. Her eyes, the color of melted chocolate, landed on Dr. Pepper. 
+    
+    “What’s this?” she whispered, her voice filled with wonder. She carefully lifted him from the shelf, her touch gentle.
+    
+    Dr. Pepper, dusty and forgotten, felt a long-dormant fizz tickle his insides. Maybe, just maybe, his story wasn’t over yet.  He smiled, his label crinkling, and for the first time in what felt like forever, he felt a surge of hope. 
+     
+    The girl traced his label with her finger, her brow furrowed in thought. Then, with a grin that could outshine the sun, she announced, "You look like you have stories to tell. You're coming with me." 
+    
+    And with that, Dr. Pepper’s adventure began again. He was no longer just a dusty bottle on a forgotten shelf. He was a story waiting to be told, a memory waiting to be made, a friend waiting to be discovered. He was Dr. Pepper, and he was home. 
+    
+    ---Parsed Response (string)---
+    "Dr. Pepper didn’t have a first name. No one knew if it was “Doctor” as in a title, or “doctor” as in someone who fixed leaky faucets. Not even he knew anymore. It had been so long since he’d been bottled, so long since he’d felt the fizz of youth. Now, he sat on the dusty shelf of a forgotten general store, nestled between a can of pickled pigs’ feet and a box of stale crackers. \n\nHe wasn’t bitter, not really. He missed the laughter of children, the satisfying clink of ice cubes, the way the world seemed brighter after a long, refreshing gulp. But Dr. Pepper had learned to appreciate the quiet. He had long conversations with the pigs’ feet (surprisingly philosophical, those piggies) and shared nostalgic stories with the crackers about their days in the sunbeams by the cash register.\n\nOne afternoon, the bell above the door jingled. A girl, all scraped knees and pigtails, wandered down the aisle. Her eyes, the color of melted chocolate, landed on Dr. Pepper. \n\n“What’s this?” she whispered, her voice filled with wonder. She carefully lifted him from the shelf, her touch gentle.\n\nDr. Pepper, dusty and forgotten, felt a long-dormant fizz tickle his insides. Maybe, just maybe, his story wasn’t over yet.  He smiled, his label crinkling, and for the first time in what felt like forever, he felt a surge of hope. \n \nThe girl traced his label with her finger, her brow furrowed in thought. Then, with a grin that could outshine the sun, she announced, \"You look like you have stories to tell. You're coming with me.\" \n\nAnd with that, Dr. Pepper’s adventure began again. He was no longer just a dusty bottle on a forgotten shelf. He was a story waiting to be told, a memory waiting to be made, a friend waiting to be discovered. He was Dr. Pepper, and he was home. \n"
+

Teardown

PASSED test_aws 0:00:02.578534

Setup

Call

Captured stderr call
[2024-09-05T13:55:25Z INFO  baml_events] Function TestAws:
+    Client: AwsBedrock (anthropic.claude-3-haiku-20240307-v1:0) - 2402ms. StopReason: max_tokens
+    ---PROMPT---
+    [chat] user: Write a nice short story about Mt Rainier is tall
+    
+    ---LLM REPLY---
+    Here is a short story about Mt. Rainier:
+    
+    The Towering Giant
+    
+    As the sun rose over the lush forests of the Pacific Northwest, its golden rays slowly crept up the majestic slopes of Mount Rainier. The colossal, snow-capped peak stood tall and proud, overlooking the surrounding landscape with an air of quiet grandeur.
+    
+    At 14,411 feet, Mount Rainier was a true titan, dwarf
+    ---Parsed Response (string)---
+    "Here is a short story about Mt. Rainier:\n\nThe Towering Giant\n\nAs the sun rose over the lush forests of the Pacific Northwest, its golden rays slowly crept up the majestic slopes of Mount Rainier. The colossal, snow-capped peak stood tall and proud, overlooking the surrounding landscape with an air of quiet grandeur.\n\nAt 14,411 feet, Mount Rainier was a true titan, dwarf"
+

Teardown

PASSED test_openai_shorthand 0:00:09.437305

Setup

Call

Captured stderr call
[2024-09-05T13:55:34Z INFO  baml_events] Function TestOpenAIShorthand:
+    Client: openai/gpt-4o-mini (gpt-4o-mini-2024-07-18) - 9426ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Write a nice short story about Mt Rainier is tall
+    
+    ---LLM REPLY---
+    Once upon a time, in a quiet town nestled at the foot of a grand mountain, there lived a young girl named Lily. The town was surrounded by lush forests and sparkling rivers, but the most impressive sight of all was Mt. Rainier. The mountain stood tall and proud, its snow-capped peak visible from every corner of the town. 
+    
+    Lily often gazed at Mt. Rainier from her bedroom window, dreaming of one day reaching its summit. The town whispered tales of the mountain—how it was a guardian of the valley, a keeper of secrets, and a source of inspiration for all who lived nearby. It was said that if you listened closely, you could hear the mountain's heartbeat in the gentle rustle of the leaves or the soft rush of the nearby creek.
+    
+    One bright summer morning, Lily decided it was time to embark on her adventure. With her backpack filled with snacks, a water bottle, and a notebook to sketch her journey, she set off toward the mountain. As she walked, she felt the warm sun kissing her cheeks and the fragrant scent of wildflowers filled the air.
+    
+    As she climbed higher, the trees began to thin out, and the air grew cooler. The views were breathtaking; she could see the sprawling valleys, carpeted with greenery, and the winding rivers that shimmered like silver ribbons far below. Every step made her heart race with excitement, and she could feel the mountain calling her to come closer.
+    
+    Finally, after hours of hiking, she reached a rocky outcrop that offered a spectacular view of Mt. Rainier up close. It loomed above her, majestic and timeless, its towering presence filled with a sense of wonder. From that place, the mountain looked even taller, and Lily felt like an ant standing next to a giant.
+    
+    She took a deep breath and pulled out her notebook. With determination, she began sketching the magnificent mountain, capturing its contours and the beauty of the surrounding landscape. As she drew, she imagined what it would be like to stand at the very top, to touch the sky, and to feel like she was floating among the clouds.
+    
+    After a while, Lily noticed a group of hikers making their way up a narrow path leading to the summit. Their laughter carried on the breeze, and she felt a pang of longing to join them. Gathering her courage, she decided to follow, step by step, heart racing with anticipation. 
+    
+    The trail was steep and challenging, but with each step, she reminded herself of the stories she'd heard about the mountain’s spirit lifting those who dared to climb it. She could feel that spirit urging her on, and soon, she found herself at the summit. 
+    
+    Standing atop Mt. Rainier, with the world spread out beneath her like a vast quilt, Lily’s heart swelled with joy. Clouds surrounded her, and she felt like she was indeed touching the sky. In that moment, she realized that the mountain was not just tall in height; it was tall in spirit, filling her with a sense of courage and possibility.
+    
+    As the sun began to set, casting a golden glow over the peaks and valleys below, Lily wrote in her notebook: "Mt. Rainier is not just a mountain; it is a reminder that we can reach great heights if we dare to follow our dreams." With a heart full of gratitude, she began her descent, knowing that she would carry the spirit of the mountain with her forever.
+    
+    From that day on, every time Lily looked at Mt. Rainier, she didn’t just see a tall mountain. She saw a friend, a guide, and a source of inspiration, reminding her to always aim high and follow her heart. And so, Mt. Rainier stood tall, not just in the landscape, but in the heart of a girl who dared to dream.
+    ---Parsed Response (string)---
+    "Once upon a time, in a quiet town nestled at the foot of a grand mountain, there lived a young girl named Lily. The town was surrounded by lush forests and sparkling rivers, but the most impressive sight of all was Mt. Rainier. The mountain stood tall and proud, its snow-capped peak visible from every corner of the town. \n\nLily often gazed at Mt. Rainier from her bedroom window, dreaming of one day reaching its summit. The town whispered tales of the mountain—how it was a guardian of the valley, a keeper of secrets, and a source of inspiration for all who lived nearby. It was said that if you listened closely, you could hear the mountain's heartbeat in the gentle rustle of the leaves or the soft rush of the nearby creek.\n\nOne bright summer morning, Lily decided it was time to embark on her adventure. With her backpack filled with snacks, a water bottle, and a notebook to sketch her journey, she set off toward the mountain. As she walked, she felt the warm sun kissing her cheeks and the fragrant scent of wildflowers filled the air.\n\nAs she climbed higher, the trees began to thin out, and the air grew cooler. The views were breathtaking; she could see the sprawling valleys, carpeted with greenery, and the winding rivers that shimmered like silver ribbons far below. Every step made her heart race with excitement, and she could feel the mountain calling her to come closer.\n\nFinally, after hours of hiking, she reached a rocky outcrop that offered a spectacular view of Mt. Rainier up close. It loomed above her, majestic and timeless, its towering presence filled with a sense of wonder. From that place, the mountain looked even taller, and Lily felt like an ant standing next to a giant.\n\nShe took a deep breath and pulled out her notebook. With determination, she began sketching the magnificent mountain, capturing its contours and the beauty of the surrounding landscape. As she drew, she imagined what it would be like to stand at the very top, to touch the sky, and to feel like she was floating among the clouds.\n\nAfter a while, Lily noticed a group of hikers making their way up a narrow path leading to the summit. Their laughter carried on the breeze, and she felt a pang of longing to join them. Gathering her courage, she decided to follow, step by step, heart racing with anticipation. \n\nThe trail was steep and challenging, but with each step, she reminded herself of the stories she'd heard about the mountain’s spirit lifting those who dared to climb it. She could feel that spirit urging her on, and soon, she found herself at the summit. \n\nStanding atop Mt. Rainier, with the world spread out beneath her like a vast quilt, Lily’s heart swelled with joy. Clouds surrounded her, and she felt like she was indeed touching the sky. In that moment, she realized that the mountain was not just tall in height; it was tall in spirit, filling her with a sense of courage and possibility.\n\nAs the sun began to set, casting a golden glow over the peaks and valleys below, Lily wrote in her notebook: \"Mt. Rainier is not just a mountain; it is a reminder that we can reach great heights if we dare to follow our dreams.\" With a heart full of gratitude, she began her descent, knowing that she would carry the spirit of the mountain with her forever.\n\nFrom that day on, every time Lily looked at Mt. Rainier, she didn’t just see a tall mountain. She saw a friend, a guide, and a source of inspiration, reminding her to always aim high and follow her heart. And so, Mt. Rainier stood tall, not just in the landscape, but in the heart of a girl who dared to dream."
+

Teardown

PASSED test_openai_shorthand_streaming 0:00:06.058036

Setup

Call

Captured stderr call
[2024-09-05T13:55:40Z INFO  baml_events] Function TestOpenAIShorthand:
+    Client: openai/gpt-4o-mini (gpt-4o-mini-2024-07-18) - 6045ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Write a nice short story about Mt Rainier is tall
+    
+    ---LLM REPLY---
+    Once upon a time in the Pacific Northwest, a small town nestled at the foot of the colossal Mt. Rainier. The townspeople often marveled at the mountain's magnificence, its snow-capped peak piercing the sky and glistening like a jewel in the sun. To them, it was more than just a mountain; it was a source of inspiration, a guardian watching over them with its imposing stature.
+    
+    Among the residents was a curious little girl named Elara. She had always been fascinated by the tales her grandmother told her about Mt. Rainier. "It's the tallest of them all," her grandmother would say, with eyes sparkling like the stars above. "It holds secrets in its glaciers and whispers stories in the wind."
+    
+    One afternoon, Elara decided she wanted to see how tall the mountain truly was. She’d heard that many brave adventurers had climbed its slopes, but she was too young for such a challenge. Instead, she set out on a quest of her own, hiking along the lush trails that meandered through the forest at its base. With each step, she felt the cool breeze carry whispers of the mountain to her ears.
+    
+    As she walked, she met creatures who called Mt. Rainier home. A wise old owl perched on a branch told Elara about the mountain’s great stories. "It has seen the seasons change a thousand times, and the spirits of the earth dance upon its peaks," he hooted.
+    
+    Further on, she encountered a playful brook that babbled its way down the mountainside. "I carry the essence of Rainier with me," it gushed, "from the melting snow and the refreshing rains." The water sparkled in the sunlight, reflecting the mountain's greatness.
+    
+    At the end of her journey that day, Elara found a quiet spot with a perfect view of Mt. Rainier. As she sat there, the golden sun began to set, painting the sky in shades of crimson and gold. In that moment, Elara understood why the mountain was revered. Its majesty was not just in its height, but in the way it inspired everyone around it.
+    
+    Elara smiled to herself. She realized that while she might not be able to scale the heights of Mt. Rainier just yet, she could appreciate its grandeur from below, carrying the spirit of the mountain in her heart. 
+    
+    From that day on, whenever Elara looked up at Mt. Rainier, she felt a connection to it — both a part of the earth and a dreamer reaching for the stars. The townsfolk continued to admire the mountain, but for Elara, it became a symbol of her own journey, reminding her to strive for greatness, no matter how tall her dreams might be.
+    ---Parsed Response (string)---
+    "Once upon a time in the Pacific Northwest, a small town nestled at the foot of the colossal Mt. Rainier. The townspeople often marveled at the mountain's magnificence, its snow-capped peak piercing the sky and glistening like a jewel in the sun. To them, it was more than just a mountain; it was a source of inspiration, a guardian watching over them with its imposing stature.\n\nAmong the residents was a curious little girl named Elara. She had always been fascinated by the tales her grandmother told her about Mt. Rainier. \"It's the tallest of them all,\" her grandmother would say, with eyes sparkling like the stars above. \"It holds secrets in its glaciers and whispers stories in the wind.\"\n\nOne afternoon, Elara decided she wanted to see how tall the mountain truly was. She’d heard that many brave adventurers had climbed its slopes, but she was too young for such a challenge. Instead, she set out on a quest of her own, hiking along the lush trails that meandered through the forest at its base. With each step, she felt the cool breeze carry whispers of the mountain to her ears.\n\nAs she walked, she met creatures who called Mt. Rainier home. A wise old owl perched on a branch told Elara about the mountain’s great stories. \"It has seen the seasons change a thousand times, and the spirits of the earth dance upon its peaks,\" he hooted.\n\nFurther on, she encountered a playful brook that babbled its way down the mountainside. \"I carry the essence of Rainier with me,\" it gushed, \"from the melting snow and the refreshing rains.\" The water sparkled in the sunlight, reflecting the mountain's greatness.\n\nAt the end of her journey that day, Elara found a quiet spot with a perfect view of Mt. Rainier. As she sat there, the golden sun began to set, painting the sky in shades of crimson and gold. In that moment, Elara understood why the mountain was revered. Its majesty was not just in its height, but in the way it inspired everyone around it.\n\nElara smiled to herself. She realized that while she might not be able to scale the heights of Mt. Rainier just yet, she could appreciate its grandeur from below, carrying the spirit of the mountain in her heart. \n\nFrom that day on, whenever Elara looked up at Mt. Rainier, she felt a connection to it — both a part of the earth and a dreamer reaching for the stars. The townsfolk continued to admire the mountain, but for Elara, it became a symbol of her own journey, reminding her to strive for greatness, no matter how tall her dreams might be."
+

Teardown

PASSED test_anthropic_shorthand 0:00:03.374503

Setup

Call

Captured stderr call
[2024-09-05T13:55:44Z INFO  baml_events] Function TestAnthropicShorthand:
+    Client: anthropic/claude-3-haiku-20240307 (claude-3-haiku-20240307) - 3366ms. StopReason: "end_turn"
+    ---PROMPT---
+    [chat] user: Write a nice short story about Mt Rainier is tall
+    
+    ---LLM REPLY---
+    Here is a short story about Mount Rainier:
+    
+    The Majestic Mountain
+    
+    As the first golden rays of sunrise peeked over the distant horizon, they illuminated the magnificent peak of Mount Rainier. The towering stratovolcano, standing at an impressive 14,411 feet, dominated the landscape with its snow-capped splendor.
+    
+    Eric stood in awe, his eyes fixed on the mountain's breathtaking grandeur. He had visited this spot many times before, but the sight of Rainier never failed to captivate him. The sheer scale of the mountain was humbling, a testament to the raw power and beauty of nature.
+    
+    As he took a deep breath of the crisp, clean air, Eric felt a sense of serenity wash over him. The mountain's presence was both calming and invigorating, a reminder of the enduring strength and resilience of the natural world.
+    
+    Eric knew that the climb to the summit was a challenging one, requiring skill, endurance, and a deep respect for the mountain's might. But in that moment, he felt a renewed desire to tackle the ascent, to experience the world from the top of this towering giant.
+    
+    With a renewed sense of purpose, Eric turned and headed back down the trail, his eyes still drawn to the majestic peak that stood watch over the land. He knew that his journey to the summit would be long and arduous, but the promise of the breathtaking views from the top fueled his determination.
+    
+    In the end, it was not the physical challenge that motivated Eric, but the profound connection he felt with the mountain itself – a bond forged through years of exploration and a deep appreciation for the awe-inspiring power of nature.
+    ---Parsed Response (string)---
+    "Here is a short story about Mount Rainier:\n\nThe Majestic Mountain\n\nAs the first golden rays of sunrise peeked over the distant horizon, they illuminated the magnificent peak of Mount Rainier. The towering stratovolcano, standing at an impressive 14,411 feet, dominated the landscape with its snow-capped splendor.\n\nEric stood in awe, his eyes fixed on the mountain's breathtaking grandeur. He had visited this spot many times before, but the sight of Rainier never failed to captivate him. The sheer scale of the mountain was humbling, a testament to the raw power and beauty of nature.\n\nAs he took a deep breath of the crisp, clean air, Eric felt a sense of serenity wash over him. The mountain's presence was both calming and invigorating, a reminder of the enduring strength and resilience of the natural world.\n\nEric knew that the climb to the summit was a challenging one, requiring skill, endurance, and a deep respect for the mountain's might. But in that moment, he felt a renewed desire to tackle the ascent, to experience the world from the top of this towering giant.\n\nWith a renewed sense of purpose, Eric turned and headed back down the trail, his eyes still drawn to the majestic peak that stood watch over the land. He knew that his journey to the summit would be long and arduous, but the promise of the breathtaking views from the top fueled his determination.\n\nIn the end, it was not the physical challenge that motivated Eric, but the profound connection he felt with the mountain itself – a bond forged through years of exploration and a deep appreciation for the awe-inspiring power of nature."
+

Teardown

PASSED test_anthropic_shorthand_streaming 0:00:03.336387

Setup

Call

Captured stderr call
[2024-09-05T13:55:47Z INFO  baml_events] Function TestAnthropicShorthand:
+    Client: anthropic/claude-3-haiku-20240307 (claude-3-haiku-20240307) - 3292ms. StopReason: "end_turn"
+    ---PROMPT---
+    [chat] user: Write a nice short story about Mt Rainier is tall
+    
+    ---LLM REPLY---
+    Here is a short story about Mt. Rainier:
+    
+    Towering above the verdant landscape, Mount Rainier stood tall and proud, its snow-capped peak piercing the brilliant blue sky. For as far as the eye could see, the majestic mountain dominated the horizon, a breathtaking natural wonder that inspired awe in all who laid eyes upon it.
+    
+    Hailey gazed up at the mountain, her heart swelling with a sense of wonder and reverence. She had grown up in the shadow of this grand monolith, but its sheer size and beauty never ceased to amaze her. The mountain's sheer scale was humbling, a reminder of the raw power and grandeur of the natural world.
+    
+    As Hailey hiked through the lush, forested foothills, she couldn't help but feel a deep connection to the mountain. It was a constant presence in her life, a towering beacon that guided her adventures and inspired her spirit. With each step, the mountain drew closer, its towering presence looming ever larger, until Hailey found herself standing at its base, gazing up in awe at its snow-capped summit.
+    
+    In that moment, Hailey felt small and insignificant, but also deeply connected to the earth and the forces that had shaped this magnificent natural wonder. She knew that she was just one tiny part of a vast and ancient landscape, but in that moment, she felt a sense of profound belonging, a deep appreciation for the power and beauty of the world around her.
+    
+    As she turned and continued her hike, Hailey couldn't help but feel grateful for the privilege of living in the shadow of such a breathtaking mountain. Mount Rainier was a constant reminder of the majesty and wonder of the natural world, and Hailey knew that she would always carry its memory with her, a testament to the enduring power of the earth and the human spirit.
+    ---Parsed Response (string)---
+    "Here is a short story about Mt. Rainier:\n\nTowering above the verdant landscape, Mount Rainier stood tall and proud, its snow-capped peak piercing the brilliant blue sky. For as far as the eye could see, the majestic mountain dominated the horizon, a breathtaking natural wonder that inspired awe in all who laid eyes upon it.\n\nHailey gazed up at the mountain, her heart swelling with a sense of wonder and reverence. She had grown up in the shadow of this grand monolith, but its sheer size and beauty never ceased to amaze her. The mountain's sheer scale was humbling, a reminder of the raw power and grandeur of the natural world.\n\nAs Hailey hiked through the lush, forested foothills, she couldn't help but feel a deep connection to the mountain. It was a constant presence in her life, a towering beacon that guided her adventures and inspired her spirit. With each step, the mountain drew closer, its towering presence looming ever larger, until Hailey found herself standing at its base, gazing up in awe at its snow-capped summit.\n\nIn that moment, Hailey felt small and insignificant, but also deeply connected to the earth and the forces that had shaped this magnificent natural wonder. She knew that she was just one tiny part of a vast and ancient landscape, but in that moment, she felt a sense of profound belonging, a deep appreciation for the power and beauty of the world around her.\n\nAs she turned and continued her hike, Hailey couldn't help but feel grateful for the privilege of living in the shadow of such a breathtaking mountain. Mount Rainier was a constant reminder of the majesty and wonder of the natural world, and Hailey knew that she would always carry its memory with her, a testament to the enduring power of the earth and the human spirit."
+

Teardown

PASSED test_fallback_to_shorthand 0:00:00.971522

Setup

Call

Captured stderr call
[2024-09-05T13:55:48Z INFO  baml_events] Function TestFallbackToShorthand:
+    (1 other previous tries)
+    Client: openai/gpt-4o-mini (gpt-4o-mini-2024-07-18) - 735ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Say a haiku about Mt Rainier is tall.
+    
+    ---LLM REPLY---
+    Majestic and proud,  
+    Mt. Rainier pierces sky,  
+    Whispers of the clouds.  
+    ---Parsed Response (string)---
+    "Majestic and proud,  \nMt. Rainier pierces sky,  \nWhispers of the clouds.  "
+

Teardown

PASSED test_aws_streaming 0:00:02.040104

Setup

Call

Captured stderr call
[2024-09-05T13:55:50Z INFO  baml_events] Function TestAws:
+    Client: AwsBedrock (anthropic.claude-3-haiku-20240307-v1:0) - 2028ms. StopReason: unknown
+    ---PROMPT---
+    [chat] user: Write a nice short story about Mt Rainier is tall
+    
+    ---LLM REPLY---
+    Here is a short story about the majestic Mount Rainier:
+    
+    Towering High
+    
+    Amidst the lush, verdant forests of the Pacific Northwest, a colossal mountain stands proud and tall, its snow-capped peak piercing the azure sky. This is Mount Rainier, a dormant volcano that has captivated the hearts and imaginations of all who lay eyes upon it.
+    
+    At 14,411 feet, Mount Rain
+    ---Parsed Response (string)---
+    "Here is a short story about the majestic Mount Rainier:\n\nTowering High\n\nAmidst the lush, verdant forests of the Pacific Northwest, a colossal mountain stands proud and tall, its snow-capped peak piercing the azure sky. This is Mount Rainier, a dormant volcano that has captivated the hearts and imaginations of all who lay eyes upon it.\n\nAt 14,411 feet, Mount Rain"
+

Teardown

PASSED test_streaming 0:00:04.134063

Setup

Call

Captured stderr call
[2024-09-05T13:55:54Z INFO  baml_events] Function PromptTestStreaming:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 4122ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Tell me a short story about Programming languages are fun to create
+    
+    ---LLM REPLY---
+    Once upon a time, in a world where creativity knew no bounds, a group of curious individuals set out to create their own programming language. They were a diverse bunch, each with their own unique backgrounds and perspectives, but they all shared a passion for technology and a love for solving complex problems.
+    
+    They worked tirelessly, pouring their heart and soul into designing the syntax, defining the data types, and implementing the unique features that would set their language apart from the rest. They debated endlessly, argued passionately, and laughed heartily as they brought their vision to life one line of code at a time.
+    
+    As the days turned into weeks and the weeks into months, their language began to take shape, evolving and growing with each new idea that they added. They faced challenges and setbacks, encountered bugs and errors, but they persevered, learning from their mistakes and pushing forward with determination and grit.
+    
+    And finally, after countless sleepless nights and endless cups of coffee, they stood back and marveled at what they had created – a programming language that was elegant, powerful, and uniquely their own. They named it "InnovaScript" as a nod to their innovative spirit and their love for scripting languages.
+    
+    And as they shared their creation with the world, they realized that the true joy of programming languages lies not just in using them to build amazing things, but in the thrill of creating something new and exciting from scratch. For in the world of technology, the possibilities are truly endless, and the only limit is the boundaries of our imagination.
+    ---Parsed Response (string)---
+    "Once upon a time, in a world where creativity knew no bounds, a group of curious individuals set out to create their own programming language. They were a diverse bunch, each with their own unique backgrounds and perspectives, but they all shared a passion for technology and a love for solving complex problems.\n\nThey worked tirelessly, pouring their heart and soul into designing the syntax, defining the data types, and implementing the unique features that would set their language apart from the rest. They debated endlessly, argued passionately, and laughed heartily as they brought their vision to life one line of code at a time.\n\nAs the days turned into weeks and the weeks into months, their language began to take shape, evolving and growing with each new idea that they added. They faced challenges and setbacks, encountered bugs and errors, but they persevered, learning from their mistakes and pushing forward with determination and grit.\n\nAnd finally, after countless sleepless nights and endless cups of coffee, they stood back and marveled at what they had created – a programming language that was elegant, powerful, and uniquely their own. They named it \"InnovaScript\" as a nod to their innovative spirit and their love for scripting languages.\n\nAnd as they shared their creation with the world, they realized that the true joy of programming languages lies not just in using them to build amazing things, but in the thrill of creating something new and exciting from scratch. For in the world of technology, the possibilities are truly endless, and the only limit is the boundaries of our imagination."
+

Teardown

PASSED test_streaming_uniterated 0:00:04.805570

Setup

Call

Captured stderr call
[2024-09-05T13:55:59Z INFO  baml_events] Function PromptTestStreaming:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 4795ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Tell me a short story about The color blue makes me sad
+    
+    ---LLM REPLY---
+    Once upon a time, there was a young girl named Lily who had a unique perspective on the world. To her, the color blue always seemed to bring a sense of sadness and melancholy. Whenever she saw the clear blue sky or the shimmering blue ocean, she couldn't help but feel a heaviness in her heart.
+    
+    As Lily grew older, she tried to understand why the color blue had such a powerful effect on her emotions. She realized that blue reminded her of times when she felt lonely or lost, like the blue shadows on a cold winter's day. It was a color that represented sadness and longing to her.
+    
+    Despite her associations with the color blue, Lily never let it hold her back. Instead, she used her sadness as inspiration to create beautiful works of art that explored themes of loneliness and isolation. Her paintings and drawings captured the essence of the color blue in all its melancholic beauty.
+    
+    Over time, Lily found solace in her art and discovered that the color blue could also be a source of comfort and healing. She realized that sadness was a part of life, but it could also be transformed into something meaningful and profound.
+    
+    And so, Lily embraced the color blue, not as a symbol of sadness, but as a reminder of the complexity and depth of human emotions. She learned to see the beauty in sadness and the strength in vulnerability, finding a sense of peace in the depths of the color that once made her sad.
+    ---Parsed Response (string)---
+    "Once upon a time, there was a young girl named Lily who had a unique perspective on the world. To her, the color blue always seemed to bring a sense of sadness and melancholy. Whenever she saw the clear blue sky or the shimmering blue ocean, she couldn't help but feel a heaviness in her heart.\n\nAs Lily grew older, she tried to understand why the color blue had such a powerful effect on her emotions. She realized that blue reminded her of times when she felt lonely or lost, like the blue shadows on a cold winter's day. It was a color that represented sadness and longing to her.\n\nDespite her associations with the color blue, Lily never let it hold her back. Instead, she used her sadness as inspiration to create beautiful works of art that explored themes of loneliness and isolation. Her paintings and drawings captured the essence of the color blue in all its melancholic beauty.\n\nOver time, Lily found solace in her art and discovered that the color blue could also be a source of comfort and healing. She realized that sadness was a part of life, but it could also be transformed into something meaningful and profound.\n\nAnd so, Lily embraced the color blue, not as a symbol of sadness, but as a reminder of the complexity and depth of human emotions. She learned to see the beauty in sadness and the strength in vulnerability, finding a sense of peace in the depths of the color that once made her sad."
+

Teardown

PASSED test_streaming_sync 0:00:06.487885

Setup

Call

Captured stderr call
[2024-09-05T13:56:05Z INFO  baml_events] Function PromptTestStreaming:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 6478ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Tell me a short story about Programming languages are fun to create
+    
+    ---LLM REPLY---
+    Once upon a time, in a small village nestled in the rolling hills, there lived a young programmer named Lily. Lily had always been fascinated by the world of computers and technology, and she spent her days tinkering away on her laptop, creating intricate programs and applications.
+    
+    One day, while sitting in her favorite spot under the old oak tree, Lily had a brilliant idea - she wanted to create her very own programming language. She was inspired by the diverse languages she had worked with in the past, and she dreamed of crafting something unique and special.
+    
+    With determination in her heart and a spark of creativity in her eyes, Lily set to work. She spent countless hours writing lines of code, testing different syntaxes and functionalities, and fine-tuning every aspect of her new creation. She poured her passion and energy into the project, knowing that she was on the cusp of something truly extraordinary.
+    
+    As the weeks passed, Lily's programming language began to take shape. It was a beautiful blend of simplicity and power, with elegant syntax and intuitive features that made it a joy to work with. She named it "Lilac" after the flowers that bloomed in the village every spring, and she knew that it was something truly special.
+    
+    When Lily finally unveiled Lilac to the world, the response was overwhelming. Other programmers marveled at the elegance and versatility of her creation, and they quickly began using it in their own projects. Lilac became a beloved language in the programming community, renowned for its ease of use and flexibility.
+    
+    And so, Lily's dream of creating her own programming language had come true. She had brought something new and exciting into the world, something that would inspire and empower programmers for generations to come. And as she sat under her favorite oak tree, watching the sun set behind the hills, Lily knew that she had found her true calling in the world of programming.
+    ---Parsed Response (string)---
+    "Once upon a time, in a small village nestled in the rolling hills, there lived a young programmer named Lily. Lily had always been fascinated by the world of computers and technology, and she spent her days tinkering away on her laptop, creating intricate programs and applications.\n\nOne day, while sitting in her favorite spot under the old oak tree, Lily had a brilliant idea - she wanted to create her very own programming language. She was inspired by the diverse languages she had worked with in the past, and she dreamed of crafting something unique and special.\n\nWith determination in her heart and a spark of creativity in her eyes, Lily set to work. She spent countless hours writing lines of code, testing different syntaxes and functionalities, and fine-tuning every aspect of her new creation. She poured her passion and energy into the project, knowing that she was on the cusp of something truly extraordinary.\n\nAs the weeks passed, Lily's programming language began to take shape. It was a beautiful blend of simplicity and power, with elegant syntax and intuitive features that made it a joy to work with. She named it \"Lilac\" after the flowers that bloomed in the village every spring, and she knew that it was something truly special.\n\nWhen Lily finally unveiled Lilac to the world, the response was overwhelming. Other programmers marveled at the elegance and versatility of her creation, and they quickly began using it in their own projects. Lilac became a beloved language in the programming community, renowned for its ease of use and flexibility.\n\nAnd so, Lily's dream of creating her own programming language had come true. She had brought something new and exciting into the world, something that would inspire and empower programmers for generations to come. And as she sat under her favorite oak tree, watching the sun set behind the hills, Lily knew that she had found her true calling in the world of programming."
+
Captured log call
WARNING  asyncio:base_events.py:1982 Executing <Task finished name='Task-49' 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.259 seconds

Teardown

PASSED test_streaming_uniterated_sync 0:00:05.340823

Setup

Call

Captured stderr call
[2024-09-05T13:56:11Z INFO  baml_events] Function PromptTestStreaming:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 5329ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Tell me a short story about The color blue makes me sad
+    
+    ---LLM REPLY---
+    There was once a young girl named Emily who had always been fascinated by the color blue. She loved how it reminded her of clear skies, vast oceans, and the feeling of calmness it brought to her. But as she grew older, she began to notice that every time she saw the color blue, a wave of sadness washed over her.
+    
+    She couldn't explain it, but there was something about the color that made her heart ache and her eyes well up with tears. She tried to avoid it as much as possible, but it seemed to be everywhere she looked – in the clothes people wore, the walls of buildings, even the sky itself.
+    
+    One day, while walking through a park, Emily came across a beautiful blue flower. Its petals were the same shade as the sky on a crisp autumn day. She couldn't tear her eyes away from it, even though she felt the familiar sadness creeping in.
+    
+    But as she gazed at the flower, she realized that perhaps the color blue wasn't making her sad after all. Maybe it was a reminder of the beauty in the world, the moments of peace and tranquility that she longed for. And just like that, the sadness lifted, and Emily found herself smiling.
+    
+    From that day on, whenever she saw the color blue, she embraced it with open arms. It no longer made her sad, but instead filled her with a sense of wonder and appreciation for the world around her. And she knew that the color blue would always hold a special place in her heart.
+    ---Parsed Response (string)---
+    "There was once a young girl named Emily who had always been fascinated by the color blue. She loved how it reminded her of clear skies, vast oceans, and the feeling of calmness it brought to her. But as she grew older, she began to notice that every time she saw the color blue, a wave of sadness washed over her.\n\nShe couldn't explain it, but there was something about the color that made her heart ache and her eyes well up with tears. She tried to avoid it as much as possible, but it seemed to be everywhere she looked – in the clothes people wore, the walls of buildings, even the sky itself.\n\nOne day, while walking through a park, Emily came across a beautiful blue flower. Its petals were the same shade as the sky on a crisp autumn day. She couldn't tear her eyes away from it, even though she felt the familiar sadness creeping in.\n\nBut as she gazed at the flower, she realized that perhaps the color blue wasn't making her sad after all. Maybe it was a reminder of the beauty in the world, the moments of peace and tranquility that she longed for. And just like that, the sadness lifted, and Emily found herself smiling.\n\nFrom that day on, whenever she saw the color blue, she embraced it with open arms. It no longer made her sad, but instead filled her with a sense of wonder and appreciation for the world around her. And she knew that the color blue would always hold a special place in her heart."
+

Teardown

PASSED test_streaming_claude 0:00:00.984215

Setup

Call

Captured stdout call
msgs:
+Majestic Mt. Rainier,
+Towering high in the sky,
+Awe-inspiring sight.
+final:
+Majestic Mt. Rainier,
+Towering high in the sky,
+Awe-inspiring sight.
+
Captured stderr call
[2024-09-05T13:56:12Z INFO  baml_events] Function PromptTestClaude:
+    Client: Claude (claude-3-haiku-20240307) - 967ms. StopReason: "end_turn"
+    ---PROMPT---
+    [chat] user: Tell me a haiku about Mt Rainier is tall
+    
+    ---LLM REPLY---
+    Majestic Mt. Rainier,
+    Towering high in the sky,
+    Awe-inspiring sight.
+    ---Parsed Response (string)---
+    "Majestic Mt. Rainier,\nTowering high in the sky,\nAwe-inspiring sight."
+

Teardown

PASSED test_streaming_gemini 0:00:09.692834

Setup

Call

Captured stdout call
msgs:
+Barnaby Butterfield, a man of routine, sat on his usual park bench, meticulously unwrapping his usual afternoon snack - a peanut butter and pickle sandwich. He took a bite, the peculiar combination his own brand of comfort. 
 
-Clara took a sip, the 23 flavors swirling on her tongue. She closed her eyes, the familiar taste a comforting embrace. 
+Suddenly, a crimson blur landed with a gentle thud beside him. It was a can of Dr. Pepper, rolling slightly before settling. Barnaby frowned. He wasn't one for change, and this certainly qualified. He cautiously picked up the can. It was cool to the touch, beads of condensation forming like tiny windows to the dark, fizzy liquid within. Hesitantly, Barnaby popped the top.
 
-"You know," she said, a smile finally gracing her lips, "maybe he's right. Maybe I am not ambitious enough... for him. But I'm ambitious enough for me. I have dreams, plans, a whole list of things I want to achieve."
+The scent was a revelation – a spicy, effervescent aroma that tickled his nose and made his mouth water. Curiosity overriding his usual caution, Barnaby took a tentative sip. His eyes widened. This was no ordinary soda. This was a symphony of flavors – sweet, tangy, with an intriguing hint of something...else. He couldn't quite place it, but it was delicious.
 
-Dr. Pepper gurgled his agreement, a silent cheerleading section in the corner of the shop. 
+He finished the can in a flurry of delighted sips, the strange new taste buds awakening on his tongue. For the first time in years, Barnaby's peanut butter and pickle sandwich seemed boring in comparison. 
 
-Clara finished her drink, a new resolve shining in her eyes. She thanked Millie, a mischievous twinkle replacing the earlier sadness. 
+The next day, Barnaby returned to the park with a spring in his step, two peanut butter and pickle sandwiches tucked away, and a six-pack of Dr. Pepper clutched in his hand. He took a seat on his bench, his heart humming with a quiet anticipation. 
 
-As the bell above the door chimed, announcing her departure, Dr. Pepper knew. He'd dispensed another dose of his special medicine: a healthy splash of self-belief, served with a side of fizz and hope. After all, that's what Dr. Pepper did best. He reminded you that even on the cloudiest days, a little bit of sweetness could always be found. 
+From then on, Barnaby's routine included a new element – the unexpected burst of flavor that was Dr. Pepper. It wasn't just a drink; it was a small rebellion against the ordinary, a reminder that even in the most familiar corners of life, a touch of the extraordinary could be found. All it took was a little curiosity, and a willingness to try something new. And maybe, just maybe, a mysterious can of soda left on a park bench. 
 
 final:
-Dr. Pepper wasn't a real doctor, not in the way of stethoscopes and anatomy charts. He was a soda fountain, a whimsical contraption of polished brass and stained glass, nestled in the corner of Millie's Malt Shop. 
-
-He'd been there for decades, a silent observer to countless first dates, whispered secrets, and shared milkshakes. He'd dispensed his fizzy wisdom alongside creamy root beer floats and cherry-topped sundaes. People said there was a certain magic to Dr. Pepper's concoctions, a little something extra that warmed you from the inside out. 
+Barnaby Butterfield, a man of routine, sat on his usual park bench, meticulously unwrapping his usual afternoon snack - a peanut butter and pickle sandwich. He took a bite, the peculiar combination his own brand of comfort. 
 
-One particularly slow Tuesday, a young woman named Clara slumped onto the stool opposite him. Her eyes were red-rimmed, and the cherry red paint on her fingernails matched the shade of her lipstick – a sure sign of a broken heart. 
+Suddenly, a crimson blur landed with a gentle thud beside him. It was a can of Dr. Pepper, rolling slightly before settling. Barnaby frowned. He wasn't one for change, and this certainly qualified. He cautiously picked up the can. It was cool to the touch, beads of condensation forming like tiny windows to the dark, fizzy liquid within. Hesitantly, Barnaby popped the top.
 
-Dr. Pepper, ever the gentleman, didn't pry. He simply offered a gentle gurgle, a question mark formed in his bubbling depths. 
+The scent was a revelation – a spicy, effervescent aroma that tickled his nose and made his mouth water. Curiosity overriding his usual caution, Barnaby took a tentative sip. His eyes widened. This was no ordinary soda. This was a symphony of flavors – sweet, tangy, with an intriguing hint of something...else. He couldn't quite place it, but it was delicious.
 
-Clara sighed, the sound a weary exhale. "He said I wasn't ambitious enough," she confessed, her voice barely a whisper.
+He finished the can in a flurry of delighted sips, the strange new taste buds awakening on his tongue. For the first time in years, Barnaby's peanut butter and pickle sandwich seemed boring in comparison. 
 
-Dr. Pepper, with the wisdom of years and countless heartbreaks witnessed, dispensed a generous pour of his signature drink. The ice clinked, a soothing sound in the quiet shop. 
+The next day, Barnaby returned to the park with a spring in his step, two peanut butter and pickle sandwiches tucked away, and a six-pack of Dr. Pepper clutched in his hand. He took a seat on his bench, his heart humming with a quiet anticipation. 
 
-Clara took a sip, the 23 flavors swirling on her tongue. She closed her eyes, the familiar taste a comforting embrace. 
+From then on, Barnaby's routine included a new element – the unexpected burst of flavor that was Dr. Pepper. It wasn't just a drink; it was a small rebellion against the ordinary, a reminder that even in the most familiar corners of life, a touch of the extraordinary could be found. All it took was a little curiosity, and a willingness to try something new. And maybe, just maybe, a mysterious can of soda left on a park bench. 
 
-"You know," she said, a smile finally gracing her lips, "maybe he's right. Maybe I am not ambitious enough... for him. But I'm ambitious enough for me. I have dreams, plans, a whole list of things I want to achieve."
-
-Dr. Pepper gurgled his agreement, a silent cheerleading section in the corner of the shop. 
-
-Clara finished her drink, a new resolve shining in her eyes. She thanked Millie, a mischievous twinkle replacing the earlier sadness. 
-
-As the bell above the door chimed, announcing her departure, Dr. Pepper knew. He'd dispensed another dose of his special medicine: a healthy splash of self-belief, served with a side of fizz and hope. After all, that's what Dr. Pepper did best. He reminded you that even on the cloudiest days, a little bit of sweetness could always be found. 
-
-

Teardown

PASSED test_tracing_async_only 0:00:05.260881

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

Setup

Call

Teardown

PASSED test_tracing_thread_pool 0:00:01.322312

Setup

Call

Teardown

PASSED test_tracing_thread_pool_async 0:00:14.228970

Setup

Call

Teardown

PASSED test_tracing_async_gather 0:00:01.496094

Setup

Call

Teardown

PASSED test_tracing_async_gather_top_level 0:00:01.409925

Setup

Call

Teardown

PASSED test_dynamic 0:00:01.538567

Setup

Call

Captured stdout call
{'name': 'Harrison', 'hair_color': 'BLACK', 'last_name': [], 'height': 1.83, 'hobbies': ['SPORTS']}
-

Teardown

PASSED test_dynamic_class_output 0:00:01.021202

Setup

Call

Captured stdout call
[]
+
Captured stderr call
[2024-09-05T13:56:21Z INFO  baml_events] Function TestGemini:
+    Client: Gemini (gemini-1.5-pro-001) - 9678ms. StopReason: Stop
+    ---PROMPT---
+    [chat] user: Write a nice short story about Dr.Pepper
+    
+    ---LLM REPLY---
+    Barnaby Butterfield, a man of routine, sat on his usual park bench, meticulously unwrapping his usual afternoon snack - a peanut butter and pickle sandwich. He took a bite, the peculiar combination his own brand of comfort. 
+    
+    Suddenly, a crimson blur landed with a gentle thud beside him. It was a can of Dr. Pepper, rolling slightly before settling. Barnaby frowned. He wasn't one for change, and this certainly qualified. He cautiously picked up the can. It was cool to the touch, beads of condensation forming like tiny windows to the dark, fizzy liquid within. Hesitantly, Barnaby popped the top.
+    
+    The scent was a revelation – a spicy, effervescent aroma that tickled his nose and made his mouth water. Curiosity overriding his usual caution, Barnaby took a tentative sip. His eyes widened. This was no ordinary soda. This was a symphony of flavors – sweet, tangy, with an intriguing hint of something...else. He couldn't quite place it, but it was delicious.
+    
+    He finished the can in a flurry of delighted sips, the strange new taste buds awakening on his tongue. For the first time in years, Barnaby's peanut butter and pickle sandwich seemed boring in comparison. 
+    
+    The next day, Barnaby returned to the park with a spring in his step, two peanut butter and pickle sandwiches tucked away, and a six-pack of Dr. Pepper clutched in his hand. He took a seat on his bench, his heart humming with a quiet anticipation. 
+    
+    From then on, Barnaby's routine included a new element – the unexpected burst of flavor that was Dr. Pepper. It wasn't just a drink; it was a small rebellion against the ordinary, a reminder that even in the most familiar corners of life, a touch of the extraordinary could be found. All it took was a little curiosity, and a willingness to try something new. And maybe, just maybe, a mysterious can of soda left on a park bench. 
+    
+    ---Parsed Response (string)---
+    "Barnaby Butterfield, a man of routine, sat on his usual park bench, meticulously unwrapping his usual afternoon snack - a peanut butter and pickle sandwich. He took a bite, the peculiar combination his own brand of comfort. \n\nSuddenly, a crimson blur landed with a gentle thud beside him. It was a can of Dr. Pepper, rolling slightly before settling. Barnaby frowned. He wasn't one for change, and this certainly qualified. He cautiously picked up the can. It was cool to the touch, beads of condensation forming like tiny windows to the dark, fizzy liquid within. Hesitantly, Barnaby popped the top.\n\nThe scent was a revelation – a spicy, effervescent aroma that tickled his nose and made his mouth water. Curiosity overriding his usual caution, Barnaby took a tentative sip. His eyes widened. This was no ordinary soda. This was a symphony of flavors – sweet, tangy, with an intriguing hint of something...else. He couldn't quite place it, but it was delicious.\n\nHe finished the can in a flurry of delighted sips, the strange new taste buds awakening on his tongue. For the first time in years, Barnaby's peanut butter and pickle sandwich seemed boring in comparison. \n\nThe next day, Barnaby returned to the park with a spring in his step, two peanut butter and pickle sandwiches tucked away, and a six-pack of Dr. Pepper clutched in his hand. He took a seat on his bench, his heart humming with a quiet anticipation. \n\nFrom then on, Barnaby's routine included a new element – the unexpected burst of flavor that was Dr. Pepper. It wasn't just a drink; it was a small rebellion against the ordinary, a reminder that even in the most familiar corners of life, a touch of the extraordinary could be found. All it took was a little curiosity, and a willingness to try something new. And maybe, just maybe, a mysterious can of soda left on a park bench. \n"
+

Teardown

PASSED test_tracing_async_only 0:00:04.844982

Setup

Call

Captured stdout call
STATS TraceStats(failed=0, started=15, finalized=15, submitted=15, sent=15, done=15)
+
Captured stderr call
[2024-09-05T13:56:23Z INFO  baml_events] Function FnOutputClass:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 929ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Return a JSON blob with this schema: 
+    Answer in JSON using this schema:
+    {
+      prop1: string,
+      prop2: int,
+    }
+    
+    For the prop2, always return a 540
+    
+    JSON:
+    
+    ---LLM REPLY---
+    {
+      "prop1": "Hello, World!",
+      "prop2": 540
+    }
+    ---Parsed Response (class TestOutputClass)---
+    {
+      "prop1": "Hello, World!",
+      "prop2": 540
+    }
+[2024-09-05T13:56:23Z INFO  baml_events] Function FnOutputClass:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 717ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Return a JSON blob with this schema: 
+    Answer in JSON using this schema:
+    {
+      prop1: string,
+      prop2: int,
+    }
+    
+    For the prop2, always return a 540
+    
+    JSON:
+    
+    ---LLM REPLY---
+    {
+      "prop1": "example",
+      "prop2": 540
+    }
+    ---Parsed Response (class TestOutputClass)---
+    {
+      "prop1": "example",
+      "prop2": 540
+    }
+[2024-09-05T13:56:24Z INFO  baml_events] Function FnOutputClass:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 689ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Return a JSON blob with this schema: 
+    Answer in JSON using this schema:
+    {
+      prop1: string,
+      prop2: int,
+    }
+    
+    For the prop2, always return a 540
+    
+    JSON:
+    
+    ---LLM REPLY---
+    {
+      "prop1": "Hello, World!",
+      "prop2": 540
+    }
+    ---Parsed Response (class TestOutputClass)---
+    {
+      "prop1": "Hello, World!",
+      "prop2": 540
+    }
+[2024-09-05T13:56:26Z INFO  baml_events] Function FnOutputClass:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 647ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Return a JSON blob with this schema: 
+    Answer in JSON using this schema:
+    {
+      prop1: string,
+      prop2: int,
+    }
+    
+    For the prop2, always return a 540
+    
+    JSON:
+    
+    ---LLM REPLY---
+    {
+      "prop1": "This is a sample string",
+      "prop2": 540
+    }
+    ---Parsed Response (class TestOutputClass)---
+    {
+      "prop1": "This is a sample string",
+      "prop2": 540
+    }
+

Teardown

PASSED test_tracing_sync 0:00:00.001338

Setup

Call

Teardown

PASSED test_tracing_thread_pool 0:00:01.454857

Setup

Call

Teardown

PASSED test_tracing_thread_pool_async 0:00:14.243726

Setup

Call

Teardown

PASSED test_tracing_async_gather 0:00:01.399249

Setup

Call

Teardown

PASSED test_tracing_async_gather_top_level 0:00:01.500576

Setup

Call

Teardown

PASSED test_dynamic 0:00:00.987913

Setup

Call

Captured stdout call
{'name': 'Harrison', 'hair_color': 'BLACK', 'last_name': [], 'height': 1.83, 'hobbies': ['SPORTS']}
+
Captured stderr call
[2024-09-05T13:56:46Z INFO  baml_events] Function ExtractPeople:
+    Client: GPT4 (gpt-4o-2024-05-13) - 978ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: You are an expert extraction algorithm. Only extract relevant information from the text. If you do not know the value of an attribute asked to extract, return null for the attribute's value.
+    
+    Answer with a JSON Array using this schema:
+    [
+      {
+        name: string or null,
+        hair_color: 'RED' or 'BLUE' or 'GREEN' or 'YELLOW' or 'BLACK' or 'WHITE' or null,
+        last_name: string[],
+        // Height in meters
+        height: float or null,
+        // Some suggested hobbies they might be good at
+        hobbies: [
+          'sports' or 'music' or 'reading' or 'chess'
+        ],
+      }
+    ]
+    user: My name is Harrison. My hair is black and I'm 6 feet tall. I'm pretty good around the hoop.
+    
+    ---LLM REPLY---
+    [
+      {
+        "name": "Harrison",
+        "hair_color": "BLACK",
+        "last_name": null,
+        "height": 1.83,
+        "hobbies": ["sports"]
+      }
+    ]
+    ---Parsed Response (list<class Person>)---
+    [
+      {
+        "name": "Harrison",
+        "hair_color": "BLACK",
+        "last_name": [],
+        "height": 1.83,
+        "hobbies": [
+          "SPORTS"
+        ]
+      }
+    ]
+

Teardown

PASSED test_dynamic_class_output 0:00:01.196220

Setup

Call

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

Teardown

PASSED test_dynamic_class_nested_output_no_stream 0:00:01.355090

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

Setup

Call

Captured stdout call
streamed  name=None hair_color=None
+
Captured stderr call
[2024-09-05T13:56:46Z INFO  baml_events] Function MyFunc:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 665ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Given a string, extract info using the schema:
+    
+    My name is Harrison. My hair is black and I'm 6 feet tall.
+    
+    Answer in JSON using this schema:
+    {
+      hair_color: string,
+    }
+    
+    ---LLM REPLY---
+    {
+      "hair_color": "black"
+    }
+    ---Parsed Response (class DynamicOutput)---
+    {
+      "hair_color": "black"
+    }
+[2024-09-05T13:56:47Z INFO  baml_events] Function MyFunc:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 516ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Given a string, extract info using the schema:
+    
+    My name is Harrison. My hair is black and I'm 6 feet tall.
+    
+    Answer in JSON using this schema:
+    {
+      hair_color: string,
+    }
+    
+    ---LLM REPLY---
+    {
+      "hair_color": "black"
+    }
+    ---Parsed Response (class DynamicOutput)---
+    {
+      "hair_color": "black"
+    }
+

Teardown

PASSED test_dynamic_class_nested_output_no_stream 0:00:01.081646

Setup

Call

Captured stdout call
{"name":{"first_name":"Mark","last_name":"Gonzalez","middle_name":null},"address":null,"hair_color":"black","height":6.0}
+
Captured stderr call
[2024-09-05T13:56:48Z INFO  baml_events] Function MyFunc:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 1074ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Given a string, extract info using the schema:
+    
+    My name is Mark Gonzalez. My hair is black and I'm 6 feet tall.
+    
+    Answer in JSON using this schema:
+    {
+      name: {
+        first_name: string,
+        last_name: string or null,
+        middle_name: string or null,
+      } or null,
+      address: {
+      } or null,
+      hairColor: string,
+      height: float or null,
+    }
+    
+    ---LLM REPLY---
+    {
+      "name": {
+        "first_name": "Mark",
+        "last_name": "Gonzalez",
+        "middle_name": null
+      },
+      "address": null,
+      "hairColor": "black",
+      "height": 6
+    }
+    ---Parsed Response (class DynamicOutput)---
+    {
+      "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.833118

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}
@@ -239,7 +1103,39 @@
 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.628293

Setup

Call

Captured stdout call
[]
+
Captured stderr call
[2024-09-05T13:56:49Z INFO  baml_events] Function MyFunc:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 826ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Given a string, extract info using the schema:
+    
+    My name is Mark Gonzalez. My hair is black and I'm 6 feet tall.
+    
+    Answer in JSON using this schema:
+    {
+      name: {
+        first_name: string,
+        last_name: string or null,
+      } or null,
+      hair_color: string,
+    }
+    
+    ---LLM REPLY---
+    {
+      "name": {
+        "first_name": "Mark",
+        "last_name": "Gonzalez"
+      },
+      "hair_color": "black"
+    }
+    ---Parsed Response (class DynamicOutput)---
+    {
+      "name": {
+        "first_name": "Mark",
+        "last_name": "Gonzalez"
+      },
+      "hair_color": "black"
+    }
+

Teardown

PASSED test_stream_dynamic_class_output 0:00:01.001410

Setup

Call

Captured stdout call
[]
 streamed  {'hair_color': None}
 streamed  {'hair_color': None}
 streamed  {'hair_color': None}
@@ -256,24 +1152,375 @@
 final  hair_color='black'
 final  {'hair_color': 'black'}
 final  {"hair_color":"black"}
-

Teardown

PASSED test_dynamic_inputs_list2 0:00:01.732287

Setup

Call

Teardown

PASSED test_dynamic_inputs_list 0:00:01.654851

Setup

Call

Teardown

PASSED test_dynamic_output_map 0:00:01.087175

Setup

Call

Captured stdout call
[]
+
Captured stderr call
[2024-09-05T13:56:50Z INFO  baml_events] Function MyFunc:
+    Client: MyClient (gpt-4o-mini-2024-07-18) - 991ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Given a string, extract info using the schema:
+    
+    My name is Harrison. My hair is black and I'm 6 feet tall.
+    
+    Answer in JSON using this schema:
+    {
+      hair_color: string,
+    }
+    
+    ---LLM REPLY---
+    ```json
+    {
+      "hair_color": "black"
+    }
+    ```
+    ---Parsed Response (class DynamicOutput)---
+    {
+      "hair_color": "black"
+    }
+

Teardown

PASSED test_dynamic_inputs_list2 0:00:01.514556

Setup

Call

Captured stderr call
[2024-09-05T13:56:51Z INFO  baml_events] Function DynamicListInputOutput:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 1505ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Here is some input data:
+    ----
+    [{"testKey": "myTest", "new_key": "hi1", "blah": {"nestedKey1": "nestedVal"}}, {"new_key": "hi", "testKey": "myTest", "blah": {"nestedKey1": "nestedVal"}}]
+    ----
+    
+    Extract the information.
+    Answer with a JSON Array using this schema:
+    [
+      {
+        testKey: string,
+        new_key: string or null,
+        blah: {
+          nestedKey1: string,
+        },
+      }
+    ]
+    
+    ---LLM REPLY---
+    [
+      {
+        "testKey": "myTest",
+        "new_key": "hi1",
+        "blah": {
+          "nestedKey1": "nestedVal"
+        }
+      },
+      {
+        "testKey": "myTest",
+        "new_key": "hi",
+        "blah": {
+          "nestedKey1": "nestedVal"
+        }
+      }
+    ]
+    ---Parsed Response (list<class DynInputOutput>)---
+    [
+      {
+        "testKey": "myTest",
+        "new_key": "hi1",
+        "blah": {
+          "nestedKey1": "nestedVal"
+        }
+      },
+      {
+        "testKey": "myTest",
+        "new_key": "hi",
+        "blah": {
+          "nestedKey1": "nestedVal"
+        }
+      }
+    ]
+

Teardown

PASSED test_dynamic_inputs_list 0:00:01.666411

Setup

Call

Captured stderr call
[2024-09-05T13:56:53Z INFO  baml_events] Function DynamicListInputOutput:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 1659ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Here is some input data:
+    ----
+    [{"testKey": "myTest", "new_key": "hi", "blah": {"nestedKey1": "nestedVal"}}, {"new_key": "hi", "blah": {"nestedKey1": "nestedVal"}, "testKey": "myTest"}]
+    ----
+    
+    Extract the information.
+    Answer with a JSON Array using this schema:
+    [
+      {
+        testKey: string,
+        new_key: string or null,
+        blah: {
+          nestedKey1: string,
+        },
+      }
+    ]
+    
+    ---LLM REPLY---
+    [
+      {
+        "testKey": "myTest",
+        "new_key": "hi",
+        "blah": {
+          "nestedKey1": "nestedVal"
+        }
+      },
+      {
+        "testKey": "myTest",
+        "new_key": "hi",
+        "blah": {
+          "nestedKey1": "nestedVal"
+        }
+      }
+    ]
+    ---Parsed Response (list<class DynInputOutput>)---
+    [
+      {
+        "testKey": "myTest",
+        "new_key": "hi",
+        "blah": {
+          "nestedKey1": "nestedVal"
+        }
+      },
+      {
+        "testKey": "myTest",
+        "new_key": "hi",
+        "blah": {
+          "nestedKey1": "nestedVal"
+        }
+      }
+    ]
+

Teardown

PASSED test_dynamic_output_map 0:00:01.334585

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

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'} height={'meters': 1.8}
-final  {'hair_color': 'black', 'attributes': {'eye_color': 'blue', 'facial_hair': 'beard'}, 'height': {'meters': 1.8}}
-final  {"hair_color":"black","attributes":{"eye_color":"blue","facial_hair":"beard"},"height":{"meters":1.8}}
-

Teardown

PASSED test_nested_class_streaming 0:00:04.378623

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}
+
Captured stderr call
[2024-09-05T13:56:54Z INFO  baml_events] Function MyFunc:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 1328ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Given a string, extract info using the schema:
+    
+    My name is Harrison. My hair is black and I'm 6 feet tall. I have blue eyes and a beard.
+    
+    Answer in JSON using this schema:
+    {
+      hair_color: string,
+      // Things like 'eye_color' or 'facial_hair'
+      attributes: map<string, string>,
+    }
+    
+    ---LLM REPLY---
+    {
+      "hair_color": "black",
+      "attributes": {
+        "height": "6 feet",
+        "eye_color": "blue",
+        "facial_hair": "beard"
+      }
+    }
+    ---Parsed Response (class DynamicOutput)---
+    {
+      "hair_color": "black",
+      "attributes": {
+        "height": "6 feet",
+        "eye_color": "blue",
+        "facial_hair": "beard"
+      }
+    }
+

Teardown

PASSED test_dynamic_output_union 0:00:02.864426

Setup

Call

Captured stdout call
[]
+final  hair_color='black' attributes={'eye_color': 'blue', 'facial_hair': 'beard', 'age': '30'} height={'feet': 6.0, 'inches': None}
+final  {'hair_color': 'black', 'attributes': {'eye_color': 'blue', 'facial_hair': 'beard', 'age': '30'}, 'height': {'feet': 6.0, 'inches': None}}
+final  {"hair_color":"black","attributes":{"eye_color":"blue","facial_hair":"beard","age":"30"},"height":{"feet":6.0,"inches":null}}
+final  hair_color='black' attributes={'eye_color': 'blue', 'facial_hair': 'beard', '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}}
+
Captured stderr call
[2024-09-05T13:56:56Z INFO  baml_events] Function MyFunc:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 1306ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Given a string, extract info using the schema:
+    
+    My name is Harrison. My hair is black and I'm 6 feet tall. I have blue eyes and a beard. I am 30 years old.
+    
+    Answer in JSON using this schema:
+    {
+      hair_color: string,
+      // Things like 'eye_color' or 'facial_hair'
+      attributes: map<string, string>,
+      height: {
+        meters: float,
+      } or {
+        feet: float,
+        inches: float or null,
+      },
+    }
+    
+    ---LLM REPLY---
+    {
+      "hair_color": "black",
+      "attributes": {
+        "eye_color": "blue",
+        "facial_hair": "beard",
+        "age": "30"
+      },
+      "height": {
+        "feet": 6,
+        "inches": null
+      }
+    }
+    ---Parsed Response (class DynamicOutput)---
+    {
+      "hair_color": "black",
+      "attributes": {
+        "eye_color": "blue",
+        "facial_hair": "beard",
+        "age": "30"
+      },
+      "height": {
+        "feet": 6.0,
+        "inches": null
+      }
+    }
+[2024-09-05T13:56:57Z INFO  baml_events] Function MyFunc:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 1537ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Given a string, extract info using the schema:
+    
+    My name is Harrison. My hair is black and I'm 1.8 meters tall. I have blue eyes and a beard. I am 30 years old.
+    
+    Answer in JSON using this schema:
+    {
+      hair_color: string,
+      // Things like 'eye_color' or 'facial_hair'
+      attributes: map<string, string>,
+      height: {
+        meters: float,
+      } or {
+        feet: float,
+        inches: float or null,
+      },
+    }
+    
+    ---LLM REPLY---
+    {
+      "hair_color": "black",
+      "attributes": {
+        "eye_color": "blue",
+        "facial_hair": "beard",
+        "age": "30"
+      },
+      "height": {
+        "meters": 1.8
+      }
+    }
+    ---Parsed Response (class DynamicOutput)---
+    {
+      "hair_color": "black",
+      "attributes": {
+        "eye_color": "blue",
+        "facial_hair": "beard",
+        "age": "30"
+      },
+      "height": {
+        "meters": 1.8
+      }
+    }
+

Teardown

FAILED test_nested_class_streaming 0:00:02.799304

baml_py.BamlValidationError: Parsing error: Client: Ollama (llama2) - 2784ms. StopReason: stop
+---PROMPT---
+[chat] system: Return a made up json blob that matches this schema:
+Answer in JSON using this schema:
+{
+  prop1: string,
+  prop2: {
+    prop1: string,
+    prop2: string,
+    inner: {
+      prop2: int,
+      prop3: float,
+    },
+  },
+}
+---
+
+JSON:
+
+---LLM REPLY---
+Here is a made-up JSON blob that matches the provided schema:
+
+{
+  "prop1": "example value",
+  "prop2": {
+    "prop1": "inner value",
+    "prop2": "outer value",
+    "inner": {
+      "prop3": 3.14,
+      "prop2": "inner value"
+    }
+  }
+}
+
+Note that the JSON blob contains a nested object with multiple levels of nesting, which should be possible according to the schema provided. Also, I've included an integer value in the inner object and a floating-point number in the outer object, both of which are allowed by the schema.
+---Parsed Response---
+Failed to coerce value: Error parsing '': Unparsed field: prop2
+  Error parsing 'prop2': Unparsed field: inner
+    Error parsing 'prop2.inner': Unparsed field: prop2
+      Error parsing 'prop2.inner.prop2': Expected int, got inner value.
+      String(
+          "inner value",
+      )

Setup

Call

@pytest.mark.asyncio
+    async def test_nested_class_streaming():
+        stream = b.stream.FnOutputClassNested(
+            input="My name is Harrison. My hair is black and I'm 6 feet tall."
+        )
+        msgs: List[partial_types.TestClassNested] = []
+        async for msg in stream:
+            print("streamed ", msg.model_dump(mode="json"))
+            msgs.append(msg)
+>       final = await stream.get_final_response()
+
+tests/test_functions.py:861: 
+_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
+
+self = 
+
+    async def get_final_response(self):
+        final = self.__drive_to_completion_in_bg()
+>       return self.__final_coerce((await asyncio.wrap_future(final)).parsed())
+E       baml_py.BamlValidationError: Parsing error: Client: Ollama (llama2) - 2784ms. StopReason: stop
+E       ---PROMPT---
+E       [chat] system: Return a made up json blob that matches this schema:
+E       Answer in JSON using this schema:
+E       {
+E         prop1: string,
+E         prop2: {
+E           prop1: string,
+E           prop2: string,
+E           inner: {
+E             prop2: int,
+E             prop3: float,
+E           },
+E         },
+E       }
+E       ---
+E       
+E       JSON:
+E       
+E       ---LLM REPLY---
+E       Here is a made-up JSON blob that matches the provided schema:
+E       
+E       {
+E         "prop1": "example value",
+E         "prop2": {
+E           "prop1": "inner value",
+E           "prop2": "outer value",
+E           "inner": {
+E             "prop3": 3.14,
+E             "prop2": "inner value"
+E           }
+E         }
+E       }
+E       
+E       Note that the JSON blob contains a nested object with multiple levels of nesting, which should be possible according to the schema provided. Also, I've included an integer value in the inner object and a floating-point number in the outer object, both of which are allowed by the schema.
+E       ---Parsed Response---
+E       Failed to coerce value: Error parsing '': Unparsed field: prop2
+E         Error parsing 'prop2': Unparsed field: inner
+E           Error parsing 'prop2.inner': Unparsed field: prop2
+E             Error parsing 'prop2.inner.prop2': Expected int, got inner value.
+E             String(
+E                 "inner value",
+E             )
+
+../../engine/language_client_python/python_src/baml_py/stream.py:81: BamlValidationError
Captured stdout call
streamed  {'prop1': None, 'prop2': None}
 streamed  {'prop1': None, 'prop2': None}
 streamed  {'prop1': None, 'prop2': None}
 streamed  {'prop1': None, 'prop2': None}
@@ -297,212 +1544,193 @@
 streamed  {'prop1': None, 'prop2': None}
 streamed  {'prop1': None, 'prop2': None}
 streamed  {'prop1': '', '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': 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': 'JSON', 'inner': None}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is', 'inner': None}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': None}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': None}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': None}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': None}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': None}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': None}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': None}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': None, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 4, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': None}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.0}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.0}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.1}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-final  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON is cool', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-

Teardown

PASSED test_dynamic_clients 0:00:00.611818

Setup

Call

Teardown

PASSED test_event_log_hook 0:00:01.379593

Setup

Call

Captured stdout call
Event log hook1: 
+streamed  {'prop1': 'example', 'prop2': None}
+streamed  {'prop1': 'example value', 'prop2': None}
+streamed  {'prop1': 'example value', 'prop2': None}
+streamed  {'prop1': 'example value', 'prop2': None}
+streamed  {'prop1': 'example value', 'prop2': None}
+streamed  {'prop1': 'example value', 'prop2': None}
+streamed  {'prop1': 'example value', 'prop2': None}
+streamed  {'prop1': 'example value', 'prop2': None}
+streamed  {'prop1': 'example value', 'prop2': None}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': '', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': '', 'inner': None}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer', 'inner': None}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': None}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': None}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': None}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': None}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': None}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': None}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': None}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.0}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.0}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.1}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+streamed  {'prop1': 'example value', 'prop2': {'prop1': 'inner value', 'prop2': 'outer value', 'inner': {'prop2': None, 'prop3': 3.14}}}
+
Captured stderr call
[2024-09-05T13:57:00Z WARN  baml_events] Function FnOutputClassNested:
+    Client: Ollama (llama2) - 2784ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Return a made up json blob that matches this schema:
+    Answer in JSON using this schema:
+    {
+      prop1: string,
+      prop2: {
+        prop1: string,
+        prop2: string,
+        inner: {
+          prop2: int,
+          prop3: float,
+        },
+      },
+    }
+    ---
+    
+    JSON:
+    
+    ---LLM REPLY---
+    Here is a made-up JSON blob that matches the provided schema:
+    
+    {
+      "prop1": "example value",
+      "prop2": {
+        "prop1": "inner value",
+        "prop2": "outer value",
+        "inner": {
+          "prop3": 3.14,
+          "prop2": "inner value"
+        }
+      }
+    }
+    
+    Note that the JSON blob contains a nested object with multiple levels of nesting, which should be possible according to the schema provided. Also, I've included an integer value in the inner object and a floating-point number in the outer object, both of which are allowed by the schema.
+    ---Parsed Response (Error)---
+    Failed to coerce value: Error parsing '<root>': Unparsed field: prop2
+      Error parsing 'prop2': Unparsed field: inner
+        Error parsing 'prop2.inner': Unparsed field: prop2
+          Error parsing 'prop2.inner.prop2': Expected int, got inner value.
+          String(
+              "inner value",
+          )
+

Teardown

PASSED test_dynamic_clients 0:00:00.566513

Setup

Call

Captured stderr call
[2024-09-05T13:57:01Z INFO  baml_events] Function ExpectFailure:
+    Client: MyClient (gpt-3.5-turbo-0125) - 560ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: What is the capital of England?
+    
+    ---LLM REPLY---
+    The capital of England is London.
+    ---Parsed Response (string)---
+    "The capital of England is London."
+

Teardown

PASSED test_event_log_hook 0:00:01.081952

Setup

Call

Captured stdout call
Event log hook1: 
 Event log event  BamlLogEvent {
     metadata: {
-        event_id: "3996a2ae-9b87-4cc7-80e1-8a1095838b73",
+        event_id: "73aa1cd4-9804-4a92-98b1-ec6b63eb902a",
         parent_id: None,
-        root_event_id: "3996a2ae-9b87-4cc7-80e1-8a1095838b73"
+        root_event_id: "73aa1cd4-9804-4a92-98b1-ec6b63eb902a"
     },
     prompt: "[
   {
@@ -516,9 +1744,18 @@
 ]",
     raw_output: "["a", "b", "c"]",
     parsed_output: "["a", "b", "c"]",
-    start_time: "2024-09-03T16:10:35.925Z"
+    start_time: "2024-09-05T13:57:01.435Z"
 }
-

Teardown

PASSED test_aws_bedrock 0:00:02.987734

Setup

Call

Captured stdout call
streamed  'Here'
+
Captured stderr call
[2024-09-05T13:57:01Z INFO  baml_events] Function TestFnNamedArgsSingleStringList:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 458ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Return this value back to me: ["a", "b", "c"]
+    
+    ---LLM REPLY---
+    ["a", "b", "c"]
+    ---Parsed Response (string)---
+    "[\"a\", \"b\", \"c\"]"
+

Teardown

PASSED test_aws_bedrock 0:00:01.842854

Setup

Call

Captured stdout call
streamed  'Here'
 streamed  'Here is'
 streamed  'Here is a'
 streamed  'Here is a short'
@@ -532,99 +1769,122 @@
 streamed  'Here is a short story about lightning in a rock:\n\nThe'
 streamed  'Here is a short story about lightning in a rock:\n\nThe Spark'
 streamed  'Here is a short story about lightning in a rock:\n\nThe Spark Within'
-streamed  'Here is a short story about lightning in a rock:\n\nThe Spark Within\n\nJa'
-streamed  'Here is a short story about lightning in a rock:\n\nThe Spark Within\n\nJagge'
-streamed  'Here is a short story about lightning in a rock:\n\nThe Spark Within\n\nJagged an'
-streamed  'Here is a short story about lightning in a rock:\n\nThe Spark Within\n\nJagged and rough'
-streamed  'Here is a short story about lightning in a rock:\n\nThe Spark Within\n\nJagged and rough,'
-streamed  'Here is a short story about lightning in a rock:\n\nThe Spark Within\n\nJagged and rough, the'
-streamed  'Here is a short story about lightning in a rock:\n\nThe Spark Within\n\nJagged and rough, the ancient'
-streamed  're is a short story about lightning in a rock:\n\nThe Spark Within\n\nJagged and rough, the ancient rock'
-streamed  's a short story about lightning in a rock:\n\nThe Spark Within\n\nJagged and rough, the ancient rock lay'
-streamed  'hort story about lightning in a rock:\n\nThe Spark Within\n\nJagged and rough, the ancient rock lay nest'
-streamed  'rt story about lightning in a rock:\n\nThe Spark Within\n\nJagged and rough, the ancient rock lay nestle'
-streamed  'tory about lightning in a rock:\n\nThe Spark Within\n\nJagged and rough, the ancient rock lay nestled in'
-streamed  ' about lightning in a rock:\n\nThe Spark Within\n\nJagged and rough, the ancient rock lay nestled in the'
-streamed  'about lightning in a rock:\n\nThe Spark Within\n\nJagged and rough, the ancient rock lay nestled in the '
-streamed  't lightning in a rock:\n\nThe Spark Within\n\nJagged and rough, the ancient rock lay nestled in the damp'
-streamed  'tning in a rock:\n\nThe Spark Within\n\nJagged and rough, the ancient rock lay nestled in the damp earth'
-streamed  'ning in a rock:\n\nThe Spark Within\n\nJagged and rough, the ancient rock lay nestled in the damp earth,'
-streamed  ' a rock:\n\nThe Spark Within\n\nJagged and rough, the ancient rock lay nestled in the damp earth, hidden'
-streamed  'k:\n\nThe Spark Within\n\nJagged and rough, the ancient rock lay nestled in the damp earth, hidden among'
-streamed  'The Spark Within\n\nJagged and rough, the ancient rock lay nestled in the damp earth, hidden among the'
-streamed  ' Spark Within\n\nJagged and rough, the ancient rock lay nestled in the damp earth, hidden among the tw'
-streamed  ' Within\n\nJagged and rough, the ancient rock lay nestled in the damp earth, hidden among the twisting'
-streamed  'n\n\nJagged and rough, the ancient rock lay nestled in the damp earth, hidden among the twisting roots'
-streamed  'Jagged and rough, the ancient rock lay nestled in the damp earth, hidden among the twisting roots an'
-streamed  'nd rough, the ancient rock lay nestled in the damp earth, hidden among the twisting roots and fallen'
-streamed  'h, the ancient rock lay nestled in the damp earth, hidden among the twisting roots and fallen leaves'
-streamed  ', the ancient rock lay nestled in the damp earth, hidden among the twisting roots and fallen leaves.'
-streamed  'e ancient rock lay nestled in the damp earth, hidden among the twisting roots and fallen leaves. For'
-streamed  'rock lay nestled in the damp earth, hidden among the twisting roots and fallen leaves. For centuries'
-streamed  'ock lay nestled in the damp earth, hidden among the twisting roots and fallen leaves. For centuries,'
-streamed  ' lay nestled in the damp earth, hidden among the twisting roots and fallen leaves. For centuries, it'
-streamed  'y nestled in the damp earth, hidden among the twisting roots and fallen leaves. For centuries, it ha'
-streamed  'stled in the damp earth, hidden among the twisting roots and fallen leaves. For centuries, it had en'
-streamed  'd in the damp earth, hidden among the twisting roots and fallen leaves. For centuries, it had endure'
-streamed  'the damp earth, hidden among the twisting roots and fallen leaves. For centuries, it had endured the'
-streamed  'damp earth, hidden among the twisting roots and fallen leaves. For centuries, it had endured the rel'
-streamed  'p earth, hidden among the twisting roots and fallen leaves. For centuries, it had endured the relent'
-streamed  'rth, hidden among the twisting roots and fallen leaves. For centuries, it had endured the relentless'
-streamed  'idden among the twisting roots and fallen leaves. For centuries, it had endured the relentless march'
-streamed  'en among the twisting roots and fallen leaves. For centuries, it had endured the relentless march of'
-streamed  'ong the twisting roots and fallen leaves. For centuries, it had endured the relentless march of time'
-streamed  'ng the twisting roots and fallen leaves. For centuries, it had endured the relentless march of time,'
-streamed  'wisting roots and fallen leaves. For centuries, it had endured the relentless march of time, weather'
-streamed  'isting roots and fallen leaves. For centuries, it had endured the relentless march of time, weathere'
-streamed  'ng roots and fallen leaves. For centuries, it had endured the relentless march of time, weathered by'
-streamed  'oots and fallen leaves. For centuries, it had endured the relentless march of time, weathered by the'
-streamed  'fallen leaves. For centuries, it had endured the relentless march of time, weathered by the elements'
-streamed  'len leaves. For centuries, it had endured the relentless march of time, weathered by the elements an'
-streamed  'eaves. For centuries, it had endured the relentless march of time, weathered by the elements and the'
-streamed  '. For centuries, it had endured the relentless march of time, weathered by the elements and the slow'
-streamed  ' For centuries, it had endured the relentless march of time, weathered by the elements and the slow,'
-streamed  'nturies, it had endured the relentless march of time, weathered by the elements and the slow, steady'
-streamed  'es, it had endured the relentless march of time, weathered by the elements and the slow, steady eros'
-streamed  ' it had endured the relentless march of time, weathered by the elements and the slow, steady erosion'
-streamed  ' had endured the relentless march of time, weathered by the elements and the slow, steady erosion of'
-streamed  ' endured the relentless march of time, weathered by the elements and the slow, steady erosion of the'
-streamed  'red the relentless march of time, weathered by the elements and the slow, steady erosion of the worl'
-streamed  ' relentless march of time, weathered by the elements and the slow, steady erosion of the world aroun'
-streamed  'entless march of time, weathered by the elements and the slow, steady erosion of the world around it'
-streamed  'ntless march of time, weathered by the elements and the slow, steady erosion of the world around it.'
-streamed  's march of time, weathered by the elements and the slow, steady erosion of the world around it.\n\nYet'
-streamed  ' march of time, weathered by the elements and the slow, steady erosion of the world around it.\n\nYet,'
-streamed  'of time, weathered by the elements and the slow, steady erosion of the world around it.\n\nYet, within'
-streamed  'me, weathered by the elements and the slow, steady erosion of the world around it.\n\nYet, within this'
-streamed  ' weathered by the elements and the slow, steady erosion of the world around it.\n\nYet, within this un'
-streamed  'eathered by the elements and the slow, steady erosion of the world around it.\n\nYet, within this unas'
-streamed  'thered by the elements and the slow, steady erosion of the world around it.\n\nYet, within this unassu'
-streamed  'ed by the elements and the slow, steady erosion of the world around it.\n\nYet, within this unassuming'
-streamed  'the elements and the slow, steady erosion of the world around it.\n\nYet, within this unassuming stone'
-streamed  'he elements and the slow, steady erosion of the world around it.\n\nYet, within this unassuming stone,'
-streamed  ' elements and the slow, steady erosion of the world around it.\n\nYet, within this unassuming stone, a'
-streamed  'nts and the slow, steady erosion of the world around it.\n\nYet, within this unassuming stone, a spark'
-streamed  ' and the slow, steady erosion of the world around it.\n\nYet, within this unassuming stone, a spark of'
-streamed  'he slow, steady erosion of the world around it.\n\nYet, within this unassuming stone, a spark of power'
-streamed  'low, steady erosion of the world around it.\n\nYet, within this unassuming stone, a spark of power lay'
-streamed  'steady erosion of the world around it.\n\nYet, within this unassuming stone, a spark of power lay dorm'
-streamed  'ady erosion of the world around it.\n\nYet, within this unassuming stone, a spark of power lay dormant'
-streamed  'dy erosion of the world around it.\n\nYet, within this unassuming stone, a spark of power lay dormant,'
-streamed  ' erosion of the world around it.\n\nYet, within this unassuming stone, a spark of power lay dormant, a'
-streamed  'f the world around it.\n\nYet, within this unassuming stone, a spark of power lay dormant, a testament'
-streamed  'he world around it.\n\nYet, within this unassuming stone, a spark of power lay dormant, a testament to'
-streamed  'he world around it.\n\nYet, within this unassuming stone, a spark of power lay dormant, a testament to'
-streamed  'he world around it.\n\nYet, within this unassuming stone, a spark of power lay dormant, a testament to'
-streamed  'he world around it.\n\nYet, within this unassuming stone, a spark of power lay dormant, a testament to'
+streamed  'Here is a short story about lightning in a rock:\n\nThe Spark Within\n\nAm'
+streamed  'Here is a short story about lightning in a rock:\n\nThe Spark Within\n\nAmelia'
+streamed  'Here is a short story about lightning in a rock:\n\nThe Spark Within\n\nAmelia hi'
+streamed  'Here is a short story about lightning in a rock:\n\nThe Spark Within\n\nAmelia hike'
+streamed  'Here is a short story about lightning in a rock:\n\nThe Spark Within\n\nAmelia hiked up'
+streamed  'Here is a short story about lightning in a rock:\n\nThe Spark Within\n\nAmelia hiked up the'
+streamed  'Here is a short story about lightning in a rock:\n\nThe Spark Within\n\nAmelia hiked up the w'
+streamed  'Here is a short story about lightning in a rock:\n\nThe Spark Within\n\nAmelia hiked up the winding'
+streamed  'ere is a short story about lightning in a rock:\n\nThe Spark Within\n\nAmelia hiked up the winding trail'
+streamed  're is a short story about lightning in a rock:\n\nThe Spark Within\n\nAmelia hiked up the winding trail,'
+streamed  's a short story about lightning in a rock:\n\nThe Spark Within\n\nAmelia hiked up the winding trail, her'
+streamed  'ort story about lightning in a rock:\n\nThe Spark Within\n\nAmelia hiked up the winding trail, her boots'
+streamed  't story about lightning in a rock:\n\nThe Spark Within\n\nAmelia hiked up the winding trail, her boots c'
+streamed  'tory about lightning in a rock:\n\nThe Spark Within\n\nAmelia hiked up the winding trail, her boots crun'
+streamed  'about lightning in a rock:\n\nThe Spark Within\n\nAmelia hiked up the winding trail, her boots crunching'
+streamed  'ut lightning in a rock:\n\nThe Spark Within\n\nAmelia hiked up the winding trail, her boots crunching on'
+streamed  'ightning in a rock:\n\nThe Spark Within\n\nAmelia hiked up the winding trail, her boots crunching on the'
+streamed  'ng in a rock:\n\nThe Spark Within\n\nAmelia hiked up the winding trail, her boots crunching on the loose'
+streamed  'in a rock:\n\nThe Spark Within\n\nAmelia hiked up the winding trail, her boots crunching on the loose gr'
+streamed  ' rock:\n\nThe Spark Within\n\nAmelia hiked up the winding trail, her boots crunching on the loose gravel'
+streamed  'rock:\n\nThe Spark Within\n\nAmelia hiked up the winding trail, her boots crunching on the loose gravel.'
+streamed  ':\n\nThe Spark Within\n\nAmelia hiked up the winding trail, her boots crunching on the loose gravel. The'
+streamed  'he Spark Within\n\nAmelia hiked up the winding trail, her boots crunching on the loose gravel. The sun'
+streamed  'ark Within\n\nAmelia hiked up the winding trail, her boots crunching on the loose gravel. The sun beat'
+streamed  'ithin\n\nAmelia hiked up the winding trail, her boots crunching on the loose gravel. The sun beat down'
+streamed  'n\n\nAmelia hiked up the winding trail, her boots crunching on the loose gravel. The sun beat down rel'
+streamed  'Amelia hiked up the winding trail, her boots crunching on the loose gravel. The sun beat down relent'
+streamed  ' hiked up the winding trail, her boots crunching on the loose gravel. The sun beat down relentlessly'
+streamed  'hiked up the winding trail, her boots crunching on the loose gravel. The sun beat down relentlessly,'
+streamed  ' the winding trail, her boots crunching on the loose gravel. The sun beat down relentlessly, causing'
+streamed  'inding trail, her boots crunching on the loose gravel. The sun beat down relentlessly, causing persp'
+streamed  'trail, her boots crunching on the loose gravel. The sun beat down relentlessly, causing perspiration'
+streamed  'il, her boots crunching on the loose gravel. The sun beat down relentlessly, causing perspiration to'
+streamed  ', her boots crunching on the loose gravel. The sun beat down relentlessly, causing perspiration to b'
+streamed  'her boots crunching on the loose gravel. The sun beat down relentlessly, causing perspiration to bea'
+streamed  'boots crunching on the loose gravel. The sun beat down relentlessly, causing perspiration to bead on'
+streamed  's crunching on the loose gravel. The sun beat down relentlessly, causing perspiration to bead on her'
+streamed  'crunching on the loose gravel. The sun beat down relentlessly, causing perspiration to bead on her b'
+streamed  'nching on the loose gravel. The sun beat down relentlessly, causing perspiration to bead on her brow'
+streamed  'ching on the loose gravel. The sun beat down relentlessly, causing perspiration to bead on her brow.'
+streamed  'ng on the loose gravel. The sun beat down relentlessly, causing perspiration to bead on her brow. As'
+streamed  'n the loose gravel. The sun beat down relentlessly, causing perspiration to bead on her brow. As she'
+streamed  'oose gravel. The sun beat down relentlessly, causing perspiration to bead on her brow. As she rounde'
+streamed  'e gravel. The sun beat down relentlessly, causing perspiration to bead on her brow. As she rounded a'
+streamed  'avel. The sun beat down relentlessly, causing perspiration to bead on her brow. As she rounded a ben'
+streamed  'el. The sun beat down relentlessly, causing perspiration to bead on her brow. As she rounded a bend,'
+streamed  '. The sun beat down relentlessly, causing perspiration to bead on her brow. As she rounded a bend, a'
+streamed  'sun beat down relentlessly, causing perspiration to bead on her brow. As she rounded a bend, a pecul'
+streamed  ' beat down relentlessly, causing perspiration to bead on her brow. As she rounded a bend, a peculiar'
+streamed  'down relentlessly, causing perspiration to bead on her brow. As she rounded a bend, a peculiar sight'
+streamed  'lentlessly, causing perspiration to bead on her brow. As she rounded a bend, a peculiar sight caught'
+streamed  'lessly, causing perspiration to bead on her brow. As she rounded a bend, a peculiar sight caught her'
+streamed  'ly, causing perspiration to bead on her brow. As she rounded a bend, a peculiar sight caught her eye'
+streamed  'y, causing perspiration to bead on her brow. As she rounded a bend, a peculiar sight caught her eye.'
+streamed  ', causing perspiration to bead on her brow. As she rounded a bend, a peculiar sight caught her eye. '
+streamed  'ing perspiration to bead on her brow. As she rounded a bend, a peculiar sight caught her eye. \n\nNest'
+streamed  'g perspiration to bead on her brow. As she rounded a bend, a peculiar sight caught her eye. \n\nNestle'
+streamed  'ation to bead on her brow. As she rounded a bend, a peculiar sight caught her eye. \n\nNestled between'
+streamed  'n to bead on her brow. As she rounded a bend, a peculiar sight caught her eye. \n\nNestled between the'
+streamed  'to bead on her brow. As she rounded a bend, a peculiar sight caught her eye. \n\nNestled between the c'
+streamed  'bead on her brow. As she rounded a bend, a peculiar sight caught her eye. \n\nNestled between the crag'
+streamed  'ad on her brow. As she rounded a bend, a peculiar sight caught her eye. \n\nNestled between the craggy'
+streamed  'her brow. As she rounded a bend, a peculiar sight caught her eye. \n\nNestled between the craggy rocks'
+streamed  'brow. As she rounded a bend, a peculiar sight caught her eye. \n\nNestled between the craggy rocks was'
+streamed  'ow. As she rounded a bend, a peculiar sight caught her eye. \n\nNestled between the craggy rocks was a'
+streamed  ' As she rounded a bend, a peculiar sight caught her eye. \n\nNestled between the craggy rocks was a ja'
+streamed  ' she rounded a bend, a peculiar sight caught her eye. \n\nNestled between the craggy rocks was a jagge'
+streamed  'unded a bend, a peculiar sight caught her eye. \n\nNestled between the craggy rocks was a jagged black'
+streamed  'a bend, a peculiar sight caught her eye. \n\nNestled between the craggy rocks was a jagged black stone'
+streamed  ' bend, a peculiar sight caught her eye. \n\nNestled between the craggy rocks was a jagged black stone,'
+streamed  'd, a peculiar sight caught her eye. \n\nNestled between the craggy rocks was a jagged black stone, its'
+streamed  'uliar sight caught her eye. \n\nNestled between the craggy rocks was a jagged black stone, its surface'
+streamed  'ar sight caught her eye. \n\nNestled between the craggy rocks was a jagged black stone, its surface sh'
+streamed  'sight caught her eye. \n\nNestled between the craggy rocks was a jagged black stone, its surface shimm'
+streamed  ' caught her eye. \n\nNestled between the craggy rocks was a jagged black stone, its surface shimmering'
+streamed  'ught her eye. \n\nNestled between the craggy rocks was a jagged black stone, its surface shimmering in'
+streamed  ' her eye. \n\nNestled between the craggy rocks was a jagged black stone, its surface shimmering in the'
+streamed  ' eye. \n\nNestled between the craggy rocks was a jagged black stone, its surface shimmering in the sun'
+streamed  ' \n\nNestled between the craggy rocks was a jagged black stone, its surface shimmering in the sunlight'
+streamed  '\n\nNestled between the craggy rocks was a jagged black stone, its surface shimmering in the sunlight.'
+streamed  '\n\nNestled between the craggy rocks was a jagged black stone, its surface shimmering in the sunlight.'
+streamed  '\n\nNestled between the craggy rocks was a jagged black stone, its surface shimmering in the sunlight.'
+streamed  '\n\nNestled between the craggy rocks was a jagged black stone, its surface shimmering in the sunlight.'
 streamed final Here is a short story about lightning in a rock:
 
 The Spark Within
 
-Jagged and rough, the ancient rock lay nestled in the damp earth, hidden among the twisting roots and fallen leaves. For centuries, it had endured the relentless march of time, weathered by the elements and the slow, steady erosion of the world around it.
+Amelia hiked up the winding trail, her boots crunching on the loose gravel. The sun beat down relentlessly, causing perspiration to bead on her brow. As she rounded a bend, a peculiar sight caught her eye. 
 
-Yet, within this unassuming stone, a spark of power lay dormant, a testament to
-

Teardown

PASSED test_serialization_exception 0:00:00.517660

Setup

Call

Captured stdout call
Exception message:  <ExceptionInfo BamlValidationError('Parsing error: Client: GPT35 (gpt-3.5-turbo-0125) - 506ms. StopReason: stop\n---PROMPT---\n[chat]...day?\n---Parsed Response---\nFailed to coerce value: Error parsing \'<root>\': Missing required fields: nonce, nonce2') tblen=2>
-

Teardown

PASSED test_stream_serialization_exception 0:00:00.508850

Setup

Call

Captured stdout call
streamed  nonce=None nonce2=None
+Nestled between the craggy rocks was a jagged black stone, its surface shimmering in the sunlight.
+
Captured stderr call
[2024-09-05T13:57:04Z INFO  baml_events] Function TestAws:
+    Client: AwsBedrock (anthropic.claude-3-haiku-20240307-v1:0) - 1830ms. StopReason: unknown
+    ---PROMPT---
+    [chat] user: Write a nice short story about lightning in a rock
+    
+    ---LLM REPLY---
+    Here is a short story about lightning in a rock:
+    
+    The Spark Within
+    
+    Amelia hiked up the winding trail, her boots crunching on the loose gravel. The sun beat down relentlessly, causing perspiration to bead on her brow. As she rounded a bend, a peculiar sight caught her eye. 
+    
+    Nestled between the craggy rocks was a jagged black stone, its surface shimmering in the sunlight.
+    ---Parsed Response (string)---
+    "Here is a short story about lightning in a rock:\n\nThe Spark Within\n\nAmelia hiked up the winding trail, her boots crunching on the loose gravel. The sun beat down relentlessly, causing perspiration to bead on her brow. As she rounded a bend, a peculiar sight caught her eye. \n\nNestled between the craggy rocks was a jagged black stone, its surface shimmering in the sunlight."
+

Teardown

PASSED test_serialization_exception 0:00:00.529340

Setup

Call

Captured stdout call
Exception message:  <ExceptionInfo BamlValidationError('Parsing error: Client: GPT35 (gpt-3.5-turbo-0125) - 519ms. StopReason: stop\n---PROMPT---\n[chat]...day?\n---Parsed Response---\nFailed to coerce value: Error parsing \'<root>\': Missing required fields: nonce, nonce2') tblen=2>
+
Captured stderr call
[2024-09-05T13:57:04Z WARN  baml_events] Function DummyOutputFunction:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 519ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Say "hello there".
+    
+    ---LLM REPLY---
+    Hello there! How can I assist you today?
+    ---Parsed Response (Error)---
+    Failed to coerce value: Error parsing '<root>': Missing required fields: nonce, nonce2
+

Teardown

PASSED test_stream_serialization_exception 0:00:00.691989

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
@@ -637,8 +1897,17 @@
 streamed  nonce=None nonce2=None
 streamed  nonce=None nonce2=None
 streamed  nonce=None nonce2=None
-Exception message:  <ExceptionInfo BamlValidationError('Parsing error: Client: GPT35 (gpt-3.5-turbo-0125) - 497ms. StopReason: stop\n---PROMPT---\n[chat]...day?\n---Parsed Response---\nFailed to coerce value: Error parsing \'<root>\': Missing required fields: nonce, nonce2') tblen=2>
-

Teardown

PASSED test_stream2_serialization_exception 0:00:00.568040

Setup

Call

Captured stdout call
streamed  nonce=None nonce2=None nonce3=None
+Exception message:  <ExceptionInfo BamlValidationError('Parsing error: Client: GPT35 (gpt-3.5-turbo-0125) - 682ms. StopReason: stop\n---PROMPT---\n[chat]...day?\n---Parsed Response---\nFailed to coerce value: Error parsing \'<root>\': Missing required fields: nonce, nonce2') tblen=2>
+
Captured stderr call
[2024-09-05T13:57:05Z WARN  baml_events] Function DummyOutputFunction:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 682ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Say "hello there".
+    
+    ---LLM REPLY---
+    Hello there! How can I assist you today?
+    ---Parsed Response (Error)---
+    Failed to coerce value: Error parsing '<root>': Missing required fields: nonce, nonce2
+

Teardown

PASSED test_stream2_serialization_exception 0:00:00.528245

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
@@ -651,8 +1920,17 @@
 streamed  nonce=None nonce2=None nonce3=None
 streamed  nonce=None nonce2=None nonce3=None
 streamed  nonce=None nonce2=None nonce3=None
-Exception message:  <ExceptionInfo BamlValidationError('Parsing error: Client: GPT35 (gpt-3.5-turbo-0125) - 557ms. StopReason: stop\n---PROMPT---\n[chat]...-Parsed Response---\nFailed to coerce value: Error parsing \'<root>\': Missing required fields: nonce, nonce2, nonce3') tblen=2>
-

Teardown

FAILED test_descriptions 0:00:02.092626

AssertionError: assert Nested(prop3='three', prop4='four', prop20=Nested2(prop11='three', prop12='four')) == 'two'
+Exception message:  <ExceptionInfo BamlValidationError('Parsing error: Client: GPT35 (gpt-3.5-turbo-0125) - 520ms. StopReason: stop\n---PROMPT---\n[chat]...-Parsed Response---\nFailed to coerce value: Error parsing \'<root>\': Missing required fields: nonce, nonce2, nonce3') tblen=2>
+
Captured stderr call
[2024-09-05T13:57:05Z WARN  baml_events] Function DummyOutputFunction:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 520ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Say "hello there".
+    
+    ---LLM REPLY---
+    Hello there! How can I assist you today?
+    ---Parsed Response (Error)---
+    Failed to coerce value: Error parsing '<root>': Missing required fields: nonce, nonce2, nonce3
+

Teardown

FAILED test_descriptions 0:00:01.913155

AssertionError: assert Nested(prop3='three', prop4='four', prop20=Nested2(prop11='three', prop12='four')) == 'two'
  +  where Nested(prop3='three', prop4='four', prop20=Nested2(prop11='three', prop12='four')) = Schema(prop1='one', prop2=Nested(prop3='three', prop4='four', prop20=Nested2(prop11='three', prop12='four')), prop5=['hi'], prop6='blah', nested_attrs=['nested'], parens='parens1', other_group='other').prop2

Setup

Call

@pytest.mark.asyncio
     async def test_descriptions():
         res = await b.SchemaDescriptions(
@@ -673,13 +1951,224 @@
 E       AssertionError: assert Nested(prop3='three', prop4='four', prop20=Nested2(prop11='three', prop12='four')) == 'two'
 E        +  where Nested(prop3='three', prop4='four', prop20=Nested2(prop11='three', prop12='four')) = Schema(prop1='one', prop2=Nested(prop3='three', prop4='four', prop20=Nested2(prop11='three', prop12='four')), prop5=['hi'], prop6='blah', nested_attrs=['nested'], parens='parens1', other_group='other').prop2
 
-tests/test_functions.py:967: AssertionError

Teardown

PASSED test_caching 0:00:02.501502

Setup

Call

Captured stdout call
Duration no caching:  1.2517590522766113
-Duration with caching:  1.2488958835601807
-

Teardown

PASSED test_arg_exceptions 0:00:00.961150

Setup

Call

Teardown

tests/test_hi.py 1 0:00:00.001342

FAILED test_accepts_subclass_of_baml_type 0:00:00.001342

TypeError: BamlAsyncClient.ExtractResume() missing 1 required positional argument: 'img'

Setup

Call

@pytest.mark.asyncio
-    async def test_accepts_subclass_of_baml_type():
-        print("calling with class")
->       _ = await b.ExtractResume("hello")
-E       TypeError: BamlAsyncClient.ExtractResume() missing 1 required positional argument: 'img'
+tests/test_functions.py:967: AssertionError
Captured stderr call
[2024-09-05T13:57:07Z INFO  baml_events] Function SchemaDescriptions:
+    Client: GPT4o (gpt-4o-2024-05-13) - 1901ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Return a schema with this format:
+    
+    Answer in JSON using this schema:
+    {
+      // write "one"
+      prop1: string or null,
+      // write "two"
+      prop2: {
+        // write "three"
+        prop3: string or null,
+        // write "four"
+        blah: string or null,
+        prop20: {
+          // write "three"
+          prop11: string or null,
+          // write "four"
+          blah: string or null,
+        },
+      } or string,
+      // write "hi"
+      prop5: [
+        string or null
+      ],
+      // write the string "blah" regardless of the other types here
+      blah: string or [
+        {
+          // write "three"
+          prop3: string or null,
+          // write "four"
+          blah: string or null,
+          prop20: {
+            // write "three"
+            prop11: string or null,
+            // write "four"
+            blah: string or null,
+          },
+        }
+      ],
+      // write the string "nested" regardless of other types
+      nested_attrs: [
+        string or null or {
+          // write "three"
+          prop3: string or null,
+          // write "four"
+          blah: string or null,
+          prop20: {
+            // write "three"
+            prop11: string or null,
+            // write "four"
+            blah: string or null,
+          },
+        }
+      ],
+      // write "parens1"
+      parens: string or null,
+      // write "other"
+      other: string or int or string,
+    }
+    
+    ---LLM REPLY---
+    ```json
+    {
+      "prop1": "one",
+      "prop2": {
+        "prop3": "three",
+        "blah": "four",
+        "prop20": {
+          "prop11": "three",
+          "blah": "four"
+        }
+      },
+      "prop5": [
+        "hi"
+      ],
+      "blah": "blah",
+      "nested_attrs": "nested",
+      "parens": "parens1",
+      "other": "other"
+    }
+    ```
+    ---Parsed Response (class Schema)---
+    {
+      "prop1": "one",
+      "prop2": {
+        "prop3": "three",
+        "prop4": "four",
+        "prop20": {
+          "prop11": "three",
+          "prop12": "four"
+        }
+      },
+      "prop5": [
+        "hi"
+      ],
+      "prop6": "blah",
+      "nested_attrs": [
+        "nested"
+      ],
+      "parens": "parens1",
+      "other_group": "other"
+    }
+

Teardown

FAILED test_caching 0:00:01.253028

baml_py.BamlClientHttpError: LLM call failed: LLMErrorResponse { client: "ClaudeWithCaching", model: None, prompt: Chat([RenderedChatMessage { role: "user", allow_duplicate_role: false, parts: [WithMeta(Text("Describe this in 5 words: \n    In a near-future society where dreams have become a tradable commodity and shared experience, a lonely and socially awkward teenager named Alex discovers they possess a rare and powerful ability to not only view but also manipulate the dreams of others. Initially thrilled by this newfound power, Alex begins subtly altering the dreams of classmates and family members, helping them overcome fears, boost confidence, or experience fantastical adventures.\nAs Alex's skills grow, so does their influence. They start selling premium dream experiences on the black market, crafting intricate and addictive dreamscapes for wealthy clients. However, the line between dream and reality begins to blur for those exposed to Alex's creations. Some clients struggle to differentiate between their true memories and the artificial ones implanted by Alex's dream manipulation.\nComplications arise when a mysterious government agency takes notice of Alex's unique abilities. They offer Alex a chance to use their gift for \"the greater good,\" hinting at applications in therapy, criminal rehabilitation, and even national security. Simultaneously, a underground resistance movement reaches out, warning Alex about the dangers of dream manipulation and the potential for mass control and exploitation.\nCaught between these opposing forces, Alex must navigate a complex web of ethical dilemmas. They grapple with questions of free will, the nature of consciousness, and the responsibility that comes with having power over people's minds. As the consequences of their actions spiral outward, affecting the lives of loved ones and strangers alike, Alex is forced to confront the true nature of their ability and decide how—or if—it should be used.\nThe story explores themes of identity, the subconscious mind, the ethics of technology, and the power of imagination. It delves into the potential consequences of a world where our most private thoughts and experiences are no longer truly our own, and examines the fine line between helping others and manipulating them for personal gain or a perceived greater good."), {"cache_control": Object {"type": String("ephemeral")}})] }]), request_options: {"max_tokens": Number(1000), "model": String("claude-3-haiku-20240307")}, start_time: SystemTime { tv_sec: 1725544627, tv_nsec: 736272000 }, latency: 1.245205667s, message: "Request failed: {\"type\":\"error\",\"error\":{\"type\":\"overloaded_error\",\"message\":\"Overloaded\"}}", code: Other(529) }

Setup

Call

@pytest.mark.asyncio
+    async def test_caching():
+        story_idea = """
+        In a near-future society where dreams have become a tradable commodity and shared experience, a lonely and socially awkward teenager named Alex discovers they possess a rare and powerful ability to not only view but also manipulate the dreams of others. Initially thrilled by this newfound power, Alex begins subtly altering the dreams of classmates and family members, helping them overcome fears, boost confidence, or experience fantastical adventures.
+    As Alex's skills grow, so does their influence. They start selling premium dream experiences on the black market, crafting intricate and addictive dreamscapes for wealthy clients. However, the line between dream and reality begins to blur for those exposed to Alex's creations. Some clients struggle to differentiate between their true memories and the artificial ones implanted by Alex's dream manipulation.
+    Complications arise when a mysterious government agency takes notice of Alex's unique abilities. They offer Alex a chance to use their gift for "the greater good," hinting at applications in therapy, criminal rehabilitation, and even national security. Simultaneously, a underground resistance movement reaches out, warning Alex about the dangers of dream manipulation and the potential for mass control and exploitation.
+    Caught between these opposing forces, Alex must navigate a complex web of ethical dilemmas. They grapple with questions of free will, the nature of consciousness, and the responsibility that comes with having power over people's minds. As the consequences of their actions spiral outward, affecting the lives of loved ones and strangers alike, Alex is forced to confront the true nature of their ability and decide how—or if—it should be used.
+    The story explores themes of identity, the subconscious mind, the ethics of technology, and the power of imagination. It delves into the potential consequences of a world where our most private thoughts and experiences are no longer truly our own, and examines the fine line between helping others and manipulating them for personal gain or a perceived greater good.
+    """
+        rand = random.randint(0, 26)
+        story_idea += " " + rand * "a"
+        start = time.time()
+>       res = await b.TestCaching(story_idea)
+
+tests/test_functions.py:986: 
+_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
+
+self = 
+input = '\n    In a near-future society where dreams have become a tradable commodity and shared experience, a lonely and soci... examines the fine line between helping others and manipulating them for personal gain or a perceived greater good.\n '
+baml_options = {}
+
+    async def TestCaching(
+        self,
+        input: str,
+        baml_options: BamlCallOptions = {},
+    ) -> str:
+      __tb__ = baml_options.get("tb", None)
+      if __tb__ is not None:
+        tb = __tb__._tb
+      else:
+        tb = None
+      __cr__ = baml_options.get("client_registry", None)
+    
+      raw = await self.__runtime.call_function(
+        "TestCaching",
+        {
+          "input": input,
+        },
+        self.__ctx_manager.get(),
+        tb,
+        __cr__,
+      )
+      mdl = create_model("TestCachingReturnType", inner=(str, ...))
+>     return coerce(mdl, raw.parsed())
+E     baml_py.BamlClientHttpError: LLM call failed: LLMErrorResponse { client: "ClaudeWithCaching", model: None, prompt: Chat([RenderedChatMessage { role: "user", allow_duplicate_role: false, parts: [WithMeta(Text("Describe this in 5 words: \n    In a near-future society where dreams have become a tradable commodity and shared experience, a lonely and socially awkward teenager named Alex discovers they possess a rare and powerful ability to not only view but also manipulate the dreams of others. Initially thrilled by this newfound power, Alex begins subtly altering the dreams of classmates and family members, helping them overcome fears, boost confidence, or experience fantastical adventures.\nAs Alex's skills grow, so does their influence. They start selling premium dream experiences on the black market, crafting intricate and addictive dreamscapes for wealthy clients. However, the line between dream and reality begins to blur for those exposed to Alex's creations. Some clients struggle to differentiate between their true memories and the artificial ones implanted by Alex's dream manipulation.\nComplications arise when a mysterious government agency takes notice of Alex's unique abilities. They offer Alex a chance to use their gift for \"the greater good,\" hinting at applications in therapy, criminal rehabilitation, and even national security. Simultaneously, a underground resistance movement reaches out, warning Alex about the dangers of dream manipulation and the potential for mass control and exploitation.\nCaught between these opposing forces, Alex must navigate a complex web of ethical dilemmas. They grapple with questions of free will, the nature of consciousness, and the responsibility that comes with having power over people's minds. As the consequences of their actions spiral outward, affecting the lives of loved ones and strangers alike, Alex is forced to confront the true nature of their ability and decide how—or if—it should be used.\nThe story explores themes of identity, the subconscious mind, the ethics of technology, and the power of imagination. It delves into the potential consequences of a world where our most private thoughts and experiences are no longer truly our own, and examines the fine line between helping others and manipulating them for personal gain or a perceived greater good."), {"cache_control": Object {"type": String("ephemeral")}})] }]), request_options: {"max_tokens": Number(1000), "model": String("claude-3-haiku-20240307")}, start_time: SystemTime { tv_sec: 1725544627, tv_nsec: 736272000 }, latency: 1.245205667s, message: "Request failed: {\"type\":\"error\",\"error\":{\"type\":\"overloaded_error\",\"message\":\"Overloaded\"}}", code: Other(529) }
 
-tests/test_hi.py:26: TypeError
Captured stdout call
calling with class
-

Teardown

\ No newline at end of file +baml_client/async_client.py:1284: BamlClientHttpError
Captured stderr call
[2024-09-05T13:57:08Z WARN  baml_events] Function TestCaching:
+    Client: ClaudeWithCaching (<unknown>) - 1245ms
+    ---PROMPT---
+    [chat] user: {"cache_control": Object {"type": String("ephemeral")}}::Describe this in 5 words: 
+        In a near-future society where dreams have become a tradable commodity and shared experience, a lonely and socially awkward teenager named Alex discovers they possess a rare and powerful ability to not only view but also manipulate the dreams of others. Initially thrilled by this newfound power, Alex begins subtly altering the dreams of classmates and family members, helping them overcome fears, boost confidence, or experience fantastical adventures.
+    As Alex's skills grow, so does their influence. They start selling premium dream experiences on the black market, crafting intricate and addictive dreamscapes for wealthy clients. However, the line between dream and reality begins to blur for those exposed to Alex's creations. Some clients struggle to differentiate between their true memories and the artificial ones implanted by Alex's dream manipulation.
+    Complications arise when a mysterious government agency takes notice of Alex's unique abilities. They offer Alex a chance to use their gift for "the greater good," hinting at applications in therapy, criminal rehabilitation, and even national security. Simultaneously, a underground resistance movement reaches out, warning Alex about the dangers of dream manipulation and the potential for mass control and exploitation.
+    Caught between these opposing forces, Alex must navigate a complex web of ethical dilemmas. They grapple with questions of free will, the nature of consciousness, and the responsibility that comes with having power over people's minds. As the consequences of their actions spiral outward, affecting the lives of loved ones and strangers alike, Alex is forced to confront the true nature of their ability and decide how—or if—it should be used.
+    The story explores themes of identity, the subconscious mind, the ethics of technology, and the power of imagination. It delves into the potential consequences of a world where our most private thoughts and experiences are no longer truly our own, and examines the fine line between helping others and manipulating them for personal gain or a perceived greater good.
+    
+    ---REQUEST OPTIONS---
+    max_tokens: 1000
+    model: "claude-3-haiku-20240307"
+    ---ERROR (Unspecified error code: 529)---
+    Request failed: {"type":"error","error":{"type":"overloaded_error","message":"Overloaded"}}
+

Teardown

PASSED test_arg_exceptions 0:00:00.835220

Setup

Call

Captured stderr call
[2024-09-05T13:57:09Z WARN  baml_events] Function MyFunc:
+    Client: MyClient (<unknown>) - 144ms
+    ---PROMPT---
+    [chat] system: Given a string, extract info using the schema:
+    
+    My name is Harrison. My hair is black and I'm 6 feet tall.
+    
+    Answer in JSON using this schema:
+    {
+    }
+    
+    ---REQUEST OPTIONS---
+    model: "gpt-4o-mini"
+    ---ERROR (InvalidAuthentication (401))---
+    Request failed: {
+        "error": {
+            "message": "Incorrect API key provided: INVALID_KEY. You can find your API key at https://platform.openai.com/account/api-keys.",
+            "type": "invalid_request_error",
+            "param": null,
+            "code": "invalid_api_key"
+        }
+    }
+    
+[2024-09-05T13:57:09Z WARN  baml_events] Function MyFunc:
+    Client: MyClient (<unknown>) - 151ms
+    ---PROMPT---
+    [chat] system: Given a string, extract info using the schema:
+    
+    My name is Harrison. My hair is black and I'm 6 feet tall.
+    
+    Answer in JSON using this schema:
+    {
+    }
+    
+    ---REQUEST OPTIONS---
+    model: "gpt-4o-mini"
+    ---ERROR (InvalidAuthentication (401))---
+    Request failed: {
+        "error": {
+            "message": "Incorrect API key provided: INVALID_KEY. You can find your API key at https://platform.openai.com/account/api-keys.",
+            "type": "invalid_request_error",
+            "param": null,
+            "code": "invalid_api_key"
+        }
+    }
+    
+[2024-09-05T13:57:09Z WARN  baml_events] Function DummyOutputFunction:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 523ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Say "hello there".
+    
+    ---LLM REPLY---
+    Hello there! How can I help you today?
+    ---Parsed Response (Error)---
+    Failed to coerce value: Error parsing '<root>': Missing required fields: nonce, nonce2
+

Teardown

PASSED test_map_as_param 0:00:00.002330

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 b62edc1bb..f523c9351 100644 --- a/integ-tests/ruby/baml_client/inlined.rb +++ b/integ-tests/ruby/baml_client/inlined.rb @@ -24,7 +24,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}\n\nfunction ExtractReceiptInfo(email: string) -> 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 AwsBedrock\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}", - "main.baml" => "generator lang_python {\n output_type python/pydantic\n output_dir \"../python\"\n version \"0.54.1\"\n}\n\ngenerator lang_typescript {\n output_type typescript\n output_dir \"../typescript\"\n version \"0.54.1\"\n}\n\ngenerator lang_ruby {\n output_type ruby/sorbet\n output_dir \"../ruby\"\n version \"0.54.1\"\n}\n", + "main.baml" => "generator lang_python {\n output_type python/pydantic\n output_dir \"../python\"\n version \"0.54.2\"\n}\n\ngenerator lang_typescript {\n output_type typescript\n output_dir \"../typescript\"\n version \"0.54.2\"\n}\n\ngenerator lang_ruby {\n output_type ruby/sorbet\n output_dir \"../ruby\"\n version \"0.54.2\"\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}", "test-files/comments/comments.baml" => "// add some functions, classes, enums etc with comments all over.", diff --git a/integ-tests/typescript/baml_client/inlinedbaml.ts b/integ-tests/typescript/baml_client/inlinedbaml.ts index 37db63a48..37821fa4f 100644 --- a/integ-tests/typescript/baml_client/inlinedbaml.ts +++ b/integ-tests/typescript/baml_client/inlinedbaml.ts @@ -25,7 +25,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}\n\nfunction ExtractReceiptInfo(email: string) -> 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 AwsBedrock\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}", - "main.baml": "generator lang_python {\n output_type python/pydantic\n output_dir \"../python\"\n version \"0.54.1\"\n}\n\ngenerator lang_typescript {\n output_type typescript\n output_dir \"../typescript\"\n version \"0.54.1\"\n}\n\ngenerator lang_ruby {\n output_type ruby/sorbet\n output_dir \"../ruby\"\n version \"0.54.1\"\n}\n", + "main.baml": "generator lang_python {\n output_type python/pydantic\n output_dir \"../python\"\n version \"0.54.2\"\n}\n\ngenerator lang_typescript {\n output_type typescript\n output_dir \"../typescript\"\n version \"0.54.2\"\n}\n\ngenerator lang_ruby {\n output_type ruby/sorbet\n output_dir \"../ruby\"\n version \"0.54.2\"\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}", "test-files/comments/comments.baml": "// add some functions, classes, enums etc with comments all over.", diff --git a/integ-tests/typescript/test-report.html b/integ-tests/typescript/test-report.html index 3aebf90df..0a4a05f39 100644 --- a/integ-tests/typescript/test-report.html +++ b/integ-tests/typescript/test-report.html @@ -257,15 +257,11 @@ font-size: 1rem; padding: 0 0.5rem; } -

Test Report

Started: 2024-09-03 09:06:25
Suites (1)
0 passed
1 failed
0 pending
Tests (44)
41 passed
3 failed
0 pending
Integ tests > should work for all inputs
single bool
failed
0.003s
Error: BamlError: BamlClientError: Something went wrong with the LLM client: LLM call failed: LLMErrorResponse { client: "Vertex", model: None, prompt: Chat([RenderedChatMessage { role: "user", allow_duplicate_role: false, parts: [Text("Return this value back to me: true")] }]), request_options: {}, start_time: SystemTime { tv_sec: 1725379586, tv_nsec: 490762000 }, latency: 153.541µs, message: "Error {\n    context: \"Failed to build request\",\n    source: \"Service account not found\",\n}", code: Other(2) }
+

Test Report

Started: 2024-09-05 06:52:56
Suites (1)
0 passed
1 failed
0 pending
Tests (44)
42 passed
2 failed
0 pending
Integ tests > should work for all inputs
single bool
failed
0.004s
Error: BamlError: BamlClientError: Something went wrong with the LLM client: LLM call failed: LLMErrorResponse { client: "Vertex", model: None, prompt: Chat([RenderedChatMessage { role: "user", allow_duplicate_role: false, parts: [Text("Return this value back to me: true")] }]), request_options: {}, start_time: SystemTime { tv_sec: 1725544377, tv_nsec: 235214000 }, latency: 121.417µs, message: "Error {\n    context: \"Failed to build request\",\n    source: \"Service account not found\",\n}", code: Other(2) }
     at BamlAsyncClient.parsed [as TestFnNamedArgsSingleBool] (/Users/vbv/repos/gloo-lang/integ-tests/typescript/baml_client/async_client.ts:906:16)
-    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:28:19)
Integ tests > should work for all inputs
single string list
passed
0.58s
Integ tests > should work for all inputs
single class
passed
0.502s
Integ tests > should work for all inputs
multiple classes
passed
0.529s
Integ tests > should work for all inputs
single enum list
passed
0.408s
Integ tests > should work for all inputs
single float
passed
0.432s
Integ tests > should work for all inputs
single int
passed
0.393s
Integ tests > should work for all inputs
single optional string
passed
0.424s
Integ tests > should work for all inputs
single map string to string
passed
0.568s
Integ tests > should work for all inputs
single map string to class
passed
0.688s
Integ tests > should work for all inputs
single map string to map
passed
0.747s
Integ tests
should work for all outputs
passed
5.603s
Integ tests
works with retries1
passed
0.981s
Integ tests
works with retries2
passed
2.039s
Integ tests
works with fallbacks
passed
1.869s
Integ tests
should work with image from url
passed
1.32s
Integ tests
should work with image from base 64
passed
1.03s
Integ tests
should work with audio base 64
passed
1.339s
Integ tests
should work with audio from url
passed
1.085s
Integ tests
should support streaming in OpenAI
failed
5.995s
Error: expect(received).toBeLessThanOrEqual(expected)
-
-Expected: <= 1500
-Received:    2744.2501668930054
-    at Object.toBeLessThanOrEqual (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:194:39)
Integ tests
should support streaming in Gemini
passed
8.92s
Integ tests
should support AWS
passed
2.624s
Integ tests
should support streaming in AWS
passed
2.341s
Integ tests
should support OpenAI shorthand
passed
9.936s
Integ tests
should support OpenAI shorthand streaming
passed
10.865s
Integ tests
should support anthropic shorthand
passed
3.265s
Integ tests
should support anthropic shorthand streaming
passed
4.075s
Integ tests
should support streaming without iterating
passed
4.106s
Integ tests
should support streaming in Claude
passed
0.811s
Integ tests
should support vertex
failed
0.002s
Error: BamlError: BamlClientError: Something went wrong with the LLM client: LLM call failed: LLMErrorResponse { client: "Vertex", model: None, prompt: Chat([RenderedChatMessage { role: "user", allow_duplicate_role: false, parts: [Text("Write a nice short story about Donkey Kong")] }]), request_options: {}, start_time: SystemTime { tv_sec: 1725379660, tv_nsec: 38966000 }, latency: 63.958µs, message: "Error {\n    context: \"Failed to build request\",\n    source: \"Service account not found\",\n}", code: Other(2) }
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:28:19)
Integ tests > should work for all inputs
single string list
passed
0.605s
Integ tests > should work for all inputs
single class
passed
0.536s
Integ tests > should work for all inputs
multiple classes
passed
0.573s
Integ tests > should work for all inputs
single enum list
passed
0.619s
Integ tests > should work for all inputs
single float
passed
0.426s
Integ tests > should work for all inputs
single int
passed
0.438s
Integ tests > should work for all inputs
single optional string
passed
0.52s
Integ tests > should work for all inputs
single map string to string
passed
0.675s
Integ tests > should work for all inputs
single map string to class
passed
0.739s
Integ tests > should work for all inputs
single map string to map
passed
0.871s
Integ tests
should work for all outputs
passed
4.001s
Integ tests
works with retries1
passed
0.951s
Integ tests
works with retries2
passed
2.027s
Integ tests
works with fallbacks
passed
1.517s
Integ tests
should work with image from url
passed
1.275s
Integ tests
should work with image from base 64
passed
1.231s
Integ tests
should work with audio base 64
passed
1.16s
Integ tests
should work with audio from url
passed
1.18s
Integ tests
should support streaming in OpenAI
passed
5.387s
Integ tests
should support streaming in Gemini
passed
17.085s
Integ tests
should support AWS
passed
2.788s
Integ tests
should support streaming in AWS
passed
2.233s
Integ tests
should support OpenAI shorthand
passed
7.601s
Integ tests
should support OpenAI shorthand streaming
passed
8.51s
Integ tests
should support anthropic shorthand
passed
3.669s
Integ tests
should support anthropic shorthand streaming
passed
3.669s
Integ tests
should support streaming without iterating
passed
3.977s
Integ tests
should support streaming in Claude
passed
0.915s
Integ tests
should support vertex
failed
0.001s
Error: BamlError: BamlClientError: Something went wrong with the LLM client: LLM call failed: LLMErrorResponse { client: "Vertex", model: None, prompt: Chat([RenderedChatMessage { role: "user", allow_duplicate_role: false, parts: [Text("Write a nice short story about Donkey Kong")] }]), request_options: {}, start_time: SystemTime { tv_sec: 1725544452, tv_nsec: 469190000 }, latency: 42.75µs, message: "Error {\n    context: \"Failed to build request\",\n    source: \"Service account not found\",\n}", code: Other(2) }
     at BamlAsyncClient.parsed [as TestVertex] (/Users/vbv/repos/gloo-lang/integ-tests/typescript/baml_client/async_client.ts:1242:16)
-    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:282:17)
Integ tests
supports tracing sync
passed
0.023s
Integ tests
supports tracing async
passed
6.514s
Integ tests
should work with dynamic types single
passed
1.448s
Integ tests
should work with dynamic types enum
passed
0.894s
Integ tests
should work with dynamic types class
passed
2.043s
Integ tests
should work with dynamic inputs class
passed
0.666s
Integ tests
should work with dynamic inputs list
passed
0.74s
Integ tests
should work with dynamic output map
passed
2.086s
Integ tests
should work with dynamic output union
passed
2.682s
Integ tests
should work with nested classes
passed
12.081s
Integ tests
should work with dynamic client
passed
0.616s
Integ tests
should work with 'onLogEvent'
passed
1.755s
Integ tests
should work with a sync client
passed
0.495s
Integ tests
should raise an error when appropriate
passed
0.893s
Console Log
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:40:15)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:282:17)
Integ tests
supports tracing sync
passed
0.02s
Integ tests
supports tracing async
passed
4.761s
Integ tests
should work with dynamic types single
passed
0.896s
Integ tests
should work with dynamic types enum
passed
0.686s
Integ tests
should work with dynamic types class
passed
1.32s
Integ tests
should work with dynamic inputs class
passed
0.666s
Integ tests
should work with dynamic inputs list
passed
0.759s
Integ tests
should work with dynamic output map
passed
1.194s
Integ tests
should work with dynamic output union
passed
3.147s
Integ tests
should work with nested classes
passed
8.6s
Integ tests
should work with dynamic client
passed
0.539s
Integ tests
should work with 'onLogEvent'
passed
1.811s
Integ tests
should work with a sync client
passed
0.56s
Integ tests
should raise an error when appropriate
passed
0.833s
Console Log
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:40: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)
@@ -280,11 +276,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:46:15)
got response key
 true
-52
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:132: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: 1725379598, tv_nsec: 273938000 }, latency: 101.340625ms, message: "Request failed: {\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:132: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: 1725544388, tv_nsec: 109879000 }, latency: 112.407625ms, message: "Request failed: {\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:1210:16)
     at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:129:7) {
   code: 'GenericFailure'
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:141: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: 1725379600, tv_nsec: 334178000 }, latency: 85.182333ms, message: "Request failed: {\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:141: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: 1725544390, tv_nsec: 149697000 }, latency: 103.663291ms, message: "Request failed: {\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:1226:16)
     at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:138:7) {
   code: 'GenericFailure'
@@ -337,9 +333,6 @@
     at jestAdapter (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:79:19)
     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)
dummyFunc2 returned
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:315: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:90:38
     at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:88:13
     at async Promise.all (index 0)
@@ -621,7 +614,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:460:13)
final  {
   hair_color: 'black',
-  attributes: { eye_color: 'blue', facial_hair: 'beard' }
+  attributes: { height: '6 feet', eye_color: 'blue', facial_hair: 'beard' }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:484: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>)
@@ -688,1510 +681,247 @@
   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:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: '', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: 'value', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: 'value1', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: 'value1', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: 'value1', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: 'value1', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: 'value1', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: 'value1', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: 'value1', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: 'value1', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: 'value1', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: 'value1', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: 'value1', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: 'value1', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: 'value1', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: 'value1', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: 'value1', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: 'value1', prop2: { prop1: '', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: { prop1: 'value', prop2: null, inner: null }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: { prop1: 'value2', prop2: null, inner: null }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: { prop1: 'value2', prop2: null, inner: null }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: { prop1: 'value2', prop2: null, inner: null }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: { prop1: 'value2', prop2: null, inner: null }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: '', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: 'Hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: 'Hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: 'Hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: 'Hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: 'Hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: 'Hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: 'Hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: 'Hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518: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:518: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:518: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:518: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:518: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:518: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:518: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:518: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:518: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:518: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:518: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:518: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:518: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:518: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:518: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:518: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:518: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:518:15)
msg { prop1: 'Hello', prop2: { prop1: 'World', prop2: 'N', inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: null }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: { prop1: 'value2', prop2: null, inner: null }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: null }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: { prop1: 'value2', prop2: null, inner: null }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: null }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: { prop1: 'value2', prop2: null, inner: null }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: null }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: { prop1: 'value2', prop2: null, inner: null }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: 'value1', prop2: { prop1: 'value2', prop2: '', inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: { prop1: 'value2', prop2: 'value', inner: null }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: null }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: { prop1: 'value2', prop2: 'value3', inner: null }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: null }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: { prop1: 'value2', prop2: 'value3', inner: null }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: null }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: { prop1: 'value2', prop2: 'value3', inner: null }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: { prop1: 'value2', prop2: 'value3', inner: null }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: { prop1: 'value2', prop2: 'value3', inner: null }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: { prop1: 'value2', prop2: 'value3', inner: null }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: { prop1: 'value2', prop2: 'value3', inner: null }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
+  prop1: 'Hello',
   prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
+    prop1: 'World',
+    prop2: 'Nice',
     inner: { prop2: null, prop3: null }
   }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
+  prop1: 'Hello',
   prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
+    prop1: 'World',
+    prop2: 'Nice',
     inner: { prop2: null, prop3: null }
   }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
+  prop1: 'Hello',
   prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
+    prop1: 'World',
+    prop2: 'Nice',
     inner: { prop2: null, prop3: null }
   }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
+  prop1: 'Hello',
   prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
+    prop1: 'World',
+    prop2: 'Nice',
     inner: { prop2: null, prop3: null }
   }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
+  prop1: 'Hello',
   prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
+    prop1: 'World',
+    prop2: 'Nice',
     inner: { prop2: null, prop3: null }
   }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
+  prop1: 'Hello',
   prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
+    prop1: 'World',
+    prop2: 'Nice',
     inner: { prop2: null, prop3: null }
   }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
+  prop1: 'Hello',
   prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
+    prop1: 'World',
+    prop2: 'Nice',
     inner: { prop2: null, prop3: null }
   }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
+  prop1: 'Hello',
   prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
+    prop1: 'World',
+    prop2: 'Nice',
     inner: { prop2: null, prop3: null }
   }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 4, prop3: null }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: null }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: null }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: null }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: null }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: null }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: null }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: null }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: null }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: null }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: { prop1: 'value2', prop2: 'value3', inner: { prop2: 42, prop3: 3 } }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: { prop1: 'value2', prop2: 'value3', inner: { prop2: 42, prop3: 3 } }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.1 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: { prop2: 4, prop3: null } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: { prop2: 42, prop3: null } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: { prop2: 42, prop3: null } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: { prop2: 42, prop3: null } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: { prop2: 42, prop3: null } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: { prop2: 42, prop3: null } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: { prop2: 42, prop3: null } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: { prop2: 42, prop3: null } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: { prop2: 42, prop3: null } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: { prop2: 42, prop3: null } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: { prop2: 42, prop3: 3 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: { prop2: 42, prop3: 3 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: { prop2: 42, prop3: 3.1 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: { prop2: 42, prop3: 3.14 } }
 }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
-}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
-  prop1: 'value1',
-  prop2: {
-    prop1: 'value2',
-    prop2: 'value3',
-    inner: { prop2: 42, prop3: 3.14 }
-  }
+  prop1: 'Hello',
+  prop2: { prop1: 'World', prop2: 'Nice', inner: { prop2: 42, prop3: 3.14 } }
 }
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:543:15)
     at callback (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:56:17)
onLogEvent {
   metadata: {
-    eventId: 'baf1de15-004e-47cb-a883-372b3eb598e0',
-    rootEventId: 'baf1de15-004e-47cb-a883-372b3eb598e0'
+    eventId: '9fbb7ea8-a06b-42df-8d25-d9e9caafd78c',
+    rootEventId: '9fbb7ea8-a06b-42df-8d25-d9e9caafd78c'
   },
   prompt: '[\n' +
     '  {\n' +
@@ -2205,12 +935,12 @@
     ']',
   rawOutput: '["a", "b", "c"]',
   parsedOutput: '["a", "b", "c"]',
-  startTime: '2024-09-03T16:08:10.147Z'
+  startTime: '2024-09-05T13:54:35.586Z'
 }
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:543:15)
     at callback (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:56:17)
onLogEvent {
   metadata: {
-    eventId: 'ea17a01e-bc7e-425d-a0eb-e1291220e0da',
-    rootEventId: 'ea17a01e-bc7e-425d-a0eb-e1291220e0da'
+    eventId: 'd671b2ca-9048-4b34-9a53-632ab833c88f',
+    rootEventId: 'd671b2ca-9048-4b34-9a53-632ab833c88f'
   },
   prompt: '[\n' +
     '  {\n' +
@@ -2224,5 +954,5 @@
     ']',
   rawOutput: '["d", "e", "f"]',
   parsedOutput: '["d", "e", "f"]',
-  startTime: '2024-09-03T16:08:10.714Z'
+  startTime: '2024-09-05T13:54:36.071Z'
 }
\ No newline at end of file diff --git a/tools/versions/engine.cfg b/tools/versions/engine.cfg index 7d6620db5..f62709162 100644 --- a/tools/versions/engine.cfg +++ b/tools/versions/engine.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.54.1 +current_version = 0.54.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 f69153cef..94f9b102f 100644 --- a/tools/versions/integ-tests.cfg +++ b/tools/versions/integ-tests.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.54.1 +current_version = 0.54.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 c894d7012..4b41c98c5 100644 --- a/tools/versions/python.cfg +++ b/tools/versions/python.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.54.1 +current_version = 0.54.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 f60baff66..f89f04082 100644 --- a/tools/versions/ruby.cfg +++ b/tools/versions/ruby.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.54.1 +current_version = 0.54.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 6ebdbc5d6..13ad8547a 100644 --- a/tools/versions/typescript.cfg +++ b/tools/versions/typescript.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.54.1 +current_version = 0.54.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 2f50071ee..ef072388e 100644 --- a/tools/versions/vscode.cfg +++ b/tools/versions/vscode.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.54.1 +current_version = 0.54.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 7f8f9e752..4fd07794e 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.54.1", + "version": "0.54.2", "publisher": "Boundary", "repository": "https://github.com/BoundaryML/baml", "homepage": "https://www.boundaryml.com",