diff --git a/CHANGELOG.md b/CHANGELOG.md index 1c0dc4b71..d9e6498ae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,35 @@ All notable changes to this project will be documented in this file. See [conventional commits](https://www.conventionalcommits.org/) for commit guidelines. +## [0.62.0](https://github.com/boundaryml/baml/compare/0.61.1..0.62.0) - 2024-10-21 + +### Features + +- Support serializing/deserializing `baml_py.Image`, `baml_py.Audio` for pydantic (#1062) - ([11cb699](https://github.com/boundaryml/baml/commit/11cb69903dce1ae348c68f88a82b4731da3977a7)) - Samuel Lijin +- Support rendering input classes with aliases (#1045) - ([3824cda](https://github.com/boundaryml/baml/commit/3824cda75524105f3401e5c7e4c21e604d639f76)) - aaronvg +- Add unstable_internal_repr on FunctionResult in python (#1068) - ([00082e8](https://github.com/boundaryml/baml/commit/00082e8b941d3648ec499215d2c38091f36db944)) - hellovai +- Add literal support for type_builder (#1069) - ([c0085d9](https://github.com/boundaryml/baml/commit/c0085d908cbf8696623fd70f49de5ca8325de06c)) - hellovai + +### Bug Fixes + +- Surface errors in fallbacks containing only erroneous clients (#1061) - ([b69ef79](https://github.com/boundaryml/baml/commit/b69ef79542ec818b8779f9710dad65d33166c862)) - Greg Hale +- Fix parser so that we are able to correctly detect sequences of empty strings. (#1048) - ([977e277](https://github.com/boundaryml/baml/commit/977e2776119a6f1e79f29cbe596b1c31697becb5)) - hellovai +- Make substring match algorithm case insensitive (#1056) - ([fa2c477](https://github.com/boundaryml/baml/commit/fa2c4770791297a7a37a3f0c837ede4bb709f0ef)) - Antonio Sarosi +- Fix vertex-ai citation data being optional (#1058) - ([5eae0a7](https://github.com/boundaryml/baml/commit/5eae0a73be6cc8286ce045185537aeed0b9feb7d)) - aaronvg +- Fix bug to correctly cast to pydantic types in ambiguous scenarios where BAML knows better (#1059) - ([830b0cb](https://github.com/boundaryml/baml/commit/830b0cb194b99fa6f019928e7466dcf3e3992596)) - hellovai +- Parser: Prefer case sensitive match over case insensitive (#1063) - ([cd6b141](https://github.com/boundaryml/baml/commit/cd6b141020ec8dfd2514c82ffffaebc5678a025b)) - Antonio Sarosi +- Only popup the vscode env var dialog once (#1066) - ([1951474](https://github.com/boundaryml/baml/commit/19514745cfc8efeb8bda0be655e0fa2f216e4b29)) - aaronvg + +### Documentation + +- Docs for literal types (#1030) - ([55e5964](https://github.com/boundaryml/baml/commit/55e596419055c8da52b841b9ecbf16e328bc1033)) - Antonio Sarosi +- Contribution guide (#1055) - ([f09d943](https://github.com/boundaryml/baml/commit/f09d9432d95c876f5e63f3abdb47a40417c5c45a)) - aaronvg + +### Misc + +- Fix VSCode metrics (#1044) - ([a131336](https://github.com/boundaryml/baml/commit/a13133656e1610cac9a92aa4b4459c78340c7304)) - hellovai +- Add more test cases for unquoted strings in objects (#1054) - ([2d1b700](https://github.com/boundaryml/baml/commit/2d1b700e82604e444d904cfeb67f46ced97153a5)) - hellovai + ## [0.61.1](https://github.com/boundaryml/baml/compare/0.61.0..0.61.1) - 2024-10-15 ### Bug Fixes diff --git a/engine/Cargo.lock b/engine/Cargo.lock index 09d199f82..26bf5e9e1 100644 --- a/engine/Cargo.lock +++ b/engine/Cargo.lock @@ -773,7 +773,7 @@ dependencies = [ [[package]] name = "baml-lib" -version = "0.61.1" +version = "0.62.0" dependencies = [ "base64 0.13.1", "dissimilar", @@ -810,7 +810,7 @@ dependencies = [ [[package]] name = "baml-runtime" -version = "0.61.1" +version = "0.62.0" dependencies = [ "ambassador", "anyhow", @@ -900,7 +900,7 @@ dependencies = [ [[package]] name = "baml-schema-build" -version = "0.61.1" +version = "0.62.0" dependencies = [ "anyhow", "baml-runtime", @@ -935,7 +935,7 @@ dependencies = [ [[package]] name = "baml-types" -version = "0.61.1" +version = "0.62.0" dependencies = [ "anyhow", "clap", @@ -2332,7 +2332,7 @@ dependencies = [ [[package]] name = "internal-baml-codegen" -version = "0.61.1" +version = "0.62.0" dependencies = [ "anyhow", "askama", @@ -2356,7 +2356,7 @@ dependencies = [ [[package]] name = "internal-baml-core" -version = "0.61.1" +version = "0.62.0" dependencies = [ "anyhow", "baml-types", @@ -2389,7 +2389,7 @@ dependencies = [ [[package]] name = "internal-baml-diagnostics" -version = "0.61.1" +version = "0.62.0" dependencies = [ "anyhow", "colored", @@ -2402,7 +2402,7 @@ dependencies = [ [[package]] name = "internal-baml-jinja" -version = "0.61.1" +version = "0.62.0" dependencies = [ "anyhow", "askama", @@ -2423,7 +2423,7 @@ dependencies = [ [[package]] name = "internal-baml-jinja-types" -version = "0.61.1" +version = "0.62.0" dependencies = [ "anyhow", "askama", @@ -2441,7 +2441,7 @@ dependencies = [ [[package]] name = "internal-baml-parser-database" -version = "0.61.1" +version = "0.62.0" dependencies = [ "anyhow", "baml-types", @@ -2463,7 +2463,7 @@ dependencies = [ [[package]] name = "internal-baml-prompt-parser" -version = "0.61.1" +version = "0.62.0" dependencies = [ "internal-baml-diagnostics", "internal-baml-schema-ast", @@ -2475,7 +2475,7 @@ dependencies = [ [[package]] name = "internal-baml-schema-ast" -version = "0.61.1" +version = "0.62.0" dependencies = [ "baml-types", "either", @@ -2552,7 +2552,7 @@ checksum = "9dbbfed4e59ba9750e15ba154fdfd9329cee16ff3df539c2666b70f58cc32105" [[package]] name = "jsonish" -version = "0.61.1" +version = "0.62.0" dependencies = [ "anyhow", "assert-json-diff", diff --git a/engine/Cargo.toml b/engine/Cargo.toml index da7e92c47..150f3022f 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.61.1" +version = "0.62.0" authors = ["Boundary "] description = "BAML Toolchain" diff --git a/engine/language_client_python/pyproject.toml b/engine/language_client_python/pyproject.toml index e93d8f4c8..f71d9150a 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.61.1" +version = "0.62.0" 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 97778c7e8..bf9ffbf21 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.61.1" + spec.version = "0.62.0" 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 0c3b3a138..6ec0300dc 100644 --- a/engine/language_client_typescript/package.json +++ b/engine/language_client_typescript/package.json @@ -1,6 +1,6 @@ { "name": "@boundaryml/baml", - "version": "0.61.1", + "version": "0.62.0", "description": "BAML typescript bindings (package.json)", "repository": { "type": "git", diff --git a/integ-tests/baml_src/generators.baml b/integ-tests/baml_src/generators.baml index de5755302..d50fea303 100644 --- a/integ-tests/baml_src/generators.baml +++ b/integ-tests/baml_src/generators.baml @@ -1,24 +1,24 @@ generator lang_python { output_type python/pydantic output_dir "../python" - version "0.61.1" + version "0.62.0" } generator lang_typescript { output_type typescript output_dir "../typescript" - version "0.61.1" + version "0.62.0" } generator lang_ruby { output_type ruby/sorbet output_dir "../ruby" - version "0.61.1" + version "0.62.0" } generator openapi { output_type rest/openapi output_dir "../openapi" - version "0.61.1" + version "0.62.0" on_generate "rm .gitignore" } diff --git a/integ-tests/python/baml_client/inlinedbaml.py b/integ-tests/python/baml_client/inlinedbaml.py index 2960a5e95..482a1e4d8 100644 --- a/integ-tests/python/baml_client/inlinedbaml.py +++ b/integ-tests/python/baml_client/inlinedbaml.py @@ -25,7 +25,7 @@ "fiddle-examples/extract-receipt-info.baml": "class ReceiptItem {\n name string\n description string?\n quantity int\n price float\n}\n\nclass ReceiptInfo {\n items ReceiptItem[]\n total_cost float?\n venue \"barisa\" | \"ox_burger\"\n}\n\nfunction ExtractReceiptInfo(email: string, reason: \"curiosity\" | \"personal_finance\") -> ReceiptInfo {\n client GPT4o\n prompt #\"\n Given the receipt below:\n\n ```\n {{email}}\n ```\n\n {{ ctx.output_format }}\n \"#\n}\n\n", "fiddle-examples/images/image.baml": "function DescribeImage(img: image) -> string {\n client GPT4o\n prompt #\"\n {{ _.role(\"user\") }}\n\n\n Describe the image below in 20 words:\n {{ img }}\n \"#\n\n}\n\nclass FakeImage {\n url string\n}\n\nclass ClassWithImage {\n myImage image\n param2 string\n fake_image FakeImage\n}\n\n// chat role user present\nfunction DescribeImage2(classWithImage: ClassWithImage, img2: image) -> string { \n client GPT4Turbo\n prompt #\"\n {{ _.role(\"user\") }}\n You should return 2 answers that answer the following commands.\n\n 1. Describe this in 5 words:\n {{ classWithImage.myImage }}\n\n 2. Also tell me what's happening here in one sentence:\n {{ img2 }}\n \"#\n}\n\n// no chat role\nfunction DescribeImage3(classWithImage: ClassWithImage, img2: image) -> string {\n client GPT4Turbo\n prompt #\"\n Describe this in 5 words:\n {{ classWithImage.myImage }}\n\n Tell me also what's happening here in one sentence and relate it to the word {{ classWithImage.param2 }}:\n {{ img2 }}\n \"#\n}\n\n\n// system prompt and chat prompt\nfunction DescribeImage4(classWithImage: ClassWithImage, img2: image) -> string {\n client GPT4Turbo\n prompt #\"\n {{ _.role(\"system\")}}\n\n Describe this in 5 words:\n {{ classWithImage.myImage }}\n\n Tell me also what's happening here in one sentence and relate it to the word {{ classWithImage.param2 }}:\n {{ img2 }}\n \"#\n}\n\ntest TestName {\n functions [DescribeImage]\n args {\n img { url \"https://imgs.xkcd.com/comics/standards.png\"}\n }\n}\n", "fiddle-examples/symbol-tuning.baml": "enum Category3 {\n Refund @alias(\"k1\")\n @description(\"Customer wants to refund a product\")\n\n CancelOrder @alias(\"k2\")\n @description(\"Customer wants to cancel an order\")\n\n TechnicalSupport @alias(\"k3\")\n @description(\"Customer needs help with a technical issue unrelated to account creation or login\")\n\n AccountIssue @alias(\"k4\")\n @description(\"Specifically relates to account-login or account-creation\")\n\n Question @alias(\"k5\")\n @description(\"Customer has a question\")\n}\n\nfunction ClassifyMessage3(input: string) -> Category {\n client GPT4\n\n prompt #\"\n Classify the following INPUT into ONE\n of the following categories:\n\n INPUT: {{ input }}\n\n {{ ctx.output_format }}\n\n Response:\n \"#\n}", - "generators.baml": "generator lang_python {\n output_type python/pydantic\n output_dir \"../python\"\n version \"0.61.1\"\n}\n\ngenerator lang_typescript {\n output_type typescript\n output_dir \"../typescript\"\n version \"0.61.1\"\n}\n\ngenerator lang_ruby {\n output_type ruby/sorbet\n output_dir \"../ruby\"\n version \"0.61.1\"\n}\n\ngenerator openapi {\n output_type rest/openapi\n output_dir \"../openapi\"\n version \"0.61.1\"\n on_generate \"rm .gitignore\"\n}\n", + "generators.baml": "generator lang_python {\n output_type python/pydantic\n output_dir \"../python\"\n version \"0.62.0\"\n}\n\ngenerator lang_typescript {\n output_type typescript\n output_dir \"../typescript\"\n version \"0.62.0\"\n}\n\ngenerator lang_ruby {\n output_type ruby/sorbet\n output_dir \"../ruby\"\n version \"0.62.0\"\n}\n\ngenerator openapi {\n output_type rest/openapi\n output_dir \"../openapi\"\n version \"0.62.0\"\n on_generate \"rm .gitignore\"\n}\n", "test-files/aliases/aliased-inputs.baml": "\nclass InputClass {\n key string @alias(\"color\")\n key2 string\n}\n\n\nclass InputClassNested {\n key string\n nested InputClass @alias(\"interesting-key\")\n}\n \n\nfunction AliasedInputClass(input: InputClass) -> string {\n client GPT35\n prompt #\"\n\n {{input}}\n\n This is a test. What's the name of the first json key above? Remember, tell me the key, not value.\n \"#\n}\n \nfunction AliasedInputClass2(input: InputClass) -> string {\n client GPT35\n prompt #\"\n\n {# making sure we can still access the original key #}\n {%if input.key == \"tiger\"%}\n Repeat this value back to me, and nothing else: {{input.key}}\n {%endif%}\n \"#\n}\n \n function AliasedInputClassNested(input: InputClassNested) -> string {\n client GPT35\n prompt #\"\n {{ _.role(\"user\")}}\n\n {{input}}\n\n This is a test. What's the name of the second json key above? Remember, tell me the key, not value.\n \"#\n }\n\n\nenum AliasedEnum {\n KEY_ONE @alias(\"tiger\")\n KEY_TWO\n}\n\nfunction AliasedInputEnum(input: AliasedEnum) -> string {\n client GPT4o\n prompt #\"\n {{ _.role(\"user\")}}\n\n\n Write out this word only in your response, in lowercase:\n ---\n {{input}}\n ---\n Answer:\n \"#\n}\n\n\nfunction AliasedInputList(input: AliasedEnum[]) -> string {\n client GPT35\n prompt #\"\n {{ _.role(\"user\")}}\n Given this array:\n ---\n {{input}}\n ---\n\n Return the first element in the array:\n \"#\n}\n\n", "test-files/aliases/classes.baml": "class TestClassAlias {\n key string @alias(\"key-dash\") @description(#\"\n This is a description for key\n af asdf\n \"#)\n key2 string @alias(\"key21\")\n key3 string @alias(\"key with space\")\n key4 string //unaliased\n key5 string @alias(\"key.with.punctuation/123\")\n}\n\nfunction FnTestClassAlias(input: string) -> TestClassAlias {\n client GPT35\n prompt #\"\n {{ctx.output_format}}\n \"#\n}\n\ntest FnTestClassAlias {\n functions [FnTestClassAlias]\n args {\n input \"example input\"\n }\n}\n", "test-files/aliases/enums.baml": "enum TestEnum {\n A @alias(\"k1\") @description(#\"\n User is angry\n \"#)\n B @alias(\"k22\") @description(#\"\n User is happy\n \"#)\n // tests whether k1 doesnt incorrectly get matched with k11\n C @alias(\"k11\") @description(#\"\n User is sad\n \"#)\n D @alias(\"k44\") @description(\n User is confused\n )\n E @description(\n User is excited\n )\n F @alias(\"k5\") // only alias\n \n G @alias(\"k6\") @description(#\"\n User is bored\n With a long description\n \"#)\n \n @@alias(\"Category\")\n}\n\nfunction FnTestAliasedEnumOutput(input: string) -> TestEnum {\n client GPT35\n prompt #\"\n Classify the user input into the following category\n \n {{ ctx.output_format }}\n\n {{ _.role('user') }}\n {{input}}\n\n {{ _.role('assistant') }}\n Category ID:\n \"#\n}\n\ntest FnTestAliasedEnumOutput {\n functions [FnTestAliasedEnumOutput]\n args {\n input \"mehhhhh\"\n }\n}", diff --git a/integ-tests/python/report.html b/integ-tests/python/report.html index 7e252c374..6c85620c2 100644 --- a/integ-tests/python/report.html +++ b/integ-tests/python/report.html @@ -3,11 +3,68 @@
Test Report

Summary

63
7 failed 56 passed

Tests

tests/test_functions.py 756 0:02:33.099733

PASSED test_sync 0:00:00.696264

Setup

Call

Captured stdout call
got response key
+    
Test Report

Summary

77
1 failed 76 passed

Tests

tests/test_functions.py 173 0:03:14.664365

PASSED test_env_vars_reset 0:00:01.360201

Setup

Call

Captured stdout call
Context depth is greater than 0!
+Except but ending trace!
+Context depth is greater than 0!
+
Captured stderr call
[2024-10-21T21:09:15Z WARN  baml_events] Function ExtractPeople:
+    Client: GPT4 (<unknown>) - 130ms
+    ---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,
+      }
+    ]
+    user: My name is Harrison. My hair is black and I'm 6 feet tall. I'm pretty good around the hoop.
+    
+    ---REQUEST OPTIONS---
+    model: "gpt-4o"
+    ---ERROR (InvalidAuthentication (401))---
+    Request failed: {
+        "error": {
+            "message": "Incorrect API key provided: sk-12345*7890. 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-10-21T21:09:16Z INFO  baml_events] Function ExtractPeople:
+    Client: GPT4 (gpt-4o-2024-08-06) - 733ms. 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,
+      }
+    ]
+    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"
+      }
+    ]
+    ---Parsed Response (list<class Person>)---
+    [
+      {
+        "name": "Harrison",
+        "hair_color": "BLACK"
+      }
+    ]
+

Teardown

PASSED test_sync 0:00:00.853908

Setup

Call

Captured stdout call
got response key
 true
 52
-
Captured stderr call
[2024-10-02T13:29:38Z INFO  baml_events] Function TestFnNamedArgsSingleClass:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 575ms. StopReason: stop
+
Captured stderr call
[2024-10-21T21:09:17Z INFO  baml_events] Function TestFnNamedArgsSingleClass:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 839ms. StopReason: stop
     ---PROMPT---
     [chat] system: Print these values back to me:
     key
@@ -20,8 +77,8 @@
     52
     ---Parsed Response (string)---
     "key\ntrue\n52"
-

Teardown

PASSED TestAllInputs::test_single_bool 0:00:00.429205

Setup

Call

Captured stderr call
[2024-10-02T13:29:38Z INFO  baml_events] Function TestFnNamedArgsSingleBool:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 419ms. StopReason: stop
+

Teardown

PASSED TestAllInputs::test_single_bool 0:00:00.364199

Setup

Call

Captured stderr call
[2024-10-21T21:09:17Z INFO  baml_events] Function TestFnNamedArgsSingleBool:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 358ms. StopReason: stop
     ---PROMPT---
     [chat] system: Return this value back to me: true
     
@@ -29,8 +86,8 @@
     true
     ---Parsed Response (string)---
     "true"
-

Teardown

PASSED TestAllInputs::test_single_string_list 0:00:00.486272

Setup

Call

Captured stderr call
[2024-10-02T13:29:39Z INFO  baml_events] Function TestFnNamedArgsSingleStringList:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 478ms. StopReason: stop
+

Teardown

PASSED TestAllInputs::test_single_string_list 0:00:00.671011

Setup

Call

Captured stderr call
[2024-10-21T21:09:18Z INFO  baml_events] Function TestFnNamedArgsSingleStringList:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 663ms. StopReason: stop
     ---PROMPT---
     [chat] system: Return this value back to me: ["a", "b", "c"]
     
@@ -38,8 +95,8 @@
     ["a", "b", "c"]
     ---Parsed Response (string)---
     "[\"a\", \"b\", \"c\"]"
-

Teardown

PASSED TestAllInputs::test_single_class 0:00:00.469527

Setup

Call

Captured stderr call
[2024-10-02T13:29:39Z INFO  baml_events] Function TestFnNamedArgsSingleClass:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 461ms. StopReason: stop
+

Teardown

PASSED TestAllInputs::test_single_class 0:00:00.385378

Setup

Call

Captured stderr call
[2024-10-21T21:09:18Z INFO  baml_events] Function TestFnNamedArgsSingleClass:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 379ms. StopReason: stop
     ---PROMPT---
     [chat] system: Print these values back to me:
     key
@@ -52,8 +109,8 @@
     52
     ---Parsed Response (string)---
     "key\ntrue\n52"
-

Teardown

PASSED TestAllInputs::test_multiple_args 0:00:00.499491

Setup

Call

Captured stderr call
[2024-10-02T13:29:40Z INFO  baml_events] Function TestMulticlassNamedArgs:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 495ms. StopReason: stop
+

Teardown

PASSED TestAllInputs::test_multiple_args 0:00:00.680528

Setup

Call

Captured stderr call
[2024-10-21T21:09:19Z INFO  baml_events] Function TestMulticlassNamedArgs:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 674ms. StopReason: stop
     ---PROMPT---
     [chat] system: Print these values back to me:
     key
@@ -72,8 +129,8 @@
     64
     ---Parsed Response (string)---
     "key\ntrue\n52\nkey\ntrue\n64"
-

Teardown

PASSED TestAllInputs::test_single_enum_list 0:00:00.369742

Setup

Call

Captured stderr call
[2024-10-02T13:29:40Z INFO  baml_events] Function TestFnNamedArgsSingleEnumList:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 363ms. StopReason: stop
+

Teardown

PASSED TestAllInputs::test_single_enum_list 0:00:00.361575

Setup

Call

Captured stderr call
[2024-10-21T21:09:19Z INFO  baml_events] Function TestFnNamedArgsSingleEnumList:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 356ms. StopReason: stop
     ---PROMPT---
     [chat] system: Print these values back to me:
     ["TWO"]
@@ -82,8 +139,8 @@
     ["TWO"]
     ---Parsed Response (string)---
     "[\"TWO\"]"
-

Teardown

PASSED TestAllInputs::test_single_float 0:00:00.310801

Setup

Call

Captured stderr call
[2024-10-02T13:29:40Z INFO  baml_events] Function TestFnNamedArgsSingleFloat:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 303ms. StopReason: stop
+

Teardown

PASSED TestAllInputs::test_single_float 0:00:00.874032

Setup

Call

Captured stderr call
[2024-10-21T21:09:20Z INFO  baml_events] Function TestFnNamedArgsSingleFloat:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 868ms. StopReason: stop
     ---PROMPT---
     [chat] system: Return this value back to me: 3.12
     
@@ -91,8 +148,8 @@
     3.12
     ---Parsed Response (string)---
     "3.12"
-

Teardown

PASSED TestAllInputs::test_single_int 0:00:00.394601

Setup

Call

Captured stderr call
[2024-10-02T13:29:41Z INFO  baml_events] Function TestFnNamedArgsSingleInt:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 387ms. StopReason: stop
+

Teardown

PASSED TestAllInputs::test_single_int 0:00:00.837118

Setup

Call

Captured stderr call
[2024-10-21T21:09:21Z INFO  baml_events] Function TestFnNamedArgsSingleInt:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 830ms. StopReason: stop
     ---PROMPT---
     [chat] system: Return this value back to me: 3566
     
@@ -100,33 +157,39 @@
     3566
     ---Parsed Response (string)---
     "3566"
-

Teardown

PASSED TestAllInputs::test_single_map_string_to_string 0:00:00.778877

Setup

Call

Captured stderr call
[2024-10-02T13:29:41Z INFO  baml_events] Function TestFnNamedArgsSingleMapStringToString:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 770ms. StopReason: stop
+

Teardown

PASSED TestAllInputs::test_single_map_string_to_string 0:00:00.522795

Setup

Call

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

Teardown

PASSED TestAllInputs::test_single_map_string_to_class 0:00:00.435043

Setup

Call

Captured stderr call
[2024-10-02T13:29:42Z INFO  baml_events] Function TestFnNamedArgsSingleMapStringToClass:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 426ms. StopReason: stop
+

Teardown

PASSED TestAllInputs::test_single_map_string_to_class 0:00:00.685528

Setup

Call

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

Teardown

PASSED TestAllInputs::test_single_map_string_to_map 0:00:00.432208

Setup

Call

Captured stderr call
[2024-10-02T13:29:42Z INFO  baml_events] Function TestFnNamedArgsSingleMapStringToMap:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 424ms. StopReason: stop
+

Teardown

PASSED TestAllInputs::test_single_map_string_to_map 0:00:00.570172

Setup

Call

Captured stderr call
[2024-10-21T21:09:23Z INFO  baml_events] Function TestFnNamedArgsSingleMapStringToMap:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 563ms. StopReason: stop
     ---PROMPT---
     [chat] system: Return this value back to me: {"lorem": {"word": "ipsum"}}
     
@@ -138,17 +201,17 @@
         "word": "ipsum"
       }
     }
-

Teardown

PASSED test_should_work_for_all_outputs 0:00:04.927616

Setup

Call

Captured stderr call
[2024-10-02T13:29:43Z INFO  baml_events] Function FnOutputBool:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 523ms. StopReason: stop
+

Teardown

PASSED test_should_work_for_all_outputs 0:00:03.665940

Setup

Call

Captured stderr call
[2024-10-21T21:09:23Z INFO  baml_events] Function FnOutputBool:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 430ms. StopReason: stop
     ---PROMPT---
     [chat] system: Return a true: Answer as a: bool
     
     ---LLM REPLY---
-    True
+    true
     ---Parsed Response (bool)---
     true
-[2024-10-02T13:29:43Z INFO  baml_events] Function FnOutputClassList:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 588ms. StopReason: stop
+[2024-10-21T21:09:24Z INFO  baml_events] Function FnOutputClassList:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 630ms. StopReason: stop
     ---PROMPT---
     [chat] system: Return a JSON array that follows this schema: 
     Answer with a JSON Array using this schema:
@@ -164,19 +227,19 @@
     ---LLM REPLY---
     [
       {
-        "prop1": "Hello",
+        "prop1": "example",
         "prop2": 123
       }
     ]
     ---Parsed Response (list<class TestOutputClass>)---
     [
       {
-        "prop1": "Hello",
+        "prop1": "example",
         "prop2": 123
       }
     ]
-[2024-10-02T13:29:44Z INFO  baml_events] Function FnOutputClassWithEnum:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 695ms. StopReason: stop
+[2024-10-21T21:09:25Z INFO  baml_events] Function FnOutputClassWithEnum:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 808ms. StopReason: stop
     ---PROMPT---
     [chat] system: Return a made up json blob that matches this schema:
     Answer in JSON using this schema:
@@ -190,16 +253,16 @@
     
     ---LLM REPLY---
     {
-      "prop1": "Hello, world!",
-      "prop2": "ONE"
+      "prop1": "Lorem ipsum",
+      "prop2": "TWO"
     }
     ---Parsed Response (class TestClassWithEnum)---
     {
-      "prop1": "Hello, world!",
-      "prop2": "ONE"
+      "prop1": "Lorem ipsum",
+      "prop2": "TWO"
     }
-[2024-10-02T13:29:46Z INFO  baml_events] Function FnOutputClass:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 1999ms. StopReason: stop
+[2024-10-21T21:09:25Z INFO  baml_events] Function FnOutputClass:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 626ms. StopReason: stop
     ---PROMPT---
     [chat] system: Return a JSON blob with this schema: 
     Answer in JSON using this schema:
@@ -214,16 +277,16 @@
     
     ---LLM REPLY---
     {
-      "prop1": "Hello, world!",
+      "prop1": "Hello, World!",
       "prop2": 540
     }
     ---Parsed Response (class TestOutputClass)---
     {
-      "prop1": "Hello, world!",
+      "prop1": "Hello, World!",
       "prop2": 540
     }
-[2024-10-02T13:29:47Z INFO  baml_events] Function FnEnumListOutput:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 444ms. StopReason: stop
+[2024-10-21T21:09:26Z INFO  baml_events] Function FnEnumListOutput:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 477ms. StopReason: stop
     ---PROMPT---
     [chat] system: Print out two of these values randomly selected from the list below in a json array.
     
@@ -236,16 +299,16 @@
     
     ---LLM REPLY---
     [
-      'ONE',
+      'TWO',
       'THREE'
     ]
     ---Parsed Response (list<enum EnumOutput>)---
     [
-      "ONE",
+      "TWO",
       "THREE"
     ]
-[2024-10-02T13:29:47Z INFO  baml_events] Function FnEnumOutput:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 629ms. StopReason: stop
+[2024-10-21T21:09:26Z INFO  baml_events] Function FnEnumOutput:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 658ms. StopReason: stop
     ---PROMPT---
     [chat] system: Choose one of these values randomly. Before you give the answer, write out an unrelated haiku about the ocean.
     
@@ -256,17 +319,15 @@
     - THREE
     
     ---LLM REPLY---
-    Waves crash upon shore
-    Whispers of the deep blue sea
-    Majestic and free
+    Sparkling blue waters
+    Waves crashing upon the shore
+    Peace found in the sea
     
-    VALUE_ENUM
-    ----
-    TWO
+    VALUE_ENUM: TWO
     ---Parsed Response (enum EnumOutput)---
     "TWO"
-

Teardown

PASSED test_should_work_with_image_url 0:00:01.250264

Setup

Call

Captured stderr call
[2024-10-02T13:29:49Z INFO  baml_events] Function TestImageInput:
-    Client: GPT4o (gpt-4o-2024-05-13) - 1241ms. StopReason: stop
+

Teardown

PASSED test_should_work_with_image_url 0:00:01.114574

Setup

Call

Captured stderr call
[2024-10-21T21:09:28Z INFO  baml_events] Function TestImageInput:
+    Client: GPT4o (gpt-4o-2024-08-06) - 1109ms. 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>
     
@@ -274,70 +335,48 @@
     Green animated ogre smiling.
     ---Parsed Response (string)---
     "Green animated ogre smiling."
-

Teardown

PASSED test_should_work_with_image_list 0:00:01.889588

Setup

Call

Captured stderr call
[2024-10-02T13:29:50Z INFO  baml_events] Function TestImageListInput:
-    Client: GPT4o (gpt-4o-2024-05-13) - 1881ms. StopReason: stop
+

Teardown

PASSED test_should_work_with_image_list 0:00:01.825899

Setup

Call

Captured stderr call
[2024-10-21T21:09:29Z INFO  baml_events] Function TestImageListInput:
+    Client: GPT4o (gpt-4o-2024-08-06) - 1820ms. 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 both the character in the first image and the Google logo in the second image have in common are green and yellow. Specifically, the character has green skin with a yellowish tone, and the Google logo contains a green letter "l" and a yellow letter "o".
+    The common colors between the two images are green, yellow, and brown.
     ---Parsed Response (string)---
-    "The colors that both the character in the first image and the Google logo in the second image have in common are green and yellow. Specifically, the character has green skin with a yellowish tone, and the Google logo contains a green letter \"l\" and a yellow letter \"o\"."
-

Teardown

FAILED test_should_work_with_vertex 0:00:00.006852

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: 1727875790, tv_nsec: 924615000 }, latency: 1.862584ms, message: "Error {\n    context: \"Failed to build request\",\n    source: \"Service account not found\",\n}", code: Other(2) }

Setup

Call

>   ???
-
-tests/test_functions.py:184: 
-_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
-
-self = 
-input = 'donkey kong', baml_options = {}
-
-    async def TestVertex(
-        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(
-        "TestVertex",
-        {
-          "input": input,
-        },
-        self.__ctx_manager.get(),
-        tb,
-        __cr__,
-      )
-      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: 1727875790, tv_nsec: 924615000 }, latency: 1.862584ms, message: "Error {\n    context: \"Failed to build request\",\n    source: \"Service account not found\",\n}", code: Other(2) }
-
-baml_client/async_client.py:1908: BamlClientError
Captured stderr call
[2024-10-02T13:29:50Z WARN  baml_events] Function TestVertex:
-    Client: Vertex (<unknown>) - 1ms
+    "The common colors between the two images are green, yellow, and brown."
+

Teardown

PASSED test_should_work_with_vertex 0:00:16.973024

Setup

Call

Captured stderr call
[2024-10-21T21:09:46Z INFO  baml_events] Function TestVertex:
+    Client: Vertex () - 16964ms. StopReason: "STOP"
     ---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:00.778791

Setup

Call

Captured stderr call
[2024-10-02T13:29:51Z INFO  baml_events] Function TestImageInput:
-    Client: GPT4o (gpt-4o-2024-05-13) - 762ms. StopReason: stop
+    ---LLM REPLY---
+    The morning sun, filtering through the leafy canopy, painted dappled patterns on Donkey Kong's fur as he munched contentedly on a particularly plump banana. Retirement, he had discovered, was glorious. Gone were the days of frantic chases across rickety mine shafts and precarious platforms. No more meddling plumbers pilfering his banana hoard. 
+    
+    He glanced at the smaller figure beside him, swinging upside down from a vine, a miniature Donkey Kong with a shock of brown hair. Diddy Kong, his beloved nephew and former partner-in-crime, grinned, peeling his own banana with his feet.
+    
+    "Remember the time," Diddy chuckled, "when you tried to build a banana-powered rocket to the moon?"
+    
+    Donkey Kong snorted, a deep rumble in his chest. He'd rather forget the disastrous (and messy) experiment. 
+    
+    "And the time," Diddy continued, mischief twinkling in his eyes, "you challenged Cranky to a dance-off? You know, to win back your banana stash?"
+    
+    Donkey Kong threw a half-eaten banana at his nephew, who dodged it with a yelp of laughter. 
+    
+    Yes, they had their share of adventures, but the best part was sharing them with family. And as Donkey Kong watched Diddy swing away, a new generation of Kongs already clamoring for attention, he knew the laughter, the mischief, and the love of family would continue to echo through their jungle home, just like the legends of Donkey Kong himself. 
+    
+    ---Parsed Response (string)---
+    "The morning sun, filtering through the leafy canopy, painted dappled patterns on Donkey Kong's fur as he munched contentedly on a particularly plump banana. Retirement, he had discovered, was glorious. Gone were the days of frantic chases across rickety mine shafts and precarious platforms. No more meddling plumbers pilfering his banana hoard. \n\nHe glanced at the smaller figure beside him, swinging upside down from a vine, a miniature Donkey Kong with a shock of brown hair. Diddy Kong, his beloved nephew and former partner-in-crime, grinned, peeling his own banana with his feet.\n\n\"Remember the time,\" Diddy chuckled, \"when you tried to build a banana-powered rocket to the moon?\"\n\nDonkey Kong snorted, a deep rumble in his chest. He'd rather forget the disastrous (and messy) experiment. \n\n\"And the time,\" Diddy continued, mischief twinkling in his eyes, \"you challenged Cranky to a dance-off? You know, to win back your banana stash?\"\n\nDonkey Kong threw a half-eaten banana at his nephew, who dodged it with a yelp of laughter. \n\nYes, they had their share of adventures, but the best part was sharing them with family. And as Donkey Kong watched Diddy swing away, a new generation of Kongs already clamoring for attention, he knew the laughter, the mischief, and the love of family would continue to echo through their jungle home, just like the legends of Donkey Kong himself. \n"
+

Teardown

PASSED test_should_work_with_image_base64 0:00:02.424895

Setup

Call

Captured stderr call
[2024-10-21T21:09:49Z INFO  baml_events] Function TestImageInput:
+    Client: GPT4o (gpt-4o-2024-08-06) - 2399ms. StopReason: stop
     ---PROMPT---
     [chat] user: Describe this in 4 words. One word must be the color<image_placeholder base64>
     
     ---LLM REPLY---
-    Green ogre wearing vest.
+    Green animated ogre smiling.
     ---Parsed Response (string)---
-    "Green ogre wearing vest."
-

Teardown

PASSED test_should_work_with_audio_base64 0:00:01.520442

Setup

Call

Captured stderr call
[2024-10-02T13:29:53Z INFO  baml_events] Function AudioInput:
-    Client: Gemini () - 1507ms. StopReason: "STOP"
+    "Green animated ogre smiling."
+

Teardown

PASSED test_should_work_with_audio_base64 0:00:01.226413

Setup

Call

Captured stderr call
[2024-10-21T21:09:50Z INFO  baml_events] Function AudioInput:
+    Client: Gemini () - 1212ms. StopReason: "STOP"
     ---PROMPT---
     [chat] user: Does this sound like a roar? Yes or no? One word no other characters.<image_placeholder base64>
     
@@ -346,8 +385,8 @@
     
     ---Parsed Response (string)---
     "Yes \n"
-

Teardown

PASSED test_should_work_with_audio_url 0:00:01.064310

Setup

Call

Captured stderr call
[2024-10-02T13:29:54Z INFO  baml_events] Function AudioInput:
-    Client: Gemini () - 948ms. StopReason: "STOP"
+

Teardown

PASSED test_should_work_with_audio_url 0:00:01.564858

Setup

Call

Captured stderr call
[2024-10-21T21:09:52Z INFO  baml_events] Function AudioInput:
+    Client: Gemini () - 1401ms. StopReason: "STOP"
     ---PROMPT---
     [chat] user: Does this sound like a roar? Yes or no? One word no other characters.<audio_placeholder base64>
     
@@ -356,10 +395,10 @@
     
     ---Parsed Response (string)---
     "No \n"
-

Teardown

PASSED test_works_with_retries2 0:00:01.910290

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: 1727875796, tv_nsec: 151093000 }, latency: 107.278125ms, 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-10-02T13:29:56Z WARN  baml_events] Function TestRetryExponential:
+

Teardown

PASSED test_works_with_retries2 0:00:02.284012

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: 1729544994, tv_nsec: 202792000 }, latency: 210.975333ms, 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-10-21T21:09:54Z WARN  baml_events] Function TestRetryExponential:
     (3 other previous tries)
-    Client: RetryClientExponential (<unknown>) - 107ms
+    Client: RetryClientExponential (<unknown>) - 210ms
     ---PROMPT---
     [chat] system: Say a haiku
     
@@ -375,20 +414,20 @@
         }
     }
     
-

Teardown

PASSED test_works_with_fallbacks 0:00:01.522619

Setup

Call

Captured stderr call
[2024-10-02T13:29:57Z INFO  baml_events] Function TestFallbackClient:
+

Teardown

PASSED test_works_with_fallbacks 0:00:02.164975

Setup

Call

Captured stderr call
[2024-10-21T21:09:56Z INFO  baml_events] Function TestFallbackClient:
     (5 other previous tries)
-    Client: GPT35 (gpt-3.5-turbo-0125) - 607ms. StopReason: stop
+    Client: GPT35 (gpt-3.5-turbo-0125) - 654ms. StopReason: stop
     ---PROMPT---
     [chat] system: Say a haiku about mexico.
     
     ---LLM REPLY---
-    Sunset on beaches,
-    Mariachi music plays,
-    Mexico's beauty.
+    Vibrant colors bloom
+    Mariachi music plays
+    Mexico's beauty
     ---Parsed Response (string)---
-    "Sunset on beaches,\nMariachi music plays,\nMexico's beauty."
-

Teardown

PASSED test_claude 0:00:00.865775

Setup

Call

Captured stderr call
[2024-10-02T13:29:58Z INFO  baml_events] Function PromptTestClaude:
-    Client: Sonnet (claude-3-5-sonnet-20240620) - 858ms. StopReason: "end_turn"
+    "Vibrant colors bloom\nMariachi music plays\nMexico's beauty"
+

Teardown

PASSED test_works_with_failing_azure_fallback 0:00:00.003020

Setup

Call

Teardown

PASSED test_claude 0:00:01.274422

Setup

Call

Captured stderr call
[2024-10-21T21:09:57Z INFO  baml_events] Function PromptTestClaude:
+    Client: Sonnet (claude-3-5-sonnet-20240620) - 1265ms. StopReason: "end_turn"
     ---PROMPT---
     [chat] user: Tell me a haiku about Mt Rainier is tall
     
@@ -396,155 +435,187 @@
     Here's a haiku about Mt. Rainier being tall:
     
     Rainier towers high
-    Majestic peak scrapes the sky
-    Nature's grand monarch
+    Piercing clouds with snowy peak
+    Nature's skyscraper
     ---Parsed Response (string)---
-    "Here's a haiku about Mt. Rainier being tall:\n\nRainier towers high\nMajestic peak scrapes the sky\nNature's grand monarch"
-

Teardown

PASSED test_gemini 0:00:12.041386

Setup

Call

Captured stdout call
LLM output from Gemini: Dr. Pepper wasn't a real doctor, not in the traditional sense. He didn't wear a white coat or carry a stethoscope, though he did own a magnificent magnifying glass he claimed could spot a lie from a mile away. In reality, Dr. Pepper was a soda jerk, but not just any soda jerk. He was the proprietor and sole employee of "Dr. Pepper's Elixirs & Enchantments," a tiny, cluttered soda fountain nestled between a dusty bookstore and a purring cat sanctuary. 
+    "Here's a haiku about Mt. Rainier being tall:\n\nRainier towers high\nPiercing clouds with snowy peak\nNature's skyscraper"
+

Teardown

PASSED test_gemini 0:00:07.735419

Setup

Call

Captured stdout call
LLM output from Gemini: Dottie sighed, the weight of the convenience store's fluorescent lights pressing down on her. Another day, another dollar, another questionable hot dog rotating slowly on the roller grill.  She glanced out the window at the endless Texas highway, shimmering under the midday sun.  
+
+"Dr. Pepper, please," a man's voice startled her. He was tall and dusty, wearing a Stetson that shadowed his eyes. Dottie grabbed a bottle, the glass cool in her hand. 
+
+As she rang him up, he saw her gazing out at the road. "Passing through?" he asked.
 
-People didn't come for the fizzy drinks, though Dr. Pepper did make a mean cherry phosphate. They came for his uncanny ability to concoct the perfect beverage for any ailment, be it a broken heart, a stalled dream, or a simple case of the Mondays. He listened with an empathetic ear and sparkling, bespectacled eyes, the gentle clinking of glasses and hiss of the soda fountain providing a comforting rhythm.  His creations, a dizzying mix of flavors and colors, were legendary. 
+"Dreaming of it," she admitted. "This town's got a way of holding you hostage." 
 
-One rainy afternoon, a young woman named Amelia wandered into the shop. She was an aspiring writer, her face etched with the frustration of writer's block. Dr. Pepper, without a word, blended a concoction of ginger ale, a pinch of cinnamon, and a secret ingredient he called "Inspiration Extract." As Amelia sipped the surprisingly delicious beverage, he told her, "Sometimes, you just need a little fizz to get the words flowing."
+The man smiled, a surprisingly gentle curve of his lips. "It's all about perspective, ma'am. Sometimes the sweetest things are hidden in plain sight." He took a swig of his Dr. Pepper.  "Twenty-two flavors, you know. Twenty-two reasons to smile." He winked and ambled out, leaving Dottie staring at the bottle in his wake. 
 
-And flow they did. By the time Amelia drained her glass, her notebook overflowed with ideas. She left with a renewed sense of purpose and a smile brighter than the neon sign outside. 
+Twenty-two reasons. She started counting them off in her head – the familiar fizz, the caramel notes, the way the cold glass felt against her hand on a day like this. She popped the cap off her own Dr. Pepper, the scent a sudden burst of nostalgia.  It tasted like lazy summer afternoons by the creek, of fireflies winking in the twilight, of her grandmother's laughter echoing through their old farmhouse. 
 
-Dr. Pepper wasn't a real doctor, but he had a gift, a magic touch that transcended fizzy water and syrups. He understood that sometimes, the best medicine was a listening ear, a kind smile, and a perfectly crafted beverage to soothe the soul. And in the heart of the bustling city, his little soda fountain became a haven, a testament to the power of a little bit of sweetness and a whole lot of heart. 
+The highway shimmered outside, no longer a symbol of escape, but a ribbon of possibility. Maybe she couldn't travel it today, but she had her memories, her dreams, and yes, even this dusty old town, holding twenty-two reasons to smile in each day. 
 
-
Captured stderr call
[2024-10-02T13:30:10Z INFO  baml_events] Function TestGemini:
-    Client: Gemini () - 12030ms. StopReason: "STOP"
+
Captured stderr call
[2024-10-21T21:10:05Z INFO  baml_events] Function TestGemini:
+    Client: Gemini () - 7728ms. StopReason: "STOP"
     ---PROMPT---
     [chat] user: Write a nice short story about Dr. Pepper
     
     ---LLM REPLY---
-    Dr. Pepper wasn't a real doctor, not in the traditional sense. He didn't wear a white coat or carry a stethoscope, though he did own a magnificent magnifying glass he claimed could spot a lie from a mile away. In reality, Dr. Pepper was a soda jerk, but not just any soda jerk. He was the proprietor and sole employee of "Dr. Pepper's Elixirs & Enchantments," a tiny, cluttered soda fountain nestled between a dusty bookstore and a purring cat sanctuary. 
+    Dottie sighed, the weight of the convenience store's fluorescent lights pressing down on her. Another day, another dollar, another questionable hot dog rotating slowly on the roller grill.  She glanced out the window at the endless Texas highway, shimmering under the midday sun.  
     
-    People didn't come for the fizzy drinks, though Dr. Pepper did make a mean cherry phosphate. They came for his uncanny ability to concoct the perfect beverage for any ailment, be it a broken heart, a stalled dream, or a simple case of the Mondays. He listened with an empathetic ear and sparkling, bespectacled eyes, the gentle clinking of glasses and hiss of the soda fountain providing a comforting rhythm.  His creations, a dizzying mix of flavors and colors, were legendary. 
+    "Dr. Pepper, please," a man's voice startled her. He was tall and dusty, wearing a Stetson that shadowed his eyes. Dottie grabbed a bottle, the glass cool in her hand. 
     
-    One rainy afternoon, a young woman named Amelia wandered into the shop. She was an aspiring writer, her face etched with the frustration of writer's block. Dr. Pepper, without a word, blended a concoction of ginger ale, a pinch of cinnamon, and a secret ingredient he called "Inspiration Extract." As Amelia sipped the surprisingly delicious beverage, he told her, "Sometimes, you just need a little fizz to get the words flowing."
+    As she rang him up, he saw her gazing out at the road. "Passing through?" he asked.
     
-    And flow they did. By the time Amelia drained her glass, her notebook overflowed with ideas. She left with a renewed sense of purpose and a smile brighter than the neon sign outside. 
+    "Dreaming of it," she admitted. "This town's got a way of holding you hostage." 
     
-    Dr. Pepper wasn't a real doctor, but he had a gift, a magic touch that transcended fizzy water and syrups. He understood that sometimes, the best medicine was a listening ear, a kind smile, and a perfectly crafted beverage to soothe the soul. And in the heart of the bustling city, his little soda fountain became a haven, a testament to the power of a little bit of sweetness and a whole lot of heart. 
+    The man smiled, a surprisingly gentle curve of his lips. "It's all about perspective, ma'am. Sometimes the sweetest things are hidden in plain sight." He took a swig of his Dr. Pepper.  "Twenty-two flavors, you know. Twenty-two reasons to smile." He winked and ambled out, leaving Dottie staring at the bottle in his wake. 
+    
+    Twenty-two reasons. She started counting them off in her head – the familiar fizz, the caramel notes, the way the cold glass felt against her hand on a day like this. She popped the cap off her own Dr. Pepper, the scent a sudden burst of nostalgia.  It tasted like lazy summer afternoons by the creek, of fireflies winking in the twilight, of her grandmother's laughter echoing through their old farmhouse. 
+    
+    The highway shimmered outside, no longer a symbol of escape, but a ribbon of possibility. Maybe she couldn't travel it today, but she had her memories, her dreams, and yes, even this dusty old town, holding twenty-two reasons to smile in each day. 
     
     ---Parsed Response (string)---
-    "Dr. Pepper wasn't a real doctor, not in the traditional sense. He didn't wear a white coat or carry a stethoscope, though he did own a magnificent magnifying glass he claimed could spot a lie from a mile away. In reality, Dr. Pepper was a soda jerk, but not just any soda jerk. He was the proprietor and sole employee of \"Dr. Pepper's Elixirs & Enchantments,\" a tiny, cluttered soda fountain nestled between a dusty bookstore and a purring cat sanctuary. \n\nPeople didn't come for the fizzy drinks, though Dr. Pepper did make a mean cherry phosphate. They came for his uncanny ability to concoct the perfect beverage for any ailment, be it a broken heart, a stalled dream, or a simple case of the Mondays. He listened with an empathetic ear and sparkling, bespectacled eyes, the gentle clinking of glasses and hiss of the soda fountain providing a comforting rhythm.  His creations, a dizzying mix of flavors and colors, were legendary. \n\nOne rainy afternoon, a young woman named Amelia wandered into the shop. She was an aspiring writer, her face etched with the frustration of writer's block. Dr. Pepper, without a word, blended a concoction of ginger ale, a pinch of cinnamon, and a secret ingredient he called \"Inspiration Extract.\" As Amelia sipped the surprisingly delicious beverage, he told her, \"Sometimes, you just need a little fizz to get the words flowing.\"\n\nAnd flow they did. By the time Amelia drained her glass, her notebook overflowed with ideas. She left with a renewed sense of purpose and a smile brighter than the neon sign outside. \n\nDr. Pepper wasn't a real doctor, but he had a gift, a magic touch that transcended fizzy water and syrups. He understood that sometimes, the best medicine was a listening ear, a kind smile, and a perfectly crafted beverage to soothe the soul. And in the heart of the bustling city, his little soda fountain became a haven, a testament to the power of a little bit of sweetness and a whole lot of heart. \n"
-

Teardown

PASSED test_gemini_streaming 0:00:10.566186

Setup

Call

Captured stdout call
LLM output from Gemini: Dr. Pete Pepper wasn't a real doctor, not in the traditional sense. He didn't wear a white coat, nor did he have a stethoscope slung around his neck. Instead, he wore a worn leather apron and a smile as bright as a freshly polished soda fountain. His domain was a little red shack on the edge of Harmony Creek, a town where life flowed at the pace of a lazy river. 
+    "Dottie sighed, the weight of the convenience store's fluorescent lights pressing down on her. Another day, another dollar, another questionable hot dog rotating slowly on the roller grill.  She glanced out the window at the endless Texas highway, shimmering under the midday sun.  \n\n\"Dr. Pepper, please,\" a man's voice startled her. He was tall and dusty, wearing a Stetson that shadowed his eyes. Dottie grabbed a bottle, the glass cool in her hand. \n\nAs she rang him up, he saw her gazing out at the road. \"Passing through?\" he asked.\n\n\"Dreaming of it,\" she admitted. \"This town's got a way of holding you hostage.\" \n\nThe man smiled, a surprisingly gentle curve of his lips. \"It's all about perspective, ma'am. Sometimes the sweetest things are hidden in plain sight.\" He took a swig of his Dr. Pepper.  \"Twenty-two flavors, you know. Twenty-two reasons to smile.\" He winked and ambled out, leaving Dottie staring at the bottle in his wake. \n\nTwenty-two reasons. She started counting them off in her head – the familiar fizz, the caramel notes, the way the cold glass felt against her hand on a day like this. She popped the cap off her own Dr. Pepper, the scent a sudden burst of nostalgia.  It tasted like lazy summer afternoons by the creek, of fireflies winking in the twilight, of her grandmother's laughter echoing through their old farmhouse. \n\nThe highway shimmered outside, no longer a symbol of escape, but a ribbon of possibility. Maybe she couldn't travel it today, but she had her memories, her dreams, and yes, even this dusty old town, holding twenty-two reasons to smile in each day. \n"
+

Teardown

PASSED test_gemini_streaming 0:00:09.974979

Setup

Call

Captured stdout call
LLM output from Gemini: Old Doc Palmer adjusted his spectacles and peered at the bubbling concoction through the glass. Around him, the soda fountain buzzed with the afternoon rush, but his focus remained solely on the caramel-colored liquid within. 
+
+"Not quite right," he muttered, tapping a finger against the glass. 
 
-His shack, known simply as "Doc's," was famous for one thing – the best darn sodas in a hundred-mile radius. Doc had a knack for concocting the most unusual, most delicious flavors. He’d muddle fresh berries with herbs he grew in his window box, mixed syrups with a secret blend of spices, and always added a dash of something unexpected – a pinch of sea salt, a sprig of rosemary, a hint of lavender. 
+He'd been at it for weeks, determined to create a new soda flavor, something unique, something...different.  He'd tried every fruit imaginable, every spice, every combination he could conjure. Still, nothing sparked the excitement, the "aha!" moment he craved. 
 
-People came from far and wide, not just for the sodas, but for Doc's infectious cheer. He had a way of listening to your troubles, offering a comforting word and a perfectly tailored drink. Feeling down?  Try the "Sunshine Splash," a burst of orange and mango. Heartbreak got you down? The "Mender Upper," a creamy concoction of chocolate and cherry, was just the thing. 
+"Whatcha making there, Doc?" 
 
-One day, a young girl named Lily arrived at Doc's, her face clouded with worry.  Her dog, Sparky, had lost his bark, and no one knew why. Doc listened patiently, his brow furrowed in thought. Then, a mischievous twinkle lit his eye. 
+Young Billy, his apprentice and all-around helper, leaned in, eyes wide with curiosity. Doc Palmer sighed. Even Billy, with his incessant questions and insatiable sweet tooth, couldn't offer a solution this time.
 
-"I believe I have just the thing," he declared, disappearing behind the counter. He emerged with a bubbly concoction, a vibrant green with a swirl of something sparkly. 
+"Trying to capture lightning in a bottle," Doc Palmer admitted, his shoulders slumping. 
 
-"This," he announced, "is the "Barking Blizzard." One sip, and Sparky will be howling at the moon!"
+Billy tilted his head, "Like the fireworks on the Fourth of July?"
 
-Lily, hesitant but hopeful, gave Sparky a tentative lick of the soda. A moment later, a bark, small but determined, erupted from Sparky. Lily's face broke into a wide grin.
+The question struck a chord in Doc Palmer's mind. Fireworks! He didn't need a specific fruit; he needed a feeling. The feeling of celebration, of excitement, of that first sip on a hot summer day that made your taste buds dance.
 
-News of the "Barking Blizzard" spread like wildfire, further cementing Dr. Pete Pepper's status as a local legend. He wasn't a doctor who mended bones or cured illnesses, but he healed hearts and lifted spirits, one delicious, magical soda at a time. And really, wasn't that a kind of magic all its own? 
+He grabbed a handful of ingredients, ignoring Billy's worried look as he tossed them into the mix: a touch of licorice for a bit of mystery, a dash of amaretto for warmth, a whisper of cola for familiarity. 
 
-
Captured stderr call
[2024-10-02T13:30:21Z INFO  baml_events] Function TestGemini:
-    Client: Gemini (gemini-1.5-pro-001) - 10545ms. StopReason: Stop
+He shook the mixture, the soda fountain rattling in protest. The resulting concoction was a deep, rich brown, with a tantalizing aroma that filled the air.  He poured a glass and took a hesitant sip.
+
+His eyes widened.  A burst of flavors, sweet and spicy, familiar yet entirely new, exploded on his tongue. It was different, it was exciting, it was...perfect. 
+
+He looked at Billy, who was staring at him expectantly. 
+
+"Well, Doc?" 
+
+Doc Palmer grinned. "Billy, I think we've done it. We've bottled lightning." 
+
+And so, with a burst of inspiration and a dash of Fourth of July magic, Dr. Palmer created his namesake drink, a soda that was more than just a beverage. It was an experience, a celebration in every sip. The legend of Dr. Pepper was born. 
+
+
Captured stderr call
[2024-10-21T21:10:15Z INFO  baml_events] Function TestGemini:
+    Client: Gemini (gemini-1.5-pro-001) - 9959ms. StopReason: Stop
     ---PROMPT---
     [chat] user: Write a nice short story about Dr. Pepper
     
     ---LLM REPLY---
-    Dr. Pete Pepper wasn't a real doctor, not in the traditional sense. He didn't wear a white coat, nor did he have a stethoscope slung around his neck. Instead, he wore a worn leather apron and a smile as bright as a freshly polished soda fountain. His domain was a little red shack on the edge of Harmony Creek, a town where life flowed at the pace of a lazy river. 
+    Old Doc Palmer adjusted his spectacles and peered at the bubbling concoction through the glass. Around him, the soda fountain buzzed with the afternoon rush, but his focus remained solely on the caramel-colored liquid within. 
+    
+    "Not quite right," he muttered, tapping a finger against the glass. 
+    
+    He'd been at it for weeks, determined to create a new soda flavor, something unique, something...different.  He'd tried every fruit imaginable, every spice, every combination he could conjure. Still, nothing sparked the excitement, the "aha!" moment he craved. 
+    
+    "Whatcha making there, Doc?" 
+    
+    Young Billy, his apprentice and all-around helper, leaned in, eyes wide with curiosity. Doc Palmer sighed. Even Billy, with his incessant questions and insatiable sweet tooth, couldn't offer a solution this time.
+    
+    "Trying to capture lightning in a bottle," Doc Palmer admitted, his shoulders slumping. 
+    
+    Billy tilted his head, "Like the fireworks on the Fourth of July?"
     
-    His shack, known simply as "Doc's," was famous for one thing – the best darn sodas in a hundred-mile radius. Doc had a knack for concocting the most unusual, most delicious flavors. He’d muddle fresh berries with herbs he grew in his window box, mixed syrups with a secret blend of spices, and always added a dash of something unexpected – a pinch of sea salt, a sprig of rosemary, a hint of lavender. 
+    The question struck a chord in Doc Palmer's mind. Fireworks! He didn't need a specific fruit; he needed a feeling. The feeling of celebration, of excitement, of that first sip on a hot summer day that made your taste buds dance.
     
-    People came from far and wide, not just for the sodas, but for Doc's infectious cheer. He had a way of listening to your troubles, offering a comforting word and a perfectly tailored drink. Feeling down?  Try the "Sunshine Splash," a burst of orange and mango. Heartbreak got you down? The "Mender Upper," a creamy concoction of chocolate and cherry, was just the thing. 
+    He grabbed a handful of ingredients, ignoring Billy's worried look as he tossed them into the mix: a touch of licorice for a bit of mystery, a dash of amaretto for warmth, a whisper of cola for familiarity. 
     
-    One day, a young girl named Lily arrived at Doc's, her face clouded with worry.  Her dog, Sparky, had lost his bark, and no one knew why. Doc listened patiently, his brow furrowed in thought. Then, a mischievous twinkle lit his eye. 
+    He shook the mixture, the soda fountain rattling in protest. The resulting concoction was a deep, rich brown, with a tantalizing aroma that filled the air.  He poured a glass and took a hesitant sip.
     
-    "I believe I have just the thing," he declared, disappearing behind the counter. He emerged with a bubbly concoction, a vibrant green with a swirl of something sparkly. 
+    His eyes widened.  A burst of flavors, sweet and spicy, familiar yet entirely new, exploded on his tongue. It was different, it was exciting, it was...perfect. 
     
-    "This," he announced, "is the "Barking Blizzard." One sip, and Sparky will be howling at the moon!"
+    He looked at Billy, who was staring at him expectantly. 
     
-    Lily, hesitant but hopeful, gave Sparky a tentative lick of the soda. A moment later, a bark, small but determined, erupted from Sparky. Lily's face broke into a wide grin.
+    "Well, Doc?" 
     
-    News of the "Barking Blizzard" spread like wildfire, further cementing Dr. Pete Pepper's status as a local legend. He wasn't a doctor who mended bones or cured illnesses, but he healed hearts and lifted spirits, one delicious, magical soda at a time. And really, wasn't that a kind of magic all its own? 
+    Doc Palmer grinned. "Billy, I think we've done it. We've bottled lightning." 
+    
+    And so, with a burst of inspiration and a dash of Fourth of July magic, Dr. Palmer created his namesake drink, a soda that was more than just a beverage. It was an experience, a celebration in every sip. The legend of Dr. Pepper was born. 
     
     ---Parsed Response (string)---
-    "Dr. Pete Pepper wasn't a real doctor, not in the traditional sense. He didn't wear a white coat, nor did he have a stethoscope slung around his neck. Instead, he wore a worn leather apron and a smile as bright as a freshly polished soda fountain. His domain was a little red shack on the edge of Harmony Creek, a town where life flowed at the pace of a lazy river. \n\nHis shack, known simply as \"Doc's,\" was famous for one thing – the best darn sodas in a hundred-mile radius. Doc had a knack for concocting the most unusual, most delicious flavors. He’d muddle fresh berries with herbs he grew in his window box, mixed syrups with a secret blend of spices, and always added a dash of something unexpected – a pinch of sea salt, a sprig of rosemary, a hint of lavender. \n\nPeople came from far and wide, not just for the sodas, but for Doc's infectious cheer. He had a way of listening to your troubles, offering a comforting word and a perfectly tailored drink. Feeling down?  Try the \"Sunshine Splash,\" a burst of orange and mango. Heartbreak got you down? The \"Mender Upper,\" a creamy concoction of chocolate and cherry, was just the thing. \n\nOne day, a young girl named Lily arrived at Doc's, her face clouded with worry.  Her dog, Sparky, had lost his bark, and no one knew why. Doc listened patiently, his brow furrowed in thought. Then, a mischievous twinkle lit his eye. \n\n\"I believe I have just the thing,\" he declared, disappearing behind the counter. He emerged with a bubbly concoction, a vibrant green with a swirl of something sparkly. \n\n\"This,\" he announced, \"is the \"Barking Blizzard.\" One sip, and Sparky will be howling at the moon!\"\n\nLily, hesitant but hopeful, gave Sparky a tentative lick of the soda. A moment later, a bark, small but determined, erupted from Sparky. Lily's face broke into a wide grin.\n\nNews of the \"Barking Blizzard\" spread like wildfire, further cementing Dr. Pete Pepper's status as a local legend. He wasn't a doctor who mended bones or cured illnesses, but he healed hearts and lifted spirits, one delicious, magical soda at a time. And really, wasn't that a kind of magic all its own? \n"
-

Teardown

PASSED test_aws 0:00:02.537717

Setup

Call

Captured stderr call
[2024-10-02T13:30:21Z WARN  aws_runtime::env_config::normalize] section [Connection 1] ignored; config must be in the AWS config file rather than the credentials file
-[2024-10-02T13:30:21Z INFO  aws_config::meta::region] load_region; provider=EnvironmentVariableRegionProvider { env: Env(Real) }
-[2024-10-02T13:30:23Z INFO  baml_events] Function TestAws:
-    Client: AwsBedrock (anthropic.claude-3-haiku-20240307-v1:0) - 2357ms. StopReason: max_tokens
+    "Old Doc Palmer adjusted his spectacles and peered at the bubbling concoction through the glass. Around him, the soda fountain buzzed with the afternoon rush, but his focus remained solely on the caramel-colored liquid within. \n\n\"Not quite right,\" he muttered, tapping a finger against the glass. \n\nHe'd been at it for weeks, determined to create a new soda flavor, something unique, something...different.  He'd tried every fruit imaginable, every spice, every combination he could conjure. Still, nothing sparked the excitement, the \"aha!\" moment he craved. \n\n\"Whatcha making there, Doc?\" \n\nYoung Billy, his apprentice and all-around helper, leaned in, eyes wide with curiosity. Doc Palmer sighed. Even Billy, with his incessant questions and insatiable sweet tooth, couldn't offer a solution this time.\n\n\"Trying to capture lightning in a bottle,\" Doc Palmer admitted, his shoulders slumping. \n\nBilly tilted his head, \"Like the fireworks on the Fourth of July?\"\n\nThe question struck a chord in Doc Palmer's mind. Fireworks! He didn't need a specific fruit; he needed a feeling. The feeling of celebration, of excitement, of that first sip on a hot summer day that made your taste buds dance.\n\nHe grabbed a handful of ingredients, ignoring Billy's worried look as he tossed them into the mix: a touch of licorice for a bit of mystery, a dash of amaretto for warmth, a whisper of cola for familiarity. \n\nHe shook the mixture, the soda fountain rattling in protest. The resulting concoction was a deep, rich brown, with a tantalizing aroma that filled the air.  He poured a glass and took a hesitant sip.\n\nHis eyes widened.  A burst of flavors, sweet and spicy, familiar yet entirely new, exploded on his tongue. It was different, it was exciting, it was...perfect. \n\nHe looked at Billy, who was staring at him expectantly. \n\n\"Well, Doc?\" \n\nDoc Palmer grinned. \"Billy, I think we've done it. We've bottled lightning.\" \n\nAnd so, with a burst of inspiration and a dash of Fourth of July magic, Dr. Palmer created his namesake drink, a soda that was more than just a beverage. It was an experience, a celebration in every sip. The legend of Dr. Pepper was born. \n"
+

Teardown

PASSED test_aws 0:00:02.320387

Setup

Call

Captured stderr call
[2024-10-21T21:10:15Z WARN  aws_runtime::env_config::normalize] section [Connection 1] ignored; config must be in the AWS config file rather than the credentials file
+[2024-10-21T21:10:15Z INFO  aws_config::meta::region] load_region; provider=EnvironmentVariableRegionProvider { env: Env(Real) }
+[2024-10-21T21:10:17Z INFO  baml_events] Function TestAws:
+    Client: AwsBedrock (anthropic.claude-3-haiku-20240307-v1:0) - 2147ms. StopReason: max_tokens
     ---PROMPT---
     [chat] user: Write a nice short story about Mt Rainier is tall
     
     ---LLM REPLY---
     Here is a short story about Mount Rainier:
     
-    The Majesty of Mount Rainier
-    
-    As the sun's golden rays peeked over the horizon, they illuminated the towering snow-capped peak of Mount Rainier. Standing tall at 14,411 feet, the majestic mountain cast an awe-inspiring presence over the surrounding landscape.
+    Towering high above the lush forests and shimmering lakes of the Pacific Northwest, Mount Rainier stands as a majestic and awe-inspiring natural wonder. At 14,411 feet tall, this dormant volcano is the highest peak in the Cascade Range, a rugged mountain chain that stretches from British Columbia to Northern California.
     
-    Emily gazed up at the mountain in wonder, her breath catching in her throat. She had seen
+    From miles away, the glaciated summit of Rainier
     ---Parsed Response (string)---
-    "Here is a short story about Mount Rainier:\n\nThe Majesty of Mount Rainier\n\nAs the sun's golden rays peeked over the horizon, they illuminated the towering snow-capped peak of Mount Rainier. Standing tall at 14,411 feet, the majestic mountain cast an awe-inspiring presence over the surrounding landscape.\n\nEmily gazed up at the mountain in wonder, her breath catching in her throat. She had seen"
-

Teardown

PASSED test_openai_shorthand 0:00:12.032283

Setup

Call

Captured stderr call
[2024-10-02T13:30:35Z INFO  baml_events] Function TestOpenAIShorthand:
-    Client: openai/gpt-4o-mini (gpt-4o-mini-2024-07-18) - 12021ms. StopReason: stop
+    "Here is a short story about Mount Rainier:\n\nTowering high above the lush forests and shimmering lakes of the Pacific Northwest, Mount Rainier stands as a majestic and awe-inspiring natural wonder. At 14,411 feet tall, this dormant volcano is the highest peak in the Cascade Range, a rugged mountain chain that stretches from British Columbia to Northern California.\n\nFrom miles away, the glaciated summit of Rainier"
+

Teardown

PASSED test_openai_shorthand 0:00:07.620217

Setup

Call

Captured stderr call
[2024-10-21T21:10:25Z INFO  baml_events] Function TestOpenAIShorthand:
+    Client: openai/gpt-4o-mini (gpt-4o-mini-2024-07-18) - 7610ms. StopReason: stop
     ---PROMPT---
     [chat] system: Write a nice short story about Mt Rainier is tall
     
     ---LLM REPLY---
-    Once upon a time, in a lush, emerald forest at the heart of Washington State, there stood a grand mountain named Mt. Rainier. Towering at over 14,000 feet, it was not just a mountain; it was a sentinel of nature, adorned with a crown of snow that glistened like diamonds under the sun.
-    
-    The nearby village of Ashford was a quaint little place, where the air was fresh and the fragrance of wildflowers danced on soft summer breezes. The villagers often remarked on how one could always glimpse Mt. Rainier peeking through the trees like a loving giant watching over them. Children would play in its shadow, imagining epic adventures among its slopes and forests.
-    
-    One young girl, Mia, was particularly enchanted by the majestic mountain. She would sit on the porch of her family’s cabin, sketching the changing colors of its summit—rosy hues at dawn and fiery oranges at dusk. Mia dreamed of climbing to the top, believing that the view from the summit would grant her a glimpse of eternity.
+    Once upon a time in the Pacific Northwest, there stood a majestic giant known as Mt. Rainier. Towering over the landscape at a breathtaking 14,411 feet, it was more than just a mountain—it was a cherished landmark, a guardian of the valleys, forests, and rivers that flowed below.
     
-    One sparkling spring day, inspired and determined, Mia set out on her adventure. She gathered her friends, Mason and Lila, and together they packed their backpacks with snacks, water, and a map. With each step along the winding trails, they encountered breathtaking vistas—the sound of chirping birds and the rustle of leaves filled the air as they marveled at the beauty around them.
+    The locals often shared stories about Mt. Rainier, enchanting tales that spoke of its ancient spirit. According to the elders, Rainier was once a proud warrior who stood tall to protect his people. When danger approached, he erupted into action, releasing thunderous roars that echoed across the region. The mountain’s peaks often wore a crown of snow, said to be the remnants of his fierce battles against the ice-hearted Winter.
     
-    As they ascended higher, they could feel the cool mountain breeze wrapping around them. The forest was alive with the flutter of butterflies, and the sun cast playful shadows on the ground. Tired but excited, they finally reached a plateau, and before them lay the breathtaking view of Mt. Rainier’s majestic peak.
+    Children would gather around fires at night, their eyes shimmering with wonder, as they listened to the elders recount how Rainier watched over them day and night. “Look up,” they’d say, pointing toward the towering summit. “He’s always there, guiding us like a lighthouse to ships at sea.”
     
-    “It’s even taller than I imagined!” Mia exclaimed, her eyes wide with wonder.
+    One crisp autumn morning, a young girl named Lila set out to climb Mt. Rainier with her father. As they trekked along the winding trails, she could feel the mountain’s presence all around her, every step filled with the whispers of the wind and the rustling of leaves. The vibrant colors of the changing season painted a breathtaking backdrop, and Lila marveled at how small she felt against such a colossal figure.
     
-    The trio decided to camp that night, hoping to wake early and finish their climb. As the stars twinkled above them, Mia shared stories about the mountain. Legends spoke of the spirits of nature dwelling within its slopes, watching over all living things. The mountain wasn’t simply tall; it was a guardian of secrets and dreams.
+    “Why is it so tall, Daddy?” she asked, her voice filled with curiosity.
     
-    When dawn broke, the sun painted the sky with soft pastels, and the children scrambled to continue their climb. At last, after a day filled with laughter, encouragement, and moments of challenge, they reached the summit. Breathless, they stood at the top of the world, gazing out at a sea of clouds that stretched far beyond the horizon. 
+    Her father smiled, looking up at the intimidating peaks. “Because it reaches for the stars, sweetheart. It wants to touch the sky and remind us that there are no limits to what we can achieve.”
     
-    “I can see the whole world from here!” Lila whispered in awe, her heart swelling with joy.
+    With each step, Lila felt inspired. The higher they climbed, the more the world below unfolded in a tapestry of greens and blues. Clouds danced among the peaks, brushing against the summit like soft cotton candy. Lila imagined she could see the whole world from up there. 
     
-    With eyes gleaming, Mason added, “Mt. Rainier is not just tall; it’s a reminder that there’s so much more to explore.”
+    At last, they reached a viewpoint just below the summit, where the landscape sprawled out in all directions. The view was breathtaking, a magnificent panorama that seemed almost magical. Lila looked at her father, her eyes wide with awe. “It really is tall,” she whispered. “But it makes me feel brave.”
     
-    Mia smiled, feeling the weight of their adventure wrap around them like a warm hug. They had climbed high, but they also realized that the true height of their experience came from their friendship and shared dreams.
+    Her father nodded, wrapping an arm around her shoulders. “Mountains like Rainier remind us of our ambitions. Sometimes, reaching them might seem impossible, but with determination and a little courage, we can conquer our very own mountains.”
     
-    As they descended, the mountain no longer felt like a distant giant looming over them; it had become a part of their story. Mt. Rainier was tall, indeed, but it also stood as a testament to the heights of imagination, friendship, and the beauty of nature—a journey that would forever reside in their hearts. 
+    As they descended, Lila felt a newfound confidence blossoming within her. She wasn’t just a climber of mountains; she was a dreamer of dreams. And just like Mt. Rainier, she vowed to stand tall against the challenges life would bring.
     
-    And from that day on, every time they looked up at Mt. Rainier, they would remember the adventure that brought them closer to nature and to each other, feeling grateful for the tall guardian that watched over them, whispering tales of wonder through the winds.
+    Years later, Lila would often return to the mountain, gazing up at its snow-capped peak, reminding herself of that day. With every visit, Rainier continued to inspire her—an everlasting symbol of courage, strength, and the endless quest to reach higher. And as she would tell the stories of her own adventures to her children, she knew deep down that Mt. Rainier would always stand sentinel, watching over her dreams, forever tall and unwavering.
     ---Parsed Response (string)---
-    "Once upon a time, in a lush, emerald forest at the heart of Washington State, there stood a grand mountain named Mt. Rainier. Towering at over 14,000 feet, it was not just a mountain; it was a sentinel of nature, adorned with a crown of snow that glistened like diamonds under the sun.\n\nThe nearby village of Ashford was a quaint little place, where the air was fresh and the fragrance of wildflowers danced on soft summer breezes. The villagers often remarked on how one could always glimpse Mt. Rainier peeking through the trees like a loving giant watching over them. Children would play in its shadow, imagining epic adventures among its slopes and forests.\n\nOne young girl, Mia, was particularly enchanted by the majestic mountain. She would sit on the porch of her family’s cabin, sketching the changing colors of its summit—rosy hues at dawn and fiery oranges at dusk. Mia dreamed of climbing to the top, believing that the view from the summit would grant her a glimpse of eternity.\n\nOne sparkling spring day, inspired and determined, Mia set out on her adventure. She gathered her friends, Mason and Lila, and together they packed their backpacks with snacks, water, and a map. With each step along the winding trails, they encountered breathtaking vistas—the sound of chirping birds and the rustle of leaves filled the air as they marveled at the beauty around them.\n\nAs they ascended higher, they could feel the cool mountain breeze wrapping around them. The forest was alive with the flutter of butterflies, and the sun cast playful shadows on the ground. Tired but excited, they finally reached a plateau, and before them lay the breathtaking view of Mt. Rainier’s majestic peak.\n\n“It’s even taller than I imagined!” Mia exclaimed, her eyes wide with wonder.\n\nThe trio decided to camp that night, hoping to wake early and finish their climb. As the stars twinkled above them, Mia shared stories about the mountain. Legends spoke of the spirits of nature dwelling within its slopes, watching over all living things. The mountain wasn’t simply tall; it was a guardian of secrets and dreams.\n\nWhen dawn broke, the sun painted the sky with soft pastels, and the children scrambled to continue their climb. At last, after a day filled with laughter, encouragement, and moments of challenge, they reached the summit. Breathless, they stood at the top of the world, gazing out at a sea of clouds that stretched far beyond the horizon. \n\n“I can see the whole world from here!” Lila whispered in awe, her heart swelling with joy.\n\nWith eyes gleaming, Mason added, “Mt. Rainier is not just tall; it’s a reminder that there’s so much more to explore.”\n\nMia smiled, feeling the weight of their adventure wrap around them like a warm hug. They had climbed high, but they also realized that the true height of their experience came from their friendship and shared dreams.\n\nAs they descended, the mountain no longer felt like a distant giant looming over them; it had become a part of their story. Mt. Rainier was tall, indeed, but it also stood as a testament to the heights of imagination, friendship, and the beauty of nature—a journey that would forever reside in their hearts. \n\nAnd from that day on, every time they looked up at Mt. Rainier, they would remember the adventure that brought them closer to nature and to each other, feeling grateful for the tall guardian that watched over them, whispering tales of wonder through the winds."
-

Teardown

PASSED test_openai_shorthand_streaming 0:00:11.793255

Setup

Call

Captured stderr call
[2024-10-02T13:30:47Z INFO  baml_events] Function TestOpenAIShorthand:
-    Client: openai/gpt-4o-mini (gpt-4o-mini-2024-07-18) - 11782ms. StopReason: stop
+    "Once upon a time in the Pacific Northwest, there stood a majestic giant known as Mt. Rainier. Towering over the landscape at a breathtaking 14,411 feet, it was more than just a mountain—it was a cherished landmark, a guardian of the valleys, forests, and rivers that flowed below.\n\nThe locals often shared stories about Mt. Rainier, enchanting tales that spoke of its ancient spirit. According to the elders, Rainier was once a proud warrior who stood tall to protect his people. When danger approached, he erupted into action, releasing thunderous roars that echoed across the region. The mountain’s peaks often wore a crown of snow, said to be the remnants of his fierce battles against the ice-hearted Winter.\n\nChildren would gather around fires at night, their eyes shimmering with wonder, as they listened to the elders recount how Rainier watched over them day and night. “Look up,” they’d say, pointing toward the towering summit. “He’s always there, guiding us like a lighthouse to ships at sea.”\n\nOne crisp autumn morning, a young girl named Lila set out to climb Mt. Rainier with her father. As they trekked along the winding trails, she could feel the mountain’s presence all around her, every step filled with the whispers of the wind and the rustling of leaves. The vibrant colors of the changing season painted a breathtaking backdrop, and Lila marveled at how small she felt against such a colossal figure.\n\n“Why is it so tall, Daddy?” she asked, her voice filled with curiosity.\n\nHer father smiled, looking up at the intimidating peaks. “Because it reaches for the stars, sweetheart. It wants to touch the sky and remind us that there are no limits to what we can achieve.”\n\nWith each step, Lila felt inspired. The higher they climbed, the more the world below unfolded in a tapestry of greens and blues. Clouds danced among the peaks, brushing against the summit like soft cotton candy. Lila imagined she could see the whole world from up there. \n\nAt last, they reached a viewpoint just below the summit, where the landscape sprawled out in all directions. The view was breathtaking, a magnificent panorama that seemed almost magical. Lila looked at her father, her eyes wide with awe. “It really is tall,” she whispered. “But it makes me feel brave.”\n\nHer father nodded, wrapping an arm around her shoulders. “Mountains like Rainier remind us of our ambitions. Sometimes, reaching them might seem impossible, but with determination and a little courage, we can conquer our very own mountains.”\n\nAs they descended, Lila felt a newfound confidence blossoming within her. She wasn’t just a climber of mountains; she was a dreamer of dreams. And just like Mt. Rainier, she vowed to stand tall against the challenges life would bring.\n\nYears later, Lila would often return to the mountain, gazing up at its snow-capped peak, reminding herself of that day. With every visit, Rainier continued to inspire her—an everlasting symbol of courage, strength, and the endless quest to reach higher. And as she would tell the stories of her own adventures to her children, she knew deep down that Mt. Rainier would always stand sentinel, watching over her dreams, forever tall and unwavering."
+

Teardown

PASSED test_openai_shorthand_streaming 0:00:08.787896

Setup

Call

Captured stderr call
[2024-10-21T21:10:34Z INFO  baml_events] Function TestOpenAIShorthand:
+    Client: openai/gpt-4o-mini (gpt-4o-mini-2024-07-18) - 8776ms. StopReason: stop
     ---PROMPT---
     [chat] system: Write a nice short story about Mt Rainier is tall
     
     ---LLM REPLY---
-    Once upon a time, in the heart of Washington State, stood a magnificent giant known as Mt. Rainier. Towering at 14,411 feet, it was the tallest peak in the Cascade Range and had a personality as grand as its stature. Covered in a blanket of snow and adorned with glistening glaciers, Mt. Rainier conspired with the clouds, often draping itself in a shawl of mist and mystery.
+    Once upon a time, in the heart of the Pacific Northwest, there stood a towering giant named Mt. Rainier. Cloaked in a white blanket of snow, it guarded the secrets of the ancient forests below. Its peak kissed the clouds, a sentinel watching over the land with grace and majesty.
     
-    The mountain had watched over the valley for centuries, cultivating a sense of reverence among the creatures and the people living beneath it. Every morning, as the sun rose to greet the day, Mt. Rainier would stretch out its slopes, beckoning adventurers to explore its trails and embrace the beauty of nature. The locals venerated the mountain, sharing tales of its wonders by fireside—stories of brave climbers, lost hikers, and the delicate balance of life that thrived in its shadow.
+    In a quaint village nestled at the mountain's base lived a young girl named Lila. Every morning, she awoke to the sight of Mt. Rainier rising, tall and proud, its glaciers glimmering in the sunlight. To Lila, the mountain was not just a natural wonder; it was her greatest inspiration. She would often dream of climbing its rugged slopes and discovering the stories whispered by the winds that danced around its summit.
     
-    One crisp autumn day, a young girl named Mia decided that it was time to meet the giant. With her heart full of curiosity, she laced up her hiking boots and packed a small backpack with snacks and a sketchbook. She had always admired the mountain from a distance, its peak sparkling in the sun's embrace, but now she yearned to experience its majesty up close.
+    One summer day, Lila gathered her courage and asked her father if they could embark on an adventure to the mountain's peak. Her father, a wise man with a heart full of wanderlust, agreed. "But remember, my dear," he said, "the mountain is beautiful yet challenging. It will test us, but the journey will teach us all we need to know.”
     
-    As she climbed the winding trails, the grandness of Mt. Rainier enveloped her; the towering trees, vibrant wildflowers, and rustling streams whispered tales of the mountain's ancient power. With each step, she could feel the heartbeat of the earth beneath her, and she marveled at how small she felt in the presence of such a colossal being.
+    Equipped with hiking gear and a picnic basket filled with sandwiches, they set off early in the morning, the sun painting the sky in hues of orange and pink. As they began their ascent, Lila marveled at how her tiny village grew smaller with each step, and soon, the world below became a patchwork of greens and browns.
     
-    Upon reaching a viewpoint, Mia paused to catch her breath, her heart racing not just from the hike but from the sheer awe of what lay before her. The mountain loomed majestically, its snowy peak piercing the azure sky, while valleys of deep green and patches of golden larch danced in the breeze. It was a sight like no other, one that seemed to steal the very words from her lips.
+    As they climbed higher, Lila noticed the change in the air. It grew cooler and crisper, filled with the scent of pine and wildflowers. They encountered babbling brooks and fields of colorful blooms that seemed to stretch endlessly. Her heart raced with excitement at the beauty surrounding her.
     
-    Inspired, Mia pulled out her sketchbook and began to draw, capturing the essence of the mountain with each stroke of her pencil. The sun dipped lower in the sky, casting a warm glow on the mountain’s face, and in that magical moment, she felt a profound connection to the land.
+    But the climb was steeper than she imagined. Fatigue set in, and Lila found herself longing for the comfort of home. Sensing her struggle, her father paused to rest and encouraged her to look up. “Remember, my dear, Mt. Rainier is not just tall; it is a journey—a series of small steps that lead us closer to our dreams.”
     
-    "I'll tell your story," she whispered to Mt. Rainier. "I'll tell everyone how tall and magnificent you are, and how you make the world seem so much larger than life."
+    With renewed determination, Lila focused on the path ahead. Each step was a victory, and with every breath, she felt the spirit of the mountain lifting her. They finally reached a breathtaking viewpoint, where the world sprawled beneath them like a painted canvas, vibrant and alive.
     
-    As the sun set behind the peak, painting the sky with hues of orange and pink, Mia promised to return. She knew that Mt. Rainier was not just a mountain but a guardian of dreams and adventures, inviting those brave enough to reach for the heights.
+    As they sat on a rocky ledge and munched on their sandwiches, Lila glanced up at Mt. Rainier's peak. She felt small yet significant, a part of something grand. A sense of belonging washed over her, and she understood that the mountain's true height was in the lessons it imparted—the strength to persevere, the courage to dream, and the beauty of the journey itself.
     
-    And so, the legend of the tall mountain continued to grow, nurtured by Mia's boundless spirit and the whispers of the wind. Local families and travelers, inspired by her tale, flocked to the feet of the great giant, eager to explore, to learn, and to marvel at its towering presence—a timeless reminder that when facing the giants in life, one should always remember to look up and embrace the adventure that lies ahead.
+    On their descent, with stars twinkling above them, Lila realized the mountain had woven its magic deep within her heart. From that day forward, she no longer saw Mt. Rainier as just a tall mountain, but a friend who had urged her to reach new heights, a friend who would forever remind her that life is an adventure best lived with passion and purpose.
+    
+    And so, Lila returned to her village, forever changed. Each time she gazed up at Mt. Rainier, she smiled, knowing she could conquer any challenge that lay ahead, inspired by the great height of the mountain and the lessons learned on her journey.
     ---Parsed Response (string)---
-    "Once upon a time, in the heart of Washington State, stood a magnificent giant known as Mt. Rainier. Towering at 14,411 feet, it was the tallest peak in the Cascade Range and had a personality as grand as its stature. Covered in a blanket of snow and adorned with glistening glaciers, Mt. Rainier conspired with the clouds, often draping itself in a shawl of mist and mystery.\n\nThe mountain had watched over the valley for centuries, cultivating a sense of reverence among the creatures and the people living beneath it. Every morning, as the sun rose to greet the day, Mt. Rainier would stretch out its slopes, beckoning adventurers to explore its trails and embrace the beauty of nature. The locals venerated the mountain, sharing tales of its wonders by fireside—stories of brave climbers, lost hikers, and the delicate balance of life that thrived in its shadow.\n\nOne crisp autumn day, a young girl named Mia decided that it was time to meet the giant. With her heart full of curiosity, she laced up her hiking boots and packed a small backpack with snacks and a sketchbook. She had always admired the mountain from a distance, its peak sparkling in the sun's embrace, but now she yearned to experience its majesty up close.\n\nAs she climbed the winding trails, the grandness of Mt. Rainier enveloped her; the towering trees, vibrant wildflowers, and rustling streams whispered tales of the mountain's ancient power. With each step, she could feel the heartbeat of the earth beneath her, and she marveled at how small she felt in the presence of such a colossal being.\n\nUpon reaching a viewpoint, Mia paused to catch her breath, her heart racing not just from the hike but from the sheer awe of what lay before her. The mountain loomed majestically, its snowy peak piercing the azure sky, while valleys of deep green and patches of golden larch danced in the breeze. It was a sight like no other, one that seemed to steal the very words from her lips.\n\nInspired, Mia pulled out her sketchbook and began to draw, capturing the essence of the mountain with each stroke of her pencil. The sun dipped lower in the sky, casting a warm glow on the mountain’s face, and in that magical moment, she felt a profound connection to the land.\n\n\"I'll tell your story,\" she whispered to Mt. Rainier. \"I'll tell everyone how tall and magnificent you are, and how you make the world seem so much larger than life.\"\n\nAs the sun set behind the peak, painting the sky with hues of orange and pink, Mia promised to return. She knew that Mt. Rainier was not just a mountain but a guardian of dreams and adventures, inviting those brave enough to reach for the heights.\n\nAnd so, the legend of the tall mountain continued to grow, nurtured by Mia's boundless spirit and the whispers of the wind. Local families and travelers, inspired by her tale, flocked to the feet of the great giant, eager to explore, to learn, and to marvel at its towering presence—a timeless reminder that when facing the giants in life, one should always remember to look up and embrace the adventure that lies ahead."
-

Teardown

PASSED test_anthropic_shorthand 0:00:04.157080

Setup

Call

Captured stderr call
[2024-10-02T13:30:51Z INFO  baml_events] Function TestAnthropicShorthand:
-    Client: anthropic/claude-3-haiku-20240307 (claude-3-haiku-20240307) - 4149ms. StopReason: "end_turn"
+    "Once upon a time, in the heart of the Pacific Northwest, there stood a towering giant named Mt. Rainier. Cloaked in a white blanket of snow, it guarded the secrets of the ancient forests below. Its peak kissed the clouds, a sentinel watching over the land with grace and majesty.\n\nIn a quaint village nestled at the mountain's base lived a young girl named Lila. Every morning, she awoke to the sight of Mt. Rainier rising, tall and proud, its glaciers glimmering in the sunlight. To Lila, the mountain was not just a natural wonder; it was her greatest inspiration. She would often dream of climbing its rugged slopes and discovering the stories whispered by the winds that danced around its summit.\n\nOne summer day, Lila gathered her courage and asked her father if they could embark on an adventure to the mountain's peak. Her father, a wise man with a heart full of wanderlust, agreed. \"But remember, my dear,\" he said, \"the mountain is beautiful yet challenging. It will test us, but the journey will teach us all we need to know.”\n\nEquipped with hiking gear and a picnic basket filled with sandwiches, they set off early in the morning, the sun painting the sky in hues of orange and pink. As they began their ascent, Lila marveled at how her tiny village grew smaller with each step, and soon, the world below became a patchwork of greens and browns.\n\nAs they climbed higher, Lila noticed the change in the air. It grew cooler and crisper, filled with the scent of pine and wildflowers. They encountered babbling brooks and fields of colorful blooms that seemed to stretch endlessly. Her heart raced with excitement at the beauty surrounding her.\n\nBut the climb was steeper than she imagined. Fatigue set in, and Lila found herself longing for the comfort of home. Sensing her struggle, her father paused to rest and encouraged her to look up. “Remember, my dear, Mt. Rainier is not just tall; it is a journey—a series of small steps that lead us closer to our dreams.”\n\nWith renewed determination, Lila focused on the path ahead. Each step was a victory, and with every breath, she felt the spirit of the mountain lifting her. They finally reached a breathtaking viewpoint, where the world sprawled beneath them like a painted canvas, vibrant and alive.\n\nAs they sat on a rocky ledge and munched on their sandwiches, Lila glanced up at Mt. Rainier's peak. She felt small yet significant, a part of something grand. A sense of belonging washed over her, and she understood that the mountain's true height was in the lessons it imparted—the strength to persevere, the courage to dream, and the beauty of the journey itself.\n\nOn their descent, with stars twinkling above them, Lila realized the mountain had woven its magic deep within her heart. From that day forward, she no longer saw Mt. Rainier as just a tall mountain, but a friend who had urged her to reach new heights, a friend who would forever remind her that life is an adventure best lived with passion and purpose.\n\nAnd so, Lila returned to her village, forever changed. Each time she gazed up at Mt. Rainier, she smiled, knowing she could conquer any challenge that lay ahead, inspired by the great height of the mountain and the lessons learned on her journey."
+

Teardown

PASSED test_anthropic_shorthand 0:00:03.301404

Setup

Call

Captured stderr call
[2024-10-21T21:10:37Z INFO  baml_events] Function TestAnthropicShorthand:
+    Client: anthropic/claude-3-haiku-20240307 (claude-3-haiku-20240307) - 3294ms. StopReason: "end_turn"
     ---PROMPT---
     [chat] user: Write a nice short story about Mt Rainier is tall
     
@@ -553,153 +624,149 @@
     
     The Majestic Mountain
     
-    As the first rays of dawn stretched across the horizon, the towering peak of Mount Rainier emerged from the morning mist, standing tall and proud against the clear blue sky. This magnificent mountain, with its snow-capped summit reaching an impressive 14,411 feet, had long captured the awe and wonder of all who laid eyes upon it.
-    
-    For the locals who called the Pacific Northwest home, Mount Rainier was more than just a natural wonder - it was a constant companion, a reminder of the power and beauty of the natural world. They watched as the mountain's appearance changed with the seasons, from the lush green slopes of summer to the stark, icy wonder of winter.
-    
-    On this particular morning, a group of hikers had gathered at the base of the mountain, eager to begin their ascent. As they gazed upwards, they couldn't help but feel a sense of both exhilaration and trepidation. The climb would be challenging, but the reward of standing atop this majestic peak would be worth every step.
+    As the sun's first rays peeked over the horizon, they illuminated the towering presence of Mount Rainier. Standing an impressive 14,411 feet tall, the dormant volcano commanded awe and reverence from all who laid eyes upon it. 
     
-    With their gear packed and their spirits high, the hikers set out, their footsteps crunching on the snow-covered trail. The air was crisp and clean, and the sound of their voices echoed off the mountainsides, mingling with the calls of the birds that soared overhead.
+    Emily gazed up at the snow-capped peak, her breath catching in her throat. Though she had lived in the Pacific Northwest her entire life, the sheer size and beauty of Mount Rainier never failed to leave her in wonder. The mountain seemed to stretch endlessly towards the heavens, a testament to the raw power and majesty of the natural world.
     
-    As they climbed higher, the world below seemed to shrink away, and they felt a sense of connection to the mountain that was both humbling and empowering. The summit, once a distant goal, now loomed ever closer, and their determination only grew stronger with each passing mile.
+    Lacing up her hiking boots, Emily set out on the trail, eager to immerse herself in the mountain's grandeur. With each step, the colossal scale of Mount Rainier became more apparent. Towering glaciers gleamed in the morning light, while rugged volcanic ridges cut dramatic silhouettes against the sky. 
     
-    Finally, after hours of arduous ascent, the hikers reached the top of Mount Rainier, standing in awe of the breathtaking panorama that surrounded them. The world below seemed insignificant, and they felt a deep sense of accomplishment and appreciation for the natural wonder that had challenged and inspired them.
+    As Emily climbed higher, she felt her troubles and worries melt away, replaced by a deep sense of peace and connection. Here, surrounded by the ancient, untamed beauty of the mountain, she was humbled by her own insignificance in the face of such powerful forces.
     
-    As they began their descent, the hikers knew that they would carry the memory of this moment with them forever, a testament to the power and majesty of Mount Rainier, a mountain that stood tall and proud, a symbol of the enduring beauty of the natural world.
+    Pausing to catch her breath, Emily turned and gazed back down the valley, taking in the sweeping vistas. Mount Rainier stood tall and proud, a timeless guardian watching over the land. In that moment, she felt grateful to be in the presence of such a magnificent natural wonder – a reminder of the enduring power and grace of the Earth.
     ---Parsed Response (string)---
-    "Here is a short story about Mount Rainier:\n\nThe Majestic Mountain\n\nAs the first rays of dawn stretched across the horizon, the towering peak of Mount Rainier emerged from the morning mist, standing tall and proud against the clear blue sky. This magnificent mountain, with its snow-capped summit reaching an impressive 14,411 feet, had long captured the awe and wonder of all who laid eyes upon it.\n\nFor the locals who called the Pacific Northwest home, Mount Rainier was more than just a natural wonder - it was a constant companion, a reminder of the power and beauty of the natural world. They watched as the mountain's appearance changed with the seasons, from the lush green slopes of summer to the stark, icy wonder of winter.\n\nOn this particular morning, a group of hikers had gathered at the base of the mountain, eager to begin their ascent. As they gazed upwards, they couldn't help but feel a sense of both exhilaration and trepidation. The climb would be challenging, but the reward of standing atop this majestic peak would be worth every step.\n\nWith their gear packed and their spirits high, the hikers set out, their footsteps crunching on the snow-covered trail. The air was crisp and clean, and the sound of their voices echoed off the mountainsides, mingling with the calls of the birds that soared overhead.\n\nAs they climbed higher, the world below seemed to shrink away, and they felt a sense of connection to the mountain that was both humbling and empowering. The summit, once a distant goal, now loomed ever closer, and their determination only grew stronger with each passing mile.\n\nFinally, after hours of arduous ascent, the hikers reached the top of Mount Rainier, standing in awe of the breathtaking panorama that surrounded them. The world below seemed insignificant, and they felt a deep sense of accomplishment and appreciation for the natural wonder that had challenged and inspired them.\n\nAs they began their descent, the hikers knew that they would carry the memory of this moment with them forever, a testament to the power and majesty of Mount Rainier, a mountain that stood tall and proud, a symbol of the enduring beauty of the natural world."
-

Teardown

PASSED test_anthropic_shorthand_streaming 0:00:03.444048

Setup

Call

Captured stderr call
[2024-10-02T13:30:55Z INFO  baml_events] Function TestAnthropicShorthand:
-    Client: anthropic/claude-3-haiku-20240307 (claude-3-haiku-20240307) - 3425ms. StopReason: "end_turn"
+    "Here is a short story about Mount Rainier:\n\nThe Majestic Mountain\n\nAs the sun's first rays peeked over the horizon, they illuminated the towering presence of Mount Rainier. Standing an impressive 14,411 feet tall, the dormant volcano commanded awe and reverence from all who laid eyes upon it. \n\nEmily gazed up at the snow-capped peak, her breath catching in her throat. Though she had lived in the Pacific Northwest her entire life, the sheer size and beauty of Mount Rainier never failed to leave her in wonder. The mountain seemed to stretch endlessly towards the heavens, a testament to the raw power and majesty of the natural world.\n\nLacing up her hiking boots, Emily set out on the trail, eager to immerse herself in the mountain's grandeur. With each step, the colossal scale of Mount Rainier became more apparent. Towering glaciers gleamed in the morning light, while rugged volcanic ridges cut dramatic silhouettes against the sky. \n\nAs Emily climbed higher, she felt her troubles and worries melt away, replaced by a deep sense of peace and connection. Here, surrounded by the ancient, untamed beauty of the mountain, she was humbled by her own insignificance in the face of such powerful forces.\n\nPausing to catch her breath, Emily turned and gazed back down the valley, taking in the sweeping vistas. Mount Rainier stood tall and proud, a timeless guardian watching over the land. In that moment, she felt grateful to be in the presence of such a magnificent natural wonder – a reminder of the enduring power and grace of the Earth."
+

Teardown

PASSED test_anthropic_shorthand_streaming 0:00:04.189179

Setup

Call

Captured stderr call
[2024-10-21T21:10:41Z INFO  baml_events] Function TestAnthropicShorthand:
+    Client: anthropic/claude-3-haiku-20240307 (claude-3-haiku-20240307) - 4151ms. 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:
+    Here is a short story about Mount Rainier:
     
-    Towering High
+    Towering Majesty: The Tale of Mount Rainier
     
-    As the sun peeked over the horizon, its golden rays illuminated the majestic peak of Mount Rainier. Standing tall and proud at over 14,000 feet, the dormant volcano cast a commanding presence over the surrounding landscape.
+    Against the clear, azure sky, the majestic peak of Mount Rainier stood tall and proud, its snow-capped summit glistening in the warm summer sun. This iconic volcano, standing at an impressive 14,411 feet, was a testament to the awe-inspiring power of nature.
     
-    Sarah gazed up at the snow-capped mountain in awe, feeling the weight of its sheer size and power. The mountain had been a constant in her life, visible from her home and the winding roads that led into the nearby national park. Yet no matter how many times she laid eyes on it, the mountain never failed to fill her with a sense of wonder.
+    For those who had the privilege of gazing upon this natural wonder, the experience was nothing short of breathtaking. The sheer scale of the mountain was humbling, dwarfing the surrounding landscape and serving as a constant reminder of the might and grandeur of the Earth's geological forces.
     
-    Pulling on her hiking boots, Sarah set out on the trail, determined to get closer to the towering peak. As she climbed higher, the panoramic views stretched out before her, revealing the patchwork of forests, meadows, and glaciers that clung to Rainier's flanks. The air grew crisper, the wind more biting, but Sarah pressed on, her eyes fixed on the summit that seemed to rise ever upward.
+    As the day wore on, the light played across the mountain's slopes, casting ever-changing shadows and highlights that captivated the senses. Hikers and adventurers trekked through the lush, verdant forests that clung to the lower reaches of the mountain, their eyes drawn upwards to the towering, snow-covered peak that seemed to reach for the heavens.
     
-    Reaching a rocky outcrop, Sarah paused to catch her breath, gazing up at the mountain's imposing silhouette. Its snow-covered peak seemed to pierce the sky, a mighty sentinel guarding the land below. In that moment, Sarah felt small and humbled by the mountain's sheer immensity, yet also filled with a sense of profound connection to the natural world.
+    For those who had the opportunity to explore the mountain's trails and glaciers, the experience was one of profound connection with the natural world. The challenges of the climb, the crisp, clean air, and the stunning vistas all combined to create a sense of wonder and reverence that lingered long after the journey had ended.
     
-    With renewed energy, she continued her ascent, her footsteps carrying her closer to the summit with each passing mile. No matter how many times she hiked this trail, the mountain's towering presence never ceased to inspire and humble her, a timeless reminder of the power and grandeur of the natural world.
+    Whether viewed from afar or experienced firsthand, Mount Rainier stood as a testament to the enduring power and beauty of our planet. Its towering presence, a true marvel of the natural world, inspired awe and wonder in all who encountered it, reminding us of the boundless potential of the world we inhabit.
     ---Parsed Response (string)---
-    "Here is a short story about Mt. Rainier:\n\nTowering High\n\nAs the sun peeked over the horizon, its golden rays illuminated the majestic peak of Mount Rainier. Standing tall and proud at over 14,000 feet, the dormant volcano cast a commanding presence over the surrounding landscape.\n\nSarah gazed up at the snow-capped mountain in awe, feeling the weight of its sheer size and power. The mountain had been a constant in her life, visible from her home and the winding roads that led into the nearby national park. Yet no matter how many times she laid eyes on it, the mountain never failed to fill her with a sense of wonder.\n\nPulling on her hiking boots, Sarah set out on the trail, determined to get closer to the towering peak. As she climbed higher, the panoramic views stretched out before her, revealing the patchwork of forests, meadows, and glaciers that clung to Rainier's flanks. The air grew crisper, the wind more biting, but Sarah pressed on, her eyes fixed on the summit that seemed to rise ever upward.\n\nReaching a rocky outcrop, Sarah paused to catch her breath, gazing up at the mountain's imposing silhouette. Its snow-covered peak seemed to pierce the sky, a mighty sentinel guarding the land below. In that moment, Sarah felt small and humbled by the mountain's sheer immensity, yet also filled with a sense of profound connection to the natural world.\n\nWith renewed energy, she continued her ascent, her footsteps carrying her closer to the summit with each passing mile. No matter how many times she hiked this trail, the mountain's towering presence never ceased to inspire and humble her, a timeless reminder of the power and grandeur of the natural world."
-

Teardown

PASSED test_fallback_to_shorthand 0:00:01.025853

Setup

Call

Captured stderr call
[2024-10-02T13:30:56Z INFO  baml_events] Function TestFallbackToShorthand:
+    "Here is a short story about Mount Rainier:\n\nTowering Majesty: The Tale of Mount Rainier\n\nAgainst the clear, azure sky, the majestic peak of Mount Rainier stood tall and proud, its snow-capped summit glistening in the warm summer sun. This iconic volcano, standing at an impressive 14,411 feet, was a testament to the awe-inspiring power of nature.\n\nFor those who had the privilege of gazing upon this natural wonder, the experience was nothing short of breathtaking. The sheer scale of the mountain was humbling, dwarfing the surrounding landscape and serving as a constant reminder of the might and grandeur of the Earth's geological forces.\n\nAs the day wore on, the light played across the mountain's slopes, casting ever-changing shadows and highlights that captivated the senses. Hikers and adventurers trekked through the lush, verdant forests that clung to the lower reaches of the mountain, their eyes drawn upwards to the towering, snow-covered peak that seemed to reach for the heavens.\n\nFor those who had the opportunity to explore the mountain's trails and glaciers, the experience was one of profound connection with the natural world. The challenges of the climb, the crisp, clean air, and the stunning vistas all combined to create a sense of wonder and reverence that lingered long after the journey had ended.\n\nWhether viewed from afar or experienced firsthand, Mount Rainier stood as a testament to the enduring power and beauty of our planet. Its towering presence, a true marvel of the natural world, inspired awe and wonder in all who encountered it, reminding us of the boundless potential of the world we inhabit."
+

Teardown

PASSED test_fallback_to_shorthand 0:00:00.842871

Setup

Call

Captured stderr call
[2024-10-21T21:10:42Z INFO  baml_events] Function TestFallbackToShorthand:
     (1 other previous tries)
-    Client: openai/gpt-4o-mini (gpt-4o-mini-2024-07-18) - 766ms. StopReason: stop
+    Client: openai/gpt-4o-mini (gpt-4o-mini-2024-07-18) - 590ms. StopReason: stop
     ---PROMPT---
     [chat] system: Say a haiku about Mt Rainier is tall.
     
     ---LLM REPLY---
-    Majestic and proud,  
-    Mount Rainier kisses skies,  
-    Tall sentinel shines.
+    Majestic it looms,  
+    Snow-capped peak kisses the sky,  
+    Nature’s grandest gift.
     ---Parsed Response (string)---
-    "Majestic and proud,  \nMount Rainier kisses skies,  \nTall sentinel shines."
-

Teardown

PASSED test_aws_streaming 0:00:02.640805

Setup

Call

Captured stderr call
[2024-10-02T13:30:56Z WARN  aws_runtime::env_config::normalize] section [Connection 1] ignored; config must be in the AWS config file rather than the credentials file
-[2024-10-02T13:30:56Z INFO  aws_config::meta::region] load_region; provider=EnvironmentVariableRegionProvider { env: Env(Real) }
-[2024-10-02T13:30:58Z INFO  baml_events] Function TestAws:
-    Client: AwsBedrock (anthropic.claude-3-haiku-20240307-v1:0) - 2628ms. StopReason: unknown
+    "Majestic it looms,  \nSnow-capped peak kisses the sky,  \nNature’s grandest gift."
+

Teardown

PASSED test_aws_streaming 0:00:02.085835

Setup

Call

Captured stderr call
[2024-10-21T21:10:42Z WARN  aws_runtime::env_config::normalize] section [Connection 1] ignored; config must be in the AWS config file rather than the credentials file
+[2024-10-21T21:10:42Z INFO  aws_config::meta::region] load_region; provider=EnvironmentVariableRegionProvider { env: Env(Real) }
+[2024-10-21T21:10:44Z INFO  baml_events] Function TestAws:
+    Client: AwsBedrock (anthropic.claude-3-haiku-20240307-v1:0) - 2078ms. StopReason: unknown
     ---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
+    Here is a short story about Mt. Rainier:
     
-    As the morning sun crested over the distant horizon, its golden rays illuminated the towering silhouette of Mount Rainier. Standing tall and proud at 14,411 feet, the legendary volcanic peak seemed to reach up and almost touch the heavens above.
+    Towering over the land, Mt. Rainier stands tall and majestic. Its snow-capped peak rises up into the clear, blue sky, commanding the attention of all who gaze upon it.
     
-    Sarah stood in awe, gazing up at the majestic mountain from her campsite in the lush,
+    For the people who live in the shadow of this mighty mountain, it is a constant and comforting presence. They are awed by its sheer size and grandeur, a reminder of the raw
     ---Parsed Response (string)---
-    "Here is a short story about Mount Rainier:\n\nThe Majestic Mountain\n\nAs the morning sun crested over the distant horizon, its golden rays illuminated the towering silhouette of Mount Rainier. Standing tall and proud at 14,411 feet, the legendary volcanic peak seemed to reach up and almost touch the heavens above.\n\nSarah stood in awe, gazing up at the majestic mountain from her campsite in the lush,"
-

Teardown

PASSED test_streaming 0:00:04.050366

Setup

Call

Captured stderr call
[2024-10-02T13:31:02Z INFO  baml_events] Function PromptTestStreaming:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 4038ms. StopReason: stop
+    "Here is a short story about Mt. Rainier:\n\nTowering over the land, Mt. Rainier stands tall and majestic. Its snow-capped peak rises up into the clear, blue sky, commanding the attention of all who gaze upon it.\n\nFor the people who live in the shadow of this mighty mountain, it is a constant and comforting presence. They are awed by its sheer size and grandeur, a reminder of the raw"
+

Teardown

PASSED test_streaming 0:00:04.434076

Setup

Call

Captured stderr call
[2024-10-21T21:10:49Z INFO  baml_events] Function PromptTestStreaming:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 4423ms. 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 land filled with curious and creative minds, there lived a young programmer named Lily. Lily had always been fascinated by the world of programming languages and dreamed of creating her very own language that would revolutionize the way people wrote code.
+    Once upon a time, in a world where creativity and innovation ruled supreme, a group of ambitious developers and computer scientists set out to create their own programming language. They were determined to push the boundaries of what was possible and make a language that was not only powerful and efficient but also fun and intuitive to use.
     
-    She spent countless hours poring over textbooks and tinkering with her computer, experimenting with different syntax and features to make her language truly unique. She was determined to make it fun and accessible for beginners, yet powerful and versatile for advanced users.
+    As they embarked on their journey, they brought together their diverse skills and expertise to brainstorm and design the perfect programming language. They spent countless hours discussing different features, syntax, and paradigms, experimenting with new ideas and testing them out in real-world scenarios.
     
-    After many sleepless nights and endless cups of coffee, Lily finally unveiled her creation to the world. She called it "LilyScript," and it was an instant hit among programmers of all skill levels. Its intuitive design and innovative features made writing code a joyous experience, and soon, developers from far and wide were singing its praises.
+    Through trial and error, they encountered many challenges and setbacks along the way. But instead of giving up, they persisted and learned from their mistakes, constantly refining and improving their creation until it was just right.
     
-    Lily's language become so popular that it was eventually integrated into mainstream programming tools, and she was hailed as a visionary in the world of technology. But for Lily, the greatest reward was knowing that she had brought joy and innovation to her fellow programmers, proving that programming languages aren't just tools – they're works of art that can inspire and delight in equal measure.
+    Finally, after months of hard work and dedication, they unveiled their masterpiece to the world - a programming language that was unlike anything that had ever been seen before. It was elegant, flexible, and incredibly user-friendly, with a clean and concise syntax that made coding a joy.
+    
+    Programmers from all corners of the globe were excited to try out this new language, and soon it became a sensation, gaining a loyal following of enthusiasts and contributors who were eager to help it grow and evolve.
+    
+    And so, the creators of this remarkable programming language basked in the glow of their success, proud of what they had achieved and excited to see where their creation would take them next. For in the world of programming, the possibilities were endless, and there was always something new and exciting just waiting to be created.
     ---Parsed Response (string)---
-    "Once upon a time, in a land filled with curious and creative minds, there lived a young programmer named Lily. Lily had always been fascinated by the world of programming languages and dreamed of creating her very own language that would revolutionize the way people wrote code.\n\nShe spent countless hours poring over textbooks and tinkering with her computer, experimenting with different syntax and features to make her language truly unique. She was determined to make it fun and accessible for beginners, yet powerful and versatile for advanced users.\n\nAfter many sleepless nights and endless cups of coffee, Lily finally unveiled her creation to the world. She called it \"LilyScript,\" and it was an instant hit among programmers of all skill levels. Its intuitive design and innovative features made writing code a joyous experience, and soon, developers from far and wide were singing its praises.\n\nLily's language become so popular that it was eventually integrated into mainstream programming tools, and she was hailed as a visionary in the world of technology. But for Lily, the greatest reward was knowing that she had brought joy and innovation to her fellow programmers, proving that programming languages aren't just tools – they're works of art that can inspire and delight in equal measure."
-

Teardown

PASSED test_streaming_uniterated 0:00:03.568557

Setup

Call

Captured stderr call
[2024-10-02T13:31:06Z INFO  baml_events] Function PromptTestStreaming:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 3557ms. StopReason: stop
+    "Once upon a time, in a world where creativity and innovation ruled supreme, a group of ambitious developers and computer scientists set out to create their own programming language. They were determined to push the boundaries of what was possible and make a language that was not only powerful and efficient but also fun and intuitive to use.\n\nAs they embarked on their journey, they brought together their diverse skills and expertise to brainstorm and design the perfect programming language. They spent countless hours discussing different features, syntax, and paradigms, experimenting with new ideas and testing them out in real-world scenarios.\n\nThrough trial and error, they encountered many challenges and setbacks along the way. But instead of giving up, they persisted and learned from their mistakes, constantly refining and improving their creation until it was just right.\n\nFinally, after months of hard work and dedication, they unveiled their masterpiece to the world - a programming language that was unlike anything that had ever been seen before. It was elegant, flexible, and incredibly user-friendly, with a clean and concise syntax that made coding a joy.\n\nProgrammers from all corners of the globe were excited to try out this new language, and soon it became a sensation, gaining a loyal following of enthusiasts and contributors who were eager to help it grow and evolve.\n\nAnd so, the creators of this remarkable programming language basked in the glow of their success, proud of what they had achieved and excited to see where their creation would take them next. For in the world of programming, the possibilities were endless, and there was always something new and exciting just waiting to be created."
+

Teardown

PASSED test_streaming_uniterated 0:00:03.787408

Setup

Call

Captured stderr call
[2024-10-21T21:10:52Z INFO  baml_events] Function PromptTestStreaming:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 3778ms. 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 Emily who always felt a pang of sadness whenever she saw the color blue. No matter what shade it was - from the deep sapphire of the ocean to the light baby blue of the sky - it always seemed to tug at her heart.
+    Once there was a young girl named Lily who had always felt an inexplicable sadness whenever she saw the color blue. No matter if it was the clear blue skies on a sunny day or the deep blue ocean waves crashing on the shore, the sight of blue always filled her heart with a heavy feeling.
     
-    People would ask her why she felt this way, but she could never quite explain it. To her, blue was a reminder of the times she felt lonely or lost, the times when she cried herself to sleep at night, the times when she wished things were different.
+    One day, as Lily walked through a park, she came across a beautiful blue butterfly fluttering among the flowers. Its wings shimmered in the sunlight, casting a mesmerizing blue hue all around. Lily couldn't help but feel a pang of sadness wash over her once again.
     
-    Despite her feelings towards the color blue, Emily longed to find peace within herself. One day, she decided to confront her sadness head-on. She began to surround herself with the color blue, slowly allowing herself to become more comfortable with it.
+    Curious, she decided to sit on a nearby bench and watch the butterfly closely. As she observed its graceful movements and delicate features, Lily realized that the blue color wasn't the source of her sadness. Instead, it was the fleeting nature of beauty and the inevitability of change that made her heart ache.
     
-    As time passed, Emily started to see the beauty in the color blue. She realized that it was not just a symbol of sadness, but also a symbol of tranquility and calmness. The ocean waves soothed her soul, the sky's vastness filled her with wonder, and the gentle hue of a forget-me-not flower brought her a sense of hope.
+    With this realization, Lily embraced her feelings of melancholy and allowed herself to appreciate the fleeting beauty of the blue butterfly. She understood that sadness was simply a part of life, just like the color blue, and that it was okay to feel both joy and sorrow in equal measure.
     
-    Eventually, Emily's sadness towards the color blue began to fade away. Instead, she embraced it as a reminder of her own inner strength and resilience. And every time she saw the color blue, she was filled with a sense of comfort and peace.
+    From that day on, whenever Lily saw the color blue, she didn't shy away from it but instead welcomed it as a reminder that life was a delicate balance of light and dark, joy and sorrow. And though the color blue still made her feel sad at times, she knew that it was only because it held a mirror to her own fleeting emotions and experiences.
     ---Parsed Response (string)---
-    "Once upon a time, there was a young girl named Emily who always felt a pang of sadness whenever she saw the color blue. No matter what shade it was - from the deep sapphire of the ocean to the light baby blue of the sky - it always seemed to tug at her heart.\n\nPeople would ask her why she felt this way, but she could never quite explain it. To her, blue was a reminder of the times she felt lonely or lost, the times when she cried herself to sleep at night, the times when she wished things were different.\n\nDespite her feelings towards the color blue, Emily longed to find peace within herself. One day, she decided to confront her sadness head-on. She began to surround herself with the color blue, slowly allowing herself to become more comfortable with it.\n\nAs time passed, Emily started to see the beauty in the color blue. She realized that it was not just a symbol of sadness, but also a symbol of tranquility and calmness. The ocean waves soothed her soul, the sky's vastness filled her with wonder, and the gentle hue of a forget-me-not flower brought her a sense of hope.\n\nEventually, Emily's sadness towards the color blue began to fade away. Instead, she embraced it as a reminder of her own inner strength and resilience. And every time she saw the color blue, she was filled with a sense of comfort and peace."
-

Teardown

PASSED test_streaming_sync 0:00:04.204105

Setup

Call

Captured stderr call
[2024-10-02T13:31:10Z INFO  baml_events] Function PromptTestStreaming:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 4195ms. StopReason: stop
+    "Once there was a young girl named Lily who had always felt an inexplicable sadness whenever she saw the color blue. No matter if it was the clear blue skies on a sunny day or the deep blue ocean waves crashing on the shore, the sight of blue always filled her heart with a heavy feeling.\n\nOne day, as Lily walked through a park, she came across a beautiful blue butterfly fluttering among the flowers. Its wings shimmered in the sunlight, casting a mesmerizing blue hue all around. Lily couldn't help but feel a pang of sadness wash over her once again.\n\nCurious, she decided to sit on a nearby bench and watch the butterfly closely. As she observed its graceful movements and delicate features, Lily realized that the blue color wasn't the source of her sadness. Instead, it was the fleeting nature of beauty and the inevitability of change that made her heart ache.\n\nWith this realization, Lily embraced her feelings of melancholy and allowed herself to appreciate the fleeting beauty of the blue butterfly. She understood that sadness was simply a part of life, just like the color blue, and that it was okay to feel both joy and sorrow in equal measure.\n\nFrom that day on, whenever Lily saw the color blue, she didn't shy away from it but instead welcomed it as a reminder that life was a delicate balance of light and dark, joy and sorrow. And though the color blue still made her feel sad at times, she knew that it was only because it held a mirror to her own fleeting emotions and experiences."
+

Teardown

PASSED test_streaming_sync 0:00:05.068735

Setup

Call

Captured stderr call
[2024-10-21T21:10:58Z INFO  baml_events] Function PromptTestStreaming:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 5059ms. StopReason: stop
     ---PROMPT---
     [chat] system: Tell me a short story about Programming languages are fun to create
     
     ---LLM REPLY---
-    Once upon a time, there was a group of friends who shared a passion for technology and a love for solving problems. One day, they decided to embark on a new adventure by creating their own programming language.
-    
-    They gathered around a whiteboard, brainstorming ideas for syntax, features, and overall structure. They debated fiercely, but also laughed and shared countless cups of coffee as they worked through the challenges of designing a language from scratch.
+    Once upon a time in the magical land of Techtopia, there was a young wizard named Alex who had a passion for creating new things. He was known throughout the kingdom for his knack for inventing innovative tools and gadgets. One day, Alex decided to embark on a new adventure – creating his very own programming language.
     
-    As they delved deeper into the project, they began to see their creation come to life before their eyes. They implemented loops, functions, and variables, each line of code bringing them closer to their vision of a language that was elegant, powerful, and user-friendly.
+    With a twinkle in his eye and a determined spirit, Alex set out to weave together spells of syntax and logic to bring his vision to life. He spent countless hours experimenting with different patterns, symbols, and rules, carefully crafting each element of his language with precision and care.
     
-    The friends marveled at the beauty of their creation, at the way the code flowed seamlessly from one function to the next, and how easily it could be understood by programmers of all levels.
+    As he delved deeper into the magical world of programming, Alex discovered the endless possibilities that his language could unlock. With just a few lines of code, he could summon powerful algorithms, manipulate data with ease, and create intricate systems that danced with complexity.
     
-    As they put the finishing touches on their language, they knew they had created something truly special. They released it to the world, where it was met with excitement and acclaim from developers everywhere.
+    But it wasn't just the practical power of his language that captivated Alex – it was the sheer joy of crafting something entirely his own. Each new feature he added, each bug he fixed, was a triumph of creativity and ingenuity. And as he shared his creation with fellow wizards and sorcerers, he found a community of like-minded souls who shared his love for the art of coding.
     
-    And so, the friends basked in the joy of their accomplishment, knowing that they had created something that would inspire others to push the boundaries of what was possible in the world of programming. And they continued to work on new projects, knowing that the sky was the limit when it came to the power and creativity of programming languages.
+    In the end, Alex's programming language became a beloved tool in Techtopia, used by wizards and enchanters far and wide. And as he looked upon the sprawling world of possibilities that his creation had unleashed, he knew that he had found his true calling – for in the act of programming, he had found not just a hobby, but a source of endless wonder and delight. And so, the tale of the young wizard who created a programming language lived on in the hearts of those who dared to dream, to create, and to embrace the magic of coding.
     ---Parsed Response (string)---
-    "Once upon a time, there was a group of friends who shared a passion for technology and a love for solving problems. One day, they decided to embark on a new adventure by creating their own programming language.\n\nThey gathered around a whiteboard, brainstorming ideas for syntax, features, and overall structure. They debated fiercely, but also laughed and shared countless cups of coffee as they worked through the challenges of designing a language from scratch.\n\nAs they delved deeper into the project, they began to see their creation come to life before their eyes. They implemented loops, functions, and variables, each line of code bringing them closer to their vision of a language that was elegant, powerful, and user-friendly.\n\nThe friends marveled at the beauty of their creation, at the way the code flowed seamlessly from one function to the next, and how easily it could be understood by programmers of all levels.\n\nAs they put the finishing touches on their language, they knew they had created something truly special. They released it to the world, where it was met with excitement and acclaim from developers everywhere.\n\nAnd so, the friends basked in the joy of their accomplishment, knowing that they had created something that would inspire others to push the boundaries of what was possible in the world of programming. And they continued to work on new projects, knowing that the sky was the limit when it came to the power and creativity of programming languages."
-

Teardown

PASSED test_streaming_uniterated_sync 0:00:03.229808

Setup

Call

Captured stderr call
[2024-10-02T13:31:13Z INFO  baml_events] Function PromptTestStreaming:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 3221ms. StopReason: stop
+    "Once upon a time in the magical land of Techtopia, there was a young wizard named Alex who had a passion for creating new things. He was known throughout the kingdom for his knack for inventing innovative tools and gadgets. One day, Alex decided to embark on a new adventure – creating his very own programming language.\n\nWith a twinkle in his eye and a determined spirit, Alex set out to weave together spells of syntax and logic to bring his vision to life. He spent countless hours experimenting with different patterns, symbols, and rules, carefully crafting each element of his language with precision and care.\n\nAs he delved deeper into the magical world of programming, Alex discovered the endless possibilities that his language could unlock. With just a few lines of code, he could summon powerful algorithms, manipulate data with ease, and create intricate systems that danced with complexity.\n\nBut it wasn't just the practical power of his language that captivated Alex – it was the sheer joy of crafting something entirely his own. Each new feature he added, each bug he fixed, was a triumph of creativity and ingenuity. And as he shared his creation with fellow wizards and sorcerers, he found a community of like-minded souls who shared his love for the art of coding.\n\nIn the end, Alex's programming language became a beloved tool in Techtopia, used by wizards and enchanters far and wide. And as he looked upon the sprawling world of possibilities that his creation had unleashed, he knew that he had found his true calling – for in the act of programming, he had found not just a hobby, but a source of endless wonder and delight. And so, the tale of the young wizard who created a programming language lived on in the hearts of those who dared to dream, to create, and to embrace the magic of coding."
+

Teardown

PASSED test_streaming_uniterated_sync 0:00:06.346556

Setup

Call

Captured stderr call
[2024-10-21T21:11:04Z INFO  baml_events] Function PromptTestStreaming:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 6339ms. StopReason: stop
     ---PROMPT---
     [chat] system: Tell me a short story about The color blue makes me sad
     
     ---LLM REPLY---
-    Once there was a girl named Lily who loved the color blue. She found comfort in its calming hues and felt a sense of peace whenever she saw it. Blue skies, blue flowers, and blue oceans filled her with joy.
+    Once upon a time, there was a young girl named Lily who lived in a world where colors held great power. Each color had its own unique effect on people's emotions, and among them, blue was known to have a particularly strong influence.
     
-    But one day, something changed. Lily's best friend, Sarah, moved away to a different city, leaving Lily feeling lonely and lost. Whenever she looked at the color blue, it reminded her of Sarah and the happy memories they shared together. But now, those memories only brought tears to her eyes.
+    For Lily, the color blue always made her sad. It reminded her of the ocean on stormy days, of cold winter nights, and of all the tears she had shed in moments of despair. She tried to avoid anything blue - clothes, paintings, even the sky on cloudy days - but no matter how hard she tried, the color would always find a way to sneak into her life.
     
-    Lily tried to avoid anything blue, but it was everywhere. The walls of her room, her favorite dress, even the sky above her head - they all taunted her with memories of her lost friend.
+    One day, while taking a walk in the forest, Lily came across a beautiful blue flower. As she looked at it, a wave of sadness washed over her, and she felt tears welling up in her eyes. But instead of turning away, she decided to face her fear head-on.
     
-    As days passed, Lily realized that it wasn't the color blue that made her sad, but the absence of her friend. She knew that Sarah would always hold a special place in her heart, no matter how much the color blue reminded her of their time together.
+    She knelt down next to the flower and studied its delicate petals, its vibrant hue standing out against the green backdrop of the forest. Slowly, she began to realize that the color blue was not only a reminder of sadness but also a symbol of beauty and strength. The flower did not make her sad because it was blue; it made her sad because it was a reminder of the beauty and strength that could be found even in the darkest of moments.
     
-    And so, Lily learned to embrace the color blue once again, finding solace in the memories of her dear friend and allowing herself to feel sad, but also grateful for the wonderful moments they shared.
+    From that day on, whenever Lily saw the color blue, she no longer felt sadness overwhelming her. Instead, she saw it as a reminder that even in the midst of sorrow, there was always a glimmer of hope and beauty to be found. And with that newfound perspective, she embraced the color blue, knowing that it held a power far greater than sorrow - the power to bring light and joy even in the darkest of times.
     ---Parsed Response (string)---
-    "Once there was a girl named Lily who loved the color blue. She found comfort in its calming hues and felt a sense of peace whenever she saw it. Blue skies, blue flowers, and blue oceans filled her with joy.\n\nBut one day, something changed. Lily's best friend, Sarah, moved away to a different city, leaving Lily feeling lonely and lost. Whenever she looked at the color blue, it reminded her of Sarah and the happy memories they shared together. But now, those memories only brought tears to her eyes.\n\nLily tried to avoid anything blue, but it was everywhere. The walls of her room, her favorite dress, even the sky above her head - they all taunted her with memories of her lost friend.\n\nAs days passed, Lily realized that it wasn't the color blue that made her sad, but the absence of her friend. She knew that Sarah would always hold a special place in her heart, no matter how much the color blue reminded her of their time together.\n\nAnd so, Lily learned to embrace the color blue once again, finding solace in the memories of her dear friend and allowing herself to feel sad, but also grateful for the wonderful moments they shared."
-

Teardown

PASSED test_streaming_claude 0:00:00.994421

Setup

Call

Captured stdout call
msgs:
+    "Once upon a time, there was a young girl named Lily who lived in a world where colors held great power. Each color had its own unique effect on people's emotions, and among them, blue was known to have a particularly strong influence.\n\nFor Lily, the color blue always made her sad. It reminded her of the ocean on stormy days, of cold winter nights, and of all the tears she had shed in moments of despair. She tried to avoid anything blue - clothes, paintings, even the sky on cloudy days - but no matter how hard she tried, the color would always find a way to sneak into her life.\n\nOne day, while taking a walk in the forest, Lily came across a beautiful blue flower. As she looked at it, a wave of sadness washed over her, and she felt tears welling up in her eyes. But instead of turning away, she decided to face her fear head-on.\n\nShe knelt down next to the flower and studied its delicate petals, its vibrant hue standing out against the green backdrop of the forest. Slowly, she began to realize that the color blue was not only a reminder of sadness but also a symbol of beauty and strength. The flower did not make her sad because it was blue; it made her sad because it was a reminder of the beauty and strength that could be found even in the darkest of moments.\n\nFrom that day on, whenever Lily saw the color blue, she no longer felt sadness overwhelming her. Instead, she saw it as a reminder that even in the midst of sorrow, there was always a glimmer of hope and beauty to be found. And with that newfound perspective, she embraced the color blue, knowing that it held a power far greater than sorrow - the power to bring light and joy even in the darkest of times."
+

Teardown

PASSED test_streaming_claude 0:00:01.282504

Setup

Call

Captured stdout call
msgs:
 Here's a haiku about Mt. Rainier being tall:
 
 Rainier towers high
-Piercing clouds with snowy peak
-Nature's skyscraper
+Snowcapped peak touches the sky
+Nature's majesty
 final:
 Here's a haiku about Mt. Rainier being tall:
 
 Rainier towers high
-Piercing clouds with snowy peak
-Nature's skyscraper
-
Captured stderr call
[2024-10-02T13:31:14Z INFO  baml_events] Function PromptTestClaude:
-    Client: Sonnet (claude-3-5-sonnet-20240620) - 977ms. StopReason: "end_turn"
+Snowcapped peak touches the sky
+Nature's majesty
+
Captured stderr call
[2024-10-21T21:11:05Z INFO  baml_events] Function PromptTestClaude:
+    Client: Sonnet (claude-3-5-sonnet-20240620) - 1263ms. StopReason: "end_turn"
     ---PROMPT---
     [chat] user: Tell me a haiku about Mt Rainier is tall
     
@@ -707,77 +774,59 @@
     Here's a haiku about Mt. Rainier being tall:
     
     Rainier towers high
-    Piercing clouds with snowy peak
-    Nature's skyscraper
+    Snowcapped peak touches the sky
+    Nature's majesty
     ---Parsed Response (string)---
-    "Here's a haiku about Mt. Rainier being tall:\n\nRainier towers high\nPiercing clouds with snowy peak\nNature's skyscraper"
-

Teardown

PASSED test_streaming_gemini 0:00:09.229494

Setup

Call

Captured stdout call
msgs:
-Dottie Mae's Diner bustled with the usual lunchtime crowd. Truckers chuckled over coffee refills, farmers debated the upcoming harvest, and Sheriff Roy droned on about his wife's prize-winning rhubarb pie. But 10-year-old Lily barely noticed. Her gaze was glued to the vintage vending machine, its chrome gleaming under the warm glow of the diner lights.  She’d never seen anything like it before. 
+    "Here's a haiku about Mt. Rainier being tall:\n\nRainier towers high\nSnowcapped peak touches the sky\nNature's majesty"
+

Teardown

PASSED test_streaming_gemini 0:00:09.485462

Setup

Call

Captured stdout call
msgs:
+Barnabus "Barney" Pepper, PhD in Fizziology, adjusted his spectacles and peered into the swirling concoction before him. It was a beautiful crimson, bubbling merrily in the glass beaker. He inhaled deeply, the sweet aroma of cherry and licorice tickling his nose. "Almost..." he murmured, tapping a finger against the glass.
 
-"Dr Pepper," she whispered, tracing the elegant script on the glass. 
+For years, Barney had chased the perfect fizz. Not just any fizz, mind you, but a Dr. Pepper fizz. It was a family legacy, passed down from generations of Peppers. His great-great-grandfather, Silas Pepper, had invented the original, a bubbly elixir that tasted like pure joy. But the recipe, passed down through generations, had faded with time, leaving only tantalizing hints of its former glory.
 
-"Never seen a fella so fascinated by a drink," chuckled a voice beside her. It was Old Man Withers, everyone's favorite storyteller and a permanent fixture at the diner counter.
+Barney, armed with his PhD and an insatiable thirst for knowledge (and Dr. Pepper), was determined to recreate it. He'd scoured dusty libraries, deciphered cryptic tasting notes scribbled on parchment, even journeyed to the peak of Mount Fizzmore, rumored to hold the secret ingredient (it was ginger, and quite underwhelming, he might add).
 
-Lily blushed. "My grandpa says Dr Pepper has 23 flavors. 23! I can only ever taste about five."
+Tonight, he believed he had finally cracked the code. With trembling hands, he added a single drop of amaretto extract, the final piece of the puzzle. The concoction fizzed with renewed vigor, a vibrant symphony of bubbles dancing before his eyes.
 
-Old Man Withers let out a low whistle. "Your grandpa's a wise man.  Dr Pepper," he said, his voice taking on a dramatic tone, "is more than just a drink. It's an adventure for your taste buds."
+He took a sip, the sweet, spicy liquid exploding across his palate. It was like a thousand fireworks going off, each one a flavor note hitting all the right spots.  Tears welled up in his eyes.  "Eureka!" he cried, his voice echoing through the lab. "It's...it's perfect!"
 
-He fished a penny from his overalls and winked at Lily. "Go on, give it a try."
-
-Lily's fingers trembled with anticipation as she dropped the coin and pressed the frosty button.  The machine clunked and whirred, spitting out a cold, sweating bottle. As Lily brought it to her lips, she could have sworn she heard a whisper of music, like a carnival from far away. 
-
-She took a sip. Her eyes widened.  It was like no Dr Pepper she'd ever tasted. It was sweet and spicy, with a hint of something citrusy, and something else... cinnamon? Licorice? She couldn’t quite place it. It was a symphony of flavor, each sip revealing something new. 
-
-Lily looked up at Old Man Withers, her face glowing.  He just winked, a mischievous glint in his eye.  From that day on, Lily looked at Dr Pepper in a whole new light. It wasn’t just a soda anymore, it was a reminder that even the most ordinary things could hold a touch of magic, a whisper of the extraordinary, if you knew how to taste it. 
+He had done it. He, Dr. Barnabus Pepper, had resurrected the legendary Dr. Pepper fizz. As he leaned back, savoring the moment, he knew this was only the beginning. He could already imagine the world, united by the joy of his perfect fizz. And it was a future sweeter than he could have ever imagined. 
 
 final:
-Dottie Mae's Diner bustled with the usual lunchtime crowd. Truckers chuckled over coffee refills, farmers debated the upcoming harvest, and Sheriff Roy droned on about his wife's prize-winning rhubarb pie. But 10-year-old Lily barely noticed. Her gaze was glued to the vintage vending machine, its chrome gleaming under the warm glow of the diner lights.  She’d never seen anything like it before. 
-
-"Dr Pepper," she whispered, tracing the elegant script on the glass. 
-
-"Never seen a fella so fascinated by a drink," chuckled a voice beside her. It was Old Man Withers, everyone's favorite storyteller and a permanent fixture at the diner counter.
-
-Lily blushed. "My grandpa says Dr Pepper has 23 flavors. 23! I can only ever taste about five."
+Barnabus "Barney" Pepper, PhD in Fizziology, adjusted his spectacles and peered into the swirling concoction before him. It was a beautiful crimson, bubbling merrily in the glass beaker. He inhaled deeply, the sweet aroma of cherry and licorice tickling his nose. "Almost..." he murmured, tapping a finger against the glass.
 
-Old Man Withers let out a low whistle. "Your grandpa's a wise man.  Dr Pepper," he said, his voice taking on a dramatic tone, "is more than just a drink. It's an adventure for your taste buds."
+For years, Barney had chased the perfect fizz. Not just any fizz, mind you, but a Dr. Pepper fizz. It was a family legacy, passed down from generations of Peppers. His great-great-grandfather, Silas Pepper, had invented the original, a bubbly elixir that tasted like pure joy. But the recipe, passed down through generations, had faded with time, leaving only tantalizing hints of its former glory.
 
-He fished a penny from his overalls and winked at Lily. "Go on, give it a try."
+Barney, armed with his PhD and an insatiable thirst for knowledge (and Dr. Pepper), was determined to recreate it. He'd scoured dusty libraries, deciphered cryptic tasting notes scribbled on parchment, even journeyed to the peak of Mount Fizzmore, rumored to hold the secret ingredient (it was ginger, and quite underwhelming, he might add).
 
-Lily's fingers trembled with anticipation as she dropped the coin and pressed the frosty button.  The machine clunked and whirred, spitting out a cold, sweating bottle. As Lily brought it to her lips, she could have sworn she heard a whisper of music, like a carnival from far away. 
+Tonight, he believed he had finally cracked the code. With trembling hands, he added a single drop of amaretto extract, the final piece of the puzzle. The concoction fizzed with renewed vigor, a vibrant symphony of bubbles dancing before his eyes.
 
-She took a sip. Her eyes widened.  It was like no Dr Pepper she'd ever tasted. It was sweet and spicy, with a hint of something citrusy, and something else... cinnamon? Licorice? She couldn’t quite place it. It was a symphony of flavor, each sip revealing something new. 
+He took a sip, the sweet, spicy liquid exploding across his palate. It was like a thousand fireworks going off, each one a flavor note hitting all the right spots.  Tears welled up in his eyes.  "Eureka!" he cried, his voice echoing through the lab. "It's...it's perfect!"
 
-Lily looked up at Old Man Withers, her face glowing.  He just winked, a mischievous glint in his eye.  From that day on, Lily looked at Dr Pepper in a whole new light. It wasn’t just a soda anymore, it was a reminder that even the most ordinary things could hold a touch of magic, a whisper of the extraordinary, if you knew how to taste it. 
+He had done it. He, Dr. Barnabus Pepper, had resurrected the legendary Dr. Pepper fizz. As he leaned back, savoring the moment, he knew this was only the beginning. He could already imagine the world, united by the joy of his perfect fizz. And it was a future sweeter than he could have ever imagined. 
 
-
Captured stderr call
[2024-10-02T13:31:24Z INFO  baml_events] Function TestGemini:
-    Client: Gemini (gemini-1.5-pro-001) - 9212ms. StopReason: Stop
+
Captured stderr call
[2024-10-21T21:11:15Z INFO  baml_events] Function TestGemini:
+    Client: Gemini (gemini-1.5-pro-001) - 9472ms. StopReason: Stop
     ---PROMPT---
     [chat] user: Write a nice short story about Dr.Pepper
     
     ---LLM REPLY---
-    Dottie Mae's Diner bustled with the usual lunchtime crowd. Truckers chuckled over coffee refills, farmers debated the upcoming harvest, and Sheriff Roy droned on about his wife's prize-winning rhubarb pie. But 10-year-old Lily barely noticed. Her gaze was glued to the vintage vending machine, its chrome gleaming under the warm glow of the diner lights.  She’d never seen anything like it before. 
+    Barnabus "Barney" Pepper, PhD in Fizziology, adjusted his spectacles and peered into the swirling concoction before him. It was a beautiful crimson, bubbling merrily in the glass beaker. He inhaled deeply, the sweet aroma of cherry and licorice tickling his nose. "Almost..." he murmured, tapping a finger against the glass.
     
-    "Dr Pepper," she whispered, tracing the elegant script on the glass. 
+    For years, Barney had chased the perfect fizz. Not just any fizz, mind you, but a Dr. Pepper fizz. It was a family legacy, passed down from generations of Peppers. His great-great-grandfather, Silas Pepper, had invented the original, a bubbly elixir that tasted like pure joy. But the recipe, passed down through generations, had faded with time, leaving only tantalizing hints of its former glory.
     
-    "Never seen a fella so fascinated by a drink," chuckled a voice beside her. It was Old Man Withers, everyone's favorite storyteller and a permanent fixture at the diner counter.
+    Barney, armed with his PhD and an insatiable thirst for knowledge (and Dr. Pepper), was determined to recreate it. He'd scoured dusty libraries, deciphered cryptic tasting notes scribbled on parchment, even journeyed to the peak of Mount Fizzmore, rumored to hold the secret ingredient (it was ginger, and quite underwhelming, he might add).
     
-    Lily blushed. "My grandpa says Dr Pepper has 23 flavors. 23! I can only ever taste about five."
+    Tonight, he believed he had finally cracked the code. With trembling hands, he added a single drop of amaretto extract, the final piece of the puzzle. The concoction fizzed with renewed vigor, a vibrant symphony of bubbles dancing before his eyes.
     
-    Old Man Withers let out a low whistle. "Your grandpa's a wise man.  Dr Pepper," he said, his voice taking on a dramatic tone, "is more than just a drink. It's an adventure for your taste buds."
+    He took a sip, the sweet, spicy liquid exploding across his palate. It was like a thousand fireworks going off, each one a flavor note hitting all the right spots.  Tears welled up in his eyes.  "Eureka!" he cried, his voice echoing through the lab. "It's...it's perfect!"
     
-    He fished a penny from his overalls and winked at Lily. "Go on, give it a try."
-    
-    Lily's fingers trembled with anticipation as she dropped the coin and pressed the frosty button.  The machine clunked and whirred, spitting out a cold, sweating bottle. As Lily brought it to her lips, she could have sworn she heard a whisper of music, like a carnival from far away. 
-    
-    She took a sip. Her eyes widened.  It was like no Dr Pepper she'd ever tasted. It was sweet and spicy, with a hint of something citrusy, and something else... cinnamon? Licorice? She couldn’t quite place it. It was a symphony of flavor, each sip revealing something new. 
-    
-    Lily looked up at Old Man Withers, her face glowing.  He just winked, a mischievous glint in his eye.  From that day on, Lily looked at Dr Pepper in a whole new light. It wasn’t just a soda anymore, it was a reminder that even the most ordinary things could hold a touch of magic, a whisper of the extraordinary, if you knew how to taste it. 
+    He had done it. He, Dr. Barnabus Pepper, had resurrected the legendary Dr. Pepper fizz. As he leaned back, savoring the moment, he knew this was only the beginning. He could already imagine the world, united by the joy of his perfect fizz. And it was a future sweeter than he could have ever imagined. 
     
     ---Parsed Response (string)---
-    "Dottie Mae's Diner bustled with the usual lunchtime crowd. Truckers chuckled over coffee refills, farmers debated the upcoming harvest, and Sheriff Roy droned on about his wife's prize-winning rhubarb pie. But 10-year-old Lily barely noticed. Her gaze was glued to the vintage vending machine, its chrome gleaming under the warm glow of the diner lights.  She’d never seen anything like it before. \n\n\"Dr Pepper,\" she whispered, tracing the elegant script on the glass. \n\n\"Never seen a fella so fascinated by a drink,\" chuckled a voice beside her. It was Old Man Withers, everyone's favorite storyteller and a permanent fixture at the diner counter.\n\nLily blushed. \"My grandpa says Dr Pepper has 23 flavors. 23! I can only ever taste about five.\"\n\nOld Man Withers let out a low whistle. \"Your grandpa's a wise man.  Dr Pepper,\" he said, his voice taking on a dramatic tone, \"is more than just a drink. It's an adventure for your taste buds.\"\n\nHe fished a penny from his overalls and winked at Lily. \"Go on, give it a try.\"\n\nLily's fingers trembled with anticipation as she dropped the coin and pressed the frosty button.  The machine clunked and whirred, spitting out a cold, sweating bottle. As Lily brought it to her lips, she could have sworn she heard a whisper of music, like a carnival from far away. \n\nShe took a sip. Her eyes widened.  It was like no Dr Pepper she'd ever tasted. It was sweet and spicy, with a hint of something citrusy, and something else... cinnamon? Licorice? She couldn’t quite place it. It was a symphony of flavor, each sip revealing something new. \n\nLily looked up at Old Man Withers, her face glowing.  He just winked, a mischievous glint in his eye.  From that day on, Lily looked at Dr Pepper in a whole new light. It wasn’t just a soda anymore, it was a reminder that even the most ordinary things could hold a touch of magic, a whisper of the extraordinary, if you knew how to taste it. \n"
-

Teardown

PASSED test_tracing_async_only 0:00:04.808090

Setup

Call

Captured stdout call
STATS TraceStats(failed=0, started=15, finalized=15, submitted=15, sent=15, done=15)
-
Captured stderr call
[2024-10-02T13:31:25Z INFO  baml_events] Function FnOutputClass:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 649ms. StopReason: stop
+    "Barnabus \"Barney\" Pepper, PhD in Fizziology, adjusted his spectacles and peered into the swirling concoction before him. It was a beautiful crimson, bubbling merrily in the glass beaker. He inhaled deeply, the sweet aroma of cherry and licorice tickling his nose. \"Almost...\" he murmured, tapping a finger against the glass.\n\nFor years, Barney had chased the perfect fizz. Not just any fizz, mind you, but a Dr. Pepper fizz. It was a family legacy, passed down from generations of Peppers. His great-great-grandfather, Silas Pepper, had invented the original, a bubbly elixir that tasted like pure joy. But the recipe, passed down through generations, had faded with time, leaving only tantalizing hints of its former glory.\n\nBarney, armed with his PhD and an insatiable thirst for knowledge (and Dr. Pepper), was determined to recreate it. He'd scoured dusty libraries, deciphered cryptic tasting notes scribbled on parchment, even journeyed to the peak of Mount Fizzmore, rumored to hold the secret ingredient (it was ginger, and quite underwhelming, he might add).\n\nTonight, he believed he had finally cracked the code. With trembling hands, he added a single drop of amaretto extract, the final piece of the puzzle. The concoction fizzed with renewed vigor, a vibrant symphony of bubbles dancing before his eyes.\n\nHe took a sip, the sweet, spicy liquid exploding across his palate. It was like a thousand fireworks going off, each one a flavor note hitting all the right spots.  Tears welled up in his eyes.  \"Eureka!\" he cried, his voice echoing through the lab. \"It's...it's perfect!\"\n\nHe had done it. He, Dr. Barnabus Pepper, had resurrected the legendary Dr. Pepper fizz. As he leaned back, savoring the moment, he knew this was only the beginning. He could already imagine the world, united by the joy of his perfect fizz. And it was a future sweeter than he could have ever imagined. \n"
+

Teardown

PASSED test_tracing_async_only 0:00:05.949957

Setup

Call

Captured stdout call
STATS TraceStats(failed=0, started=15, finalized=15, submitted=15, sent=15, done=15)
+
Captured stderr call
[2024-10-21T21:11:16Z INFO  baml_events] Function FnOutputClass:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 606ms. StopReason: stop
     ---PROMPT---
     [chat] system: Return a JSON blob with this schema: 
     Answer in JSON using this schema:
@@ -792,16 +841,16 @@
     
     ---LLM REPLY---
     {
-      "prop1": "Hello, World!",
+      "prop1": "Hello",
       "prop2": 540
     }
     ---Parsed Response (class TestOutputClass)---
     {
-      "prop1": "Hello, World!",
+      "prop1": "Hello",
       "prop2": 540
     }
-[2024-10-02T13:31:26Z INFO  baml_events] Function FnOutputClass:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 585ms. StopReason: stop
+[2024-10-21T21:11:17Z INFO  baml_events] Function FnOutputClass:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 618ms. StopReason: stop
     ---PROMPT---
     [chat] system: Return a JSON blob with this schema: 
     Answer in JSON using this schema:
@@ -824,8 +873,8 @@
       "prop1": "Hello, JSON!",
       "prop2": 540
     }
-[2024-10-02T13:31:27Z INFO  baml_events] Function FnOutputClass:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 618ms. StopReason: stop
+[2024-10-21T21:11:17Z INFO  baml_events] Function FnOutputClass:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 702ms. StopReason: stop
     ---PROMPT---
     [chat] system: Return a JSON blob with this schema: 
     Answer in JSON using this schema:
@@ -840,16 +889,16 @@
     
     ---LLM REPLY---
     {
-      "prop1": "example",
+      "prop1": "This is a sample string",
       "prop2": 540
     }
     ---Parsed Response (class TestOutputClass)---
     {
-      "prop1": "example",
+      "prop1": "This is a sample string",
       "prop2": 540
     }
-[2024-10-02T13:31:28Z INFO  baml_events] Function FnOutputClass:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 519ms. StopReason: stop
+[2024-10-21T21:11:20Z INFO  baml_events] Function FnOutputClass:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 553ms. StopReason: stop
     ---PROMPT---
     [chat] system: Return a JSON blob with this schema: 
     Answer in JSON using this schema:
@@ -864,17 +913,17 @@
     
     ---LLM REPLY---
     {
-      "prop1": "hello",
+      "prop1": "Hello, world!",
       "prop2": 540
     }
     ---Parsed Response (class TestOutputClass)---
     {
-      "prop1": "hello",
+      "prop1": "Hello, world!",
       "prop2": 540
     }
-

Teardown

PASSED test_tracing_sync 0:00:00.001214

Setup

Call

Teardown

PASSED test_tracing_thread_pool 0:00:01.434536

Setup

Call

Teardown

PASSED test_tracing_thread_pool_async 0:00:14.239770

Setup

Call

Teardown

PASSED test_tracing_async_gather 0:00:01.440577

Setup

Call

Teardown

PASSED test_tracing_async_gather_top_level 0:00:01.313040

Setup

Call

Teardown

PASSED test_dynamic 0:00:00.821108

Setup

Call

Captured stdout call
{'name': 'Harrison', 'hair_color': 'BLACK', 'last_name': [], 'height': 1.83, 'hobbies': ['SPORTS']}
-
Captured stderr call
[2024-10-02T13:31:48Z INFO  baml_events] Function ExtractPeople:
-    Client: GPT4 (gpt-4o-2024-05-13) - 806ms. StopReason: stop
+

Teardown

PASSED test_tracing_sync 0:00:00.001106

Setup

Call

Teardown

PASSED test_tracing_thread_pool 0:00:01.368758

Setup

Call

Teardown

PASSED test_tracing_thread_pool_async 0:00:13.663521

Setup

Call

Teardown

PASSED test_tracing_async_gather 0:00:01.223600

Setup

Call

Teardown

PASSED test_tracing_async_gather_top_level 0:00:01.484650

Setup

Call

Teardown

PASSED test_dynamic 0:00:01.164092

Setup

Call

Captured stdout call
{'name': 'Harrison', 'hair_color': <Color.BLACK: 'BLACK'>, 'last_name': [], 'height': 1.83, 'hobbies': [<Hobby.SPORTS: 'SPORTS'>]}
+
Captured stderr call
[2024-10-21T21:11:40Z INFO  baml_events] Function ExtractPeople:
+    Client: GPT4 (gpt-4o-2024-08-06) - 1151ms. 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.
     
@@ -918,10 +967,10 @@
         ]
       }
     ]
-

Teardown

PASSED test_dynamic_class_output 0:00:00.955352

Setup

Call

Captured stdout call
[]
+

Teardown

PASSED test_dynamic_class_output 0:00:01.038064

Setup

Call

Captured stdout call
[]
 {"hair_color":"black"}
-
Captured stderr call
[2024-10-02T13:31:48Z INFO  baml_events] Function MyFunc:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 390ms. StopReason: stop
+
Captured stderr call
[2024-10-21T21:11:40Z INFO  baml_events] Function MyFunc:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 479ms. StopReason: stop
     ---PROMPT---
     [chat] system: Given a string, extract info using the schema:
     
@@ -940,8 +989,8 @@
     {
       "hair_color": "black"
     }
-[2024-10-02T13:31:49Z INFO  baml_events] Function MyFunc:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 549ms. StopReason: stop
+[2024-10-21T21:11:41Z INFO  baml_events] Function MyFunc:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 545ms. StopReason: stop
     ---PROMPT---
     [chat] system: Given a string, extract info using the schema:
     
@@ -960,9 +1009,9 @@
     {
       "hair_color": "black"
     }
-

Teardown

PASSED test_dynamic_class_nested_output_no_stream 0:00:01.018233

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-10-02T13:31:50Z INFO  baml_events] Function MyFunc:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 1006ms. StopReason: stop
+

Teardown

PASSED test_dynamic_class_nested_output_no_stream 0:00:01.023474

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-10-21T21:11:42Z INFO  baml_events] Function MyFunc:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 1013ms. StopReason: stop
     ---PROMPT---
     [chat] system: Given a string, extract info using the schema:
     
@@ -990,7 +1039,7 @@
       },
       "address": null,
       "hairColor": "black",
-      "height": 6
+      "height": 6.0
     }
     ---Parsed Response (class DynamicOutput)---
     {
@@ -1003,7 +1052,7 @@
       "hair_color": "black",
       "height": 6.0
     }
-

Teardown

PASSED test_dynamic_class_nested_output_stream 0:00:00.759239

Setup

Call

Captured stdout call
streamed  name=None hair_color=None
+

Teardown

PASSED test_dynamic_class_nested_output_stream 0:00:00.868856

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}
@@ -1080,8 +1129,8 @@
 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"}
-
Captured stderr call
[2024-10-02T13:31:50Z INFO  baml_events] Function MyFunc:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 750ms. StopReason: stop
+
Captured stderr call
[2024-10-21T21:11:42Z INFO  baml_events] Function MyFunc:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 860ms. StopReason: stop
     ---PROMPT---
     [chat] system: Given a string, extract info using the schema:
     
@@ -1112,26 +1161,16 @@
       },
       "hair_color": "black"
     }
-

Teardown

PASSED test_stream_dynamic_class_output 0:00:00.682154

Setup

Call

Captured stdout call
[]
-Found: 1
-streamed  {'hair_color': None}
-Found: 1
-streamed  {'hair_color': None}
-Found: 1
-streamed  {'hair_color': None}
-Found: 1
-streamed  {'hair_color': None}
-Found: 1
-streamed  {'hair_color': None}
-Found: 1
-streamed  {'hair_color': None}
-Found: 1
+

Teardown

PASSED test_stream_dynamic_class_output 0:00:00.513415

Setup

Call

Captured stdout call
[]
+streamed  {'hair_color': '{'}
+streamed  {'hair_color': '{'}
+streamed  {'hair_color': '{\n  "'}
+streamed  {'hair_color': '{\n  "hair'}
+streamed  {'hair_color': '{\n  "hair_color'}
+streamed  {'hair_color': '{\n  "hair_color":'}
 streamed  {'hair_color': ''}
-Found: 1
 streamed  {'hair_color': 'black'}
-Found: 1
 streamed  {'hair_color': 'black'}
-Found: 1
 streamed  {'hair_color': 'black'}
 streamed  {'hair_color': 'black'}
 streamed  {'hair_color': 'black'}
@@ -1139,8 +1178,8 @@
 final  hair_color='black'
 final  {'hair_color': 'black'}
 final  {"hair_color":"black"}
-
Captured stderr call
[2024-10-02T13:31:51Z INFO  baml_events] Function MyFunc:
-    Client: MyClient (gpt-4o-mini-2024-07-18) - 672ms. StopReason: stop
+
Captured stderr call
[2024-10-21T21:11:43Z INFO  baml_events] Function MyFunc:
+    Client: MyClient (gpt-4o-mini-2024-07-18) - 505ms. StopReason: stop
     ---PROMPT---
     [chat] system: Given a string, extract info using the schema:
     
@@ -1161,12 +1200,24 @@
     {
       "hair_color": "black"
     }
-

Teardown

PASSED test_dynamic_inputs_list2 0:00:01.538839

Setup

Call

Captured stderr call
[2024-10-02T13:31:53Z INFO  baml_events] Function DynamicListInputOutput:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 1528ms. StopReason: stop
+

Teardown

PASSED test_dynamic_inputs_list2 0:00:01.259611

Setup

Call

Captured stderr call
[2024-10-21T21:11:44Z INFO  baml_events] Function DynamicListInputOutput:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 1251ms. StopReason: stop
     ---PROMPT---
     [chat] system: Here is some input data:
     ----
-    [{"new_key": "hi1", "testKey": "myTest", "blah": {"nestedKey1": "nestedVal"}}, {"new_key": "hi", "blah": {"nestedKey1": "nestedVal"}, "testKey": "myTest"}]
+    [{
+        "new_key": "hi1",
+        "blah": {
+            "nestedKey1": "nestedVal",
+        },
+        "testKey": "myTest",
+    }, {
+        "new_key": "hi",
+        "blah": {
+            "nestedKey1": "nestedVal",
+        },
+        "testKey": "myTest",
+    }]
     ----
     
     Extract the information.
@@ -1182,6 +1233,23 @@
     ]
     
     ---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",
@@ -1198,29 +1266,86 @@
         }
       }
     ]
-    ---Parsed Response (list<class DynInputOutput>)---
+

Teardown

PASSED test_dynamic_types_enum 0:00:00.837452

Setup

Call

Captured stderr call
[2024-10-21T21:11:45Z INFO  baml_events] Function ExtractPeople:
+    Client: GPT4 (gpt-4o-2024-08-06) - 828ms. 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:
     [
       {
-        "testKey": "myTest",
-        "new_key": "hi1",
-        "blah": {
-          "nestedKey1": "nestedVal"
-        }
-      },
+        name: string or null,
+        hair_color: 'RED' or 'BLUE' or 'GREEN' or 'YELLOW' or 'BLACK' or 'WHITE' or null,
+        animalLiked: 'GIRAFFE' or 'ELEPHANT' or 'LION',
+      }
+    ]
+    user: My name is Harrison. My hair is black and I'm 6 feet tall. I'm pretty good around the hoop. I like giraffes.
+    
+    ---LLM REPLY---
+    [
       {
-        "testKey": "myTest",
-        "new_key": "hi",
-        "blah": {
-          "nestedKey1": "nestedVal"
-        }
+        "name": "Harrison",
+        "hair_color": "BLACK",
+        "animalLiked": "GIRAFFE"
+      }
+    ]
+    ---Parsed Response (list<class Person>)---
+    [
+      {
+        "name": "Harrison",
+        "hair_color": "BLACK",
+        "animalLiked": "GIRAFFE"
+      }
+    ]
+

Teardown

PASSED test_dynamic_literals 0:00:01.298448

Setup

Call

Captured stderr call
[2024-10-21T21:11:46Z INFO  baml_events] Function ExtractPeople:
+    Client: GPT4 (gpt-4o-2024-08-06) - 1290ms. 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,
+        animalLiked: "GIRAFFE" or "ELEPHANT" or "LION",
+      }
+    ]
+    user: My name is Harrison. My hair is black and I'm 6 feet tall. I'm pretty good around the hoop. I like giraffes.
+    
+    ---LLM REPLY---
+    [
+      {
+        "name": "Harrison",
+        "hair_color": "BLACK",
+        "animalLiked": "GIRAFFE"
       }
     ]
-

Teardown

PASSED test_dynamic_inputs_list 0:00:01.447178

Setup

Call

Captured stderr call
[2024-10-02T13:31:54Z INFO  baml_events] Function DynamicListInputOutput:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 1436ms. StopReason: stop
+    ---Parsed Response (list<class Person>)---
+    [
+      {
+        "name": "Harrison",
+        "hair_color": "BLACK",
+        "animalLiked": "GIRAFFE"
+      }
+    ]
+

Teardown

PASSED test_dynamic_inputs_list 0:00:01.175730

Setup

Call

Captured stderr call
[2024-10-21T21:11:48Z INFO  baml_events] Function DynamicListInputOutput:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 1166ms. StopReason: stop
     ---PROMPT---
     [chat] system: Here is some input data:
     ----
-    [{"testKey": "myTest", "new_key": "hi", "blah": {"nestedKey1": "nestedVal"}}, {"testKey": "myTest", "new_key": "hi", "blah": {"nestedKey1": "nestedVal"}}]
+    [{
+        "blah": {
+            "nestedKey1": "nestedVal",
+        },
+        "testKey": "myTest",
+        "new_key": "hi",
+    }, {
+        "testKey": "myTest",
+        "new_key": "hi",
+        "blah": {
+            "nestedKey1": "nestedVal",
+        },
+    }]
     ----
     
     Extract the information.
@@ -1269,12 +1394,12 @@
         }
       }
     ]
-

Teardown

PASSED test_dynamic_output_map 0:00:00.752548

Setup

Call

Captured stdout call
[]
-final  hair_color='black' attributes={'eye_color': 'blue', 'facial_hair': 'beard'}
-final  {'hair_color': 'black', 'attributes': {'eye_color': 'blue', 'facial_hair': 'beard'}}
-final  {"hair_color":"black","attributes":{"eye_color":"blue","facial_hair":"beard"}}
-
Captured stderr call
[2024-10-02T13:31:55Z INFO  baml_events] Function MyFunc:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 743ms. StopReason: stop
+

Teardown

PASSED test_dynamic_output_map 0:00:00.862678

Setup

Call

Captured stdout call
[]
+final  hair_color='black' attributes={'eye_color': 'blue', 'facial_hair': 'beard', 'height': '6 feet'}
+final  {'hair_color': 'black', 'attributes': {'eye_color': 'blue', 'facial_hair': 'beard', 'height': '6 feet'}}
+final  {"hair_color":"black","attributes":{"eye_color":"blue","facial_hair":"beard","height":"6 feet"}}
+
Captured stderr call
[2024-10-21T21:11:48Z INFO  baml_events] Function MyFunc:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 857ms. StopReason: stop
     ---PROMPT---
     [chat] system: Given a string, extract info using the schema:
     
@@ -1292,7 +1417,8 @@
       "hair_color": "black",
       "attributes": {
         "eye_color": "blue",
-        "facial_hair": "beard"
+        "facial_hair": "beard",
+        "height": "6 feet"
       }
     }
     ---Parsed Response (class DynamicOutput)---
@@ -1300,18 +1426,19 @@
       "hair_color": "black",
       "attributes": {
         "eye_color": "blue",
-        "facial_hair": "beard"
+        "facial_hair": "beard",
+        "height": "6 feet"
       }
     }
-

Teardown

PASSED test_dynamic_output_union 0:00:02.005882

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}}
+

Teardown

PASSED test_dynamic_output_union 0:00:02.198647

Setup

Call

Captured stdout call
[]
+final  hair_color='black' attributes={'eye_color': 'blue', 'facial_hair': 'beard', 'age': '30'} height={'feet': 6.0, 'inches': None}
+final  {'hair_color': 'black', 'attributes': {'eye_color': 'blue', 'facial_hair': 'beard', 'age': '30'}, 'height': {'feet': 6.0, 'inches': None}}
+final  {"hair_color":"black","attributes":{"eye_color":"blue","facial_hair":"beard","age":"30"},"height":{"feet":6.0,"inches":null}}
 final  hair_color='black' attributes={'eye_color': 'blue', 'facial_hair': 'beard'} height={'meters': 1.8}
 final  {'hair_color': 'black', 'attributes': {'eye_color': 'blue', 'facial_hair': 'beard'}, 'height': {'meters': 1.8}}
 final  {"hair_color":"black","attributes":{"eye_color":"blue","facial_hair":"beard"},"height":{"meters":1.8}}
-
Captured stderr call
[2024-10-02T13:31:56Z INFO  baml_events] Function MyFunc:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 1029ms. StopReason: stop
+
Captured stderr call
[2024-10-21T21:11:50Z INFO  baml_events] Function MyFunc:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 1170ms. StopReason: stop
     ---PROMPT---
     [chat] system: Given a string, extract info using the schema:
     
@@ -1335,7 +1462,8 @@
       "hair_color": "black",
       "attributes": {
         "eye_color": "blue",
-        "facial_hair": "beard"
+        "facial_hair": "beard",
+        "age": "30"
       },
       "height": {
         "feet": 6,
@@ -1347,15 +1475,16 @@
       "hair_color": "black",
       "attributes": {
         "eye_color": "blue",
-        "facial_hair": "beard"
+        "facial_hair": "beard",
+        "age": "30"
       },
       "height": {
         "feet": 6.0,
         "inches": null
       }
     }
-[2024-10-02T13:31:57Z INFO  baml_events] Function MyFunc:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 960ms. StopReason: stop
+[2024-10-21T21:11:51Z INFO  baml_events] Function MyFunc:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 1008ms. StopReason: stop
     ---PROMPT---
     [chat] system: Given a string, extract info using the schema:
     
@@ -1396,7 +1525,7 @@
         "meters": 1.8
       }
     }
-

Teardown

PASSED test_nested_class_streaming 0:00:04.400260

Setup

Call

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

Teardown

PASSED test_nested_class_streaming 0:00:04.822264

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}
@@ -1415,458 +1544,265 @@
 streamed  {'prop1': None, 'prop2': None}
 streamed  {'prop1': None, 'prop2': None}
 streamed  {'prop1': None, 'prop2': None}
-Found: 1
 streamed  {'prop1': None, 'prop2': None}
-Found: 1
 streamed  {'prop1': None, 'prop2': None}
-Found: 1
 streamed  {'prop1': None, 'prop2': None}
-Found: 1
 streamed  {'prop1': None, 'prop2': None}
-Found: 1
-streamed  {'prop1': None, 'prop2': None}
-Found: 1
-streamed  {'prop1': None, 'prop2': None}
-Found: 1
-streamed  {'prop1': None, 'prop2': None}
-Found: 1
 streamed  {'prop1': '', 'prop2': None}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': None}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': None}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': None}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': None}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': None}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': None}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': None}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': None}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': '', 'prop2': None, 'inner': None}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': None, 'inner': None}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': None, 'inner': None}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': None, 'inner': None}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': None, 'inner': None}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': None, 'inner': None}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': None, 'inner': None}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': None, 'inner': None}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': None, 'inner': None}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '', 'inner': None}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': None}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': None}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': None}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': None}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': None}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': None}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': None}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': None, 'prop3': None}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': None, 'prop3': None}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': None, 'prop3': None}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': None, 'prop3': None}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': None, 'prop3': None}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': None, 'prop3': None}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': None, 'prop3': None}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': None, 'prop3': None}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 4, 'prop3': None}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': None}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': None}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': None}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': None}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': None}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': None}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': None}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': None}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': None}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.0}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.0}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.1}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-Found: 1
-final  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
-
Captured stderr call
[2024-10-02T13:32:01Z INFO  baml_events] Function FnOutputClassNested:
-    Client: Ollama (llama2) - 4381ms. StopReason: stop
+streamed  {'prop1': 'value', 'prop2': None}
+streamed  {'prop1': 'value1', 'prop2': None}
+streamed  {'prop1': 'value1', 'prop2': None}
+streamed  {'prop1': 'value1', 'prop2': None}
+streamed  {'prop1': 'value1', 'prop2': None}
+streamed  {'prop1': 'value1', 'prop2': None}
+streamed  {'prop1': 'value1', 'prop2': None}
+streamed  {'prop1': 'value1', 'prop2': None}
+streamed  {'prop1': 'value1', 'prop2': None}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': '', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': '', 'inner': None}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value', 'inner': None}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': None}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': None}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': None}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': None}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': None}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': None}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': None}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': None}}}
+final  {'prop1': 'value1', 'prop2': {'prop1': 'value2', 'prop2': 'value3', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+
Captured stderr call
[2024-10-21T21:11:55Z INFO  baml_events] Function FnOutputClassNested:
+    Client: Ollama (llama2) - 4806ms. StopReason: stop
     ---PROMPT---
     [chat] system: Return a made up json blob that matches this schema:
     Answer in JSON using this schema:
@@ -1886,46 +1822,41 @@
     JSON:
     
     ---LLM REPLY---
-    Sure! Here is a JSON blob that matches the schema you provided:
+    Here is a sample JSON blob that matches the provided schema:
     ```json
     {
-      "prop1": "Hello",
+      "prop1": "value1",
       "prop2": {
-        "prop1": "World",
-        "prop2": "JSON",
+        "prop1": "value2",
+        "prop2": "value3",
         "inner": {
           "prop2": 42,
           "prop3": 3.14,
-        },
-      },
+        }
+      }
     }
     ```
     Explanation:
     
-    * `prop1`: A string property with value "Hello"
-    * `prop2`: An object property with the following properties:
-    	+ `prop1`: A string property with value "World"
-    	+ `prop2`: A string property with value "JSON"
-    	+ `inner`: An object property with the following properties:
-    		- `prop2`: An integer property with value 42
-    		- `prop3`: A float property with value 3.14
-    * The outer `prop2` property is nested inside the inner `inner` property
+    * `prop1` has a value of "value1".
+    * `prop2` is an object with three properties: `prop1`, `prop2`, and `inner`. The `prop1` property of `prop2` has a value of "value2", and the `prop2` property has a value of "value3".
+    * `inner` is an object with two properties: `prop2` and `prop3`. The `prop2` property has a value of 42, and the `prop3` property has a value of 3.14.
     
-    I hope this helps! Let me know if you have any questions or need further clarification.
+    Note that the schema you provided defines a nested object with three levels of nesting (top-level `prop1`, inner `prop2`, and inner `inner`). The JSON blob I provided nested objects to match these levels of nesting.
     ---Parsed Response (class TestClassNested)---
     {
-      "prop1": "Hello",
+      "prop1": "value1",
       "prop2": {
-        "prop1": "World",
-        "prop2": "JSON",
+        "prop1": "value2",
+        "prop2": "value3",
         "inner": {
           "prop2": 42,
           "prop3": 3.14
         }
       }
     }
-

Teardown

PASSED test_dynamic_clients 0:00:00.452369

Setup

Call

Captured stderr call
[2024-10-02T13:32:02Z INFO  baml_events] Function ExpectFailure:
-    Client: MyClient (gpt-3.5-turbo-0125) - 445ms. StopReason: stop
+

Teardown

PASSED test_dynamic_client_with_openai 0:00:00.446947

Setup

Call

Captured stderr call
[2024-10-21T21:11:56Z INFO  baml_events] Function ExpectFailure:
+    Client: MyClient (gpt-3.5-turbo-0125) - 441ms. StopReason: stop
     ---PROMPT---
     [chat] system: What is the capital of England?
     
@@ -1933,12 +1864,32 @@
     London
     ---Parsed Response (string)---
     "London"
-

Teardown

PASSED test_event_log_hook 0:00:01.016189

Setup

Call

Captured stdout call
Event log hook1: 
+

Teardown

PASSED test_dynamic_client_with_vertex_json_str_creds 0:00:01.309533

Setup

Call

Captured stderr call
[2024-10-21T21:11:57Z INFO  baml_events] Function ExpectFailure:
+    Client: MyClient () - 1305ms. StopReason: "STOP"
+    ---PROMPT---
+    [chat] user: What is the capital of England?
+    
+    ---LLM REPLY---
+    The capital of England is **London**. 
+    
+    ---Parsed Response (string)---
+    "The capital of England is **London**. \n"
+

Teardown

PASSED test_dynamic_client_with_vertex_json_object_creds 0:00:01.250145

Setup

Call

Captured stderr call
[2024-10-21T21:11:58Z INFO  baml_events] Function ExpectFailure:
+    Client: MyClient () - 1245ms. StopReason: "STOP"
+    ---PROMPT---
+    [chat] user: What is the capital of England?
+    
+    ---LLM REPLY---
+    The capital of England is **London**. 
+    
+    ---Parsed Response (string)---
+    "The capital of England is **London**. \n"
+

Teardown

PASSED test_event_log_hook 0:00:01.406538

Setup

Call

Captured stdout call
Event log hook1: 
 Event log event  BamlLogEvent {
     metadata: {
-        event_id: "d8e84d92-8e74-4ee7-adcc-f72ba7c0a872",
+        event_id: "fe0f41fd-d790-42ca-8d2e-12100ea30b23",
         parent_id: None,
-        root_event_id: "d8e84d92-8e74-4ee7-adcc-f72ba7c0a872"
+        root_event_id: "fe0f41fd-d790-42ca-8d2e-12100ea30b23"
     },
     prompt: "[
   {
@@ -1952,10 +1903,10 @@
 ]",
     raw_output: "["a", "b", "c"]",
     parsed_output: "["a", "b", "c"]",
-    start_time: "2024-10-02T13:32:02.686Z"
+    start_time: "2024-10-21T21:11:59.240Z"
 }
-
Captured stderr call
[2024-10-02T13:32:03Z INFO  baml_events] Function TestFnNamedArgsSingleStringList:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 388ms. StopReason: stop
+
Captured stderr call
[2024-10-21T21:11:59Z INFO  baml_events] Function TestFnNamedArgsSingleStringList:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 669ms. StopReason: stop
     ---PROMPT---
     [chat] system: Return this value back to me: ["a", "b", "c"]
     
@@ -1963,7 +1914,7 @@
     ["a", "b", "c"]
     ---Parsed Response (string)---
     "[\"a\", \"b\", \"c\"]"
-

Teardown

PASSED test_aws_bedrock 0:00:02.477850

Setup

Call

Captured stdout call
streamed  'Here'
+

Teardown

PASSED test_aws_bedrock 0:00:02.002140

Setup

Call

Captured stdout call
streamed  'Here'
 streamed  'Here is'
 streamed  'Here is a'
 streamed  'Here is a short'
@@ -1975,131 +1926,119 @@
 streamed  'Here is a short story about lightning in a rock'
 streamed  'Here is a short story about lightning in a rock:'
 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\nThe'
-streamed  'Here is a short story about lightning in a rock:\n\nThe Spark Within\n\nThe storm'
-streamed  'Here is a short story about lightning in a rock:\n\nThe Spark Within\n\nThe storm clouds'
-streamed  'Here is a short story about lightning in a rock:\n\nThe Spark Within\n\nThe storm clouds ha'
-streamed  'Here is a short story about lightning in a rock:\n\nThe Spark Within\n\nThe storm clouds had been'
-streamed  'e is a short story about lightning in a rock:\n\nThe Spark Within\n\nThe storm clouds had been gathering'
-streamed  ' a short story about lightning in a rock:\n\nThe Spark Within\n\nThe storm clouds had been gathering all'
-streamed  'hort story about lightning in a rock:\n\nThe Spark Within\n\nThe storm clouds had been gathering all day'
-streamed  'ort story about lightning in a rock:\n\nThe Spark Within\n\nThe storm clouds had been gathering all day,'
-streamed  ' about lightning in a rock:\n\nThe Spark Within\n\nThe storm clouds had been gathering all day, building'
-streamed  'out lightning in a rock:\n\nThe Spark Within\n\nThe storm clouds had been gathering all day, building up'
-streamed  't lightning in a rock:\n\nThe Spark Within\n\nThe storm clouds had been gathering all day, building up a'
-streamed  'ing in a rock:\n\nThe Spark Within\n\nThe storm clouds had been gathering all day, building up a massive'
-streamed  'a rock:\n\nThe Spark Within\n\nThe storm clouds had been gathering all day, building up a massive charge'
-streamed  'ock:\n\nThe Spark Within\n\nThe storm clouds had been gathering all day, building up a massive charge in'
-streamed  '\n\nThe Spark Within\n\nThe storm clouds had been gathering all day, building up a massive charge in the'
-streamed  'e Spark Within\n\nThe storm clouds had been gathering all day, building up a massive charge in the sky'
-streamed  'k Within\n\nThe storm clouds had been gathering all day, building up a massive charge in the sky above'
-streamed  ' Within\n\nThe storm clouds had been gathering all day, building up a massive charge in the sky above.'
-streamed  'thin\n\nThe storm clouds had been gathering all day, building up a massive charge in the sky above. As'
-streamed  '\n\nThe storm clouds had been gathering all day, building up a massive charge in the sky above. As the'
-streamed  'e storm clouds had been gathering all day, building up a massive charge in the sky above. As the win'
-streamed  'rm clouds had been gathering all day, building up a massive charge in the sky above. As the wind how'
-streamed  ' clouds had been gathering all day, building up a massive charge in the sky above. As the wind howle'
-streamed  'uds had been gathering all day, building up a massive charge in the sky above. As the wind howled an'
-streamed  'ad been gathering all day, building up a massive charge in the sky above. As the wind howled and the'
-streamed  'en gathering all day, building up a massive charge in the sky above. As the wind howled and the rain'
-streamed  'hering all day, building up a massive charge in the sky above. As the wind howled and the rain began'
-streamed  'ing all day, building up a massive charge in the sky above. As the wind howled and the rain began to'
-streamed  'g all day, building up a massive charge in the sky above. As the wind howled and the rain began to p'
-streamed  'll day, building up a massive charge in the sky above. As the wind howled and the rain began to pelt'
-streamed  'y, building up a massive charge in the sky above. As the wind howled and the rain began to pelt down'
-streamed  ', building up a massive charge in the sky above. As the wind howled and the rain began to pelt down,'
-streamed  'building up a massive charge in the sky above. As the wind howled and the rain began to pelt down, a'
-streamed  'g up a massive charge in the sky above. As the wind howled and the rain began to pelt down, a sudden'
-streamed  'a massive charge in the sky above. As the wind howled and the rain began to pelt down, a sudden bolt'
-streamed  'assive charge in the sky above. As the wind howled and the rain began to pelt down, a sudden bolt of'
-streamed  'rge in the sky above. As the wind howled and the rain began to pelt down, a sudden bolt of lightning'
-streamed  'n the sky above. As the wind howled and the rain began to pelt down, a sudden bolt of lightning shot'
-streamed  ' sky above. As the wind howled and the rain began to pelt down, a sudden bolt of lightning shot down'
-streamed  'above. As the wind howled and the rain began to pelt down, a sudden bolt of lightning shot down from'
-streamed  'e. As the wind howled and the rain began to pelt down, a sudden bolt of lightning shot down from the'
-streamed  ' the wind howled and the rain began to pelt down, a sudden bolt of lightning shot down from the heav'
-streamed  'e wind howled and the rain began to pelt down, a sudden bolt of lightning shot down from the heavens'
-streamed  ' wind howled and the rain began to pelt down, a sudden bolt of lightning shot down from the heavens,'
-streamed  'led and the rain began to pelt down, a sudden bolt of lightning shot down from the heavens, striking'
-streamed  'd and the rain began to pelt down, a sudden bolt of lightning shot down from the heavens, striking a'
-streamed  'the rain began to pelt down, a sudden bolt of lightning shot down from the heavens, striking a large'
-streamed  ' began to pelt down, a sudden bolt of lightning shot down from the heavens, striking a large boulder'
-streamed  'gan to pelt down, a sudden bolt of lightning shot down from the heavens, striking a large boulder on'
-streamed  'to pelt down, a sudden bolt of lightning shot down from the heavens, striking a large boulder on the'
-streamed  'lt down, a sudden bolt of lightning shot down from the heavens, striking a large boulder on the hill'
-streamed  'own, a sudden bolt of lightning shot down from the heavens, striking a large boulder on the hillside'
-streamed  'wn, a sudden bolt of lightning shot down from the heavens, striking a large boulder on the hillside.'
-streamed  ' sudden bolt of lightning shot down from the heavens, striking a large boulder on the hillside.\n\nThe'
-streamed  'en bolt of lightning shot down from the heavens, striking a large boulder on the hillside.\n\nThe rock'
-streamed  'lt of lightning shot down from the heavens, striking a large boulder on the hillside.\n\nThe rock trem'
-streamed  'of lightning shot down from the heavens, striking a large boulder on the hillside.\n\nThe rock tremble'
-streamed  'ightning shot down from the heavens, striking a large boulder on the hillside.\n\nThe rock trembled as'
-streamed  'ning shot down from the heavens, striking a large boulder on the hillside.\n\nThe rock trembled as the'
-streamed  'own from the heavens, striking a large boulder on the hillside.\n\nThe rock trembled as the incredible'
-streamed  'e heavens, striking a large boulder on the hillside.\n\nThe rock trembled as the incredible electrical'
-streamed  's, striking a large boulder on the hillside.\n\nThe rock trembled as the incredible electrical current'
-streamed  'triking a large boulder on the hillside.\n\nThe rock trembled as the incredible electrical current sur'
-streamed  'iking a large boulder on the hillside.\n\nThe rock trembled as the incredible electrical current surge'
-streamed  'arge boulder on the hillside.\n\nThe rock trembled as the incredible electrical current surged through'
-streamed  'e boulder on the hillside.\n\nThe rock trembled as the incredible electrical current surged through it'
-streamed  ' boulder on the hillside.\n\nThe rock trembled as the incredible electrical current surged through it,'
-streamed  'lder on the hillside.\n\nThe rock trembled as the incredible electrical current surged through it, the'
-streamed  ' the hillside.\n\nThe rock trembled as the incredible electrical current surged through it, the energy'
-streamed  'lside.\n\nThe rock trembled as the incredible electrical current surged through it, the energy illumin'
-streamed  '.\n\nThe rock trembled as the incredible electrical current surged through it, the energy illuminating'
-streamed  'he rock trembled as the incredible electrical current surged through it, the energy illuminating its'
-streamed  'k trembled as the incredible electrical current surged through it, the energy illuminating its rough'
-streamed  'ed as the incredible electrical current surged through it, the energy illuminating its rough surface'
-streamed  'd as the incredible electrical current surged through it, the energy illuminating its rough surface.'
-streamed  'e incredible electrical current surged through it, the energy illuminating its rough surface. Within'
-streamed  'credible electrical current surged through it, the energy illuminating its rough surface. Within the'
-streamed  'le electrical current surged through it, the energy illuminating its rough surface. Within the stone'
-streamed  'e electrical current surged through it, the energy illuminating its rough surface. Within the stone,'
-streamed  'electrical current surged through it, the energy illuminating its rough surface. Within the stone, a'
-streamed  'ectrical current surged through it, the energy illuminating its rough surface. Within the stone, a f'
-streamed  'ectrical current surged through it, the energy illuminating its rough surface. Within the stone, a f'
-streamed  'ectrical current surged through it, the energy illuminating its rough surface. Within the stone, a f'
-streamed  'ectrical current surged through it, the energy illuminating its rough surface. Within the stone, a f'
+streamed  'Here is a short story about lightning in a rock:\n\nThe Fallen'
+streamed  'Here is a short story about lightning in a rock:\n\nThe Fallen Star'
+streamed  'Here is a short story about lightning in a rock:\n\nThe Fallen Star\n\nAs the'
+streamed  'Here is a short story about lightning in a rock:\n\nThe Fallen Star\n\nAs the sun'
+streamed  'Here is a short story about lightning in a rock:\n\nThe Fallen Star\n\nAs the sun '
+streamed  'Here is a short story about lightning in a rock:\n\nThe Fallen Star\n\nAs the sun dippe'
+streamed  'Here is a short story about lightning in a rock:\n\nThe Fallen Star\n\nAs the sun dipped below'
+streamed  'Here is a short story about lightning in a rock:\n\nThe Fallen Star\n\nAs the sun dipped below the'
+streamed  're is a short story about lightning in a rock:\n\nThe Fallen Star\n\nAs the sun dipped below the horizon'
+streamed  'e is a short story about lightning in a rock:\n\nThe Fallen Star\n\nAs the sun dipped below the horizon,'
+streamed  'hort story about lightning in a rock:\n\nThe Fallen Star\n\nAs the sun dipped below the horizon, casting'
+streamed  'story about lightning in a rock:\n\nThe Fallen Star\n\nAs the sun dipped below the horizon, casting long'
+streamed  'out lightning in a rock:\n\nThe Fallen Star\n\nAs the sun dipped below the horizon, casting long shadows'
+streamed  'htning in a rock:\n\nThe Fallen Star\n\nAs the sun dipped below the horizon, casting long shadows across'
+streamed  'ng in a rock:\n\nThe Fallen Star\n\nAs the sun dipped below the horizon, casting long shadows across the'
+streamed  'in a rock:\n\nThe Fallen Star\n\nAs the sun dipped below the horizon, casting long shadows across the ru'
+streamed  'a rock:\n\nThe Fallen Star\n\nAs the sun dipped below the horizon, casting long shadows across the rugge'
+streamed  'The Fallen Star\n\nAs the sun dipped below the horizon, casting long shadows across the rugged terrain'
+streamed  'he Fallen Star\n\nAs the sun dipped below the horizon, casting long shadows across the rugged terrain,'
+streamed  ' Fallen Star\n\nAs the sun dipped below the horizon, casting long shadows across the rugged terrain, a'
+streamed  'n Star\n\nAs the sun dipped below the horizon, casting long shadows across the rugged terrain, a flash'
+streamed  'tar\n\nAs the sun dipped below the horizon, casting long shadows across the rugged terrain, a flash of'
+streamed  's the sun dipped below the horizon, casting long shadows across the rugged terrain, a flash of light'
+streamed  ' sun dipped below the horizon, casting long shadows across the rugged terrain, a flash of light pier'
+streamed  'un dipped below the horizon, casting long shadows across the rugged terrain, a flash of light pierce'
+streamed  'pped below the horizon, casting long shadows across the rugged terrain, a flash of light pierced the'
+streamed  ' the horizon, casting long shadows across the rugged terrain, a flash of light pierced the gathering'
+streamed  'zon, casting long shadows across the rugged terrain, a flash of light pierced the gathering darkness'
+streamed  'on, casting long shadows across the rugged terrain, a flash of light pierced the gathering darkness.'
+streamed  ', casting long shadows across the rugged terrain, a flash of light pierced the gathering darkness. A'
+streamed  'ting long shadows across the rugged terrain, a flash of light pierced the gathering darkness. A bolt'
+streamed  'g long shadows across the rugged terrain, a flash of light pierced the gathering darkness. A bolt of'
+streamed  'dows across the rugged terrain, a flash of light pierced the gathering darkness. A bolt of lightning'
+streamed  's the rugged terrain, a flash of light pierced the gathering darkness. A bolt of lightning seemingly'
+streamed  'e rugged terrain, a flash of light pierced the gathering darkness. A bolt of lightning seemingly eru'
+streamed  'ugged terrain, a flash of light pierced the gathering darkness. A bolt of lightning seemingly erupte'
+streamed  'terrain, a flash of light pierced the gathering darkness. A bolt of lightning seemingly erupted from'
+streamed  'ain, a flash of light pierced the gathering darkness. A bolt of lightning seemingly erupted from the'
+streamed  ' flash of light pierced the gathering darkness. A bolt of lightning seemingly erupted from the groun'
+streamed  'lash of light pierced the gathering darkness. A bolt of lightning seemingly erupted from the ground,'
+streamed  'of light pierced the gathering darkness. A bolt of lightning seemingly erupted from the ground, bran'
+streamed  'ght pierced the gathering darkness. A bolt of lightning seemingly erupted from the ground, branching'
+streamed  'pierced the gathering darkness. A bolt of lightning seemingly erupted from the ground, branching out'
+streamed  'rced the gathering darkness. A bolt of lightning seemingly erupted from the ground, branching out in'
+streamed  'ed the gathering darkness. A bolt of lightning seemingly erupted from the ground, branching out in a'
+streamed  'd the gathering darkness. A bolt of lightning seemingly erupted from the ground, branching out in a '
+streamed  'e gathering darkness. A bolt of lightning seemingly erupted from the ground, branching out in a dazz'
+streamed  'thering darkness. A bolt of lightning seemingly erupted from the ground, branching out in a dazzling'
+streamed  'darkness. A bolt of lightning seemingly erupted from the ground, branching out in a dazzling display'
+streamed  's. A bolt of lightning seemingly erupted from the ground, branching out in a dazzling display before'
+streamed  ' A bolt of lightning seemingly erupted from the ground, branching out in a dazzling display before f'
+streamed  'lt of lightning seemingly erupted from the ground, branching out in a dazzling display before fading'
+streamed  ' lightning seemingly erupted from the ground, branching out in a dazzling display before fading into'
+streamed  'htning seemingly erupted from the ground, branching out in a dazzling display before fading into the'
+streamed  ' seemingly erupted from the ground, branching out in a dazzling display before fading into the night'
+streamed  'seemingly erupted from the ground, branching out in a dazzling display before fading into the night.'
+streamed  'eemingly erupted from the ground, branching out in a dazzling display before fading into the night. '
+streamed  'erupted from the ground, branching out in a dazzling display before fading into the night. \n\nCurious'
+streamed  'rupted from the ground, branching out in a dazzling display before fading into the night. \n\nCurious,'
+streamed  'pted from the ground, branching out in a dazzling display before fading into the night. \n\nCurious, a'
+streamed  'rom the ground, branching out in a dazzling display before fading into the night. \n\nCurious, a young'
+streamed  'm the ground, branching out in a dazzling display before fading into the night. \n\nCurious, a young h'
+streamed  'e ground, branching out in a dazzling display before fading into the night. \n\nCurious, a young hiker'
+streamed  'und, branching out in a dazzling display before fading into the night. \n\nCurious, a young hiker made'
+streamed  ' branching out in a dazzling display before fading into the night. \n\nCurious, a young hiker made her'
+streamed  'nching out in a dazzling display before fading into the night. \n\nCurious, a young hiker made her way'
+streamed  'out in a dazzling display before fading into the night. \n\nCurious, a young hiker made her way across'
+streamed  'in a dazzling display before fading into the night. \n\nCurious, a young hiker made her way across the'
+streamed  'azzling display before fading into the night. \n\nCurious, a young hiker made her way across the rocky'
+streamed  'splay before fading into the night. \n\nCurious, a young hiker made her way across the rocky landscape'
+streamed  'play before fading into the night. \n\nCurious, a young hiker made her way across the rocky landscape,'
+streamed  ' before fading into the night. \n\nCurious, a young hiker made her way across the rocky landscape, her'
+streamed  're fading into the night. \n\nCurious, a young hiker made her way across the rocky landscape, her foot'
+streamed  ' fading into the night. \n\nCurious, a young hiker made her way across the rocky landscape, her footst'
+streamed  'ding into the night. \n\nCurious, a young hiker made her way across the rocky landscape, her footsteps'
+streamed  'ng into the night. \n\nCurious, a young hiker made her way across the rocky landscape, her footsteps c'
+streamed  'into the night. \n\nCurious, a young hiker made her way across the rocky landscape, her footsteps crun'
+streamed  'the night. \n\nCurious, a young hiker made her way across the rocky landscape, her footsteps crunching'
+streamed  ' night. \n\nCurious, a young hiker made her way across the rocky landscape, her footsteps crunching on'
+streamed  'ht. \n\nCurious, a young hiker made her way across the rocky landscape, her footsteps crunching on the'
+streamed  ' \n\nCurious, a young hiker made her way across the rocky landscape, her footsteps crunching on the gr'
+streamed  'urious, a young hiker made her way across the rocky landscape, her footsteps crunching on the gravel'
+streamed  'urious, a young hiker made her way across the rocky landscape, her footsteps crunching on the gravel'
+streamed  'urious, a young hiker made her way across the rocky landscape, her footsteps crunching on the gravel'
+streamed  'urious, a young hiker made her way across the rocky landscape, her footsteps crunching on the gravel'
 streamed final Here is a short story about lightning in a rock:
 
-The Spark Within
+The Fallen Star
 
-The storm clouds had been gathering all day, building up a massive charge in the sky above. As the wind howled and the rain began to pelt down, a sudden bolt of lightning shot down from the heavens, striking a large boulder on the hillside.
+As the sun dipped below the horizon, casting long shadows across the rugged terrain, a flash of light pierced the gathering darkness. A bolt of lightning seemingly erupted from the ground, branching out in a dazzling display before fading into the night. 
 
-The rock trembled as the incredible electrical current surged through it, the energy illuminating its rough surface. Within the stone, a f
-
Captured stderr call
[2024-10-02T13:32:03Z WARN  aws_runtime::env_config::normalize] section [Connection 1] ignored; config must be in the AWS config file rather than the credentials file
-[2024-10-02T13:32:03Z INFO  aws_config::meta::region] load_region; provider=EnvironmentVariableRegionProvider { env: Env(Real) }
-[2024-10-02T13:32:05Z INFO  baml_events] Function TestAws:
-    Client: AwsBedrock (anthropic.claude-3-haiku-20240307-v1:0) - 2468ms. StopReason: unknown
+Curious, a young hiker made her way across the rocky landscape, her footsteps crunching on the gravel
+
Captured stderr call
[2024-10-21T21:12:00Z WARN  aws_runtime::env_config::normalize] section [Connection 1] ignored; config must be in the AWS config file rather than the credentials file
+[2024-10-21T21:12:00Z INFO  aws_config::meta::region] load_region; provider=EnvironmentVariableRegionProvider { env: Env(Real) }
+[2024-10-21T21:12:02Z INFO  baml_events] Function TestAws:
+    Client: AwsBedrock (anthropic.claude-3-haiku-20240307-v1:0) - 1992ms. 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
+    The Fallen Star
     
-    The storm clouds had been gathering all day, building up a massive charge in the sky above. As the wind howled and the rain began to pelt down, a sudden bolt of lightning shot down from the heavens, striking a large boulder on the hillside.
+    As the sun dipped below the horizon, casting long shadows across the rugged terrain, a flash of light pierced the gathering darkness. A bolt of lightning seemingly erupted from the ground, branching out in a dazzling display before fading into the night. 
     
-    The rock trembled as the incredible electrical current surged through it, the energy illuminating its rough surface. Within the stone, a f
+    Curious, a young hiker made her way across the rocky landscape, her footsteps crunching on the gravel
     ---Parsed Response (string)---
-    "Here is a short story about lightning in a rock:\n\nThe Spark Within\n\nThe storm clouds had been gathering all day, building up a massive charge in the sky above. As the wind howled and the rain began to pelt down, a sudden bolt of lightning shot down from the heavens, striking a large boulder on the hillside.\n\nThe rock trembled as the incredible electrical current surged through it, the energy illuminating its rough surface. Within the stone, a f"
-

Teardown

FAILED test_serialization_exception 0:00:00.500698

assert 'Failed to coerce' in ": Missing required field: nonce\\n  - : Missing required field: nonce2') tblen=2>"
- +  where ": Missing required field: nonce\\n  - : Missing required field: nonce2') tblen=2>" = str(: Missing required field: nonce\n  - : Missing required field: nonce2') tblen=2>)

Setup

Call

@pytest.mark.asyncio
-    async def test_serialization_exception():
-        with pytest.raises(Exception) as excinfo:
-            await b.DummyOutputFunction("dummy input")
-    
-        print("Exception message: ", excinfo)
->       assert "Failed to coerce" in str(excinfo)
-E       assert 'Failed to coerce' in ": Missing required field: nonce\\n  - : Missing required field: nonce2') tblen=2>"
-E        +  where ": Missing required field: nonce\\n  - : Missing required field: nonce2') tblen=2>" = str(: Missing required field: nonce\n  - : Missing required field: nonce2') tblen=2>)
-
-tests/test_functions.py:919: AssertionError
Captured stdout call
Exception message:  <ExceptionInfo BamlValidationError('Parsing error: Client: GPT35 (gpt-3.5-turbo-0125) - 491ms. StopReason: stop\n---PROMPT---\n[chat]... fields: missing=2, unparsed=0\n  - <root>: Missing required field: nonce\n  - <root>: Missing required field: nonce2') tblen=2>
-
Captured stderr call
[2024-10-02T13:32:06Z WARN  baml_events] Function DummyOutputFunction:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 491ms. StopReason: stop
+    "Here is a short story about lightning in a rock:\n\nThe Fallen Star\n\nAs the sun dipped below the horizon, casting long shadows across the rugged terrain, a flash of light pierced the gathering darkness. A bolt of lightning seemingly erupted from the ground, branching out in a dazzling display before fading into the night. \n\nCurious, a young hiker made her way across the rocky landscape, her footsteps crunching on the gravel"
+

Teardown

PASSED test_serialization_exception 0:00:00.560102

Setup

Call

Captured stdout call
Exception message from test:  <ExceptionInfo BamlValidationError(message=Failed to parse LLM response: Failed to coerce value: <root>: Failed while parsing require...required field: nonce2, raw_output=Hello there! How can I assist you today?, prompt=[chat] system: Say "hello there".
+) tblen=2>
+
Captured stderr call
[2024-10-21T21:12:02Z WARN  baml_events] Function DummyOutputFunction:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 556ms. StopReason: stop
     ---PROMPT---
     [chat] system: Say "hello there".
     
@@ -2109,22 +2048,7 @@
     Failed to coerce value: <root>: Failed while parsing required fields: missing=2, unparsed=0
       - <root>: Missing required field: nonce
       - <root>: Missing required field: nonce2
-

Teardown

FAILED test_stream_serialization_exception 0:00:00.458951

assert 'Failed to coerce' in ": Missing required field: nonce\\n  - : Missing required field: nonce2') tblen=2>"
- +  where ": Missing required field: nonce\\n  - : Missing required field: nonce2') tblen=2>" = str(: Missing required field: nonce\n  - : Missing required field: nonce2') tblen=2>)

Setup

Call

@pytest.mark.asyncio
-    async def test_stream_serialization_exception():
-        with pytest.raises(Exception) as excinfo:
-            stream = b.stream.DummyOutputFunction("dummy input")
-            async for msg in stream:
-                print("streamed ", msg)
-    
-            _ = await stream.get_final_response()
-    
-        print("Exception message: ", excinfo)
->       assert "Failed to coerce" in str(excinfo)
-E       assert 'Failed to coerce' in ": Missing required field: nonce\\n  - : Missing required field: nonce2') tblen=2>"
-E        +  where ": Missing required field: nonce\\n  - : Missing required field: nonce2') tblen=2>" = str(: Missing required field: nonce\n  - : Missing required field: nonce2') tblen=2>)
-
-tests/test_functions.py:932: AssertionError
Captured stdout call
streamed  nonce=None nonce2=None
+

Teardown

PASSED test_stream_serialization_exception 0:00:00.706884

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
@@ -2137,9 +2061,10 @@
 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) - 450ms. StopReason: stop\n---PROMPT---\n[chat]... fields: missing=2, unparsed=0\n  - <root>: Missing required field: nonce\n  - <root>: Missing required field: nonce2') tblen=2>
-
Captured stderr call
[2024-10-02T13:32:06Z WARN  baml_events] Function DummyOutputFunction:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 450ms. StopReason: stop
+Exception message:  <ExceptionInfo BamlValidationError(message=Failed to parse LLM response: Failed to coerce value: <root>: Failed while parsing require...required field: nonce2, raw_output=Hello there! How can I assist you today?, prompt=[chat] system: Say "hello there".
+) tblen=3>
+
Captured stderr call
[2024-10-21T21:12:03Z WARN  baml_events] Function DummyOutputFunction:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 699ms. StopReason: stop
     ---PROMPT---
     [chat] system: Say "hello there".
     
@@ -2149,48 +2074,7 @@
     Failed to coerce value: <root>: Failed while parsing required fields: missing=2, unparsed=0
       - <root>: Missing required field: nonce
       - <root>: Missing required field: nonce2
-

Teardown

FAILED test_stream2_serialization_exception 0:00:00.469247

assert 'Failed to coerce' in ": Missing required field: nonce2\\n  - : Missing required field: nonce3') tblen=2>"
- +  where ": Missing required field: nonce2\\n  - : Missing required field: nonce3') tblen=2>" = str(: Missing required field: nonce2\n  - : Missing required field: nonce3') tblen=2>)

Setup

Call

def test_stream2_serialization_exception():
-        tb = TypeBuilder()
-        tb.DummyOutput.add_property("nonce3", tb.string())
-    
-        async def stream_func():
-            with pytest.raises(Exception) as excinfo:
-                stream = b.stream.DummyOutputFunction("dummy input", {"tb": tb})
-                async for msg in stream:
-                    print("streamed ", msg)
-    
-                _ = await stream.get_final_response()
-    
-            print("Exception message: ", excinfo)
-            assert "Failed to coerce" in str(excinfo)
-    
->       asyncio.run(stream_func())
-
-tests/test_functions.py:950: 
-_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
-/opt/homebrew/Cellar/python@3.12/3.12.4/Frameworks/Python.framework/Versions/3.12/lib/python3.12/asyncio/runners.py:194: in run
-    return runner.run(main)
-/opt/homebrew/Cellar/python@3.12/3.12.4/Frameworks/Python.framework/Versions/3.12/lib/python3.12/asyncio/runners.py:118: in run
-    return self._loop.run_until_complete(task)
-/opt/homebrew/Cellar/python@3.12/3.12.4/Frameworks/Python.framework/Versions/3.12/lib/python3.12/asyncio/base_events.py:687: in run_until_complete
-    return future.result()
-_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
-
-    async def stream_func():
-        with pytest.raises(Exception) as excinfo:
-            stream = b.stream.DummyOutputFunction("dummy input", {"tb": tb})
-            async for msg in stream:
-                print("streamed ", msg)
-    
-            _ = await stream.get_final_response()
-    
-        print("Exception message: ", excinfo)
->       assert "Failed to coerce" in str(excinfo)
-E       assert 'Failed to coerce' in ": Missing required field: nonce2\\n  - : Missing required field: nonce3') tblen=2>"
-E        +  where ": Missing required field: nonce2\\n  - : Missing required field: nonce3') tblen=2>" = str(: Missing required field: nonce2\n  - : Missing required field: nonce3') tblen=2>)
-
-tests/test_functions.py:948: AssertionError
Captured stdout call
streamed  nonce=None nonce2=None nonce3=None
+

Teardown

PASSED test_stream2_serialization_exception 0:00:00.482907

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
@@ -2203,42 +2087,22 @@
 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) - 460ms. StopReason: stop\n---PROMPT---\n[chat]...Missing required field: nonce\n  - <root>: Missing required field: nonce2\n  - <root>: Missing required field: nonce3') tblen=2>
-
Captured stderr call
[2024-10-02T13:32:07Z WARN  baml_events] Function DummyOutputFunction:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 460ms. StopReason: stop
+Exception message:  <ExceptionInfo BamlValidationError(message=Failed to parse LLM response: Failed to coerce value: <root>: Failed while parsing require...g required field: nonce3, raw_output=Hello there! How can I help you today?, prompt=[chat] system: Say "hello there".
+) tblen=3>
+
Captured stderr call
[2024-10-21T21:12:04Z WARN  baml_events] Function DummyOutputFunction:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 475ms. StopReason: stop
     ---PROMPT---
     [chat] system: Say "hello there".
     
     ---LLM REPLY---
-    Hello there! How can I assist you today?
+    Hello there! How can I help you today?
     ---Parsed Response (Error)---
     Failed to coerce value: <root>: Failed while parsing required fields: missing=3, unparsed=0
       - <root>: Missing required field: nonce
       - <root>: Missing required field: nonce2
       - <root>: Missing required field: nonce3
-

Teardown

FAILED test_descriptions 0:00:01.479070

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(
-            "donkey kong"
-        )  # Assuming this returns a Pydantic model
-    
-        # Check Nested2 values
-        assert res.prop2.prop20.prop11 == "three"
-        assert res.prop2.prop20.prop12 == "four"
-    
-        # Check Nested values
-        assert res.prop2.prop3 == "three"
-        assert res.prop2.prop4 == "four"
-    
-        # Check Schema values
-        assert res.prop1 == "one"
->       assert res.prop2 == "two"
-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:969: AssertionError
Captured stderr call
[2024-10-02T13:32:08Z INFO  baml_events] Function SchemaDescriptions:
-    Client: GPT4o (gpt-4o-2024-05-13) - 1470ms. StopReason: stop
+

Teardown

PASSED test_descriptions 0:00:02.293221

Setup

Call

Captured stderr call
[2024-10-21T21:12:06Z INFO  baml_events] Function SchemaDescriptions:
+    Client: GPT4o (gpt-4o-2024-08-06) - 2276ms. StopReason: stop
     ---PROMPT---
     [chat] system: Return a schema with this format:
     
@@ -2315,9 +2179,7 @@
         "hi"
       ],
       "blah": "blah",
-      "nested_attrs": [
-        "nested"
-      ],
+      "nested_attrs": "nested",
       "parens": "parens1",
       "other": "other"
     }
@@ -2343,69 +2205,71 @@
       "parens": "parens1",
       "other_group": "other"
     }
-

Teardown

FAILED test_caching 0:00:01.284138

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

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)
-        duration = time.time() - start
-    
-        start = time.time()
-        res2 = await b.TestCaching(story_idea)
-        duration2 = time.time() - start
-    
-        print("Duration no caching: ", duration)
-        print("Duration with caching: ", duration2)
-    
->       assert (
-            duration2 < duration
-        ), "Expected second call to be faster than first by a large margin."
-E       AssertionError: Expected second call to be faster than first by a large margin.
-E       assert 0.6699540615081787 < 0.6125550270080566
+

Teardown

FAILED test_caching 0:00:03.383143

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

Setup

Call

>   ???
+E   AssertionError: Expected second call to be faster than first by a large margin.
+E   assert 2.4833388328552246 < 0.8984320163726807
 
-tests/test_functions.py:999: AssertionError
Captured stdout call
Duration no caching:  0.6125550270080566
-Duration with caching:  0.6699540615081787
-
Captured stderr call
[2024-10-02T13:32:09Z INFO  baml_events] Function TestCaching:
-    Client: ClaudeWithCaching (claude-3-haiku-20240307) - 607ms. StopReason: "end_turn"
+tests/test_functions.py:1133: AssertionError
Captured stdout call
Duration no caching:  0.8984320163726807
+Duration with caching:  2.4833388328552246
+
Captured stderr call
[2024-10-21T21:12:07Z INFO  baml_events] Function TestCaching:
+    Client: ClaudeWithCaching (claude-3-haiku-20240307) - 895ms. StopReason: "end_turn"
     ---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.
-     aaaaaaa
+    [chat] system: {"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, an 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. The narrative further expands on the societal implications of such abilities, questioning the moral boundaries of altering consciousness and the potential for abuse in a world where dreams can be commodified. It challenges the reader to consider the impact of technology on personal autonomy and the ethical responsibilities of those who wield such power.
+    
+        As Alex's journey unfolds, they encounter various individuals whose lives have been touched by their dream manipulations, each presenting a unique perspective on the ethical quandaries at hand. From a classmate who gains newfound confidence to a wealthy client who becomes addicted to the dreamscapes, the ripple effects of Alex's actions are profound and far-reaching. The government agency's interest in Alex's abilities raises questions about the potential for state control and surveillance, while the resistance movement highlights the dangers of unchecked power and the importance of safeguarding individual freedoms.
+    
+        Ultimately, Alex's story is one of self-discovery and moral reckoning, as they must decide whether to embrace their abilities for personal gain, align with the government's vision of a controlled utopia, or join the resistance in their fight for freedom and autonomy. The narrative invites readers to reflect on the nature of reality, the boundaries of human experience, and the ethical implications of a world where dreams are no longer private sanctuaries but shared and manipulated commodities. It also explores the psychological impact on Alex, who must deal with the burden of knowing the intimate fears and desires of others, and the isolation that comes from being unable to share their own dreams without altering them.
+    
+        The story further examines the technological advancements that have made dream manipulation possible, questioning the role of innovation in society and the potential for both progress and peril. It considers the societal divide between those who can afford to buy enhanced dream experiences and those who cannot, highlighting issues of inequality and access. As Alex becomes more entangled in the web of their own making, they must confront the possibility that their actions could lead to unintended consequences, not just for themselves but for the fabric of society as a whole.
+    
+        In the end, Alex's journey is a cautionary tale about the power of dreams and the responsibilities that come with wielding such influence. It serves as a reminder of the importance of ethical considerations in the face of technological advancement and the need to balance innovation with humanity. The story leaves readers pondering the true cost of a world where dreams are no longer sacred, and the potential for both wonder and danger in the uncharted territories of the mind.
+     aaaaaaaaaaaaaaaaaaaa
+    user: be funny
     
     ---LLM REPLY---
-    Lucid dreaming, mind control, ethical dilemma.
+    Here's a funny 5-word description of the story:
+    
+    Dream hacking gone wild, oops.
     ---Parsed Response (string)---
-    "Lucid dreaming, mind control, ethical dilemma."
-[2024-10-02T13:32:10Z INFO  baml_events] Function TestCaching:
-    Client: ClaudeWithCaching (claude-3-haiku-20240307) - 664ms. StopReason: "end_turn"
+    "Here's a funny 5-word description of the story:\n\nDream hacking gone wild, oops."
+[2024-10-21T21:12:09Z INFO  baml_events] Function TestCaching:
+    Client: ClaudeWithCaching (claude-3-haiku-20240307) - 2477ms. StopReason: "end_turn"
     ---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.
-     aaaaaaa
+    [chat] system: {"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, an 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. The narrative further expands on the societal implications of such abilities, questioning the moral boundaries of altering consciousness and the potential for abuse in a world where dreams can be commodified. It challenges the reader to consider the impact of technology on personal autonomy and the ethical responsibilities of those who wield such power.
+    
+        As Alex's journey unfolds, they encounter various individuals whose lives have been touched by their dream manipulations, each presenting a unique perspective on the ethical quandaries at hand. From a classmate who gains newfound confidence to a wealthy client who becomes addicted to the dreamscapes, the ripple effects of Alex's actions are profound and far-reaching. The government agency's interest in Alex's abilities raises questions about the potential for state control and surveillance, while the resistance movement highlights the dangers of unchecked power and the importance of safeguarding individual freedoms.
+    
+        Ultimately, Alex's story is one of self-discovery and moral reckoning, as they must decide whether to embrace their abilities for personal gain, align with the government's vision of a controlled utopia, or join the resistance in their fight for freedom and autonomy. The narrative invites readers to reflect on the nature of reality, the boundaries of human experience, and the ethical implications of a world where dreams are no longer private sanctuaries but shared and manipulated commodities. It also explores the psychological impact on Alex, who must deal with the burden of knowing the intimate fears and desires of others, and the isolation that comes from being unable to share their own dreams without altering them.
+    
+        The story further examines the technological advancements that have made dream manipulation possible, questioning the role of innovation in society and the potential for both progress and peril. It considers the societal divide between those who can afford to buy enhanced dream experiences and those who cannot, highlighting issues of inequality and access. As Alex becomes more entangled in the web of their own making, they must confront the possibility that their actions could lead to unintended consequences, not just for themselves but for the fabric of society as a whole.
+    
+        In the end, Alex's journey is a cautionary tale about the power of dreams and the responsibilities that come with wielding such influence. It serves as a reminder of the importance of ethical considerations in the face of technological advancement and the need to balance innovation with humanity. The story leaves readers pondering the true cost of a world where dreams are no longer sacred, and the potential for both wonder and danger in the uncharted territories of the mind.
+     aaaaaaaaaaaaaaaaaaaa
+    user: be real
     
     ---LLM REPLY---
-    Futuristic dream-altering teen's moral dilemma.
+    Okay, let me try to summarize the premise in a more concise and realistic way:
+    
+    In a near-future society, dreams have become a tradable commodity. A teenager named Alex discovers they have the rare ability to not just view, but manipulate the dreams of others. Initially, Alex uses this power to help people, but soon starts exploiting it for personal gain, crafting intricate dream experiences to sell on the black market. 
+    
+    As Alex's skill grows, the line between dream and reality begins to blur for their clients. A government agency takes notice of Alex's abilities and offers them a chance to use their powers for the "greater good." Meanwhile, an underground resistance warns Alex about the dangers of dream manipulation and mass control.
+    
+    Torn between these opposing forces, Alex must wrestle with ethical dilemmas surrounding free will, consciousness, and the responsibilities that come with wielding power over people's minds. The story explores the societal implications of a world where dreams can be commodified, and challenges readers to consider the fine line between help and exploitation.
     ---Parsed Response (string)---
-    "Futuristic dream-altering teen's moral dilemma."
-

Teardown

PASSED test_arg_exceptions 0:00:00.787566

Setup

Call

Captured stderr call
[2024-10-02T13:32:10Z WARN  baml_events] Function MyFunc:
-    Client: MyClient (<unknown>) - 171ms
+    "Okay, let me try to summarize the premise in a more concise and realistic way:\n\nIn a near-future society, dreams have become a tradable commodity. A teenager named Alex discovers they have the rare ability to not just view, but manipulate the dreams of others. Initially, Alex uses this power to help people, but soon starts exploiting it for personal gain, crafting intricate dream experiences to sell on the black market. \n\nAs Alex's skill grows, the line between dream and reality begins to blur for their clients. A government agency takes notice of Alex's abilities and offers them a chance to use their powers for the \"greater good.\" Meanwhile, an underground resistance warns Alex about the dangers of dream manipulation and mass control.\n\nTorn between these opposing forces, Alex must wrestle with ethical dilemmas surrounding free will, consciousness, and the responsibilities that come with wielding power over people's minds. The story explores the societal implications of a world where dreams can be commodified, and challenges readers to consider the fine line between help and exploitation."
+

Teardown

PASSED test_arg_exceptions 0:00:00.950553

Setup

Call

Captured stderr call
[2024-10-21T21:12:10Z WARN  baml_events] Function MyFunc:
+    Client: MyClient (<unknown>) - 211ms
     ---PROMPT---
     [chat] system: Given a string, extract info using the schema:
     
@@ -2427,8 +2291,8 @@
         }
     }
     
-[2024-10-02T13:32:10Z WARN  baml_events] Function MyFunc:
-    Client: MyClient (<unknown>) - 157ms
+[2024-10-21T21:12:10Z WARN  baml_events] Function MyFunc:
+    Client: MyClient (<unknown>) - 173ms
     ---PROMPT---
     [chat] system: Given a string, extract info using the schema:
     
@@ -2450,8 +2314,23 @@
         }
     }
     
-[2024-10-02T13:32:10Z WARN  baml_events] Function DummyOutputFunction:
-    Client: GPT35 (gpt-3.5-turbo-0125) - 441ms. StopReason: stop
+[2024-10-21T21:12:10Z WARN  baml_events] Function DummyOutputFunction:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 557ms. 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: <root>: Failed while parsing required fields: missing=2, unparsed=0
+      - <root>: Missing required field: nonce
+      - <root>: Missing required field: nonce2
+

Teardown

PASSED test_map_as_param 0:00:00.000888

Setup

Call

Teardown

PASSED test_baml_validation_error_format 0:00:00.578249

Setup

Call

Captured stdout call
Error:  BamlValidationError(message=Failed to parse LLM response: Failed to coerce value: <root>: Failed while parsing required fields: missing=2, unparsed=0
+  - <root>: Missing required field: nonce
+  - <root>: Missing required field: nonce2, raw_output=Hello there! How can I assist you today?, prompt=[chat] system: Say "hello there".
+)
+
Captured stderr call
[2024-10-21T21:12:11Z WARN  baml_events] Function DummyOutputFunction:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 574ms. StopReason: stop
     ---PROMPT---
     [chat] system: Say "hello there".
     
@@ -2461,29 +2340,234 @@
     Failed to coerce value: <root>: Failed while parsing required fields: missing=2, unparsed=0
       - <root>: Missing required field: nonce
       - <root>: Missing required field: nonce2
-

Teardown

PASSED test_map_as_param 0:00:00.001116

Setup

Call

Teardown

FAILED test_env_vars_reset 0:00:00.000573

baml_py.BamlError: Cannot reset BAML environment variables while there are active BAML contexts.

Setup

Call

@pytest.mark.asyncio
-    async def test_env_vars_reset():
-        env_vars = {
-            "OPENAI_API_KEY": "sk-1234567890",
+

Teardown

PASSED test_no_stream_big_integer 0:00:00.737626

Setup

Call

Captured stderr call
[2024-10-21T21:12:12Z INFO  baml_events] Function StreamOneBigNumber:
+    Client: GPT4 (gpt-4o-2024-08-06) - 732ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Respond with only an integer, no affirmations or prefixes or anything.
+    The response should be parsable as a JSON number.
+    
+    Please make sure the integer has 12 digits.
+    
+    Answer as a: int
+    
+    ---LLM REPLY---
+    982374102938
+    ---Parsed Response (int)---
+    982374102938
+

Teardown

PASSED test_no_stream_object_with_numbers 0:00:00.735308

Setup

Call

Captured stderr call
[2024-10-21T21:12:12Z INFO  baml_events] Function StreamBigNumbers:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 727ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Please make sure every integer in the output has 12 digits.
+    For floats, provide a mix - from 0-10 places before the decimal point,
+    and 1-10 places after the decimal point. Bet.
+    
+    Answer in JSON using this schema:
+    {
+      a: int,
+      b: float,
+    }
+    
+    ---LLM REPLY---
+    {
+      "a": 100000000000,
+      "b": 123456.789
+    }
+    ---Parsed Response (class BigNumbers)---
+    {
+      "a": 100000000000,
+      "b": 123456.789
+    }
+

Teardown

PASSED test_no_stream_compound_object 0:00:03.113028

Setup

Call

Captured stderr call
[2024-10-21T21:12:15Z INFO  baml_events] Function StreamingCompoundNumbers:
+    Client: GPT4 (gpt-4o-2024-08-06) - 3106ms. StopReason: stop
+    ---PROMPT---
+    [chat] system:     Respond in pure json. Don't use any English descriptions like "Sure, I'll do that",
+        nor put the result into a fenced code block.
+    
+        Just output a JSON value that could be parsed as JSON.
+    
+    Please make sure every integer has 12 digits.
+    For floats, provide a mix - from 0-10 places before the decimal point,
+    and 1-10 places after the decimal point. Bet.
+    
+    Answer in JSON using this schema:
+    {
+      big: {
+        a: int,
+        b: float,
+      },
+      big_nums: [
+        {
+          a: int,
+          b: float,
         }
->       reset_baml_env_vars(env_vars)
-
-tests/test_functions.py:1056: 
-_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
-
-env_vars = {'OPENAI_API_KEY': 'sk-1234567890'}
-
-    def reset_baml_env_vars(env_vars: Dict[str, str]):
-      if DO_NOT_USE_DIRECTLY_UNLESS_YOU_KNOW_WHAT_YOURE_DOING_CTX.allow_reset():
-        DO_NOT_USE_DIRECTLY_UNLESS_YOU_KNOW_WHAT_YOURE_DOING_RUNTIME.reset(
-          "baml_src",
-          get_baml_files(),
-          env_vars
-        )
-        DO_NOT_USE_DIRECTLY_UNLESS_YOU_KNOW_WHAT_YOURE_DOING_CTX.reset()
-      else:
->       raise BamlError("Cannot reset BAML environment variables while there are active BAML contexts.")
-E       baml_py.BamlError: Cannot reset BAML environment variables while there are active BAML contexts.
-
-baml_client/globals.py:39: BamlError
Captured stdout call
Too many ctxs!
-

Teardown

\ No newline at end of file + ], + another: { + a: int, + b: float, + }, + } + + ---LLM REPLY--- + { + "big": { + "a": 312345678901, + "b": 52234567.123456789 + }, + "big_nums": [ + { + "a": 112345678901, + "b": 3456789.9876543210 + }, + { + "a": 987654321098, + "b": 1456.78901234 + }, + { + "a": 192837465001, + "b": 9234567891.123456 + } + ], + "another": { + "a": 234567890123, + "b": 67894567.0987654321 + } + } + ---Parsed Response (class CompoundBigNumbers)--- + { + "big": { + "a": 312345678901, + "b": 52234567.12345679 + }, + "big_nums": [ + { + "a": 112345678901, + "b": 3456789.987654321 + }, + { + "a": 987654321098, + "b": 1456.78901234 + }, + { + "a": 192837465001, + "b": 9234567891.123455 + } + ], + "another": { + "a": 234567890123, + "b": 67894567.09876543 + } + } +

Teardown

PASSED test_no_stream_compound_object_with_yapping 0:00:12.722894

Setup

Call

Captured stderr call
[2024-10-21T21:12:28Z INFO  baml_events] Function StreamingCompoundNumbers:
+    Client: GPT4 (gpt-4o-2024-08-06) - 12715ms. StopReason: stop
+    ---PROMPT---
+    [chat] system:     Please give me a friendly response before outputting json. And put the JSON
+        into a fenced code block.
+    
+    Please make sure every integer has 12 digits.
+    For floats, provide a mix - from 0-10 places before the decimal point,
+    and 1-10 places after the decimal point. Bet.
+    
+    Answer in JSON using this schema:
+    {
+      big: {
+        a: int,
+        b: float,
+      },
+      big_nums: [
+        {
+          a: int,
+          b: float,
+        }
+      ],
+      another: {
+        a: int,
+        b: float,
+      },
+    }
+    
+    ---LLM REPLY---
+    Hello there! I hope you're having a great day. Here's the JSON data you requested:
+    
+    ```json
+    {
+      "big": {
+        "a": 123456789012,
+        "b": 9876543.123456789
+      },
+      "big_nums": [
+        {
+          "a": 234567890123,
+          "b": 8765432.1
+        },
+        {
+          "a": 345678901234,
+          "b": 0.123456789
+        },
+        {
+          "a": 456789012345,
+          "b": 98765.4321
+        }
+      ],
+      "another": {
+        "a": 567890123456,
+        "b": 1234567890.987654321
+      }
+    }
+    ``` 
+    
+    Let me know if there's anything else you need! 😊
+    ---Parsed Response (class CompoundBigNumbers)---
+    {
+      "big": {
+        "a": 123456789012,
+        "b": 9876543.12345679
+      },
+      "big_nums": [
+        {
+          "a": 234567890123,
+          "b": 8765432.1
+        },
+        {
+          "a": 345678901234,
+          "b": 0.123456789
+        },
+        {
+          "a": 456789012345,
+          "b": 98765.4321
+        }
+      ],
+      "another": {
+        "a": 567890123456,
+        "b": 1234567890.9876542
+      }
+    }
+

Teardown

PASSED test_differing_unions 0:00:01.278532

Setup

Call

Captured stderr call
[2024-10-21T21:12:29Z INFO  baml_events] Function DifferentiateUnions:
+    Client: openai/gpt-4o-mini (gpt-4o-mini-2024-07-18) - 1270ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Create a data model that represents the latter of the two classes.
+    
+    Answer in JSON using any of these schemas:
+    {
+      value: int,
+    } or {
+      value: int,
+      value2: string,
+    }
+    
+    ---LLM REPLY---
+    Here is a JSON representation of a data model that uses the second schema—incorporating both an integer value and a string value:
+    
+    ```json
+    {
+      "value": 42,
+      "value2": "example string"
+    }
+    ```
+    
+    In this model, `value` is an integer set to `42`, and `value2` is a string set to `"example string"`. You can adjust the integer and string values as needed.
+    ---Parsed Response (class OriginalB)---
+    {
+      "value": 42,
+      "value2": "example string"
+    }
+

Teardown

tests/test_pydantic.py 3 0:00:00.002057

PASSED test_model_validate_success 0:00:00.001073

Setup

Call

Teardown

PASSED test_model_validate_failure 0:00:00.000550

Setup

Call

Teardown

PASSED test_model_dump 0:00:00.000434

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

Test Report

Started: 2024-10-16 14:22:05
Suites (1)
1 passed
0 failed
0 pending
Tests (50)
4 passed
0 failed
46 pending
Integ tests > should work for all inputs
single bool
pending
0s
Integ tests > should work for all inputs
single string list
pending
0s
Integ tests > should work for all inputs
single class
pending
0s
Integ tests > should work for all inputs
multiple classes
pending
0s
Integ tests > should work for all inputs
single enum list
pending
0s
Integ tests > should work for all inputs
single float
pending
0s
Integ tests > should work for all inputs
single int
pending
0s
Integ tests > should work for all inputs
single optional string
pending
0s
Integ tests > should work for all inputs
single map string to string
pending
0s
Integ tests > should work for all inputs
single map string to class
pending
0s
Integ tests > should work for all inputs
single map string to map
pending
0s
Integ tests
should work for all outputs
pending
0s
Integ tests
works with retries1
pending
0s
Integ tests
works with retries2
pending
0s
Integ tests
works with fallbacks
pending
0s
Integ tests
should work with image from url
pending
0s
Integ tests
should work with image from base 64
pending
0s
Integ tests
should work with audio base 64
pending
0s
Integ tests
should work with audio from url
pending
0s
Integ tests
should support streaming in OpenAI
pending
0s
Integ tests
should support streaming in Gemini
pending
0s
Integ tests
should support AWS
pending
0s
Integ tests
should support streaming in AWS
pending
0s
Integ tests
should support OpenAI shorthand
pending
0s
Integ tests
should support OpenAI shorthand streaming
pending
0s
Integ tests
should support anthropic shorthand
pending
0s
Integ tests
should support anthropic shorthand streaming
pending
0s
Integ tests
should support streaming without iterating
pending
0s
Integ tests
should support streaming in Claude
pending
0s
Integ tests
should support vertex
pending
0s
Integ tests
supports tracing sync
pending
0s
Integ tests
supports tracing async
pending
0s
Integ tests
should work with dynamic types single
pending
0s
Integ tests
should work with dynamic types enum
pending
0s
Integ tests
should work with dynamic types class
pending
0s
Integ tests
should work with dynamic inputs class
pending
0s
Integ tests
should work with dynamic inputs list
pending
0s
Integ tests
should work with dynamic output map
pending
0s
Integ tests
should work with dynamic output union
pending
0s
Integ tests
should work with nested classes
pending
0s
Integ tests
should work with dynamic client
pending
0s
Integ tests
should work with 'onLogEvent'
pending
0s
Integ tests
should work with a sync client
pending
0s
Integ tests
should raise an error when appropriate
pending
0s
Integ tests
should raise a BAMLValidationError
pending
0s
Integ tests
should reset environment variables correctly
pending
0s
Integ tests
should use aliases when serializing input objects - classes
passed
1.405s
Integ tests
should use aliases when serializing, but still have original keys in jinja
passed
0.851s
Integ tests
should use aliases when serializing input objects - enums
passed
0.449s
Integ tests
should use aliases when serializing input objects - lists
passed
0.766s
\ No newline at end of file +

Test Report

Started: 2024-10-21 14:07:26
Suites (1)
0 passed
1 failed
0 pending
Tests (51)
49 passed
2 failed
0 pending
Integ tests > should work for all inputs
single bool
passed
0.383s
Integ tests > should work for all inputs
single string list
passed
0.545s
Integ tests > should work for all inputs
single class
passed
0.527s
Integ tests > should work for all inputs
multiple classes
passed
0.546s
Integ tests > should work for all inputs
single enum list
passed
0.561s
Integ tests > should work for all inputs
single float
passed
0.342s
Integ tests > should work for all inputs
single int
passed
0.455s
Integ tests > should work for all inputs
single optional string
passed
0.518s
Integ tests > should work for all inputs
single map string to string
passed
0.599s
Integ tests > should work for all inputs
single map string to class
passed
0.772s
Integ tests > should work for all inputs
single map string to map
passed
0.568s
Integ tests
should work for all outputs
failed
4.554s
BamlValidationError: BamlValidationError: Failed to parse LLM response: Failed to coerce value: <root>: Too many matches for EnumOutput. Got: ONE (1 times), TWO (1 times), THREE (1 times)
+    at Function.from (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/index.js:33:28)
+    at from (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/index.js:58:32)
+    at BamlAsyncClient.FnEnumOutput (/Users/vbv/repos/gloo-lang/integ-tests/typescript/baml_client/async_client.ts:811:50)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:125:20)
Integ tests
works with retries1
passed
1.351s
Integ tests
works with retries2
passed
2.249s
Integ tests
works with fallbacks
passed
2.041s
Integ tests
should work with image from url
passed
2.373s
Integ tests
should work with image from base 64
passed
2.346s
Integ tests
should work with audio base 64
passed
1.445s
Integ tests
should work with audio from url
passed
1.163s
Integ tests
should support streaming in OpenAI
passed
3.369s
Integ tests
should support streaming in Gemini
passed
9.511s
Integ tests
should support AWS
passed
2.522s
Integ tests
should support streaming in AWS
passed
2.342s
Integ tests
should support OpenAI shorthand
passed
7.424s
Integ tests
should support OpenAI shorthand streaming
passed
4.16s
Integ tests
should support anthropic shorthand
passed
2.678s
Integ tests
should support anthropic shorthand streaming
passed
4.126s
Integ tests
should support streaming without iterating
passed
3.071s
Integ tests
should support streaming in Claude
passed
1.42s
Integ tests
should support vertex
passed
8.601s
Integ tests
supports tracing sync
passed
0.013s
Integ tests
supports tracing async
passed
2.348s
Integ tests
should work with dynamic types single
passed
1.02s
Integ tests
should work with dynamic types enum
passed
0.895s
Integ tests
should work with dynamic literals
passed
1.779s
Integ tests
should work with dynamic types class
passed
1.006s
Integ tests
should work with dynamic inputs class
passed
1.381s
Integ tests
should work with dynamic inputs list
passed
0.685s
Integ tests
should work with dynamic output map
passed
1.511s
Integ tests
should work with dynamic output union
passed
2.402s
Integ tests
should work with nested classes
failed
10.346s
Error: {"type":"BamlValidationError","prompt":"[\u001b[2mchat\u001b[0m] \u001b[43msystem: \u001b[0mReturn a made up json blob that matches this schema:\nAnswer in JSON using this schema:\n{\n  prop1: string,\n  prop2: {\n    prop1: string,\n    prop2: string,\n    inner: {\n      prop2: int,\n      prop3: float,\n    },\n  },\n}\n---\n\nJSON:\n","raw_output":"Sure! Here is a made-up JSON blob that matches the schema you provided:\n```json\n{\n  \"prop1\": \"Hello\",\n  \"prop2\": {\n    \"prop1\": \"Hi\",\n    \"prop2\": \"World\",\n    \"inner\": {\n      \"prop3\": 4.5,\n      \"prop4\": 3.14,\n    },\n  },\n}\n```\nHere's a breakdown of the JSON:\n\n* `prop1`: A string property with value \"Hello\"\n* `prop2`: An object property with values:\n\t+ `prop1`: A string property with value \"Hi\"\n\t+ `prop2`: A string property with value \"World\"\n\t+ `inner`: An object property with values:\n\t\t- `prop3`: An integer property with value 4.5\n\t\t- `prop4`: A float property with value 3.14\n* `inner` contains another object property with two properties: `prop3` and `prop4`.\n\nI hope this helps! Let me know if you have any questions or need further clarification.","message":"BamlValidationError: Failed to parse LLM response: Failed to coerce value: <root>: Failed to find any TestClassNested in 3 items\n  - <root>: Failed while parsing required fields: missing=0, unparsed=1\n    - <root>: Failed to parse field prop2: prop2: Failed while parsing required fields: missing=0, unparsed=1\n      - prop2: Failed to parse field inner: prop2.inner: Failed while parsing required fields: missing=1, unparsed=0\n        - prop2.inner: Missing required field: prop2\n        - prop2.inner: Failed while parsing required fields: missing=1, unparsed=0\n          - prop2.inner: Missing required field: prop2\n      - prop2: Failed while parsing required fields: missing=0, unparsed=1\n        - prop2: Failed to parse field inner: prop2.inner: Failed while parsing required fields: missing=1, unparsed=0\n          - prop2.inner: Missing required field: prop2\n          - prop2.inner: Failed while parsing required fields: missing=1, unparsed=0\n            - prop2.inner: Missing required field: prop2\n  - <root>: Failed while parsing required fields: missing=2, unparsed=0\n    - <root>: Missing required field: prop1\n    - <root>: Missing required field: prop2\n  - <root>: Failed while parsing required fields: missing=0, unparsed=1\n    - <root>: Failed to parse field prop2: prop2: Failed while parsing required fields: missing=0, unparsed=1\n      - prop2: Failed to parse field inner: prop2.inner: Failed while parsing required fields: missing=1, unparsed=0\n        - prop2.inner: Missing required field: prop2\n        - prop2.inner: Failed while parsing required fields: missing=1, unparsed=0\n          - prop2.inner: Missing required field: prop2\n      - prop2: Failed while parsing required fields: missing=0, unparsed=1\n        - prop2: Failed to parse field inner: prop2.inner: Failed while parsing required fields: missing=1, unparsed=0\n          - prop2.inner: Missing required field: prop2\n          - prop2.inner: Failed while parsing required fields: missing=1, unparsed=0\n            - prop2.inner: Missing required field: prop2"}
+    at BamlStream.parsed [as getFinalResponse] (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/stream.js:58:39)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:535:19)
Integ tests
should work with dynamic client
passed
0.66s
Integ tests
should work with 'onLogEvent'
passed
2.035s
Integ tests
should work with a sync client
passed
0.757s
Integ tests
should raise an error when appropriate
passed
0.888s
Integ tests
should raise a BAMLValidationError
passed
0.517s
Integ tests
should reset environment variables correctly
passed
0.832s
Integ tests
should use aliases when serializing input objects - classes
passed
1.107s
Integ tests
should use aliases when serializing, but still have original keys in jinja
passed
0.972s
Integ tests
should use aliases when serializing input objects - enums
passed
0.478s
Integ tests
should use aliases when serializing input objects - lists
passed
0.402s
Console Log
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:41: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)
+    at _callCircusTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:316:40)
+    at _runTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:252:3)
+    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:126:9)
+    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:121:9)
+    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:121:9)
+    at run (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:71:3)
+    at runAndTransformResultsToJestFormat (/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/jestAdapterInit.js:122:21)
+    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)
calling with class
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:47:15)
got response key
+true
+52
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:133: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: 1729544859, tv_nsec: 13341000 }, latency: 290.43475ms, 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:2159:18)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:130:7) {
+  code: 'GenericFailure'
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:142: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: 1729544861, tv_nsec: 363925000 }, latency: 222.247958ms, 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:2184:18)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:139:7) {
+  code: 'GenericFailure'
+}
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:295:15)
+    at func (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:83:38)
+    at AsyncLocalStorage.run (node:async_hooks:338:14)
+    at run (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:81:22)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:304:5)
+    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)
+    at _callCircusTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:316:40)
+    at _runTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:252:3)
+    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:126:9)
+    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:121:9)
+    at run (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:71:3)
+    at runAndTransformResultsToJestFormat (/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/jestAdapterInit.js:122:21)
+    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)
hello world
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:298:15)
+    at func (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:83:38)
+    at AsyncLocalStorage.run (node:async_hooks:338:14)
+    at run (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:81:22)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:304:5)
+    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)
+    at _callCircusTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:316:40)
+    at _runTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:252:3)
+    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:126:9)
+    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:121:9)
+    at run (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:71:3)
+    at runAndTransformResultsToJestFormat (/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/jestAdapterInit.js:122:21)
+    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)
dummyFunc returned
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:301:15)
+    at func (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:83:38)
+    at AsyncLocalStorage.run (node:async_hooks:338:14)
+    at run (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:81:22)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:304:5)
+    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)
+    at _callCircusTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:316:40)
+    at _runTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:252:3)
+    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:126:9)
+    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:121:9)
+    at run (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:71:3)
+    at runAndTransformResultsToJestFormat (/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/jestAdapterInit.js:122:21)
+    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:316:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 0)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:322:22)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 0)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:334:5)
samDummyNested nested1
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:316:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 1)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:322:22)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 0)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:334:5)
samDummyNested nested2
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:316:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 2)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:322:22)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 0)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:334:5)
samDummyNested nested3
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:327:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 0)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:334:5)
dummy hi1
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:316:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 0)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:322:22)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 1)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:334:5)
samDummyNested nested1
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:316:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 1)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:322:22)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 1)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:334:5)
samDummyNested nested2
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:316:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 2)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:322:22)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 1)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:334:5)
samDummyNested nested3
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:327:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 1)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:334:5)
dummy hi2
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:316:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 0)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:322:22)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 2)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:334:5)
samDummyNested nested1
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:316:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 1)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:322:22)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 2)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:334:5)
samDummyNested nested2
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:316:15)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 2)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:322:22)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 2)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:334:5)
samDummyNested nested3
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:327:15)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 2)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:334:5)
dummy hi3
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:341:15)
+    at func (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:44)
+    at AsyncLocalStorage.run (node:async_hooks:338:14)
+    at run (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:28)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:357:5)
hello world
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:316:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 0)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:322:22)
samDummyNested nested1
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:316:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 1)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:322:22)
samDummyNested nested2
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:316:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 2)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:322:22)
samDummyNested nested3
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:327:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
dummy firstDummyFuncArg
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:316:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 0)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:322:22)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at /Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:346:20
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:340:17)
samDummyNested nested1
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:316:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 1)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:322:22)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at /Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:346:20
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:340:17)
samDummyNested nested2
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:316:15)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 2)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:322:22)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at /Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:346:20
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:340:17)
samDummyNested nested3
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:327:15)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at /Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:346:20
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:340:17)
dummy secondDummyFuncArg
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:316:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 0)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:322:22)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at /Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:354:20
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:340:17)
samDummyNested nested1
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:316:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 1)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:322:22)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at /Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:354:20
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:340:17)
samDummyNested nested2
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:316:15)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at async Promise.all (index 2)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:322:22)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at /Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:354:20
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:340:17)
samDummyNested nested3
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:327:15)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at /Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:354:20
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:13
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:340:17)
dummy thirdDummyFuncArg
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:360:15)
+    at func (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:104:44)
+    at AsyncLocalStorage.run (node:async_hooks:338:14)
+    at run (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:102:28)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:366:5)
hello world
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:370:13)
stats {"failed":0,"started":30,"finalized":30,"submitted":30,"sent":30,"done":30}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:394:13)
[
+  {
+    name: 'Harrison',
+    hair_color: 'BLACK',
+    last_name: null,
+    height: 1.83,
+    hobbies: [ 'SPORTS' ]
+  }
+]
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:463: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>)
+    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)
+    at _callCircusTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:316:40)
+    at _runTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:252:3)
+    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:126:9)
+    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:121:9)
+    at run (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:71:3)
+    at runAndTransformResultsToJestFormat (/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/jestAdapterInit.js:122:21)
+    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)
[
+  [
+    'hair_color',
+    ClassPropertyBuilder { bldr: ClassPropertyBuilder {} }
+  ],
+  [
+    'attributes',
+    ClassPropertyBuilder { bldr: ClassPropertyBuilder {} }
+  ]
+]
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:465: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)
+    at _callCircusTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:316:40)
+    at _runTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:252:3)
+    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:126:9)
+    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:121:9)
+    at run (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:71:3)
+    at runAndTransformResultsToJestFormat (/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/jestAdapterInit.js:122:21)
+    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)
Property: hair_color
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:465: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)
+    at _callCircusTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:316:40)
+    at _runTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:252:3)
+    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:126:9)
+    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:121:9)
+    at run (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:71:3)
+    at runAndTransformResultsToJestFormat (/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/jestAdapterInit.js:122:21)
+    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)
Property: attributes
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:473:13)
final  {
+  hair_color: 'black',
+  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:497: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>)
+    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)
+    at _callCircusTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:316:40)
+    at _runTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:252:3)
+    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:126:9)
+    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:121:9)
+    at run (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:71:3)
+    at runAndTransformResultsToJestFormat (/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/jestAdapterInit.js:122:21)
+    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)
[
+  [
+    'hair_color',
+    ClassPropertyBuilder { bldr: ClassPropertyBuilder {} }
+  ],
+  [
+    'attributes',
+    ClassPropertyBuilder { bldr: ClassPropertyBuilder {} }
+  ],
+  [ 'height', ClassPropertyBuilder { bldr: ClassPropertyBuilder {} } ]
+]
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:499: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)
+    at _callCircusTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:316:40)
+    at _runTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:252:3)
+    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:126:9)
+    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:121:9)
+    at run (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:71:3)
+    at runAndTransformResultsToJestFormat (/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/jestAdapterInit.js:122:21)
+    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)
Property: hair_color
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:499: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)
+    at _callCircusTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:316:40)
+    at _runTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:252:3)
+    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:126:9)
+    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:121:9)
+    at run (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:71:3)
+    at runAndTransformResultsToJestFormat (/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/jestAdapterInit.js:122:21)
+    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)
Property: attributes
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:499: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)
+    at _callCircusTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:316:40)
+    at _runTest (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:252:3)
+    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:126:9)
+    at _runTestsForDescribeBlock (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:121:9)
+    at run (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/run.js:71:3)
+    at runAndTransformResultsToJestFormat (/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/jestAdapterInit.js:122:21)
+    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)
Property: height
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:507:13)
final  {
+  hair_color: 'black',
+  attributes: { eye_color: 'blue', facial_hair: 'beard', age: '30' },
+  height: { feet: 6, inches: null }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:13)
final  {
+  hair_color: 'black',
+  attributes: { eye_color: 'blue', facial_hair: 'beard' },
+  height: { meters: 1.8 }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg { prop1: '', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg { prop1: 'Hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg { prop1: 'Hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg { prop1: 'Hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg { prop1: 'Hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg { prop1: 'Hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg { prop1: 'Hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg { prop1: 'Hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg { prop1: 'Hello', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531: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:531: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:531: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:531: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:531: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:531: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:531: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:531: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:531:15)
msg { prop1: 'Hello', prop2: { prop1: 'Hi', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg { prop1: 'Hello', prop2: { prop1: 'Hi', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg { prop1: 'Hello', prop2: { prop1: 'Hi', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg { prop1: 'Hello', prop2: { prop1: 'Hi', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg { prop1: 'Hello', prop2: { prop1: 'Hi', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg { prop1: 'Hello', prop2: { prop1: 'Hi', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg { prop1: 'Hello', prop2: { prop1: 'Hi', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg { prop1: 'Hello', prop2: { prop1: 'Hi', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg { prop1: 'Hello', prop2: { prop1: 'Hi', prop2: '', inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg { prop1: 'Hello', prop2: { prop1: 'Hi', prop2: 'World', inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg { prop1: 'Hello', prop2: { prop1: 'Hi', prop2: 'World', inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg { prop1: 'Hello', prop2: { prop1: 'Hi', prop2: 'World', inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg { prop1: 'Hello', prop2: { prop1: 'Hi', prop2: 'World', inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg { prop1: 'Hello', prop2: { prop1: 'Hi', prop2: 'World', inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg { prop1: 'Hello', prop2: { prop1: 'Hi', prop2: 'World', inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg { prop1: 'Hello', prop2: { prop1: 'Hi', prop2: 'World', inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: null } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: null } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: null } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: null } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: null } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: null } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: null } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: null } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: null } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: null } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: null } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: null } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:531:15)
msg {
+  prop1: 'Hello',
+  prop2: { prop1: 'Hi', prop2: 'World', inner: { prop2: null, prop3: 4.5 } }
+}
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:556:15)
+    at callback (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:70:17)
onLogEvent {
+  metadata: {
+    eventId: '9f74ac43-3903-478e-8936-54d5a8ed8f23',
+    rootEventId: '9f74ac43-3903-478e-8936-54d5a8ed8f23'
+  },
+  prompt: '[\n' +
+    '  {\n' +
+    '    "role": "system",\n' +
+    '    "content": [\n' +
+    '      {\n' +
+    '        "text": "Return this value back to me: [\\"a\\", \\"b\\", \\"c\\"]"\n' +
+    '      }\n' +
+    '    ]\n' +
+    '  }\n' +
+    ']',
+  rawOutput: '["a", "b", "c"]',
+  parsedOutput: '["a", "b", "c"]',
+  startTime: '2024-10-21T21:09:04.550Z'
+}
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:556:15)
+    at callback (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:70:17)
onLogEvent {
+  metadata: {
+    eventId: '0daa000d-c611-4880-980b-649055872789',
+    rootEventId: '0daa000d-c611-4880-980b-649055872789'
+  },
+  prompt: '[\n' +
+    '  {\n' +
+    '    "role": "system",\n' +
+    '    "content": [\n' +
+    '      {\n' +
+    '        "text": "Return this value back to me: [\\"d\\", \\"e\\", \\"f\\"]"\n' +
+    '      }\n' +
+    '    ]\n' +
+    '  }\n' +
+    ']',
+  rawOutput: '["d", "e", "f"]',
+  parsedOutput: '["d", "e", "f"]',
+  startTime: '2024-10-21T21:09:05.030Z'
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:590:15)
Error: Error: BamlError: BamlClientError: BamlClientHttpError: LLM call failed: LLMErrorResponse { client: "MyClient", model: None, prompt: Chat([RenderedChatMessage { role: "system", allow_duplicate_role: false, parts: [Text("Given a string, extract info using the schema:\n\nMy name is Harrison. My hair is black and I'm 6 feet tall.\n\nAnswer in JSON using this schema:\n{\n}")] }]), request_options: {"model": String("gpt-4o-mini")}, start_time: SystemTime { tv_sec: 1729544947, tv_nsec: 193917000 }, latency: 190.5325ms, message: "Request failed: {\n    \"error\": {\n        \"message\": \"Incorrect API key provided: INVALID_KEY. You can find your API key at https://platform.openai.com/account/api-keys.\",\n        \"type\": \"invalid_request_error\",\n        \"param\": null,\n        \"code\": \"invalid_api_key\"\n    }\n}\n", code: InvalidAuthentication }
+    at BamlAsyncClient.parsed (/Users/vbv/repos/gloo-lang/integ-tests/typescript/baml_client/async_client.ts:1159:18)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:587:7) {
+  code: 'GenericFailure'
+}
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:598:17)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:594:5)
BamlValidationError: BamlValidationError: Failed to parse LLM response: Failed to coerce value: <root>: Failed while parsing required fields: missing=2, unparsed=0
+  - <root>: Missing required field: nonce
+  - <root>: Missing required field: nonce2
+    at Function.from (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/index.js:33:28)
+    at from (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/index.js:58:32)
+    at BamlAsyncClient.DummyOutputFunction (/Users/vbv/repos/gloo-lang/integ-tests/typescript/baml_client/async_client.ts:486:50)
+    at /Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:596:9
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:594:5) {
+  prompt: '[\x1B[2mchat\x1B[0m] \x1B[43msystem: \x1B[0mSay "hello there".\n',
+  raw_output: 'Hello there! How can I assist you today?'
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:610:17)
error BamlValidationError: BamlValidationError: Failed to parse LLM response: Failed to coerce value: <root>: Failed while parsing required fields: missing=2, unparsed=0
+  - <root>: Missing required field: nonce
+  - <root>: Missing required field: nonce2
+    at Function.from (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/index.js:33:28)
+    at from (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/index.js:58:32)
+    at BamlAsyncClient.DummyOutputFunction (/Users/vbv/repos/gloo-lang/integ-tests/typescript/baml_client/async_client.ts:486:50)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:606:7) {
+  prompt: '[\x1B[2mchat\x1B[0m] \x1B[43msystem: \x1B[0mSay "hello there".\n',
+  raw_output: 'Hello there! How can I assist you today?'
+}
\ No newline at end of file diff --git a/tools/versions/engine.cfg b/tools/versions/engine.cfg index f42d5acfe..fd635fdae 100644 --- a/tools/versions/engine.cfg +++ b/tools/versions/engine.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.61.1 +current_version = 0.62.0 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 be05b0fac..7da5a2905 100644 --- a/tools/versions/integ-tests.cfg +++ b/tools/versions/integ-tests.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.61.1 +current_version = 0.62.0 commit = False tag = False parse = ^(?P\d+)\.(?P\d+).(?P\d+)$ diff --git a/tools/versions/python.cfg b/tools/versions/python.cfg index 259c06980..faf906e6d 100644 --- a/tools/versions/python.cfg +++ b/tools/versions/python.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.61.1 +current_version = 0.62.0 commit = False tag = False parse = ^(?P\d+)\.(?P\d+).(?P\d+)$ diff --git a/tools/versions/ruby.cfg b/tools/versions/ruby.cfg index b2189a9aa..bdcaf359c 100644 --- a/tools/versions/ruby.cfg +++ b/tools/versions/ruby.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.61.1 +current_version = 0.62.0 commit = False tag = False parse = ^(?P\d+)\.(?P\d+).(?P\d+)$ diff --git a/tools/versions/typescript.cfg b/tools/versions/typescript.cfg index d4233214b..5394a205b 100644 --- a/tools/versions/typescript.cfg +++ b/tools/versions/typescript.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.61.1 +current_version = 0.62.0 commit = False tag = False parse = ^(?P\d+)\.(?P\d+).(?P\d+)$ diff --git a/tools/versions/vscode.cfg b/tools/versions/vscode.cfg index f3ace0fd9..9f4f53313 100644 --- a/tools/versions/vscode.cfg +++ b/tools/versions/vscode.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.61.1 +current_version = 0.62.0 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 358d8de11..ca0b609d7 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.61.1", + "version": "0.62.0", "publisher": "Boundary", "repository": "https://github.com/BoundaryML/baml", "homepage": "https://www.boundaryml.com",