From 2c2ef92864de48089ecd25eb66f2bc2438280a3c Mon Sep 17 00:00:00 2001 From: hellovai Date: Tue, 27 Aug 2024 01:01:06 -0700 Subject: [PATCH] chore: Bump version to 0.54.0 (#902) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bump version to 0.54.0 ❌ Typescript integ tests ❌ Python integ tests Generated by bump-version script. ALLOW_FAILING_TESTS=hellovai ALLOW_FAILING_TESTS_REASON=Manually inspected test failures and failures are expected --- CHANGELOG.md | 30 + engine/Cargo.lock | 28 +- engine/Cargo.toml | 2 +- engine/language_client_python/pyproject.toml | 2 +- engine/language_client_ruby/baml.gemspec | 2 +- .../language_client_typescript/package.json | 2 +- integ-tests/baml_src/main.baml | 6 +- integ-tests/python/baml_client/inlinedbaml.py | 2 +- integ-tests/python/report.html | 2277 ++++++++++++++++- integ-tests/ruby/baml_client/inlined.rb | 2 +- .../typescript/baml_client/inlinedbaml.ts | 2 +- integ-tests/typescript/test-report.html | 778 +++++- tools/versions/engine.cfg | 2 +- tools/versions/integ-tests.cfg | 2 +- tools/versions/python.cfg | 2 +- tools/versions/ruby.cfg | 2 +- tools/versions/typescript.cfg | 2 +- tools/versions/vscode.cfg | 2 +- typescript/vscode-ext/packages/package.json | 2 +- 19 files changed, 2993 insertions(+), 154 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6918ea7a8..089dd1d44 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,36 @@ All notable changes to this project will be documented in this file. See [conventional commits](https://www.conventionalcommits.org/) for commit guidelines. +## [0.54.0](https://github.com/boundaryml/baml/compare/0.53.1..0.54.0) - 2024-08-27 + +### BREAKING CHANGE + +- Update Default Gemini Base URL to v1beta (#891) - ([a5d8c58](https://github.com/boundaryml/baml/commit/a5d8c588e0fd0b7e186d7c71f1f6171334250629)) - gleed + +The default base URL for the Gemini provider has been updated to v1beta. This change is should have no impact on existing users as v1beta is the default version for the Gemini python library, we are mirroring this change in BAML. + +### Bug Fixes + +- Allow promptfiddle to talk to localhost ollama (#886) - ([5f02b2a](https://github.com/boundaryml/baml/commit/5f02b2ac688ceeb5a34e848a8ff87fd43a6b093a)) - Samuel Lijin +- Update Parser for unions so they handle nested objects better (#900) - ([c5b9a75](https://github.com/boundaryml/baml/commit/c5b9a75ea6da7c45da1999032e2b256bec97d922)) - hellovai + +### Documentation + +- Add ollama to default prompt fiddle example (#888) - ([49146c0](https://github.com/boundaryml/baml/commit/49146c0e50c88615e4cc97adb595849c23bad8ae)) - Samuel Lijin +- Adding improved docs + unit tests for caching (#895) - ([ff7be44](https://github.com/boundaryml/baml/commit/ff7be4478b706da049085d432b2ec98627b5da1f)) - hellovai + +### Features + +- Allow local filepaths to be used in tests in BAML files (image and audio) (#871) - ([fa6dc03](https://github.com/boundaryml/baml/commit/fa6dc03fcdd3255dd83e25d0bfb3b0e740991408)) - Samuel Lijin +- Add support for absolute file paths in the file specifier (#881) - ([fcd189e](https://github.com/boundaryml/baml/commit/fcd189ed7eb81712bf3b641eb3dde158fc6a62af)) - hellovai +- Implement shorthand clients (You can now use "openai/gpt-4o" as short for creating a complete client.) (#879) - ([ddd15c9](https://github.com/boundaryml/baml/commit/ddd15c92c3e8d81c24cb7305c9fcbb36b819900f)) - Samuel Lijin +- Add support for arbritrary metadata (e.g. cache_policy for anthropic) (#893) - ([0d63a70](https://github.com/boundaryml/baml/commit/0d63a70332477761a97783e203c98fd0bf67f151)) - hellovai +- Expose Exceptions to user code: BamlError, BamlInvalidArgumentError, BamlClientError, BamlClientHttpError, BamlValidationError (#770) - ([7da14c4](https://github.com/boundaryml/baml/commit/7da14c480506e9791b3f4ce52ac73836a042d38a)) - hellovai + + +### Internal +- AST Restructuring (#857) - ([75b51cb](https://github.com/boundaryml/baml/commit/75b51cbf80a0c8ba19ae05b021ef3c94dacb4e30)) - Anish Palakurthi + ## [0.53.1](https://github.com/boundaryml/baml/compare/0.53.0..0.53.1) - 2024-08-11 ### Bug Fixes diff --git a/engine/Cargo.lock b/engine/Cargo.lock index 90913c851..5d0e41692 100644 --- a/engine/Cargo.lock +++ b/engine/Cargo.lock @@ -687,7 +687,7 @@ dependencies = [ [[package]] name = "baml" -version = "0.53.1" +version = "0.54.0" dependencies = [ "anyhow", "baml-lib", @@ -728,7 +728,7 @@ dependencies = [ [[package]] name = "baml-fmt" -version = "0.53.1" +version = "0.54.0" dependencies = [ "anyhow", "base64 0.22.1", @@ -749,7 +749,7 @@ dependencies = [ [[package]] name = "baml-lib" -version = "0.53.1" +version = "0.54.0" dependencies = [ "base64 0.13.1", "dissimilar", @@ -787,7 +787,7 @@ dependencies = [ [[package]] name = "baml-runtime" -version = "0.53.1" +version = "0.54.0" dependencies = [ "ambassador", "anyhow", @@ -868,7 +868,7 @@ dependencies = [ [[package]] name = "baml-schema-build" -version = "0.53.1" +version = "0.54.0" dependencies = [ "anyhow", "baml-runtime", @@ -903,7 +903,7 @@ dependencies = [ [[package]] name = "baml-types" -version = "0.53.1" +version = "0.54.0" dependencies = [ "anyhow", "indexmap 2.2.6", @@ -2302,7 +2302,7 @@ dependencies = [ [[package]] name = "internal-baml-codegen" -version = "0.53.1" +version = "0.54.0" dependencies = [ "anyhow", "askama", @@ -2325,7 +2325,7 @@ dependencies = [ [[package]] name = "internal-baml-core" -version = "0.53.1" +version = "0.54.0" dependencies = [ "anyhow", "baml-types", @@ -2359,7 +2359,7 @@ dependencies = [ [[package]] name = "internal-baml-diagnostics" -version = "0.53.1" +version = "0.54.0" dependencies = [ "anyhow", "colored", @@ -2372,7 +2372,7 @@ dependencies = [ [[package]] name = "internal-baml-jinja" -version = "0.53.1" +version = "0.54.0" dependencies = [ "anyhow", "askama", @@ -2390,7 +2390,7 @@ dependencies = [ [[package]] name = "internal-baml-parser-database" -version = "0.53.1" +version = "0.54.0" dependencies = [ "anyhow", "baml-types", @@ -2413,7 +2413,7 @@ dependencies = [ [[package]] name = "internal-baml-prompt-parser" -version = "0.53.1" +version = "0.54.0" dependencies = [ "internal-baml-diagnostics", "internal-baml-schema-ast", @@ -2425,7 +2425,7 @@ dependencies = [ [[package]] name = "internal-baml-schema-ast" -version = "0.53.1" +version = "0.54.0" dependencies = [ "baml-types", "either", @@ -2502,7 +2502,7 @@ checksum = "9dbbfed4e59ba9750e15ba154fdfd9329cee16ff3df539c2666b70f58cc32105" [[package]] name = "jsonish" -version = "0.53.1" +version = "0.54.0" dependencies = [ "anyhow", "assert-json-diff", diff --git a/engine/Cargo.toml b/engine/Cargo.toml index 93f7fe5ac..b97eb2b0a 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.53.1" +version = "0.54.0" authors = ["Boundary "] description = "BAML Toolchain" diff --git a/engine/language_client_python/pyproject.toml b/engine/language_client_python/pyproject.toml index bd5496465..7f01f6667 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.53.1" +version = "0.54.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 2052e0f28..a5a0621b1 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.53.1" + spec.version = "0.54.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 8f960f491..dfcbc504e 100644 --- a/engine/language_client_typescript/package.json +++ b/engine/language_client_typescript/package.json @@ -1,6 +1,6 @@ { "name": "@boundaryml/baml", - "version": "0.53.1", + "version": "0.54.0", "description": "BAML typescript bindings (package.json)", "repository": { "type": "git", diff --git a/integ-tests/baml_src/main.baml b/integ-tests/baml_src/main.baml index f404fc145..9ccea6ea6 100644 --- a/integ-tests/baml_src/main.baml +++ b/integ-tests/baml_src/main.baml @@ -1,17 +1,17 @@ generator lang_python { output_type python/pydantic output_dir "../python" - version "0.53.1" + version "0.54.0" } generator lang_typescript { output_type typescript output_dir "../typescript" - version "0.53.1" + version "0.54.0" } generator lang_ruby { output_type ruby/sorbet output_dir "../ruby" - version "0.53.1" + version "0.54.0" } diff --git a/integ-tests/python/baml_client/inlinedbaml.py b/integ-tests/python/baml_client/inlinedbaml.py index afa270fdc..9b185c030 100644 --- a/integ-tests/python/baml_client/inlinedbaml.py +++ b/integ-tests/python/baml_client/inlinedbaml.py @@ -24,7 +24,7 @@ "fiddle-examples/extract-receipt-info.baml": "class ReceiptItem {\n name string\n description string?\n quantity int\n price float\n}\n\nclass ReceiptInfo {\n items ReceiptItem[]\n total_cost float?\n}\n\nfunction ExtractReceiptInfo(email: string) -> ReceiptInfo {\n client GPT4o\n prompt #\"\n Given the receipt below:\n\n ```\n {{email}}\n ```\n\n {{ ctx.output_format }}\n \"#\n}\n\n", "fiddle-examples/images/image.baml": "function DescribeImage(img: image) -> string {\n client AwsBedrock\n prompt #\"\n {{ _.role(\"user\") }}\n\n\n Describe the image below in 20 words:\n {{ img }}\n \"#\n\n}\n\nclass FakeImage {\n url string\n}\n\nclass ClassWithImage {\n myImage image\n param2 string\n fake_image FakeImage\n}\n\n// chat role user present\nfunction DescribeImage2(classWithImage: ClassWithImage, img2: image) -> string { \n client GPT4Turbo\n prompt #\"\n {{ _.role(\"user\") }}\n You should return 2 answers that answer the following commands.\n\n 1. Describe this in 5 words:\n {{ classWithImage.myImage }}\n\n 2. Also tell me what's happening here in one sentence:\n {{ img2 }}\n \"#\n}\n\n// no chat role\nfunction DescribeImage3(classWithImage: ClassWithImage, img2: image) -> string {\n client GPT4Turbo\n prompt #\"\n Describe this in 5 words:\n {{ classWithImage.myImage }}\n\n Tell me also what's happening here in one sentence and relate it to the word {{ classWithImage.param2 }}:\n {{ img2 }}\n \"#\n}\n\n\n// system prompt and chat prompt\nfunction DescribeImage4(classWithImage: ClassWithImage, img2: image) -> string {\n client GPT4Turbo\n prompt #\"\n {{ _.role(\"system\")}}\n\n Describe this in 5 words:\n {{ classWithImage.myImage }}\n\n Tell me also what's happening here in one sentence and relate it to the word {{ classWithImage.param2 }}:\n {{ img2 }}\n \"#\n}\n\ntest TestName {\n functions [DescribeImage]\n args {\n img { url \"https://imgs.xkcd.com/comics/standards.png\"}\n }\n}\n", "fiddle-examples/symbol-tuning.baml": "enum Category3 {\n Refund @alias(\"k1\")\n @description(\"Customer wants to refund a product\")\n\n CancelOrder @alias(\"k2\")\n @description(\"Customer wants to cancel an order\")\n\n TechnicalSupport @alias(\"k3\")\n @description(\"Customer needs help with a technical issue unrelated to account creation or login\")\n\n AccountIssue @alias(\"k4\")\n @description(\"Specifically relates to account-login or account-creation\")\n\n Question @alias(\"k5\")\n @description(\"Customer has a question\")\n}\n\nfunction ClassifyMessage3(input: string) -> Category {\n client GPT4\n\n prompt #\"\n Classify the following INPUT into ONE\n of the following categories:\n\n INPUT: {{ input }}\n\n {{ ctx.output_format }}\n\n Response:\n \"#\n}", - "main.baml": "generator lang_python {\n output_type python/pydantic\n output_dir \"../python\"\n version \"0.53.1\"\n}\n\ngenerator lang_typescript {\n output_type typescript\n output_dir \"../typescript\"\n version \"0.53.1\"\n}\n\ngenerator lang_ruby {\n output_type ruby/sorbet\n output_dir \"../ruby\"\n version \"0.53.1\"\n}\n", + "main.baml": "generator lang_python {\n output_type python/pydantic\n output_dir \"../python\"\n version \"0.54.0\"\n}\n\ngenerator lang_typescript {\n output_type typescript\n output_dir \"../typescript\"\n version \"0.54.0\"\n}\n\ngenerator lang_ruby {\n output_type ruby/sorbet\n output_dir \"../ruby\"\n version \"0.54.0\"\n}\n", "test-files/aliases/classes.baml": "class TestClassAlias {\n key string @alias(\"key-dash\") @description(#\"\n This is a description for key\n af asdf\n \"#)\n key2 string @alias(\"key21\")\n key3 string @alias(\"key with space\")\n key4 string //unaliased\n key5 string @alias(\"key.with.punctuation/123\")\n}\n\nfunction FnTestClassAlias(input: string) -> TestClassAlias {\n client GPT35\n prompt #\"\n {{ctx.output_format}}\n \"#\n}\n\ntest FnTestClassAlias {\n functions [FnTestClassAlias]\n args {\n input \"example input\"\n }\n}\n", "test-files/aliases/enums.baml": "enum TestEnum {\n A @alias(\"k1\") @description(#\"\n User is angry\n \"#)\n B @alias(\"k22\") @description(#\"\n User is happy\n \"#)\n // tests whether k1 doesnt incorrectly get matched with k11\n C @alias(\"k11\") @description(#\"\n User is sad\n \"#)\n D @alias(\"k44\") @description(\n User is confused\n )\n E @description(\n User is excited\n )\n F @alias(\"k5\") // only alias\n \n G @alias(\"k6\") @description(#\"\n User is bored\n With a long description\n \"#)\n \n @@alias(\"Category\")\n}\n\nfunction FnTestAliasedEnumOutput(input: string) -> TestEnum {\n client GPT35\n prompt #\"\n Classify the user input into the following category\n \n {{ ctx.output_format }}\n\n {{ _.role('user') }}\n {{input}}\n\n {{ _.role('assistant') }}\n Category ID:\n \"#\n}\n\ntest FnTestAliasedEnumOutput {\n functions [FnTestAliasedEnumOutput]\n args {\n input \"mehhhhh\"\n }\n}", "test-files/comments/comments.baml": "// add some functions, classes, enums etc with comments all over.", diff --git a/integ-tests/python/report.html b/integ-tests/python/report.html index f363be303..0085321cd 100644 --- a/integ-tests/python/report.html +++ b/integ-tests/python/report.html @@ -3,14 +3,31 @@
Test Report

Summary

59
3 failed 56 passed

Tests

tests/test_functions.py 356 0:02:12.970440

PASSED test_sync 0:00:00.642486

Setup

Call

Teardown

FAILED TestAllInputs::test_single_bool 0:00:00.005467

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

Setup

Call

self = 
+    
Test Report

Summary

62
5 failed 57 passed

Tests

tests/test_functions.py 457 0:03:06.838002

PASSED test_sync 0:00:00.615624

Setup

Call

Captured stdout call
got response key
+true
+52
+
Captured stderr call
[2024-08-27T07:50:15Z INFO  baml_events] Function TestFnNamedArgsSingleClass:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 501ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Print these values back to me:
+    key
+    true
+    52
+    
+    ---LLM REPLY---
+    key
+    true
+    52
+    ---Parsed Response (string)---
+    "key\ntrue\n52"
+

Teardown

FAILED TestAllInputs::test_single_bool 0:00:00.007244

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

Setup

Call

self = 
 
 >   ???
 
-tests/test_functions.py:45: 
-_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
+tests/test_functions.py:46: 
+_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
 
-self = , myBool = True, baml_options = {}
+self = , myBool = True, baml_options = {}
 
     async def TestFnNamedArgsSingleBool(
         self,
@@ -35,16 +52,297 @@
       )
       mdl = create_model("TestFnNamedArgsSingleBoolReturnType", inner=(str, ...))
 >     return coerce(mdl, raw.parsed())
-E     baml_py.BamlError: LLM call failed: LLMErrorResponse { client: "Vertex", model: None, prompt: Chat([RenderedChatMessage { role: "user", allow_duplicate_role: false, parts: [Text("Return this value back to me: true")] }]), request_options: {}, start_time: SystemTime { tv_sec: 1724601999, tv_nsec: 507999000 }, latency: 215.25µs, message: "Error {\n    context: \"Failed to build request\",\n    source: \"Service account not found\",\n}", code: Other(2) }
+E     baml_py.BamlClientError: Something went wrong with the LLM client: LLM call failed: LLMErrorResponse { client: "Vertex", model: None, prompt: Chat([RenderedChatMessage { role: "user", allow_duplicate_role: false, parts: [Text("Return this value back to me: true")] }]), request_options: {}, start_time: SystemTime { tv_sec: 1724745015, tv_nsec: 311982000 }, latency: 1.079167ms, message: "Error {\n    context: \"Failed to build request\",\n    source: \"Service account not found\",\n}", code: Other(2) }
 
-baml_client/async_client.py:1332: BamlError

Teardown

PASSED TestAllInputs::test_single_string_list 0:00:00.457149

Setup

Call

Teardown

PASSED TestAllInputs::test_single_class 0:00:00.368022

Setup

Call

Teardown

PASSED TestAllInputs::test_multiple_args 0:00:00.520651

Setup

Call

Teardown

PASSED TestAllInputs::test_single_enum_list 0:00:00.363145

Setup

Call

Teardown

PASSED TestAllInputs::test_single_float 0:00:00.376520

Setup

Call

Teardown

PASSED TestAllInputs::test_single_int 0:00:00.461172

Setup

Call

Teardown

PASSED TestAllInputs::test_single_map_string_to_string 0:00:00.550462

Setup

Call

Teardown

PASSED TestAllInputs::test_single_map_string_to_class 0:00:00.497630

Setup

Call

Teardown

PASSED TestAllInputs::test_single_map_string_to_map 0:00:00.525978

Setup

Call

Teardown

PASSED test_should_work_for_all_outputs 0:00:03.715236

Setup

Call

Teardown

PASSED test_should_work_with_image_url 0:00:01.576821

Setup

Call

Teardown

PASSED test_should_work_with_image_list 0:00:02.043939

Setup

Call

Teardown

FAILED test_should_work_with_vertex 0:00:00.005235

baml_py.BamlError: 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: 1724602011, tv_nsec: 40061000 }, latency: 234.125µs, message: "Error {\n    context: \"Failed to build request\",\n    source: \"Service account not found\",\n}", code: Other(2) }

Setup

Call

@pytest.mark.asyncio
+baml_client/async_client.py:1356: BamlClientError
Captured stderr call
[2024-08-27T07:50:15Z WARN  baml_events] Function TestFnNamedArgsSingleBool:
+    LLM call failed: LLMErrorResponse { client: "Vertex", model: None, prompt: Chat([RenderedChatMessage { role: "user", allow_duplicate_role: false, parts: [Text("Return this value back to me: true")] }]), request_options: {}, start_time: SystemTime { tv_sec: 1724745015, tv_nsec: 311982000 }, latency: 1.079167ms, message: "Error {\n    context: \"Failed to build request\",\n    source: \"Service account not found\",\n}", code: Other(2) }
+    
+

Teardown

PASSED TestAllInputs::test_single_string_list 0:00:00.439012

Setup

Call

Captured stderr call
[2024-08-27T07:50:15Z INFO  baml_events] Function TestFnNamedArgsSingleStringList:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 434ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Return this value back to me: ["a", "b", "c"]
+    
+    ---LLM REPLY---
+    ["a", "b", "c"]
+    ---Parsed Response (string)---
+    "[\"a\", \"b\", \"c\"]"
+

Teardown

PASSED TestAllInputs::test_single_class 0:00:01.973797

Setup

Call

Captured stderr call
[2024-08-27T07:50:17Z INFO  baml_events] Function TestFnNamedArgsSingleClass:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 1967ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Print these values back to me:
+    key
+    true
+    52
+    
+    ---LLM REPLY---
+    key
+    true
+    52
+    ---Parsed Response (string)---
+    "key\ntrue\n52"
+

Teardown

PASSED TestAllInputs::test_multiple_args 0:00:00.460231

Setup

Call

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

Teardown

PASSED TestAllInputs::test_single_enum_list 0:00:00.469199

Setup

Call

Captured stderr call
[2024-08-27T07:50:18Z INFO  baml_events] Function TestFnNamedArgsSingleEnumList:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 462ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Print these values back to me:
+    ["TWO"]
+    
+    ---LLM REPLY---
+    ["TWO"]
+    ---Parsed Response (string)---
+    "[\"TWO\"]"
+

Teardown

PASSED TestAllInputs::test_single_float 0:00:00.478861

Setup

Call

Captured stderr call
[2024-08-27T07:50:19Z INFO  baml_events] Function TestFnNamedArgsSingleFloat:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 471ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Return this value back to me: 3.12
+    
+    ---LLM REPLY---
+    3.12
+    ---Parsed Response (string)---
+    "3.12"
+

Teardown

PASSED TestAllInputs::test_single_int 0:00:00.524848

Setup

Call

Captured stderr call
[2024-08-27T07:50:19Z INFO  baml_events] Function TestFnNamedArgsSingleInt:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 518ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Return this value back to me: 3566
+    
+    ---LLM REPLY---
+    3566
+    ---Parsed Response (string)---
+    "3566"
+

Teardown

PASSED TestAllInputs::test_single_map_string_to_string 0:00:00.563275

Setup

Call

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

Teardown

PASSED TestAllInputs::test_single_map_string_to_class 0:00:00.483198

Setup

Call

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

Teardown

PASSED TestAllInputs::test_single_map_string_to_map 0:00:00.524210

Setup

Call

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

Teardown

PASSED test_should_work_for_all_outputs 0:00:05.772085

Setup

Call

Captured stderr call
[2024-08-27T07:50:21Z INFO  baml_events] Function FnOutputBool:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 513ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Return a true: Answer as a: bool
+    
+    ---LLM REPLY---
+    True
+    ---Parsed Response (bool)---
+    true
+[2024-08-27T07:50:22Z INFO  baml_events] Function FnOutputClassList:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 1155ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Return a JSON array that follows this schema: 
+    Answer with a JSON Array using this schema:
+    [
+      {
+        prop1: string,
+        prop2: int,
+      }
+    ]
+    
+    JSON:
+    
+    ---LLM REPLY---
+    [
+      {
+        "prop1": "example1",
+        "prop2": 123
+      },
+      {
+        "prop1": "example2",
+        "prop2": 456
+      },
+      {
+        "prop1": "example3",
+        "prop2": 789
+      }
+    ]
+    ---Parsed Response (list<class TestOutputClass>)---
+    [
+      {
+        "prop1": "example1",
+        "prop2": 123
+      },
+      {
+        "prop1": "example2",
+        "prop2": 456
+      },
+      {
+        "prop1": "example3",
+        "prop2": 789
+      }
+    ]
+[2024-08-27T07:50:23Z INFO  baml_events] Function FnOutputClassWithEnum:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 686ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Return a made up json blob that matches this schema:
+    Answer in JSON using this schema:
+    {
+      prop1: string,
+      prop2: 'ONE' or 'TWO',
+    }
+    ---
+    
+    JSON:
+    
+    ---LLM REPLY---
+    {
+      "prop1": "Hello, World!",
+      "prop2": "TWO"
+    }
+    ---Parsed Response (class TestClassWithEnum)---
+    {
+      "prop1": "Hello, World!",
+      "prop2": "TWO"
+    }
+[2024-08-27T07:50:24Z INFO  baml_events] Function FnOutputClass:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 760ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Return a JSON blob with this schema: 
+    Answer in JSON using this schema:
+    {
+      prop1: string,
+      prop2: int,
+    }
+    
+    For the prop2, always return a 540
+    
+    JSON:
+    
+    ---LLM REPLY---
+    {
+      "prop1": "example",
+      "prop2": 540
+    }
+    ---Parsed Response (class TestOutputClass)---
+    {
+      "prop1": "example",
+      "prop2": 540
+    }
+[2024-08-27T07:50:24Z INFO  baml_events] Function FnEnumListOutput:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 553ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Print out two of these values randomly selected from the list below in a json array.
+    
+    Answer with a JSON Array using this schema:
+    [
+      'ONE' or 'TWO' or 'THREE'
+    ]
+    
+    Answer:
+    
+    ---LLM REPLY---
+    [
+      'ONE',
+      'THREE'
+    ]
+    ---Parsed Response (list<enum EnumOutput>)---
+    [
+      "ONE",
+      "THREE"
+    ]
+[2024-08-27T07:50:27Z INFO  baml_events] Function FnEnumOutput:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 2055ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Choose one of these values randomly. Before you give the answer, write out an unrelated haiku about the ocean.
+    
+    VALUE_ENUM
+    ----
+    - ONE
+    - TWO
+    - THREE
+    
+    ---LLM REPLY---
+    Waves crash upon shore
+    Majestic beauty abounds
+    Ocean's song, eternal
+    
+    VALUE_ENUM
+    ----
+    - TWO
+    ---Parsed Response (enum EnumOutput)---
+    "TWO"
+

Teardown

PASSED test_should_work_with_image_url 0:00:01.113243

Setup

Call

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

Teardown

PASSED test_should_work_with_image_list 0:00:03.607883

Setup

Call

Captured stderr call
[2024-08-27T07:50:31Z INFO  baml_events] Function TestImageListInput:
+    Client: GPT4o (gpt-4o-2024-05-13) - 3599ms. 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 primary colors in common between the two images are green and brown:
+    
+    1. **Green**: This is evident in the first image (character's skin) and in the second image ("Google" logo has a green 'l').
+    2. **Brown**: Concisely present in the first image (character's vest and boots) and less prominent but occasionally used in Google's branding (though not represented clearly in the logo shown here).
+    
+    Other colors in the two images do not match exactly, for instance:
+    
+    - The character has a pale beige outfit which isn't present in the Google logo.
+    - The Google logo includes red, yellow, and blue which are not found in the character's image.
+    ---Parsed Response (string)---
+    "The primary colors in common between the two images are green and brown:\n\n1. **Green**: This is evident in the first image (character's skin) and in the second image (\"Google\" logo has a green 'l').\n2. **Brown**: Concisely present in the first image (character's vest and boots) and less prominent but occasionally used in Google's branding (though not represented clearly in the logo shown here).\n\nOther colors in the two images do not match exactly, for instance:\n\n- The character has a pale beige outfit which isn't present in the Google logo.\n- The Google logo includes red, yellow, and blue which are not found in the character's image."
+

Teardown

FAILED test_should_work_with_vertex 0:00:00.004882

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: 1724745031, tv_nsec: 794539000 }, latency: 239.959µs, message: "Error {\n    context: \"Failed to build request\",\n    source: \"Service account not found\",\n}", code: Other(2) }

Setup

Call

@pytest.mark.asyncio
     async def test_should_work_with_vertex():
 >       res = await b.TestVertex("donkey kong")
 
-tests/test_functions.py:181: 
-_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
+tests/test_functions.py:182: 
+_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
 
-self = , input = 'donkey kong', baml_options = {}
+self = , input = 'donkey kong', baml_options = {}
 
     async def TestVertex(
         self,
@@ -69,119 +367,1854 @@
       )
       mdl = create_model("TestVertexReturnType", inner=(str, ...))
 >     return coerce(mdl, raw.parsed())
-E     baml_py.BamlError: 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: 1724602011, tv_nsec: 40061000 }, latency: 234.125µs, message: "Error {\n    context: \"Failed to build request\",\n    source: \"Service account not found\",\n}", code: Other(2) }
-
-baml_client/async_client.py:1836: BamlError

Teardown

PASSED test_should_work_with_image_base64 0:00:01.001880

Setup

Call

Teardown

PASSED test_should_work_with_audio_base64 0:00:01.069176

Setup

Call

Teardown

PASSED test_should_work_with_audio_url 0:00:01.026211

Setup

Call

Teardown

PASSED test_works_with_retries2 0:00:01.909465

Setup

Call

Teardown

PASSED test_works_with_fallbacks 0:00:01.456765

Setup

Call

Teardown

PASSED test_claude 0:00:00.810304

Setup

Call

Teardown

PASSED test_gemini 0:00:08.455440

Setup

Call

Teardown

PASSED test_gemini_streaming 0:00:09.927347

Setup

Call

Teardown

PASSED test_aws 0:00:02.175537

Setup

Call

Teardown

PASSED test_openai_shorthand 0:00:05.224078

Setup

Call

Teardown

PASSED test_openai_shorthand_streaming 0:00:05.385128

Setup

Call

Teardown

PASSED test_anthropic_shorthand 0:00:02.746796

Setup

Call

Teardown

PASSED test_anthropic_shorthand_streaming 0:00:03.121021

Setup

Call

Teardown

PASSED test_fallback_to_shorthand 0:00:00.705662

Setup

Call

Teardown

PASSED test_aws_streaming 0:00:01.571585

Setup

Call

Teardown

PASSED test_streaming 0:00:04.389992

Setup

Call

Teardown

PASSED test_streaming_uniterated 0:00:02.947902

Setup

Call

Teardown

PASSED test_streaming_sync 0:00:03.298695

Setup

Call

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

Teardown

PASSED test_streaming_uniterated_sync 0:00:03.044685

Setup

Call

Teardown

PASSED test_streaming_claude 0:00:00.593107

Setup

Call

Teardown

PASSED test_streaming_gemini 0:00:06.893688

Setup

Call

Teardown

PASSED test_tracing_async_only 0:00:05.101920

Setup

Call

Teardown

PASSED test_tracing_sync 0:00:00.001171

Setup

Call

Teardown

PASSED test_tracing_thread_pool 0:00:01.437445

Setup

Call

Teardown

PASSED test_tracing_thread_pool_async 0:00:14.296113

Setup

Call

Teardown

PASSED test_tracing_async_gather 0:00:01.313355

Setup

Call

Teardown

PASSED test_tracing_async_gather_top_level 0:00:01.464294

Setup

Call

Teardown

PASSED test_dynamic 0:00:00.892128

Setup

Call

Teardown

PASSED test_dynamic_class_output 0:00:01.149542

Setup

Call

Teardown

PASSED test_dynamic_class_nested_output_no_stream 0:00:01.502034

Setup

Call

Teardown

PASSED test_dynamic_class_nested_output_stream 0:00:00.726042

Setup

Call

Teardown

PASSED test_stream_dynamic_class_output 0:00:00.747202

Setup

Call

Teardown

PASSED test_dynamic_inputs_list2 0:00:01.231266

Setup

Call

Teardown

PASSED test_dynamic_inputs_list 0:00:01.213410

Setup

Call

Teardown

PASSED test_dynamic_output_map 0:00:00.783542

Setup

Call

Teardown

PASSED test_dynamic_output_union 0:00:02.002265

Setup

Call

Teardown

FAILED test_nested_class_streaming 0:00:11.987666

baml_py.BamlError: Client: Ollama (llama2) - 11977ms. StopReason: stop
----PROMPT---
-[chat] system: Return a made up json blob that matches this schema:
-Answer in JSON using this schema:
-{
-  prop1: string,
-  prop2: {
-    prop1: string,
-    prop2: string,
-    inner: {
+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: 1724745031, tv_nsec: 794539000 }, latency: 239.959µs, message: "Error {\n    context: \"Failed to build request\",\n    source: \"Service account not found\",\n}", code: Other(2) }
+
+baml_client/async_client.py:1860: BamlClientError
Captured stderr call
[2024-08-27T07:50:31Z WARN  baml_events] Function TestVertex:
+    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: 1724745031, tv_nsec: 794539000 }, latency: 239.959µs, message: "Error {\n    context: \"Failed to build request\",\n    source: \"Service account not found\",\n}", code: Other(2) }
+    
+

Teardown

PASSED test_should_work_with_image_base64 0:00:01.278204

Setup

Call

Captured stderr call
[2024-08-27T07:50:33Z INFO  baml_events] Function TestImageInput:
+    Client: GPT4o (gpt-4o-2024-05-13) - 1262ms. StopReason: stop
+    ---PROMPT---
+    [chat] user: Describe this in 4 words. One word must be the color<image_placeholder base64>
+    
+    ---LLM REPLY---
+    Green ogre in vest.
+    ---Parsed Response (string)---
+    "Green ogre in vest."
+

Teardown

PASSED test_should_work_with_audio_base64 0:00:03.109679

Setup

Call

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

Teardown

PASSED test_should_work_with_audio_url 0:00:08.750814

Setup

Call

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

Teardown

PASSED test_works_with_retries2 0:00:01.993470

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: 1724745046, tv_nsec: 819946000 }, latency: 156.428042ms, 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-08-27T07:50:46Z WARN  baml_events] Function TestRetryExponential:
+    (3 other previous tries)
+    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: 1724745046, tv_nsec: 819946000 }, latency: 156.428042ms, message: "Request failed: {\n    \"error\": {\n        \"message\": \"Incorrect API key provided: blahh. You can find your API key at https://platform.openai.com/account/api-keys.\",\n        \"type\": \"invalid_request_error\",\n        \"param\": null,\n        \"code\": \"invalid_api_key\"\n    }\n}\n", code: InvalidAuthentication }
+    
+

Teardown

PASSED test_works_with_fallbacks 0:00:01.603614

Setup

Call

Captured stderr call
[2024-08-27T07:50:48Z INFO  baml_events] Function TestFallbackClient:
+    (5 other previous tries)
+    Client: GPT35 (gpt-3.5-turbo-0125) - 677ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Say a haiku about mexico.
+    
+    ---LLM REPLY---
+    Vibrant fiestas call,
+    Tacos, tequila, and sun,
+    Mexico's beauty.
+    ---Parsed Response (string)---
+    "Vibrant fiestas call,\nTacos, tequila, and sun,\nMexico's beauty."
+

Teardown

PASSED test_claude 0:00:00.708697

Setup

Call

Captured stderr call
[2024-08-27T07:50:49Z INFO  baml_events] Function PromptTestClaude:
+    Client: Claude (claude-3-haiku-20240307) - 703ms. StopReason: "end_turn"
+    ---PROMPT---
+    [chat] user: Tell me a haiku about Mt Rainier is tall
+    
+    ---LLM REPLY---
+    Here is a haiku about Mt. Rainier:
+    
+    Towering high peak
+    Majestic Mount Rainier stands
+    Reaching for the sky.
+    ---Parsed Response (string)---
+    "Here is a haiku about Mt. Rainier:\n\nTowering high peak\nMajestic Mount Rainier stands\nReaching for the sky."
+

Teardown

PASSED test_gemini 0:00:13.941754

Setup

Call

Captured stdout call
LLM output from Gemini: Bartholomew "Bubbles" Pepper wasn't your typical squirrel. Sure, he enjoyed the occasional acorn and the thrill of a daring leap between branches. But Bubbles harbored a secret dream: to become a doctor. 
+
+He wasn't quite sure where this aspiration came from. Maybe it was the countless hours he spent observing Mrs. Willow, the park's resident healer, tending to injured birds with dandelion fluff and dewdrop poultices. Or perhaps it was the dog-eared copy of "Gray's Anatomy" he'd found discarded near a park bench, its pages filled with intriguing diagrams of skeletal structures and organ systems.
+
+Whatever the source, Bubbles’ passion burned bright. He traded acorns for discarded magnifying glasses and repurposed fallen leaves as bandages for injured beetles. His patients, initially skeptical, soon warmed to his earnest demeanor and surprisingly effective treatments.
+
+News of Dr. Pepper, as he became affectionately known, spread through the park and beyond. Squirrels from neighboring groves sought his advice, pigeons flew in with sprained wings, and even a grumpy old raccoon with a limp put aside his distrust for this unusual physician.
+
+Dr. Pepper, once just a squirrel with a dream, had become a symbol of hope and healing, proving that even the smallest creature could make a difference with a big heart and a thirst for knowledge. His story served as a constant reminder that within every ordinary being resided the potential for extraordinary things.  
+
+
Captured stderr call
[2024-08-27T07:51:03Z INFO  baml_events] Function TestGemini:
+    Client: Gemini () - 13933ms. StopReason: "STOP"
+    ---PROMPT---
+    [chat] user: Write a nice short story about Dr. Pepper
+    
+    ---LLM REPLY---
+    Bartholomew "Bubbles" Pepper wasn't your typical squirrel. Sure, he enjoyed the occasional acorn and the thrill of a daring leap between branches. But Bubbles harbored a secret dream: to become a doctor. 
+    
+    He wasn't quite sure where this aspiration came from. Maybe it was the countless hours he spent observing Mrs. Willow, the park's resident healer, tending to injured birds with dandelion fluff and dewdrop poultices. Or perhaps it was the dog-eared copy of "Gray's Anatomy" he'd found discarded near a park bench, its pages filled with intriguing diagrams of skeletal structures and organ systems.
+    
+    Whatever the source, Bubbles’ passion burned bright. He traded acorns for discarded magnifying glasses and repurposed fallen leaves as bandages for injured beetles. His patients, initially skeptical, soon warmed to his earnest demeanor and surprisingly effective treatments.
+    
+    News of Dr. Pepper, as he became affectionately known, spread through the park and beyond. Squirrels from neighboring groves sought his advice, pigeons flew in with sprained wings, and even a grumpy old raccoon with a limp put aside his distrust for this unusual physician.
+    
+    Dr. Pepper, once just a squirrel with a dream, had become a symbol of hope and healing, proving that even the smallest creature could make a difference with a big heart and a thirst for knowledge. His story served as a constant reminder that within every ordinary being resided the potential for extraordinary things.  
+    
+    ---Parsed Response (string)---
+    "Bartholomew \"Bubbles\" Pepper wasn't your typical squirrel. Sure, he enjoyed the occasional acorn and the thrill of a daring leap between branches. But Bubbles harbored a secret dream: to become a doctor. \n\nHe wasn't quite sure where this aspiration came from. Maybe it was the countless hours he spent observing Mrs. Willow, the park's resident healer, tending to injured birds with dandelion fluff and dewdrop poultices. Or perhaps it was the dog-eared copy of \"Gray's Anatomy\" he'd found discarded near a park bench, its pages filled with intriguing diagrams of skeletal structures and organ systems.\n\nWhatever the source, Bubbles’ passion burned bright. He traded acorns for discarded magnifying glasses and repurposed fallen leaves as bandages for injured beetles. His patients, initially skeptical, soon warmed to his earnest demeanor and surprisingly effective treatments.\n\nNews of Dr. Pepper, as he became affectionately known, spread through the park and beyond. Squirrels from neighboring groves sought his advice, pigeons flew in with sprained wings, and even a grumpy old raccoon with a limp put aside his distrust for this unusual physician.\n\nDr. Pepper, once just a squirrel with a dream, had become a symbol of hope and healing, proving that even the smallest creature could make a difference with a big heart and a thirst for knowledge. His story served as a constant reminder that within every ordinary being resided the potential for extraordinary things.  \n"
+

Teardown

PASSED test_gemini_streaming 0:00:21.664820

Setup

Call

Captured stdout call
LLM output from Gemini: The antique shop was crammed with forgotten treasures, each object humming with silent stories. Among them, nestled between a chipped porcelain doll and a tarnished silver hand mirror, sat a dusty green glass bottle. Etched on its side, beneath a thin layer of grime, were the words "Dr Pepper."
+
+A young boy named Finn, his eyes bright with curiosity, picked up the bottle. It was surprisingly heavy, cool to the touch. "What's this, Grandpa?" he asked, turning to the kindly old man arranging a display of vintage postcards.
+
+Grandpa George smiled. "Ah, Dr Pepper," he chuckled, his eyes twinkling. "That, my boy, is a taste of legend."
+
+He led Finn to a worn leather armchair and, with a storyteller's flair, began to weave a tale. He spoke of a time long ago, when soda fountains were palaces of sweet delight and Dr Pepper was the king of unique flavors. He described the drink's mysterious 23 flavors, a secret recipe whispered on the wind, and how each sip was like a burst of pure joy.
+
+Finn listened, captivated, his imagination painting vivid pictures of a bygone era. He imagined dapper gentlemen sipping Dr Pepper in grand saloons, flapper girls giggling over their frosted glasses at soda fountains, and children like him, eyes wide with wonder, savoring the sweet, fizzy magic.
+
+Finally, Grandpa George finished his story. Finn, his head full of sparkling images, carefully placed the bottle back on the shelf. "I wish I could try it," he sighed, a little wistfully.
+
+Grandpa George winked. "Who says you can't?" He reached under the counter and pulled out a cold, familiar green glass bottle, its label gleaming new. "Legend has it," he said, handing it to Finn with a flourish, "that Dr Pepper still tastes just as magical today."
+
+Finn’s face lit up as he twisted off the cap, the familiar fizz echoing the stories he'd just heard. He took a long, slow sip, and his eyes widened. It was sweet, yes, but with a complexity he couldn't quite place. Spicy, fruity, familiar yet surprising, like a secret whispered on his tongue. 
+
+It wasn't just a drink, Finn realized; it was a taste of history, a sip of legend, and in that moment, he understood the magic of Dr Pepper. 
+
+
Captured stderr call
[2024-08-27T07:51:24Z INFO  baml_events] Function TestGemini:
+    Client: Gemini (gemini-1.5-pro-001) - 21640ms. StopReason: Stop
+    ---PROMPT---
+    [chat] user: Write a nice short story about Dr. Pepper
+    
+    ---LLM REPLY---
+    The antique shop was crammed with forgotten treasures, each object humming with silent stories. Among them, nestled between a chipped porcelain doll and a tarnished silver hand mirror, sat a dusty green glass bottle. Etched on its side, beneath a thin layer of grime, were the words "Dr Pepper."
+    
+    A young boy named Finn, his eyes bright with curiosity, picked up the bottle. It was surprisingly heavy, cool to the touch. "What's this, Grandpa?" he asked, turning to the kindly old man arranging a display of vintage postcards.
+    
+    Grandpa George smiled. "Ah, Dr Pepper," he chuckled, his eyes twinkling. "That, my boy, is a taste of legend."
+    
+    He led Finn to a worn leather armchair and, with a storyteller's flair, began to weave a tale. He spoke of a time long ago, when soda fountains were palaces of sweet delight and Dr Pepper was the king of unique flavors. He described the drink's mysterious 23 flavors, a secret recipe whispered on the wind, and how each sip was like a burst of pure joy.
+    
+    Finn listened, captivated, his imagination painting vivid pictures of a bygone era. He imagined dapper gentlemen sipping Dr Pepper in grand saloons, flapper girls giggling over their frosted glasses at soda fountains, and children like him, eyes wide with wonder, savoring the sweet, fizzy magic.
+    
+    Finally, Grandpa George finished his story. Finn, his head full of sparkling images, carefully placed the bottle back on the shelf. "I wish I could try it," he sighed, a little wistfully.
+    
+    Grandpa George winked. "Who says you can't?" He reached under the counter and pulled out a cold, familiar green glass bottle, its label gleaming new. "Legend has it," he said, handing it to Finn with a flourish, "that Dr Pepper still tastes just as magical today."
+    
+    Finn’s face lit up as he twisted off the cap, the familiar fizz echoing the stories he'd just heard. He took a long, slow sip, and his eyes widened. It was sweet, yes, but with a complexity he couldn't quite place. Spicy, fruity, familiar yet surprising, like a secret whispered on his tongue. 
+    
+    It wasn't just a drink, Finn realized; it was a taste of history, a sip of legend, and in that moment, he understood the magic of Dr Pepper. 
+    
+    ---Parsed Response (string)---
+    "The antique shop was crammed with forgotten treasures, each object humming with silent stories. Among them, nestled between a chipped porcelain doll and a tarnished silver hand mirror, sat a dusty green glass bottle. Etched on its side, beneath a thin layer of grime, were the words \"Dr Pepper.\"\n\nA young boy named Finn, his eyes bright with curiosity, picked up the bottle. It was surprisingly heavy, cool to the touch. \"What's this, Grandpa?\" he asked, turning to the kindly old man arranging a display of vintage postcards.\n\nGrandpa George smiled. \"Ah, Dr Pepper,\" he chuckled, his eyes twinkling. \"That, my boy, is a taste of legend.\"\n\nHe led Finn to a worn leather armchair and, with a storyteller's flair, began to weave a tale. He spoke of a time long ago, when soda fountains were palaces of sweet delight and Dr Pepper was the king of unique flavors. He described the drink's mysterious 23 flavors, a secret recipe whispered on the wind, and how each sip was like a burst of pure joy.\n\nFinn listened, captivated, his imagination painting vivid pictures of a bygone era. He imagined dapper gentlemen sipping Dr Pepper in grand saloons, flapper girls giggling over their frosted glasses at soda fountains, and children like him, eyes wide with wonder, savoring the sweet, fizzy magic.\n\nFinally, Grandpa George finished his story. Finn, his head full of sparkling images, carefully placed the bottle back on the shelf. \"I wish I could try it,\" he sighed, a little wistfully.\n\nGrandpa George winked. \"Who says you can't?\" He reached under the counter and pulled out a cold, familiar green glass bottle, its label gleaming new. \"Legend has it,\" he said, handing it to Finn with a flourish, \"that Dr Pepper still tastes just as magical today.\"\n\nFinn’s face lit up as he twisted off the cap, the familiar fizz echoing the stories he'd just heard. He took a long, slow sip, and his eyes widened. It was sweet, yes, but with a complexity he couldn't quite place. Spicy, fruity, familiar yet surprising, like a secret whispered on his tongue. \n\nIt wasn't just a drink, Finn realized; it was a taste of history, a sip of legend, and in that moment, he understood the magic of Dr Pepper. \n"
+

Teardown

PASSED test_aws 0:00:02.697402

Setup

Call

Captured stderr call
[2024-08-27T07:51:27Z INFO  baml_events] Function TestAws:
+    Client: AwsBedrock (anthropic.claude-3-haiku-20240307-v1:0) - 2516ms. 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:
+    
+    Towering High
+    
+    The morning sun peeked over the horizon, casting a warm glow across the forested landscape. As I stepped outside, my gaze was immediately drawn upwards to the majestic sight before me - the snow-capped peak of Mount Rainier, standing tall and proud against the clear blue sky.
+    
+    At 14,411 feet, this iconic volcano dominates the skyline,
+    ---Parsed Response (string)---
+    "Here is a short story about Mount Rainier:\n\nTowering High\n\nThe morning sun peeked over the horizon, casting a warm glow across the forested landscape. As I stepped outside, my gaze was immediately drawn upwards to the majestic sight before me - the snow-capped peak of Mount Rainier, standing tall and proud against the clear blue sky.\n\nAt 14,411 feet, this iconic volcano dominates the skyline,"
+

Teardown

PASSED test_openai_shorthand 0:00:07.871869

Setup

Call

Captured stderr call
[2024-08-27T07:51:35Z INFO  baml_events] Function TestOpenAIShorthand:
+    Client: openai/gpt-4o-mini (gpt-4o-mini-2024-07-18) - 7864ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Write a nice short story about Mt Rainier is tall
+    
+    ---LLM REPLY---
+    In a small town nestled at the base of Mt. Rainier, the community was united by a shared admiration for the majestic mountain that towered above them. Known as “Tacoma’s Sentinel,” Mt. Rainier was more than just a breathtaking view; it was a symbol of strength, resilience, and hope.
+    
+    Each year, as spring melted the winter snows and flowers began to bloom, the townsfolk celebrated “Rainier Day.” It was a festival filled with laughter, music, and stories of the mountain’s majesty. Families gathered in the park, children painted colorful pictures of the iconic peak, and local artisans displayed crafts inspired by the natural beauty surrounding them.
+    
+    Evelyn, a spirited eight-year-old with twinkling hazel eyes, had always been intrigued by the mountain’s towering presence. Unlike other children who spent their days playing in the park, she often found herself staring at Mt. Rainier, dreaming of adventure. On Rainier Day, her heart raced with excitement as the community prepared for the festivities, but her true desire was to climb the mountain.
+    
+    It was tradition for a local guide to lead a special hike to a scenic viewpoint on Rainier Day, and Evelyn had been waiting for this moment for years. This time, she mustered the courage to ask her mother if she could join the group. Her mother smiled and nodded, understanding that her daughter’s heart was set on an adventure.
+    
+    As the sun rose on Rainier Day, Evelyn joined a small group of hikers. With every step, she felt a sense of delight. The air was crisp, and the scent of pine filled her lungs. The mountain stood tall and proud, its snow-capped peak glimmering in the sunlight, beckoning them closer.
+    
+    Evelyn walked beside the guide, a kind man named Mr. Thompson, who shared tales of the mountain’s history. “Mt. Rainier is not just the tallest peak in Washington; it’s also a beacon of endurance,” he explained. “Many have climbed her, and each one has a story to tell.”
+    
+    As they ascended, the trail wound through fields of vibrant wildflowers, each one more beautiful than the last. Evelyn danced through the blooms, giggling with delight. The higher they climbed, the more magnificent the views became. When they finally reached the viewpoint, Evelyn stood in awe, gazing at the sprawling landscape below.
+    
+    The sun dipped low on the horizon, casting a warm golden hue over the world. The clouds seemed like soft cotton candy, floating lazily as if to celebrate the day. Evelyn’s heart swelled with joy; she felt as if she was on top of the world.
+    
+    “I see why everyone loves this mountain,” she whispered, her eyes wide with wonder. Mr. Thompson smiled, knowing that this moment would forever be etched in her heart.
+    
+    As they descended, the sky turned a brilliant shade of orange and pink, painting the mountain in hues of fire. Evelyn had climbed only a small part of Mt. Rainier, but it felt monumental. She had faced her fear, embraced the spirit of adventure, and connected with something vast and powerful.
+    
+    That night, as the townsfolk gathered to celebrate Rainier Day, Evelyn couldn’t stop telling her friends about her hike. “Mt. Rainier is tall, but climbing it makes you feel even taller!” she exclaimed, her eyes sparkling like the stars above.
+    
+    And as the festival came to life with laughter, music, and the bittersweet taste of summer, everyone knew that beneath the towering presence of Mt. Rainier, they were all part of a grand, shared story—one of adventure, friendship, and the incredible beauty of nature.
+    ---Parsed Response (string)---
+    "In a small town nestled at the base of Mt. Rainier, the community was united by a shared admiration for the majestic mountain that towered above them. Known as “Tacoma’s Sentinel,” Mt. Rainier was more than just a breathtaking view; it was a symbol of strength, resilience, and hope.\n\nEach year, as spring melted the winter snows and flowers began to bloom, the townsfolk celebrated “Rainier Day.” It was a festival filled with laughter, music, and stories of the mountain’s majesty. Families gathered in the park, children painted colorful pictures of the iconic peak, and local artisans displayed crafts inspired by the natural beauty surrounding them.\n\nEvelyn, a spirited eight-year-old with twinkling hazel eyes, had always been intrigued by the mountain’s towering presence. Unlike other children who spent their days playing in the park, she often found herself staring at Mt. Rainier, dreaming of adventure. On Rainier Day, her heart raced with excitement as the community prepared for the festivities, but her true desire was to climb the mountain.\n\nIt was tradition for a local guide to lead a special hike to a scenic viewpoint on Rainier Day, and Evelyn had been waiting for this moment for years. This time, she mustered the courage to ask her mother if she could join the group. Her mother smiled and nodded, understanding that her daughter’s heart was set on an adventure.\n\nAs the sun rose on Rainier Day, Evelyn joined a small group of hikers. With every step, she felt a sense of delight. The air was crisp, and the scent of pine filled her lungs. The mountain stood tall and proud, its snow-capped peak glimmering in the sunlight, beckoning them closer.\n\nEvelyn walked beside the guide, a kind man named Mr. Thompson, who shared tales of the mountain’s history. “Mt. Rainier is not just the tallest peak in Washington; it’s also a beacon of endurance,” he explained. “Many have climbed her, and each one has a story to tell.”\n\nAs they ascended, the trail wound through fields of vibrant wildflowers, each one more beautiful than the last. Evelyn danced through the blooms, giggling with delight. The higher they climbed, the more magnificent the views became. When they finally reached the viewpoint, Evelyn stood in awe, gazing at the sprawling landscape below.\n\nThe sun dipped low on the horizon, casting a warm golden hue over the world. The clouds seemed like soft cotton candy, floating lazily as if to celebrate the day. Evelyn’s heart swelled with joy; she felt as if she was on top of the world.\n\n“I see why everyone loves this mountain,” she whispered, her eyes wide with wonder. Mr. Thompson smiled, knowing that this moment would forever be etched in her heart.\n\nAs they descended, the sky turned a brilliant shade of orange and pink, painting the mountain in hues of fire. Evelyn had climbed only a small part of Mt. Rainier, but it felt monumental. She had faced her fear, embraced the spirit of adventure, and connected with something vast and powerful.\n\nThat night, as the townsfolk gathered to celebrate Rainier Day, Evelyn couldn’t stop telling her friends about her hike. “Mt. Rainier is tall, but climbing it makes you feel even taller!” she exclaimed, her eyes sparkling like the stars above.\n\nAnd as the festival came to life with laughter, music, and the bittersweet taste of summer, everyone knew that beneath the towering presence of Mt. Rainier, they were all part of a grand, shared story—one of adventure, friendship, and the incredible beauty of nature."
+

Teardown

PASSED test_openai_shorthand_streaming 0:00:08.866322

Setup

Call

Captured stderr call
[2024-08-27T07:51:44Z INFO  baml_events] Function TestOpenAIShorthand:
+    Client: openai/gpt-4o-mini (gpt-4o-mini-2024-07-18) - 8857ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Write a nice short story about Mt Rainier is tall
+    
+    ---LLM REPLY---
+    Once upon a time in the lush green forests of Washington State, there lived a mountain named Mt. Rainier. Towering at 14,411 feet, it was the tallest peak in the Cascade Range. To the trees, the rivers, and the wild animals, Mt. Rainier was no ordinary mountain; it was a gentle giant, a sentinel watching over the land.
+    
+    Every morning, as the sun's golden rays rose above the horizon, Mt. Rainier adorned itself in a shimmering blanket of snow. Its majestic slopes caught the early light, transforming the mountain into a canvas of soft pinks and glowing oranges. The birds would sing, the deer would graze, and everyone would pause for a moment to admire the breathtaking view. 
+    
+    But what the inhabitants of the valley didn’t know was that Mt. Rainier had dreams of its own. High above sea level, where the air was thin and crisp, the mountain often gazed longingly at the sky. "How wonderful it would be," thought Rainier, "to touch the stars and dance with the clouds!"
+    
+    One particular day, as the mountain daydreamed, a little girl named Elara and her mother set out on a hiking adventure. They climbed and climbed, the air getting thinner and the views becoming more spectacular with each step. Elara looked up in awe at the towering mountain, feeling small yet safe under its watchful gaze.
+    
+    "Mom, do you think we can reach the top?" Elara asked, her eyes sparkling with determination.
+    
+    “You can reach any height you set your mind to,” her mother encouraged, “but the journey itself is just as important.”
+    
+    With her mother’s encouragement, Elara pressed on. As they hiked, they met cheerful marmots, playful pikas, and delicate wildflowers in every color imaginable. They listened to the whisper of the wind and the distant sound of a rushing waterfall. With every footfall, Elara’s love for the mountain grew.
+    
+    After hours of climbing, they finally reached a vista point that took their breath away. The view was nothing short of magical. Forests sprawled below, rivers sparkled like silver ribbons, and far in the distance, the peaks of the Cascade Mountains formed a jagged skyline. 
+    
+    As Elara stood still, mesmerized, the mountain felt her admiration. "If only I could show her the stars," thought Mt. Rainier, "if only she could know how close I am to the universe above!"
+    
+    That evening, just as the sun dipped below the horizon, Elara and her mother prepared to head back down. But as twilight deepened into night, the skies unveiled their secrets. Stars twinkled into existence, casting a celestial glow over the mountain.
+    
+    Elara gasped, pointing upwards. “Look, Mom! It’s like the universe has come down to meet us!” She could scarcely believe the beauty above her, each star shimmering with a kind of magic that made her heart race.
+    
+    Mt. Rainier, feeling fulfilled, basked in the moment. Although it couldn't reach the stars, it realized that through Elara’s dreams and spirit, it had connected to the infinite beauty of the sky. 
+    
+    With a heart full of joy, Elara turned to her mother. “I want to be as tall and strong as Mt. Rainier, reaching for the stars just like it does!” Her mother smiled, embracing her with pride.
+    
+    And so, from that day on, every time Elara looked at the towering mountain in the distance, she remembered her adventure and the dreams they both shared. Mt. Rainier continued to stand tall, a statue of resilience and wonder, inspiring all those who gazed upon it to reach for their own stars. The little girl’s aspirations echoed in its peaks, telling a story of connection and the power of dreams.
+    
+    And in the heart of the forest, the gentle giant smiled down, knowing that it had woven a new dream into the fabric of the universe, one that would forever shine brightly in the night sky.
+    ---Parsed Response (string)---
+    "Once upon a time in the lush green forests of Washington State, there lived a mountain named Mt. Rainier. Towering at 14,411 feet, it was the tallest peak in the Cascade Range. To the trees, the rivers, and the wild animals, Mt. Rainier was no ordinary mountain; it was a gentle giant, a sentinel watching over the land.\n\nEvery morning, as the sun's golden rays rose above the horizon, Mt. Rainier adorned itself in a shimmering blanket of snow. Its majestic slopes caught the early light, transforming the mountain into a canvas of soft pinks and glowing oranges. The birds would sing, the deer would graze, and everyone would pause for a moment to admire the breathtaking view. \n\nBut what the inhabitants of the valley didn’t know was that Mt. Rainier had dreams of its own. High above sea level, where the air was thin and crisp, the mountain often gazed longingly at the sky. \"How wonderful it would be,\" thought Rainier, \"to touch the stars and dance with the clouds!\"\n\nOne particular day, as the mountain daydreamed, a little girl named Elara and her mother set out on a hiking adventure. They climbed and climbed, the air getting thinner and the views becoming more spectacular with each step. Elara looked up in awe at the towering mountain, feeling small yet safe under its watchful gaze.\n\n\"Mom, do you think we can reach the top?\" Elara asked, her eyes sparkling with determination.\n\n“You can reach any height you set your mind to,” her mother encouraged, “but the journey itself is just as important.”\n\nWith her mother’s encouragement, Elara pressed on. As they hiked, they met cheerful marmots, playful pikas, and delicate wildflowers in every color imaginable. They listened to the whisper of the wind and the distant sound of a rushing waterfall. With every footfall, Elara’s love for the mountain grew.\n\nAfter hours of climbing, they finally reached a vista point that took their breath away. The view was nothing short of magical. Forests sprawled below, rivers sparkled like silver ribbons, and far in the distance, the peaks of the Cascade Mountains formed a jagged skyline. \n\nAs Elara stood still, mesmerized, the mountain felt her admiration. \"If only I could show her the stars,\" thought Mt. Rainier, \"if only she could know how close I am to the universe above!\"\n\nThat evening, just as the sun dipped below the horizon, Elara and her mother prepared to head back down. But as twilight deepened into night, the skies unveiled their secrets. Stars twinkled into existence, casting a celestial glow over the mountain.\n\nElara gasped, pointing upwards. “Look, Mom! It’s like the universe has come down to meet us!” She could scarcely believe the beauty above her, each star shimmering with a kind of magic that made her heart race.\n\nMt. Rainier, feeling fulfilled, basked in the moment. Although it couldn't reach the stars, it realized that through Elara’s dreams and spirit, it had connected to the infinite beauty of the sky. \n\nWith a heart full of joy, Elara turned to her mother. “I want to be as tall and strong as Mt. Rainier, reaching for the stars just like it does!” Her mother smiled, embracing her with pride.\n\nAnd so, from that day on, every time Elara looked at the towering mountain in the distance, she remembered her adventure and the dreams they both shared. Mt. Rainier continued to stand tall, a statue of resilience and wonder, inspiring all those who gazed upon it to reach for their own stars. The little girl’s aspirations echoed in its peaks, telling a story of connection and the power of dreams.\n\nAnd in the heart of the forest, the gentle giant smiled down, knowing that it had woven a new dream into the fabric of the universe, one that would forever shine brightly in the night sky."
+

Teardown

PASSED test_anthropic_shorthand 0:00:03.119958

Setup

Call

Captured stderr call
[2024-08-27T07:51:47Z INFO  baml_events] Function TestAnthropicShorthand:
+    Client: anthropic/claude-3-haiku-20240307 (claude-3-haiku-20240307) - 3113ms. StopReason: "end_turn"
+    ---PROMPT---
+    [chat] user: Write a nice short story about Mt Rainier is tall
+    
+    ---LLM REPLY---
+    Here is a short story about Mt. Rainier:
+    
+    Towering above the lush, green forests of the Pacific Northwest, Mt. Rainier stands as an awe-inspiring sight. At 14,411 feet, it is the tallest mountain in the Cascade Range, dominating the landscape for miles around.
+    
+    As the morning sun slowly crests the horizon, its golden rays illuminate the snow-capped peak, transforming it into a majestic, glowing monument. Hikers pausing to gaze up at its grandeur can't help but feel a sense of wonder and insignificance in the face of such raw, natural power.
+    
+    The mountain's sheer size is humbling, a constant reminder of the incredible forces that have shaped the Earth over millennia. Glaciers cling to its steep slopes, remnants of the ice ages that once covered the region. Steam vents and fumaroles near the summit attest to the volcanic origins of this sleeping giant.
+    
+    For the people who live in the shadow of Mt. Rainier, it is a cherished symbol of home, a touchstone in an ever-changing world. They know its moods - the way the clouds swirl around the peak, the brilliant alpenglow that paints the snow in vibrant hues at sunset. To them, this towering mountain is a faithful companion, a timeless presence that has watched over the land for eons.
+    
+    Whether viewed from afar or explored up close, Mt. Rainier evokes a sense of smallness and humility. Its towering height is a testament to the raw, untamed power of nature, a majestic reminder of our place in the grand sweep of the natural world.
+    ---Parsed Response (string)---
+    "Here is a short story about Mt. Rainier:\n\nTowering above the lush, green forests of the Pacific Northwest, Mt. Rainier stands as an awe-inspiring sight. At 14,411 feet, it is the tallest mountain in the Cascade Range, dominating the landscape for miles around.\n\nAs the morning sun slowly crests the horizon, its golden rays illuminate the snow-capped peak, transforming it into a majestic, glowing monument. Hikers pausing to gaze up at its grandeur can't help but feel a sense of wonder and insignificance in the face of such raw, natural power.\n\nThe mountain's sheer size is humbling, a constant reminder of the incredible forces that have shaped the Earth over millennia. Glaciers cling to its steep slopes, remnants of the ice ages that once covered the region. Steam vents and fumaroles near the summit attest to the volcanic origins of this sleeping giant.\n\nFor the people who live in the shadow of Mt. Rainier, it is a cherished symbol of home, a touchstone in an ever-changing world. They know its moods - the way the clouds swirl around the peak, the brilliant alpenglow that paints the snow in vibrant hues at sunset. To them, this towering mountain is a faithful companion, a timeless presence that has watched over the land for eons.\n\nWhether viewed from afar or explored up close, Mt. Rainier evokes a sense of smallness and humility. Its towering height is a testament to the raw, untamed power of nature, a majestic reminder of our place in the grand sweep of the natural world."
+

Teardown

PASSED test_anthropic_shorthand_streaming 0:00:03.011275

Setup

Call

Captured stderr call
[2024-08-27T07:51:50Z INFO  baml_events] Function TestAnthropicShorthand:
+    Client: anthropic/claude-3-haiku-20240307 (claude-3-haiku-20240307) - 2973ms. StopReason: "end_turn"
+    ---PROMPT---
+    [chat] user: Write a nice short story about Mt Rainier is tall
+    
+    ---LLM REPLY---
+    Here is a short story about Mount Rainier:
+    
+    The Majesty of Mount Rainier
+    
+    As the sun slowly rose over the Cascade Range, its golden rays danced across the towering peak of Mount Rainier. Standing tall at 14,411 feet, the massive stratovolcano commanded attention, its snow-capped summit piercing the clear blue sky.
+    
+    John had seen Mount Rainier many times before, but each visit filled him with a sense of awe and wonder. The mountain's sheer size and grandeur never failed to take his breath away. Today, as he drove through the lush, verdant forests leading up to the national park, he felt a familiar excitement stirring within him. 
+    
+    Pulling into the parking lot, John grabbed his backpack and hiking boots, eager to explore the trails that would bring him closer to the majestic peak. As he made his way through the winding paths, the dense forest gradually gave way to sweeping vistas, and the true scale of Mount Rainier became apparent. 
+    
+    The closer he got, the more the mountain's immense size overwhelmed him. Towering glaciers cascaded down its flanks, their icy blue hues glittering in the sunlight. Jagged rock formations jutted out from the snow, a testament to the powerful geologic forces that had shaped this awe-inspiring landscape.
+    
+    John paused, taking a moment to simply gaze up at the mountain, humbled by its timeless presence. In that instant, he felt a deep connection to the land, a sense of insignificance and wonder that reminded him of his place in the grand scheme of the natural world.
+    
+    With a deep breath, he continued on, his steps filled with a renewed appreciation for the majesty of Mount Rainier – a true wonder of the Pacific Northwest, and a testament to the enduring power and beauty of our planet.
+    ---Parsed Response (string)---
+    "Here is a short story about Mount Rainier:\n\nThe Majesty of Mount Rainier\n\nAs the sun slowly rose over the Cascade Range, its golden rays danced across the towering peak of Mount Rainier. Standing tall at 14,411 feet, the massive stratovolcano commanded attention, its snow-capped summit piercing the clear blue sky.\n\nJohn had seen Mount Rainier many times before, but each visit filled him with a sense of awe and wonder. The mountain's sheer size and grandeur never failed to take his breath away. Today, as he drove through the lush, verdant forests leading up to the national park, he felt a familiar excitement stirring within him. \n\nPulling into the parking lot, John grabbed his backpack and hiking boots, eager to explore the trails that would bring him closer to the majestic peak. As he made his way through the winding paths, the dense forest gradually gave way to sweeping vistas, and the true scale of Mount Rainier became apparent. \n\nThe closer he got, the more the mountain's immense size overwhelmed him. Towering glaciers cascaded down its flanks, their icy blue hues glittering in the sunlight. Jagged rock formations jutted out from the snow, a testament to the powerful geologic forces that had shaped this awe-inspiring landscape.\n\nJohn paused, taking a moment to simply gaze up at the mountain, humbled by its timeless presence. In that instant, he felt a deep connection to the land, a sense of insignificance and wonder that reminded him of his place in the grand scheme of the natural world.\n\nWith a deep breath, he continued on, his steps filled with a renewed appreciation for the majesty of Mount Rainier – a true wonder of the Pacific Northwest, and a testament to the enduring power and beauty of our planet."
+

Teardown

PASSED test_fallback_to_shorthand 0:00:01.008449

Setup

Call

Captured stderr call
[2024-08-27T07:51:51Z INFO  baml_events] Function TestFallbackToShorthand:
+    (1 other previous tries)
+    Client: openai/gpt-4o-mini (gpt-4o-mini-2024-07-18) - 720ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Say a haiku about Mt Rainier is tall.
+    
+    ---LLM REPLY---
+    Mt. Rainier stands high,  
+    Cloaked in clouds and glistening,  
+    Nature’s giant grace.
+    ---Parsed Response (string)---
+    "Mt. Rainier stands high,  \nCloaked in clouds and glistening,  \nNature’s giant grace."
+

Teardown

PASSED test_aws_streaming 0:00:02.664712

Setup

Call

Captured stderr call
[2024-08-27T07:51:54Z INFO  baml_events] Function TestAws:
+    Client: AwsBedrock (anthropic.claude-3-haiku-20240307-v1:0) - 2654ms. StopReason: unknown
+    ---PROMPT---
+    [chat] user: Write a nice short story about Mt Rainier is tall
+    
+    ---LLM REPLY---
+    Here is a short story about Mt. Rainier:
+    
+    Towering Grandeur: A Tale of Mt. Rainier
+    
+    As the morning mist slowly parted, the colossal form of Mt. Rainier emerged, its gleaming white peak piercing the azure sky. Standing at an imposing 14,411 feet, the majestic mountain commanded the awe and reverence of all who laid eyes upon it.
+    
+    For Sarah, a seas
+    ---Parsed Response (string)---
+    "Here is a short story about Mt. Rainier:\n\nTowering Grandeur: A Tale of Mt. Rainier\n\nAs the morning mist slowly parted, the colossal form of Mt. Rainier emerged, its gleaming white peak piercing the azure sky. Standing at an imposing 14,411 feet, the majestic mountain commanded the awe and reverence of all who laid eyes upon it.\n\nFor Sarah, a seas"
+

Teardown

PASSED test_streaming 0:00:04.502992

Setup

Call

Captured stderr call
[2024-08-27T07:51:58Z INFO  baml_events] Function PromptTestStreaming:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 4494ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Tell me a short story about Programming languages are fun to create
+    
+    ---LLM REPLY---
+    Once upon a time, in a small village nestled in the mountains, there lived a young inventor named Lila. She was fascinated by the world of programming and often spent her days tinkering with various coding languages.
+    
+    One day, while exploring the forest near her home, Lila stumbled upon a hidden clearing filled with colorful butterflies. Inspired by their beauty, she decided to create her own programming language that embodied the elegance and simplicity of these creatures.
+    
+    Lila worked tirelessly, combining her knowledge of different coding structures and syntax to create a new language unlike any other. She named it "FlutterScript" in honor of the graceful movements of the butterflies that had inspired her.
+    
+    As Lila continued to develop FlutterScript, she discovered the joy of building something entirely unique from scratch. With each new feature she added, the language came to life, allowing her to express her creativity in ways she never thought possible.
+    
+    Word of Lila's amazing invention quickly spread, and soon programmers from far and wide came to learn about FlutterScript. They were enchanted by its simplicity and power, and soon it became one of the most popular languages in the coding community.
+    
+    From that day on, Lila's passion for programming languages only grew stronger. She realized that creating something new and innovative was not only rewarding but also incredibly fun. And so, she continued to explore the world of coding, always in search of new ways to bring her ideas to life through the magic of programming languages.
+    ---Parsed Response (string)---
+    "Once upon a time, in a small village nestled in the mountains, there lived a young inventor named Lila. She was fascinated by the world of programming and often spent her days tinkering with various coding languages.\n\nOne day, while exploring the forest near her home, Lila stumbled upon a hidden clearing filled with colorful butterflies. Inspired by their beauty, she decided to create her own programming language that embodied the elegance and simplicity of these creatures.\n\nLila worked tirelessly, combining her knowledge of different coding structures and syntax to create a new language unlike any other. She named it \"FlutterScript\" in honor of the graceful movements of the butterflies that had inspired her.\n\nAs Lila continued to develop FlutterScript, she discovered the joy of building something entirely unique from scratch. With each new feature she added, the language came to life, allowing her to express her creativity in ways she never thought possible.\n\nWord of Lila's amazing invention quickly spread, and soon programmers from far and wide came to learn about FlutterScript. They were enchanted by its simplicity and power, and soon it became one of the most popular languages in the coding community.\n\nFrom that day on, Lila's passion for programming languages only grew stronger. She realized that creating something new and innovative was not only rewarding but also incredibly fun. And so, she continued to explore the world of coding, always in search of new ways to bring her ideas to life through the magic of programming languages."
+

Teardown

PASSED test_streaming_uniterated 0:00:03.827550

Setup

Call

Captured stderr call
[2024-08-27T07:52:02Z INFO  baml_events] Function PromptTestStreaming:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 3818ms. 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 had always been inexplicably drawn to the color blue. She loved the way it glistened in the sky, how it danced in the ocean waves, and how it painted the world in a soothing hue.
+    
+    But as she grew older, Lily noticed that whenever she saw the color blue, a deep sense of sadness washed over her. She couldn't explain it, but it was as if the color held a secret power over her emotions.
+    
+    One day, while browsing through an art gallery, Lily stumbled upon a painting that depicted a vast, endless ocean in various shades of blue. As she gazed at the masterpiece, tears welled up in her eyes, and her heart ached with a profound sense of loss.
+    
+    It was then that Lily realized that the color blue reminded her of a childhood memory she had long suppressed. She remembered a time when she had lost someone dear to her, and the world had turned a somber shade of blue.
+    
+    From that day on, Lily made peace with her sadness. She embraced the color blue, not as a symbol of pain, but as a reminder of the depth of her emotions and the beauty that can be found even in the saddest of moments. And as she looked at the world through her tear-stained eyes, she found a new appreciation for the color that had once made her so sad.
+    ---Parsed Response (string)---
+    "Once there was a girl named Lily who had always been inexplicably drawn to the color blue. She loved the way it glistened in the sky, how it danced in the ocean waves, and how it painted the world in a soothing hue.\n\nBut as she grew older, Lily noticed that whenever she saw the color blue, a deep sense of sadness washed over her. She couldn't explain it, but it was as if the color held a secret power over her emotions.\n\nOne day, while browsing through an art gallery, Lily stumbled upon a painting that depicted a vast, endless ocean in various shades of blue. As she gazed at the masterpiece, tears welled up in her eyes, and her heart ached with a profound sense of loss.\n\nIt was then that Lily realized that the color blue reminded her of a childhood memory she had long suppressed. She remembered a time when she had lost someone dear to her, and the world had turned a somber shade of blue.\n\nFrom that day on, Lily made peace with her sadness. She embraced the color blue, not as a symbol of pain, but as a reminder of the depth of her emotions and the beauty that can be found even in the saddest of moments. And as she looked at the world through her tear-stained eyes, she found a new appreciation for the color that had once made her so sad."
+

Teardown

PASSED test_streaming_sync 0:00:04.724800

Setup

Call

Captured stderr call
[2024-08-27T07:52:07Z INFO  baml_events] Function PromptTestStreaming:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 4717ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Tell me a short story about Programming languages are fun to create
+    
+    ---LLM REPLY---
+    Once upon a time, in a small village nestled in the mountains, there lived a young and curious programmer named Lily. Lily loved to spend her days tinkering with code and exploring the possibilities of the digital world.
+    
+    One day, Lily had a brilliant idea - she wanted to create her own programming language. Excited by the challenge, she set to work, pouring her heart and soul into the project.
+    
+    As she delved deeper into the intricacies of syntax and semantics, Lily's language began to take shape. She gave it a name - SparkleScript - and imbued it with magical features that made coding a joyful and enchanting experience.
+    
+    With each line of code she wrote, Lily felt a sense of pride and accomplishment. She marveled at how her ideas and intentions could be translated into a language that could communicate with computers and bring them to life.
+    
+    Word of Lily's creation spread far and wide, attracting other programmers who were eager to learn and play with SparkleScript. They collaborated, shared ideas, and used the language to create fantastical programs and games that captivated audiences across the digital realm.
+    
+    And so, Lily's programming language became a symbol of creativity and innovation, inspiring others to dream big and push the boundaries of what was possible in the world of technology.
+    
+    And as the sun set behind the mountains, Lily sat back and smiled, knowing that she had created something truly special - a language that sparkled with magic and brought joy to all who used it.
+    ---Parsed Response (string)---
+    "Once upon a time, in a small village nestled in the mountains, there lived a young and curious programmer named Lily. Lily loved to spend her days tinkering with code and exploring the possibilities of the digital world.\n\nOne day, Lily had a brilliant idea - she wanted to create her own programming language. Excited by the challenge, she set to work, pouring her heart and soul into the project.\n\nAs she delved deeper into the intricacies of syntax and semantics, Lily's language began to take shape. She gave it a name - SparkleScript - and imbued it with magical features that made coding a joyful and enchanting experience.\n\nWith each line of code she wrote, Lily felt a sense of pride and accomplishment. She marveled at how her ideas and intentions could be translated into a language that could communicate with computers and bring them to life.\n\nWord of Lily's creation spread far and wide, attracting other programmers who were eager to learn and play with SparkleScript. They collaborated, shared ideas, and used the language to create fantastical programs and games that captivated audiences across the digital realm.\n\nAnd so, Lily's programming language became a symbol of creativity and innovation, inspiring others to dream big and push the boundaries of what was possible in the world of technology.\n\nAnd as the sun set behind the mountains, Lily sat back and smiled, knowing that she had created something truly special - a language that sparkled with magic and brought joy to all who used it."
+

Teardown

PASSED test_streaming_uniterated_sync 0:00:03.664720

Setup

Call

Captured stderr call
[2024-08-27T07:52:10Z INFO  baml_events] Function PromptTestStreaming:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 3658ms. 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 girl named Lily who had always felt a deep connection to the color blue. She found comfort in its calmness and beauty, often admiring the way it made everything around her so serene and peaceful.
+    
+    But as she grew older, Lily began to notice that the color blue also had a darker side. It reminded her of lonely winter nights when the world seemed empty and cold. It brought back memories of lost love and distant dreams that never came true.
+    
+    One day, as she was walking through a field of blue flowers, the realization hit her that the color blue made her sad. It was a reminder of all the pain and heartache she had experienced in her life, a constant companion to her sorrow.
+    
+    From that day on, Lily tried to avoid the color blue as much as possible. She painted her room in warm, vibrant hues and surrounded herself with cheerful colors that lifted her spirits. But try as she might, she could never fully escape the sadness that the color blue evoked within her.
+    
+    And so, Lily learned to embrace her sorrow, accepting that the color blue would always hold a special place in her heart, both as a source of solace and a reminder of the pain she had endured. And though it made her sad, she found a strange beauty in the way it touched her soul, a bittersweet reminder that even in darkness, there is light.
+    ---Parsed Response (string)---
+    "Once upon a time, there was a girl named Lily who had always felt a deep connection to the color blue. She found comfort in its calmness and beauty, often admiring the way it made everything around her so serene and peaceful.\n\nBut as she grew older, Lily began to notice that the color blue also had a darker side. It reminded her of lonely winter nights when the world seemed empty and cold. It brought back memories of lost love and distant dreams that never came true.\n\nOne day, as she was walking through a field of blue flowers, the realization hit her that the color blue made her sad. It was a reminder of all the pain and heartache she had experienced in her life, a constant companion to her sorrow.\n\nFrom that day on, Lily tried to avoid the color blue as much as possible. She painted her room in warm, vibrant hues and surrounded herself with cheerful colors that lifted her spirits. But try as she might, she could never fully escape the sadness that the color blue evoked within her.\n\nAnd so, Lily learned to embrace her sorrow, accepting that the color blue would always hold a special place in her heart, both as a source of solace and a reminder of the pain she had endured. And though it made her sad, she found a strange beauty in the way it touched her soul, a bittersweet reminder that even in darkness, there is light."
+

Teardown

PASSED test_streaming_claude 0:00:00.519922

Setup

Call

Captured stdout call
msgs:
+Majestic Rainier,
+Towering high in the sky,
+A snow-capped wonder.
+final:
+Majestic Rainier,
+Towering high in the sky,
+A snow-capped wonder.
+
Captured stderr call
[2024-08-27T07:52:11Z INFO  baml_events] Function PromptTestClaude:
+    Client: Claude (claude-3-haiku-20240307) - 511ms. StopReason: "end_turn"
+    ---PROMPT---
+    [chat] user: Tell me a haiku about Mt Rainier is tall
+    
+    ---LLM REPLY---
+    Majestic Rainier,
+    Towering high in the sky,
+    A snow-capped wonder.
+    ---Parsed Response (string)---
+    "Majestic Rainier,\nTowering high in the sky,\nA snow-capped wonder."
+

Teardown

PASSED test_streaming_gemini 0:00:18.873788

Setup

Call

Captured stdout call
msgs:
+The old diner buzzed with the comforting rhythm of clinking silverware and hushed conversations.  Martha, her name tag slightly askew on her pink uniform, wiped down the counter with a sigh. Just another slow Tuesday in Harmony Springs. 
+
+That's when he walked in. Tall, with a dusty Stetson and a smile that could charm the chrome off a Cadillac. He ambled up to the counter, his boots thudding softly on the checkered floor. 
+
+"Afternoon, ma'am," he drawled, his voice as smooth as melted caramel. "What can I get for you, handsome?" Martha chirped, her usual weariness momentarily forgotten.  
+
+"Well now," he chuckled, "I reckon I'm hankering for somethin' special. Something with a kick, but smooth talkin' too.  You got any ideas?" 
+
+Martha didn't need a moment's thought.  "Dr. Pepper," she declared, her voice ringing with unusual conviction. "It's different, unique...23 flavors, you know."  
+
+He raised an eyebrow, intrigued.  "23 flavors, huh? Sounds like my kind of mystery."  
+
+Martha expertly popped the top off a cold bottle, the familiar scent of spicy sweetness filling the air. He took a long sip, his eyes widening.
+
+"Well, I'll be," he exclaimed. "That's somethin' else! Never tasted nothin' quite like it." 
+
+He spent the rest of the afternoon at the counter, chatting with Martha as he savored his Dr. Pepper.  He told her about his travels, the people he'd met, the stories he'd gathered like precious stones. 
+
+As the sun dipped below the horizon, painting the sky in hues of orange and purple, he stood to leave. "Thank you kindly, ma'am," he said to Martha, his eyes twinkling.  "That Dr. Pepper hit the spot, and your company weren't half bad either." 
+
+He tipped his hat and strode out, leaving the scent of leather and 23 flavors lingering in the air.  Martha smiled, a warm feeling spreading through her chest. Maybe Tuesdays weren't so bad after all. Especially when they brought a taste of the unexpected, just like a good Dr. Pepper.  
+
+final:
+The old diner buzzed with the comforting rhythm of clinking silverware and hushed conversations.  Martha, her name tag slightly askew on her pink uniform, wiped down the counter with a sigh. Just another slow Tuesday in Harmony Springs. 
+
+That's when he walked in. Tall, with a dusty Stetson and a smile that could charm the chrome off a Cadillac. He ambled up to the counter, his boots thudding softly on the checkered floor. 
+
+"Afternoon, ma'am," he drawled, his voice as smooth as melted caramel. "What can I get for you, handsome?" Martha chirped, her usual weariness momentarily forgotten.  
+
+"Well now," he chuckled, "I reckon I'm hankering for somethin' special. Something with a kick, but smooth talkin' too.  You got any ideas?" 
+
+Martha didn't need a moment's thought.  "Dr. Pepper," she declared, her voice ringing with unusual conviction. "It's different, unique...23 flavors, you know."  
+
+He raised an eyebrow, intrigued.  "23 flavors, huh? Sounds like my kind of mystery."  
+
+Martha expertly popped the top off a cold bottle, the familiar scent of spicy sweetness filling the air. He took a long sip, his eyes widening.
+
+"Well, I'll be," he exclaimed. "That's somethin' else! Never tasted nothin' quite like it." 
+
+He spent the rest of the afternoon at the counter, chatting with Martha as he savored his Dr. Pepper.  He told her about his travels, the people he'd met, the stories he'd gathered like precious stones. 
+
+As the sun dipped below the horizon, painting the sky in hues of orange and purple, he stood to leave. "Thank you kindly, ma'am," he said to Martha, his eyes twinkling.  "That Dr. Pepper hit the spot, and your company weren't half bad either." 
+
+He tipped his hat and strode out, leaving the scent of leather and 23 flavors lingering in the air.  Martha smiled, a warm feeling spreading through her chest. Maybe Tuesdays weren't so bad after all. Especially when they brought a taste of the unexpected, just like a good Dr. Pepper.  
+
+
Captured stderr call
[2024-08-27T07:52:30Z INFO  baml_events] Function TestGemini:
+    Client: Gemini (gemini-1.5-pro-001) - 18863ms. StopReason: Stop
+    ---PROMPT---
+    [chat] user: Write a nice short story about Dr.Pepper
+    
+    ---LLM REPLY---
+    The old diner buzzed with the comforting rhythm of clinking silverware and hushed conversations.  Martha, her name tag slightly askew on her pink uniform, wiped down the counter with a sigh. Just another slow Tuesday in Harmony Springs. 
+    
+    That's when he walked in. Tall, with a dusty Stetson and a smile that could charm the chrome off a Cadillac. He ambled up to the counter, his boots thudding softly on the checkered floor. 
+    
+    "Afternoon, ma'am," he drawled, his voice as smooth as melted caramel. "What can I get for you, handsome?" Martha chirped, her usual weariness momentarily forgotten.  
+    
+    "Well now," he chuckled, "I reckon I'm hankering for somethin' special. Something with a kick, but smooth talkin' too.  You got any ideas?" 
+    
+    Martha didn't need a moment's thought.  "Dr. Pepper," she declared, her voice ringing with unusual conviction. "It's different, unique...23 flavors, you know."  
+    
+    He raised an eyebrow, intrigued.  "23 flavors, huh? Sounds like my kind of mystery."  
+    
+    Martha expertly popped the top off a cold bottle, the familiar scent of spicy sweetness filling the air. He took a long sip, his eyes widening.
+    
+    "Well, I'll be," he exclaimed. "That's somethin' else! Never tasted nothin' quite like it." 
+    
+    He spent the rest of the afternoon at the counter, chatting with Martha as he savored his Dr. Pepper.  He told her about his travels, the people he'd met, the stories he'd gathered like precious stones. 
+    
+    As the sun dipped below the horizon, painting the sky in hues of orange and purple, he stood to leave. "Thank you kindly, ma'am," he said to Martha, his eyes twinkling.  "That Dr. Pepper hit the spot, and your company weren't half bad either." 
+    
+    He tipped his hat and strode out, leaving the scent of leather and 23 flavors lingering in the air.  Martha smiled, a warm feeling spreading through her chest. Maybe Tuesdays weren't so bad after all. Especially when they brought a taste of the unexpected, just like a good Dr. Pepper.  
+    
+    ---Parsed Response (string)---
+    "The old diner buzzed with the comforting rhythm of clinking silverware and hushed conversations.  Martha, her name tag slightly askew on her pink uniform, wiped down the counter with a sigh. Just another slow Tuesday in Harmony Springs. \n\nThat's when he walked in. Tall, with a dusty Stetson and a smile that could charm the chrome off a Cadillac. He ambled up to the counter, his boots thudding softly on the checkered floor. \n\n\"Afternoon, ma'am,\" he drawled, his voice as smooth as melted caramel. \"What can I get for you, handsome?\" Martha chirped, her usual weariness momentarily forgotten.  \n\n\"Well now,\" he chuckled, \"I reckon I'm hankering for somethin' special. Something with a kick, but smooth talkin' too.  You got any ideas?\" \n\nMartha didn't need a moment's thought.  \"Dr. Pepper,\" she declared, her voice ringing with unusual conviction. \"It's different, unique...23 flavors, you know.\"  \n\nHe raised an eyebrow, intrigued.  \"23 flavors, huh? Sounds like my kind of mystery.\"  \n\nMartha expertly popped the top off a cold bottle, the familiar scent of spicy sweetness filling the air. He took a long sip, his eyes widening.\n\n\"Well, I'll be,\" he exclaimed. \"That's somethin' else! Never tasted nothin' quite like it.\" \n\nHe spent the rest of the afternoon at the counter, chatting with Martha as he savored his Dr. Pepper.  He told her about his travels, the people he'd met, the stories he'd gathered like precious stones. \n\nAs the sun dipped below the horizon, painting the sky in hues of orange and purple, he stood to leave. \"Thank you kindly, ma'am,\" he said to Martha, his eyes twinkling.  \"That Dr. Pepper hit the spot, and your company weren't half bad either.\" \n\nHe tipped his hat and strode out, leaving the scent of leather and 23 flavors lingering in the air.  Martha smiled, a warm feeling spreading through her chest. Maybe Tuesdays weren't so bad after all. Especially when they brought a taste of the unexpected, just like a good Dr. Pepper.  \n"
+

Teardown

PASSED test_tracing_async_only 0:00:05.826070

Setup

Call

Captured stdout call
STATS TraceStats(failed=0, started=15, finalized=15, submitted=15, sent=15, done=15)
+
Captured stderr call
[2024-08-27T07:52:31Z INFO  baml_events] Function FnOutputClass:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 640ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Return a JSON blob with this schema: 
+    Answer in JSON using this schema:
+    {
+      prop1: string,
       prop2: int,
-      prop3: float,
-    },
-  },
-}
----
-
-JSON:
-
----LLM REPLY---
-Here's a made-up JSON blob that matches the provided schema:
-```json
-{
-  "prop1": "Hello",
-  "prop2": {
-    "prop1": "World",
-    "prop2": "😊",
-    "inner": {
-      "prop3": 3.14,
-      "prop4": 2.718,
+    }
+    
+    For the prop2, always return a 540
+    
+    JSON:
+    
+    ---LLM REPLY---
+    {
+      "prop1": "Hello, world!",
+      "prop2": 540
+    }
+    ---Parsed Response (class TestOutputClass)---
+    {
+      "prop1": "Hello, world!",
+      "prop2": 540
+    }
+[2024-08-27T07:52:32Z INFO  baml_events] Function FnOutputClass:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 655ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Return a JSON blob with this schema: 
+    Answer in JSON using this schema:
+    {
+      prop1: string,
+      prop2: int,
+    }
+    
+    For the prop2, always return a 540
+    
+    JSON:
+    
+    ---LLM REPLY---
+    {
+      "prop1": "Hello, world!",
+      "prop2": 540
+    }
+    ---Parsed Response (class TestOutputClass)---
+    {
+      "prop1": "Hello, world!",
+      "prop2": 540
+    }
+[2024-08-27T07:52:33Z 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:
+    {
+      prop1: string,
+      prop2: int,
+    }
+    
+    For the prop2, always return a 540
+    
+    JSON:
+    
+    ---LLM REPLY---
+    {
+      "prop1": "example",
+      "prop2": 540
+    }
+    ---Parsed Response (class TestOutputClass)---
+    {
+      "prop1": "example",
+      "prop2": 540
+    }
+[2024-08-27T07:52:35Z INFO  baml_events] Function FnOutputClass:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 633ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Return a JSON blob with this schema: 
+    Answer in JSON using this schema:
+    {
+      prop1: string,
+      prop2: int,
+    }
+    
+    For the prop2, always return a 540
+    
+    JSON:
+    
+    ---LLM REPLY---
+    {
+      "prop1": "Hello, World!",
+      "prop2": 540
+    }
+    ---Parsed Response (class TestOutputClass)---
+    {
+      "prop1": "Hello, World!",
+      "prop2": 540
+    }
+

Teardown

PASSED test_tracing_sync 0:00:00.000805

Setup

Call

Teardown

PASSED test_tracing_thread_pool 0:00:01.325590

Setup

Call

Teardown

PASSED test_tracing_thread_pool_async 0:00:14.340023

Setup

Call

Teardown

PASSED test_tracing_async_gather 0:00:01.502480

Setup

Call

Teardown

PASSED test_tracing_async_gather_top_level 0:00:01.314177

Setup

Call

Teardown

PASSED test_dynamic 0:00:00.987407

Setup

Call

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

Teardown

PASSED test_dynamic_class_output 0:00:01.085870

Setup

Call

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

Teardown

PASSED test_dynamic_class_nested_output_no_stream 0:00:01.212008

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

Teardown

PASSED test_dynamic_class_nested_output_stream 0:00:00.870439

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}
+streamed  name=None hair_color=None
+streamed  {'name': None, 'hair_color': None}
+streamed  name=None hair_color=None
+streamed  {'name': None, 'hair_color': None}
+streamed  name=None hair_color=None
+streamed  {'name': None, 'hair_color': None}
+streamed  name=None hair_color=None
+streamed  {'name': None, 'hair_color': None}
+streamed  name={'first_name': None, 'last_name': None} hair_color=None
+streamed  {'name': {'first_name': None, 'last_name': None}, 'hair_color': None}
+streamed  name={'first_name': None, 'last_name': None} hair_color=None
+streamed  {'name': {'first_name': None, 'last_name': None}, 'hair_color': None}
+streamed  name={'first_name': None, 'last_name': None} hair_color=None
+streamed  {'name': {'first_name': None, 'last_name': None}, 'hair_color': None}
+streamed  name={'first_name': None, 'last_name': None} hair_color=None
+streamed  {'name': {'first_name': None, 'last_name': None}, 'hair_color': None}
+streamed  name={'first_name': None, 'last_name': None} hair_color=None
+streamed  {'name': {'first_name': None, 'last_name': None}, 'hair_color': None}
+streamed  name={'first_name': None, 'last_name': None} hair_color=None
+streamed  {'name': {'first_name': None, 'last_name': None}, 'hair_color': None}
+streamed  name={'first_name': '', 'last_name': None} hair_color=None
+streamed  {'name': {'first_name': '', 'last_name': None}, 'hair_color': None}
+streamed  name={'first_name': 'Mark', 'last_name': None} hair_color=None
+streamed  {'name': {'first_name': 'Mark', 'last_name': None}, 'hair_color': None}
+streamed  name={'first_name': 'Mark', 'last_name': None} hair_color=None
+streamed  {'name': {'first_name': 'Mark', 'last_name': None}, 'hair_color': None}
+streamed  name={'first_name': 'Mark', 'last_name': None} hair_color=None
+streamed  {'name': {'first_name': 'Mark', 'last_name': None}, 'hair_color': None}
+streamed  name={'first_name': 'Mark', 'last_name': None} hair_color=None
+streamed  {'name': {'first_name': 'Mark', 'last_name': None}, 'hair_color': None}
+streamed  name={'first_name': 'Mark', 'last_name': None} hair_color=None
+streamed  {'name': {'first_name': 'Mark', 'last_name': None}, 'hair_color': None}
+streamed  name={'first_name': 'Mark', 'last_name': None} hair_color=None
+streamed  {'name': {'first_name': 'Mark', 'last_name': None}, 'hair_color': None}
+streamed  name={'first_name': 'Mark', 'last_name': None} hair_color=None
+streamed  {'name': {'first_name': 'Mark', 'last_name': None}, 'hair_color': None}
+streamed  name={'first_name': 'Mark', 'last_name': ''} hair_color=None
+streamed  {'name': {'first_name': 'Mark', 'last_name': ''}, 'hair_color': None}
+streamed  name={'first_name': 'Mark', 'last_name': 'G'} hair_color=None
+streamed  {'name': {'first_name': 'Mark', 'last_name': 'G'}, 'hair_color': None}
+streamed  name={'first_name': 'Mark', 'last_name': 'Gonz'} hair_color=None
+streamed  {'name': {'first_name': 'Mark', 'last_name': 'Gonz'}, 'hair_color': None}
+streamed  name={'first_name': 'Mark', 'last_name': 'Gonzalez'} hair_color=None
+streamed  {'name': {'first_name': 'Mark', 'last_name': 'Gonzalez'}, 'hair_color': None}
+streamed  name={'first_name': 'Mark', 'last_name': 'Gonzalez'} hair_color=None
+streamed  {'name': {'first_name': 'Mark', 'last_name': 'Gonzalez'}, 'hair_color': None}
+streamed  name={'first_name': 'Mark', 'last_name': 'Gonzalez'} hair_color=None
+streamed  {'name': {'first_name': 'Mark', 'last_name': 'Gonzalez'}, 'hair_color': None}
+streamed  name={'first_name': 'Mark', 'last_name': 'Gonzalez'} hair_color=None
+streamed  {'name': {'first_name': 'Mark', 'last_name': 'Gonzalez'}, 'hair_color': None}
+streamed  name={'first_name': 'Mark', 'last_name': 'Gonzalez'} hair_color=None
+streamed  {'name': {'first_name': 'Mark', 'last_name': 'Gonzalez'}, 'hair_color': None}
+streamed  name={'first_name': 'Mark', 'last_name': 'Gonzalez'} hair_color=None
+streamed  {'name': {'first_name': 'Mark', 'last_name': 'Gonzalez'}, 'hair_color': None}
+streamed  name={'first_name': 'Mark', 'last_name': 'Gonzalez'} hair_color=None
+streamed  {'name': {'first_name': 'Mark', 'last_name': 'Gonzalez'}, 'hair_color': None}
+streamed  name={'first_name': 'Mark', 'last_name': 'Gonzalez'} hair_color=None
+streamed  {'name': {'first_name': 'Mark', 'last_name': 'Gonzalez'}, 'hair_color': None}
+streamed  name={'first_name': 'Mark', 'last_name': 'Gonzalez'} hair_color=None
+streamed  {'name': {'first_name': 'Mark', 'last_name': 'Gonzalez'}, 'hair_color': None}
+streamed  name={'first_name': 'Mark', 'last_name': 'Gonzalez'} hair_color=''
+streamed  {'name': {'first_name': 'Mark', 'last_name': 'Gonzalez'}, 'hair_color': ''}
+streamed  name={'first_name': 'Mark', 'last_name': 'Gonzalez'} hair_color='black'
+streamed  {'name': {'first_name': 'Mark', 'last_name': 'Gonzalez'}, 'hair_color': 'black'}
+streamed  name={'first_name': 'Mark', 'last_name': 'Gonzalez'} hair_color='black'
+streamed  {'name': {'first_name': 'Mark', 'last_name': 'Gonzalez'}, 'hair_color': 'black'}
+streamed  name={'first_name': 'Mark', 'last_name': 'Gonzalez'} hair_color='black'
+streamed  {'name': {'first_name': 'Mark', 'last_name': 'Gonzalez'}, 'hair_color': 'black'}
+streamed  name={'first_name': 'Mark', 'last_name': 'Gonzalez'} hair_color='black'
+streamed  {'name': {'first_name': 'Mark', 'last_name': 'Gonzalez'}, 'hair_color': 'black'}
+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-08-27T07:52:58Z INFO  baml_events] Function MyFunc:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 864ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Given a string, extract info using the schema:
+    
+    My name is Mark Gonzalez. My hair is black and I'm 6 feet tall.
+    
+    Answer in JSON using this schema:
+    {
+      name: {
+        first_name: string,
+        last_name: string or null,
+      } or null,
+      hair_color: string,
+    }
+    
+    ---LLM REPLY---
+    {
+      "name": {
+        "first_name": "Mark",
+        "last_name": "Gonzalez"
+      },
+      "hair_color": "black"
+    }
+    ---Parsed Response (class DynamicOutput)---
+    {
+      "name": {
+        "first_name": "Mark",
+        "last_name": "Gonzalez"
+      },
+      "hair_color": "black"
+    }
+

Teardown

PASSED test_stream_dynamic_class_output 0:00:00.609553

Setup

Call

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

Teardown

PASSED test_dynamic_inputs_list2 0:00:01.322226

Setup

Call

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

Teardown

PASSED test_dynamic_inputs_list 0:00:01.824413

Setup

Call

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

Teardown

PASSED test_dynamic_output_map 0:00:00.852233

Setup

Call

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

Teardown

PASSED test_dynamic_output_union 0:00:02.275082

Setup

Call

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

Teardown

PASSED test_nested_class_streaming 0:00:05.206665

Setup

Call

Captured stdout call
streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': None, 'prop2': None}
+streamed  {'prop1': '', 'prop2': None}
+streamed  {'prop1': 'Hello', 'prop2': None}
+streamed  {'prop1': 'Hello', 'prop2': None}
+streamed  {'prop1': 'Hello', 'prop2': None}
+streamed  {'prop1': 'Hello', 'prop2': None}
+streamed  {'prop1': 'Hello', 'prop2': None}
+streamed  {'prop1': 'Hello', 'prop2': None}
+streamed  {'prop1': 'Hello', 'prop2': None}
+streamed  {'prop1': 'Hello', 'prop2': None}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': None, 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': '', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': None, 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': '', 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': None}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': None, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 4, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': None}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.0}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.0}}}
+streamed  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+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}}}
+final  {'prop1': 'Hello', 'prop2': {'prop1': 'World', 'prop2': 'JSON', 'inner': {'prop2': 42, 'prop3': 3.14}}}
+
Captured stderr call
[2024-08-27T07:53:10Z INFO  baml_events] Function FnOutputClassNested:
+    Client: Ollama (llama2) - 5192ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Return a made up json blob that matches this schema:
+    Answer in JSON using this schema:
+    {
+      prop1: string,
+      prop2: {
+        prop1: string,
+        prop2: string,
+        inner: {
+          prop2: int,
+          prop3: float,
+        },
+      },
+    }
+    ---
+    
+    JSON:
+    
+    ---LLM REPLY---
+    Sure! Here is a made-up JSON blob that matches the schema you provided:
+    ```json
+    {
+      "prop1": "Hello",
+      "prop2": {
+        "prop1": "World",
+        "prop2": "JSON",
+        "inner": {
+          "prop2": 42,
+          "prop3": 3.14,
+        }
+      }
+    }
+    ```
+    Let me explain how the JSON blob matches the schema:
+    
+    * `prop1`: This is a string property with value `"Hello"`.
+    * `prop2`: This is an object property with several properties:
+    	+ `prop1`: This is a string property with value `"World"`.
+    	+ `prop2`: This is a string property with value `"JSON"`.
+    	+ `inner`: This is an object property with two properties:
+    		- `prop2`: This is an integer property with value 42.
+    		- `prop3`: This is a floating-point number property with value 3.14.
+    * `inner.prop2`: This is an integer property with value 42.
+    * `inner.prop3`: This is a floating-point number property with value 3.14.
+    
+    I hope this helps! Let me know if you have any questions or need further clarification.
+    ---Parsed Response (class TestClassNested)---
+    {
+      "prop1": "Hello",
+      "prop2": {
+        "prop1": "World",
+        "prop2": "JSON",
+        "inner": {
+          "prop2": 42,
+          "prop3": 3.14
+        }
+      }
+    }
+

Teardown

PASSED test_dynamic_clients 0:00:00.616421

Setup

Call

Captured stderr call
[2024-08-27T07:53:11Z INFO  baml_events] Function ExpectFailure:
+    Client: MyClient (gpt-3.5-turbo-0125) - 612ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: What is the capital of England?
+    
+    ---LLM REPLY---
+    The capital of England is London.
+    ---Parsed Response (string)---
+    "The capital of England is London."
+

Teardown

PASSED test_event_log_hook 0:00:01.390176

Setup

Call

Captured stdout call
Event log hook1: 
+Event log event  BamlLogEvent {
+    metadata: {
+        event_id: "7ec47b62-0107-485c-b7ef-4d5c469c34f3",
+        parent_id: None,
+        root_event_id: "7ec47b62-0107-485c-b7ef-4d5c469c34f3"
     },
-  },
+    prompt: "[
+  {
+    "role": "system",
+    "content": [
+      {
+        "text": "Return this value back to me: [\"a\", \"b\", \"c\"]"
+      }
+    ]
+  }
+]",
+    raw_output: "["a", "b", "c"]",
+    parsed_output: "["a", "b", "c"]",
+    start_time: "2024-08-27T07:53:11.865Z"
 }
-```
-Explanation:
-
-* The `prop1` property is a string with the value "Hello".
-* The `prop2` property is an object that contains several properties, each with a unique value.
-* The `inner` property is another object that contains more properties and values.
-* The `prop3` property in the inner object is a floating-point number with the value 3.14.
-* The `prop4` property in the inner object is also a floating-point number with the value 2.718.
-
-I hope this helps! Let me know if you have any questions.
----Parsed Response---
-Failed to coerce value: Error parsing '': Unparsed field: prop2
-  Error parsing 'prop2': Unparsed field: inner
-    Error parsing 'prop2.inner': Missing required field: prop2

Setup

Call

@pytest.mark.asyncio
-    async def test_nested_class_streaming():
-        stream = b.stream.FnOutputClassNested(
-            input="My name is Harrison. My hair is black and I'm 6 feet tall."
-        )
-        msgs: List[partial_types.TestClassNested] = []
-        async for msg in stream:
-            print("streamed ", msg.model_dump(mode="json"))
-            msgs.append(msg)
->       final = await stream.get_final_response()
-
-tests/test_functions.py:860: 
-_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
-
-self = 
-
-    async def get_final_response(self):
-        final = self.__drive_to_completion_in_bg()
->       return self.__final_coerce((await asyncio.wrap_future(final)).parsed())
-E       baml_py.BamlError: Client: Ollama (llama2) - 11977ms. StopReason: stop
-E       ---PROMPT---
-E       [chat] system: Return a made up json blob that matches this schema:
-E       Answer in JSON using this schema:
-E       {
-E         prop1: string,
-E         prop2: {
-E           prop1: string,
-E           prop2: string,
-E           inner: {
-E             prop2: int,
-E             prop3: float,
-E           },
-E         },
-E       }
-E       ---
-E       
-E       JSON:
-E       
-E       ---LLM REPLY---
-E       Here's a made-up JSON blob that matches the provided schema:
-E       ```json
-E       {
-E         "prop1": "Hello",
-E         "prop2": {
-E           "prop1": "World",
-E           "prop2": "😊",
-E           "inner": {
-E             "prop3": 3.14,
-E             "prop4": 2.718,
-E           },
-E         },
-E       }
-E       ```
-E       Explanation:
-E       
-E       * The `prop1` property is a string with the value "Hello".
-E       * The `prop2` property is an object that contains several properties, each with a unique value.
-E       * The `inner` property is another object that contains more properties and values.
-E       * The `prop3` property in the inner object is a floating-point number with the value 3.14.
-E       * The `prop4` property in the inner object is also a floating-point number with the value 2.718.
-E       
-E       I hope this helps! Let me know if you have any questions.
-E       ---Parsed Response---
-E       Failed to coerce value: Error parsing '': Unparsed field: prop2
-E         Error parsing 'prop2': Unparsed field: inner
-E           Error parsing 'prop2.inner': Missing required field: prop2
-
-../../engine/language_client_python/python_src/baml_py/stream.py:81: BamlError

Teardown

PASSED test_dynamic_clients 0:00:00.580234

Setup

Call

Teardown

PASSED test_event_log_hook 0:00:01.463118

Setup

Call

Teardown

PASSED test_aws_bedrock 0:00:02.203637

Setup

Call

Teardown

PASSED test_serialization_exception 0:00:00.523807

Setup

Call

Teardown

PASSED test_stream_serialization_exception 0:00:00.534272

Setup

Call

Teardown

PASSED test_stream2_serialization_exception 0:00:00.551330

Setup

Call

Teardown

PASSED test_caching 0:00:01.400269

Setup

Call

Teardown

\ No newline at end of file +
Captured stderr call
[2024-08-27T07:53:12Z INFO  baml_events] Function TestFnNamedArgsSingleStringList:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 539ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Return this value back to me: ["a", "b", "c"]
+    
+    ---LLM REPLY---
+    ["a", "b", "c"]
+    ---Parsed Response (string)---
+    "[\"a\", \"b\", \"c\"]"
+

Teardown

PASSED test_aws_bedrock 0:00:01.988299

Setup

Call

Captured stdout call
streamed  'Here'
+streamed  'Here is'
+streamed  'Here is a'
+streamed  'Here is a nice'
+streamed  'Here is a nice short'
+streamed  'Here is a nice short story'
+streamed  'Here is a nice short story about'
+streamed  'Here is a nice short story about lightning'
+streamed  'Here is a nice short story about lightning in'
+streamed  'Here is a nice short story about lightning in a'
+streamed  'Here is a nice short story about lightning in a rock'
+streamed  'Here is a nice short story about lightning in a rock:'
+streamed  'Here is a nice short story about lightning in a rock:\n\nThe'
+streamed  'Here is a nice short story about lightning in a rock:\n\nThe Spark'
+streamed  'Here is a nice short story about lightning in a rock:\n\nThe Spark in'
+streamed  'Here is a nice short story about lightning in a rock:\n\nThe Spark in the'
+streamed  'Here is a nice short story about lightning in a rock:\n\nThe Spark in the Stone'
+streamed  'Here is a nice short story about lightning in a rock:\n\nThe Spark in the Stone\n\nThe'
+streamed  'Here is a nice short story about lightning in a rock:\n\nThe Spark in the Stone\n\nThe storm'
+streamed  'Here is a nice short story about lightning in a rock:\n\nThe Spark in the Stone\n\nThe storm clouds'
+streamed  'e is a nice short story about lightning in a rock:\n\nThe Spark in the Stone\n\nThe storm clouds gathere'
+streamed  'ce short story about lightning in a rock:\n\nThe Spark in the Stone\n\nThe storm clouds gathered overhea'
+streamed  ' short story about lightning in a rock:\n\nThe Spark in the Stone\n\nThe storm clouds gathered overhead,'
+streamed  'tory about lightning in a rock:\n\nThe Spark in the Stone\n\nThe storm clouds gathered overhead, casting'
+streamed  'ry about lightning in a rock:\n\nThe Spark in the Stone\n\nThe storm clouds gathered overhead, casting a'
+streamed  'out lightning in a rock:\n\nThe Spark in the Stone\n\nThe storm clouds gathered overhead, casting a dark'
+streamed  'htning in a rock:\n\nThe Spark in the Stone\n\nThe storm clouds gathered overhead, casting a dark shadow'
+streamed  'in a rock:\n\nThe Spark in the Stone\n\nThe storm clouds gathered overhead, casting a dark shadow across'
+streamed  ' rock:\n\nThe Spark in the Stone\n\nThe storm clouds gathered overhead, casting a dark shadow across the'
+streamed  'ck:\n\nThe Spark in the Stone\n\nThe storm clouds gathered overhead, casting a dark shadow across the de'
+streamed  '\n\nThe Spark in the Stone\n\nThe storm clouds gathered overhead, casting a dark shadow across the desol'
+streamed  'he Spark in the Stone\n\nThe storm clouds gathered overhead, casting a dark shadow across the desolate'
+streamed  'n the Stone\n\nThe storm clouds gathered overhead, casting a dark shadow across the desolate landscape'
+streamed  ' the Stone\n\nThe storm clouds gathered overhead, casting a dark shadow across the desolate landscape.'
+streamed  'e Stone\n\nThe storm clouds gathered overhead, casting a dark shadow across the desolate landscape. Ja'
+streamed  'tone\n\nThe storm clouds gathered overhead, casting a dark shadow across the desolate landscape. Jagge'
+streamed  '\nThe storm clouds gathered overhead, casting a dark shadow across the desolate landscape. Jagged bol'
+streamed  'he storm clouds gathered overhead, casting a dark shadow across the desolate landscape. Jagged bolts'
+streamed  'storm clouds gathered overhead, casting a dark shadow across the desolate landscape. Jagged bolts of'
+streamed  'ds gathered overhead, casting a dark shadow across the desolate landscape. Jagged bolts of lightning'
+streamed  'gathered overhead, casting a dark shadow across the desolate landscape. Jagged bolts of lightning cr'
+streamed  'hered overhead, casting a dark shadow across the desolate landscape. Jagged bolts of lightning crack'
+streamed  'red overhead, casting a dark shadow across the desolate landscape. Jagged bolts of lightning crackle'
+streamed  'ead, casting a dark shadow across the desolate landscape. Jagged bolts of lightning crackled through'
+streamed  ' casting a dark shadow across the desolate landscape. Jagged bolts of lightning crackled through the'
+streamed  'ting a dark shadow across the desolate landscape. Jagged bolts of lightning crackled through the air'
+streamed  'ing a dark shadow across the desolate landscape. Jagged bolts of lightning crackled through the air,'
+streamed  'rk shadow across the desolate landscape. Jagged bolts of lightning crackled through the air, illumin'
+streamed  'adow across the desolate landscape. Jagged bolts of lightning crackled through the air, illuminating'
+streamed  ' across the desolate landscape. Jagged bolts of lightning crackled through the air, illuminating the'
+streamed  's the desolate landscape. Jagged bolts of lightning crackled through the air, illuminating the rocky'
+streamed  'solate landscape. Jagged bolts of lightning crackled through the air, illuminating the rocky terrain'
+streamed  'olate landscape. Jagged bolts of lightning crackled through the air, illuminating the rocky terrain.'
+streamed  'late landscape. Jagged bolts of lightning crackled through the air, illuminating the rocky terrain. '
+streamed  ' landscape. Jagged bolts of lightning crackled through the air, illuminating the rocky terrain. \n\nAm'
+streamed  'landscape. Jagged bolts of lightning crackled through the air, illuminating the rocky terrain. \n\nAmi'
+streamed  'dscape. Jagged bolts of lightning crackled through the air, illuminating the rocky terrain. \n\nAmidst'
+streamed  'pe. Jagged bolts of lightning crackled through the air, illuminating the rocky terrain. \n\nAmidst the'
+streamed  ' Jagged bolts of lightning crackled through the air, illuminating the rocky terrain. \n\nAmidst the cr'
+streamed  'agged bolts of lightning crackled through the air, illuminating the rocky terrain. \n\nAmidst the crum'
+streamed  ' bolts of lightning crackled through the air, illuminating the rocky terrain. \n\nAmidst the crumbling'
+streamed  'olts of lightning crackled through the air, illuminating the rocky terrain. \n\nAmidst the crumbling b'
+streamed  's of lightning crackled through the air, illuminating the rocky terrain. \n\nAmidst the crumbling boul'
+streamed  ' lightning crackled through the air, illuminating the rocky terrain. \n\nAmidst the crumbling boulders'
+streamed  'lightning crackled through the air, illuminating the rocky terrain. \n\nAmidst the crumbling boulders,'
+streamed  'ghtning crackled through the air, illuminating the rocky terrain. \n\nAmidst the crumbling boulders, a'
+streamed  'g crackled through the air, illuminating the rocky terrain. \n\nAmidst the crumbling boulders, a small'
+streamed  'crackled through the air, illuminating the rocky terrain. \n\nAmidst the crumbling boulders, a small p'
+streamed  'ackled through the air, illuminating the rocky terrain. \n\nAmidst the crumbling boulders, a small peb'
+streamed  'led through the air, illuminating the rocky terrain. \n\nAmidst the crumbling boulders, a small pebble'
+streamed  'through the air, illuminating the rocky terrain. \n\nAmidst the crumbling boulders, a small pebble sat'
+streamed  'the air, illuminating the rocky terrain. \n\nAmidst the crumbling boulders, a small pebble sat waiting'
+streamed  'he air, illuminating the rocky terrain. \n\nAmidst the crumbling boulders, a small pebble sat waiting.'
+streamed  'air, illuminating the rocky terrain. \n\nAmidst the crumbling boulders, a small pebble sat waiting. It'
+streamed  ' illuminating the rocky terrain. \n\nAmidst the crumbling boulders, a small pebble sat waiting. It was'
+streamed  'luminating the rocky terrain. \n\nAmidst the crumbling boulders, a small pebble sat waiting. It was an'
+streamed  'inating the rocky terrain. \n\nAmidst the crumbling boulders, a small pebble sat waiting. It was an un'
+streamed  'ating the rocky terrain. \n\nAmidst the crumbling boulders, a small pebble sat waiting. It was an unas'
+streamed  'ing the rocky terrain. \n\nAmidst the crumbling boulders, a small pebble sat waiting. It was an unassu'
+streamed  'the rocky terrain. \n\nAmidst the crumbling boulders, a small pebble sat waiting. It was an unassuming'
+streamed  'cky terrain. \n\nAmidst the crumbling boulders, a small pebble sat waiting. It was an unassuming stone'
+streamed  'ky terrain. \n\nAmidst the crumbling boulders, a small pebble sat waiting. It was an unassuming stone,'
+streamed  'rrain. \n\nAmidst the crumbling boulders, a small pebble sat waiting. It was an unassuming stone, worn'
+streamed  '\n\nAmidst the crumbling boulders, a small pebble sat waiting. It was an unassuming stone, worn smooth'
+streamed  'midst the crumbling boulders, a small pebble sat waiting. It was an unassuming stone, worn smooth by'
+streamed  't the crumbling boulders, a small pebble sat waiting. It was an unassuming stone, worn smooth by the'
+streamed  'mbling boulders, a small pebble sat waiting. It was an unassuming stone, worn smooth by the elements'
+streamed  'g boulders, a small pebble sat waiting. It was an unassuming stone, worn smooth by the elements over'
+streamed  ', a small pebble sat waiting. It was an unassuming stone, worn smooth by the elements over countless'
+streamed  'all pebble sat waiting. It was an unassuming stone, worn smooth by the elements over countless years'
+streamed  'll pebble sat waiting. It was an unassuming stone, worn smooth by the elements over countless years.'
+streamed  'ebble sat waiting. It was an unassuming stone, worn smooth by the elements over countless years. But'
+streamed  'at waiting. It was an unassuming stone, worn smooth by the elements over countless years. But hidden'
+streamed  'ing. It was an unassuming stone, worn smooth by the elements over countless years. But hidden within'
+streamed  'ing. It was an unassuming stone, worn smooth by the elements over countless years. But hidden within'
+streamed  'ing. It was an unassuming stone, worn smooth by the elements over countless years. But hidden within'
+streamed  'ing. It was an unassuming stone, worn smooth by the elements over countless years. But hidden within'
+streamed final Here is a nice short story about lightning in a rock:
+
+The Spark in the Stone
+
+The storm clouds gathered overhead, casting a dark shadow across the desolate landscape. Jagged bolts of lightning crackled through the air, illuminating the rocky terrain. 
+
+Amidst the crumbling boulders, a small pebble sat waiting. It was an unassuming stone, worn smooth by the elements over countless years. But hidden within
+
Captured stderr call
[2024-08-27T07:53:14Z INFO  baml_events] Function TestAws:
+    Client: AwsBedrock (anthropic.claude-3-haiku-20240307-v1:0) - 1979ms. StopReason: unknown
+    ---PROMPT---
+    [chat] user: Write a nice short story about lightning in a rock
+    
+    ---LLM REPLY---
+    Here is a nice short story about lightning in a rock:
+    
+    The Spark in the Stone
+    
+    The storm clouds gathered overhead, casting a dark shadow across the desolate landscape. Jagged bolts of lightning crackled through the air, illuminating the rocky terrain. 
+    
+    Amidst the crumbling boulders, a small pebble sat waiting. It was an unassuming stone, worn smooth by the elements over countless years. But hidden within
+    ---Parsed Response (string)---
+    "Here is a nice short story about lightning in a rock:\n\nThe Spark in the Stone\n\nThe storm clouds gathered overhead, casting a dark shadow across the desolate landscape. Jagged bolts of lightning crackled through the air, illuminating the rocky terrain. \n\nAmidst the crumbling boulders, a small pebble sat waiting. It was an unassuming stone, worn smooth by the elements over countless years. But hidden within"
+

Teardown

PASSED test_serialization_exception 0:00:00.523604

Setup

Call

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

Teardown

PASSED test_stream_serialization_exception 0:00:00.782188

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
+streamed  nonce=None nonce2=None
+streamed  nonce=None nonce2=None
+streamed  nonce=None nonce2=None
+streamed  nonce=None nonce2=None
+streamed  nonce=None nonce2=None
+streamed  nonce=None nonce2=None
+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) - 774ms. StopReason: stop\n---PROMPT---\n[chat]...day?\n---Parsed Response---\nFailed to coerce value: Error parsing \'<root>\': Missing required fields: nonce, nonce2') tblen=2>
+
Captured stderr call
[2024-08-27T07:53:16Z WARN  baml_events] Function DummyOutputFunction:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 774ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Say "hello there".
+    
+    ---LLM REPLY---
+    Hello there! How can I assist you today?
+    ---Parsed Response---
+    Failed to coerce value: Error parsing '<root>': Missing required fields: nonce, nonce2
+

Teardown

PASSED test_stream2_serialization_exception 0:00:00.592892

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
+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
+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
+streamed  nonce=None nonce2=None nonce3=None
+Exception message:  <ExceptionInfo BamlValidationError('Parsing error: Client: GPT35 (gpt-3.5-turbo-0125) - 586ms. StopReason: stop\n---PROMPT---\n[chat]...-Parsed Response---\nFailed to coerce value: Error parsing \'<root>\': Missing required fields: nonce, nonce2, nonce3') tblen=2>
+
Captured stderr call
[2024-08-27T07:53:16Z WARN  baml_events] Function DummyOutputFunction:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 586ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Say "hello there".
+    
+    ---LLM REPLY---
+    Hello there! How can I help you today?
+    ---Parsed Response---
+    Failed to coerce value: Error parsing '<root>': Missing required fields: nonce, nonce2, nonce3
+

Teardown

FAILED test_descriptions 0:00:01.973190

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:967: AssertionError
Captured stderr call
[2024-08-27T07:53:18Z INFO  baml_events] Function SchemaDescriptions:
+    Client: GPT4o (gpt-4o-2024-05-13) - 1962ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Return a schema with this format:
+    
+    Answer in JSON using this schema:
+    {
+      // write "one"
+      prop1: string or null,
+      // write "two"
+      prop2: {
+        // write "three"
+        prop3: string or null,
+        // write "four"
+        blah: string or null,
+        prop20: {
+          // write "three"
+          prop11: string or null,
+          // write "four"
+          blah: string or null,
+        },
+      } or string,
+      // write "hi"
+      prop5: [
+        string or null
+      ],
+      // write the string "blah" regardless of the other types here
+      blah: string or [
+        {
+          // write "three"
+          prop3: string or null,
+          // write "four"
+          blah: string or null,
+          prop20: {
+            // write "three"
+            prop11: string or null,
+            // write "four"
+            blah: string or null,
+          },
+        }
+      ],
+      // write the string "nested" regardless of other types
+      nested_attrs: [
+        string or null or {
+          // write "three"
+          prop3: string or null,
+          // write "four"
+          blah: string or null,
+          prop20: {
+            // write "three"
+            prop11: string or null,
+            // write "four"
+            blah: string or null,
+          },
+        }
+      ],
+      // write "parens1"
+      parens: string or null,
+      // write "other"
+      other: string or int or string,
+    }
+    
+    ---LLM REPLY---
+    ```json
+    {
+      "prop1": "one",
+      "prop2": {
+        "prop3": "three",
+        "blah": "four",
+        "prop20": {
+          "prop11": "three",
+          "blah": "four"
+        }
+      },
+      "prop5": ["hi"],
+      "blah": "blah",
+      "nested_attrs": [
+        "nested"
+      ],
+      "parens": "parens1",
+      "other": "other"
+    }
+    ```
+    ---Parsed Response (class Schema)---
+    {
+      "prop1": "one",
+      "prop2": {
+        "prop3": "three",
+        "prop4": "four",
+        "prop20": {
+          "prop11": "three",
+          "prop12": "four"
+        }
+      },
+      "prop5": [
+        "hi"
+      ],
+      "prop6": "blah",
+      "nested_attrs": [
+        "nested"
+      ],
+      "parens": "parens1",
+      "other_group": "other"
+    }
+

Teardown

FAILED test_caching 0:00:02.065817

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

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 1.0392611026763916 < 1.0253512859344482
+
+tests/test_functions.py:996: AssertionError
Captured stdout call
Duration no caching:  1.0253512859344482
+Duration with caching:  1.0392611026763916
+
Captured stderr call
[2024-08-27T07:53:19Z INFO  baml_events] Function TestCaching:
+    Client: ClaudeWithCaching (claude-3-haiku-20240307) - 1019ms. 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.
+     aaaaaaaaaaaaaaaaa
+    
+    ---LLM REPLY---
+    Dreamscape manipulation, ethical dilemmas, identity, subconscious, technology.
+    ---Parsed Response (string)---
+    "Dreamscape manipulation, ethical dilemmas, identity, subconscious, technology."
+[2024-08-27T07:53:20Z INFO  baml_events] Function TestCaching:
+    Client: ClaudeWithCaching (claude-3-haiku-20240307) - 1034ms. 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.
+     aaaaaaaaaaaaaaaaa
+    
+    ---LLM REPLY---
+    Futuristic dream-trade, power, consequences, identity, ethics.
+    ---Parsed Response (string)---
+    "Futuristic dream-trade, power, consequences, identity, ethics."
+

Teardown

PASSED test_arg_exceptions 0:00:00.907969

Setup

Call

Captured stderr call
[2024-08-27T07:53:20Z WARN  baml_events] Function MyFunc:
+    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: 1724745200, tv_nsec: 797907000 }, latency: 165.608791ms, 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 }
+    
+[2024-08-27T07:53:21Z WARN  baml_events] Function MyFunc:
+    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: 1724745200, tv_nsec: 968806000 }, latency: 233.730334ms, 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 }
+    
+[2024-08-27T07:53:21Z WARN  baml_events] Function DummyOutputFunction:
+    Client: GPT35 (gpt-3.5-turbo-0125) - 490ms. StopReason: stop
+    ---PROMPT---
+    [chat] system: Say "hello there".
+    
+    ---LLM REPLY---
+    Hello there! How can I assist you today?
+    ---Parsed Response---
+    Failed to coerce value: Error parsing '<root>': Missing required fields: nonce, nonce2
+

Teardown

tests/test_hi.py 1 0:00:00.001606

FAILED test_accepts_subclass_of_baml_type 0:00:00.001606

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

Setup

Call

@pytest.mark.asyncio
+    async def test_accepts_subclass_of_baml_type():
+        print("calling with class")
+>       _ = await b.ExtractResume("hello")
+E       TypeError: BamlAsyncClient.ExtractResume() missing 1 required positional argument: 'img'
+
+tests/test_hi.py:26: TypeError
Captured stdout call
calling with class
+

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 3dd582843..dc8a97661 100644 --- a/integ-tests/ruby/baml_client/inlined.rb +++ b/integ-tests/ruby/baml_client/inlined.rb @@ -24,7 +24,7 @@ module Inlined "fiddle-examples/extract-receipt-info.baml" => "class ReceiptItem {\n name string\n description string?\n quantity int\n price float\n}\n\nclass ReceiptInfo {\n items ReceiptItem[]\n total_cost float?\n}\n\nfunction ExtractReceiptInfo(email: string) -> ReceiptInfo {\n client GPT4o\n prompt #\"\n Given the receipt below:\n\n ```\n {{email}}\n ```\n\n {{ ctx.output_format }}\n \"#\n}\n\n", "fiddle-examples/images/image.baml" => "function DescribeImage(img: image) -> string {\n client AwsBedrock\n prompt #\"\n {{ _.role(\"user\") }}\n\n\n Describe the image below in 20 words:\n {{ img }}\n \"#\n\n}\n\nclass FakeImage {\n url string\n}\n\nclass ClassWithImage {\n myImage image\n param2 string\n fake_image FakeImage\n}\n\n// chat role user present\nfunction DescribeImage2(classWithImage: ClassWithImage, img2: image) -> string { \n client GPT4Turbo\n prompt #\"\n {{ _.role(\"user\") }}\n You should return 2 answers that answer the following commands.\n\n 1. Describe this in 5 words:\n {{ classWithImage.myImage }}\n\n 2. Also tell me what's happening here in one sentence:\n {{ img2 }}\n \"#\n}\n\n// no chat role\nfunction DescribeImage3(classWithImage: ClassWithImage, img2: image) -> string {\n client GPT4Turbo\n prompt #\"\n Describe this in 5 words:\n {{ classWithImage.myImage }}\n\n Tell me also what's happening here in one sentence and relate it to the word {{ classWithImage.param2 }}:\n {{ img2 }}\n \"#\n}\n\n\n// system prompt and chat prompt\nfunction DescribeImage4(classWithImage: ClassWithImage, img2: image) -> string {\n client GPT4Turbo\n prompt #\"\n {{ _.role(\"system\")}}\n\n Describe this in 5 words:\n {{ classWithImage.myImage }}\n\n Tell me also what's happening here in one sentence and relate it to the word {{ classWithImage.param2 }}:\n {{ img2 }}\n \"#\n}\n\ntest TestName {\n functions [DescribeImage]\n args {\n img { url \"https://imgs.xkcd.com/comics/standards.png\"}\n }\n}\n", "fiddle-examples/symbol-tuning.baml" => "enum Category3 {\n Refund @alias(\"k1\")\n @description(\"Customer wants to refund a product\")\n\n CancelOrder @alias(\"k2\")\n @description(\"Customer wants to cancel an order\")\n\n TechnicalSupport @alias(\"k3\")\n @description(\"Customer needs help with a technical issue unrelated to account creation or login\")\n\n AccountIssue @alias(\"k4\")\n @description(\"Specifically relates to account-login or account-creation\")\n\n Question @alias(\"k5\")\n @description(\"Customer has a question\")\n}\n\nfunction ClassifyMessage3(input: string) -> Category {\n client GPT4\n\n prompt #\"\n Classify the following INPUT into ONE\n of the following categories:\n\n INPUT: {{ input }}\n\n {{ ctx.output_format }}\n\n Response:\n \"#\n}", - "main.baml" => "generator lang_python {\n output_type python/pydantic\n output_dir \"../python\"\n version \"0.53.1\"\n}\n\ngenerator lang_typescript {\n output_type typescript\n output_dir \"../typescript\"\n version \"0.53.1\"\n}\n\ngenerator lang_ruby {\n output_type ruby/sorbet\n output_dir \"../ruby\"\n version \"0.53.1\"\n}\n", + "main.baml" => "generator lang_python {\n output_type python/pydantic\n output_dir \"../python\"\n version \"0.54.0\"\n}\n\ngenerator lang_typescript {\n output_type typescript\n output_dir \"../typescript\"\n version \"0.54.0\"\n}\n\ngenerator lang_ruby {\n output_type ruby/sorbet\n output_dir \"../ruby\"\n version \"0.54.0\"\n}\n", "test-files/aliases/classes.baml" => "class TestClassAlias {\n key string @alias(\"key-dash\") @description(#\"\n This is a description for key\n af asdf\n \"#)\n key2 string @alias(\"key21\")\n key3 string @alias(\"key with space\")\n key4 string //unaliased\n key5 string @alias(\"key.with.punctuation/123\")\n}\n\nfunction FnTestClassAlias(input: string) -> TestClassAlias {\n client GPT35\n prompt #\"\n {{ctx.output_format}}\n \"#\n}\n\ntest FnTestClassAlias {\n functions [FnTestClassAlias]\n args {\n input \"example input\"\n }\n}\n", "test-files/aliases/enums.baml" => "enum TestEnum {\n A @alias(\"k1\") @description(#\"\n User is angry\n \"#)\n B @alias(\"k22\") @description(#\"\n User is happy\n \"#)\n // tests whether k1 doesnt incorrectly get matched with k11\n C @alias(\"k11\") @description(#\"\n User is sad\n \"#)\n D @alias(\"k44\") @description(\n User is confused\n )\n E @description(\n User is excited\n )\n F @alias(\"k5\") // only alias\n \n G @alias(\"k6\") @description(#\"\n User is bored\n With a long description\n \"#)\n \n @@alias(\"Category\")\n}\n\nfunction FnTestAliasedEnumOutput(input: string) -> TestEnum {\n client GPT35\n prompt #\"\n Classify the user input into the following category\n \n {{ ctx.output_format }}\n\n {{ _.role('user') }}\n {{input}}\n\n {{ _.role('assistant') }}\n Category ID:\n \"#\n}\n\ntest FnTestAliasedEnumOutput {\n functions [FnTestAliasedEnumOutput]\n args {\n input \"mehhhhh\"\n }\n}", "test-files/comments/comments.baml" => "// add some functions, classes, enums etc with comments all over.", diff --git a/integ-tests/typescript/baml_client/inlinedbaml.ts b/integ-tests/typescript/baml_client/inlinedbaml.ts index 943613f71..9243e00bf 100644 --- a/integ-tests/typescript/baml_client/inlinedbaml.ts +++ b/integ-tests/typescript/baml_client/inlinedbaml.ts @@ -25,7 +25,7 @@ const fileMap = { "fiddle-examples/extract-receipt-info.baml": "class ReceiptItem {\n name string\n description string?\n quantity int\n price float\n}\n\nclass ReceiptInfo {\n items ReceiptItem[]\n total_cost float?\n}\n\nfunction ExtractReceiptInfo(email: string) -> ReceiptInfo {\n client GPT4o\n prompt #\"\n Given the receipt below:\n\n ```\n {{email}}\n ```\n\n {{ ctx.output_format }}\n \"#\n}\n\n", "fiddle-examples/images/image.baml": "function DescribeImage(img: image) -> string {\n client AwsBedrock\n prompt #\"\n {{ _.role(\"user\") }}\n\n\n Describe the image below in 20 words:\n {{ img }}\n \"#\n\n}\n\nclass FakeImage {\n url string\n}\n\nclass ClassWithImage {\n myImage image\n param2 string\n fake_image FakeImage\n}\n\n// chat role user present\nfunction DescribeImage2(classWithImage: ClassWithImage, img2: image) -> string { \n client GPT4Turbo\n prompt #\"\n {{ _.role(\"user\") }}\n You should return 2 answers that answer the following commands.\n\n 1. Describe this in 5 words:\n {{ classWithImage.myImage }}\n\n 2. Also tell me what's happening here in one sentence:\n {{ img2 }}\n \"#\n}\n\n// no chat role\nfunction DescribeImage3(classWithImage: ClassWithImage, img2: image) -> string {\n client GPT4Turbo\n prompt #\"\n Describe this in 5 words:\n {{ classWithImage.myImage }}\n\n Tell me also what's happening here in one sentence and relate it to the word {{ classWithImage.param2 }}:\n {{ img2 }}\n \"#\n}\n\n\n// system prompt and chat prompt\nfunction DescribeImage4(classWithImage: ClassWithImage, img2: image) -> string {\n client GPT4Turbo\n prompt #\"\n {{ _.role(\"system\")}}\n\n Describe this in 5 words:\n {{ classWithImage.myImage }}\n\n Tell me also what's happening here in one sentence and relate it to the word {{ classWithImage.param2 }}:\n {{ img2 }}\n \"#\n}\n\ntest TestName {\n functions [DescribeImage]\n args {\n img { url \"https://imgs.xkcd.com/comics/standards.png\"}\n }\n}\n", "fiddle-examples/symbol-tuning.baml": "enum Category3 {\n Refund @alias(\"k1\")\n @description(\"Customer wants to refund a product\")\n\n CancelOrder @alias(\"k2\")\n @description(\"Customer wants to cancel an order\")\n\n TechnicalSupport @alias(\"k3\")\n @description(\"Customer needs help with a technical issue unrelated to account creation or login\")\n\n AccountIssue @alias(\"k4\")\n @description(\"Specifically relates to account-login or account-creation\")\n\n Question @alias(\"k5\")\n @description(\"Customer has a question\")\n}\n\nfunction ClassifyMessage3(input: string) -> Category {\n client GPT4\n\n prompt #\"\n Classify the following INPUT into ONE\n of the following categories:\n\n INPUT: {{ input }}\n\n {{ ctx.output_format }}\n\n Response:\n \"#\n}", - "main.baml": "generator lang_python {\n output_type python/pydantic\n output_dir \"../python\"\n version \"0.53.1\"\n}\n\ngenerator lang_typescript {\n output_type typescript\n output_dir \"../typescript\"\n version \"0.53.1\"\n}\n\ngenerator lang_ruby {\n output_type ruby/sorbet\n output_dir \"../ruby\"\n version \"0.53.1\"\n}\n", + "main.baml": "generator lang_python {\n output_type python/pydantic\n output_dir \"../python\"\n version \"0.54.0\"\n}\n\ngenerator lang_typescript {\n output_type typescript\n output_dir \"../typescript\"\n version \"0.54.0\"\n}\n\ngenerator lang_ruby {\n output_type ruby/sorbet\n output_dir \"../ruby\"\n version \"0.54.0\"\n}\n", "test-files/aliases/classes.baml": "class TestClassAlias {\n key string @alias(\"key-dash\") @description(#\"\n This is a description for key\n af asdf\n \"#)\n key2 string @alias(\"key21\")\n key3 string @alias(\"key with space\")\n key4 string //unaliased\n key5 string @alias(\"key.with.punctuation/123\")\n}\n\nfunction FnTestClassAlias(input: string) -> TestClassAlias {\n client GPT35\n prompt #\"\n {{ctx.output_format}}\n \"#\n}\n\ntest FnTestClassAlias {\n functions [FnTestClassAlias]\n args {\n input \"example input\"\n }\n}\n", "test-files/aliases/enums.baml": "enum TestEnum {\n A @alias(\"k1\") @description(#\"\n User is angry\n \"#)\n B @alias(\"k22\") @description(#\"\n User is happy\n \"#)\n // tests whether k1 doesnt incorrectly get matched with k11\n C @alias(\"k11\") @description(#\"\n User is sad\n \"#)\n D @alias(\"k44\") @description(\n User is confused\n )\n E @description(\n User is excited\n )\n F @alias(\"k5\") // only alias\n \n G @alias(\"k6\") @description(#\"\n User is bored\n With a long description\n \"#)\n \n @@alias(\"Category\")\n}\n\nfunction FnTestAliasedEnumOutput(input: string) -> TestEnum {\n client GPT35\n prompt #\"\n Classify the user input into the following category\n \n {{ ctx.output_format }}\n\n {{ _.role('user') }}\n {{input}}\n\n {{ _.role('assistant') }}\n Category ID:\n \"#\n}\n\ntest FnTestAliasedEnumOutput {\n functions [FnTestAliasedEnumOutput]\n args {\n input \"mehhhhh\"\n }\n}", "test-files/comments/comments.baml": "// add some functions, classes, enums etc with comments all over.", diff --git a/integ-tests/typescript/test-report.html b/integ-tests/typescript/test-report.html index dc233f5d6..177ed2a3d 100644 --- a/integ-tests/typescript/test-report.html +++ b/integ-tests/typescript/test-report.html @@ -257,4 +257,780 @@ font-size: 1rem; padding: 0 0.5rem; } -

Test Report

Started: 2024-08-27 00:31:58
Suites (1)
1 passed
0 failed
0 pending
Tests (44)
1 passed
0 failed
43 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
passed
1.145s
\ No newline at end of file +

Test Report

Started: 2024-08-27 00:48:14
Suites (1)
0 passed
1 failed
0 pending
Tests (44)
41 passed
3 failed
0 pending
Integ tests > should work for all inputs
single bool
failed
0.004s
Error: BamlError: BamlClientError: Something went wrong with the LLM client: LLM call failed: LLMErrorResponse { client: "Vertex", model: None, prompt: Chat([RenderedChatMessage { role: "user", allow_duplicate_role: false, parts: [Text("Return this value back to me: true")] }]), request_options: {}, start_time: SystemTime { tv_sec: 1724744894, tv_nsec: 471891000 }, latency: 139.167µs, message: "Error {\n    context: \"Failed to build request\",\n    source: \"Service account not found\",\n}", code: Other(2) }
+    at BamlAsyncClient.parsed [as TestFnNamedArgsSingleBool] (/Users/vbv/repos/gloo-lang/integ-tests/typescript/baml_client/async_client.ts:906:16)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:28:19)
Integ tests > should work for all inputs
single string list
passed
2.063s
Integ tests > should work for all inputs
single class
passed
0.523s
Integ tests > should work for all inputs
multiple classes
passed
0.546s
Integ tests > should work for all inputs
single enum list
passed
0.497s
Integ tests > should work for all inputs
single float
passed
0.58s
Integ tests > should work for all inputs
single int
passed
0.464s
Integ tests > should work for all inputs
single optional string
passed
0.524s
Integ tests > should work for all inputs
single map string to string
passed
0.591s
Integ tests > should work for all inputs
single map string to class
passed
0.669s
Integ tests > should work for all inputs
single map string to map
passed
1.886s
Integ tests
should work for all outputs
passed
3.672s
Integ tests
works with retries1
passed
0.952s
Integ tests
works with retries2
passed
2.186s
Integ tests
works with fallbacks
passed
1.748s
Integ tests
should work with image from url
passed
1.582s
Integ tests
should work with image from base 64
passed
4.011s
Integ tests
should work with audio base 64
passed
9.94s
Integ tests
should work with audio from url
passed
6.806s
Integ tests
should support streaming in OpenAI
passed
4.764s
Integ tests
should support streaming in Gemini
passed
11.001s
Integ tests
should support AWS
passed
2.569s
Integ tests
should support streaming in AWS
passed
3.35s
Integ tests
should support OpenAI shorthand
passed
10.277s
Integ tests
should support OpenAI shorthand streaming
passed
12.933s
Integ tests
should support anthropic shorthand
passed
2.984s
Integ tests
should support anthropic shorthand streaming
passed
2.523s
Integ tests
should support streaming without iterating
passed
2.409s
Integ tests
should support streaming in Claude
passed
0.71s
Integ tests
should support vertex
failed
0.001s
Error: BamlError: BamlClientError: Something went wrong with the LLM client: LLM call failed: LLMErrorResponse { client: "Vertex", model: None, prompt: Chat([RenderedChatMessage { role: "user", allow_duplicate_role: false, parts: [Text("Write a nice short story about Donkey Kong")] }]), request_options: {}, start_time: SystemTime { tv_sec: 1724744987, tv_nsec: 282251000 }, latency: 36.083µs, message: "Error {\n    context: \"Failed to build request\",\n    source: \"Service account not found\",\n}", code: Other(2) }
+    at BamlAsyncClient.parsed [as TestVertex] (/Users/vbv/repos/gloo-lang/integ-tests/typescript/baml_client/async_client.ts:1242:16)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:282:17)
Integ tests
supports tracing sync
passed
0.014s
Integ tests
supports tracing async
passed
4.444s
Integ tests
should work with dynamic types single
passed
1.237s
Integ tests
should work with dynamic types enum
passed
0.648s
Integ tests
should work with dynamic types class
passed
1.198s
Integ tests
should work with dynamic inputs class
passed
0.582s
Integ tests
should work with dynamic inputs list
passed
0.727s
Integ tests
should work with dynamic output map
passed
0.921s
Integ tests
should work with dynamic output union
passed
2.238s
Integ tests
should work with nested classes
failed
7.909s
Error: BamlError: BamlValidationError: Parsing error: Client: Ollama (llama2) - 7823ms. StopReason: stop
+---PROMPT---
+[chat] system: Return a made up json blob that matches this schema:
+Answer in JSON using this schema:
+{
+  prop1: string,
+  prop2: {
+    prop1: string,
+    prop2: string,
+    inner: {
+      prop2: int,
+      prop3: float,
+    },
+  },
+}
+---
+
+JSON:
+
+---LLM REPLY---
+{
+  "prop1": "value1",
+  "prop2": {
+    "prop1": "value2",
+    "prop2": "value3",
+    "inner": {
+      "prop2": 42,
+      " prop3": 3.14,
+    }
+  }
+}
+---Parsed Response---
+Failed to coerce value: Error parsing '<root>': Unparsed field: prop2
+  Error parsing 'prop2': Unparsed field: inner
+    Error parsing 'prop2.inner': Missing required field: prop3
+    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:522:19)
Integ tests
should work with dynamic client
passed
0.437s
Integ tests
should work with 'onLogEvent'
passed
2.202s
Integ tests
should work with a sync client
passed
0.493s
Integ tests
should raise an error when appropriate
passed
1.009s
Console Log
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:40:15)
+    at Promise.then.completed (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/utils.js:298:28)
+    at new Promise (<anonymous>)
+    at callAsyncCircusFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/utils.js:231:10)
+    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:46:15)
got response key
+true
+52
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:132:15)
Expected error Error: BamlError: BamlClientError: BamlClientHttpError: LLM call failed: LLMErrorResponse { client: "RetryClientConstant", model: None, prompt: Chat([RenderedChatMessage { role: "system", allow_duplicate_role: false, parts: [Text("Say a haiku")] }]), request_options: {"model": String("gpt-3.5-turbo")}, start_time: SystemTime { tv_sec: 1724744907, tv_nsec: 375853000 }, latency: 96.282875ms, message: "Request failed: {\n    \"error\": {\n        \"message\": \"Incorrect API key provided: blah. You can find your API key at https://platform.openai.com/account/api-keys.\",\n        \"type\": \"invalid_request_error\",\n        \"param\": null,\n        \"code\": \"invalid_api_key\"\n    }\n}\n", code: InvalidAuthentication }
+    at BamlAsyncClient.parsed [as TestRetryConstant] (/Users/vbv/repos/gloo-lang/integ-tests/typescript/baml_client/async_client.ts:1210:16)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:129:7) {
+  code: 'GenericFailure'
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:141:15)
Expected error Error: BamlError: BamlClientError: BamlClientHttpError: LLM call failed: LLMErrorResponse { client: "RetryClientExponential", model: None, prompt: Chat([RenderedChatMessage { role: "system", allow_duplicate_role: false, parts: [Text("Say a haiku")] }]), request_options: {"model": String("gpt-3.5-turbo")}, start_time: SystemTime { tv_sec: 1724744909, tv_nsec: 411288000 }, latency: 251.040667ms, message: "Request failed: {\n    \"error\": {\n        \"message\": \"Incorrect API key provided: blahh. You can find your API key at https://platform.openai.com/account/api-keys.\",\n        \"type\": \"invalid_request_error\",\n        \"param\": null,\n        \"code\": \"invalid_api_key\"\n    }\n}\n", code: InvalidAuthentication }
+    at BamlAsyncClient.parsed [as TestRetryExponential] (/Users/vbv/repos/gloo-lang/integ-tests/typescript/baml_client/async_client.ts:1226:16)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:138:7) {
+  code: 'GenericFailure'
+}
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:294:15)
+    at func (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:69:38)
+    at AsyncLocalStorage.run (node:async_hooks:338:14)
+    at run (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:67:22)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:303: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:297:15)
+    at func (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:69:38)
+    at AsyncLocalStorage.run (node:async_hooks:338:14)
+    at run (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:67:22)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:303: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:300:15)
+    at func (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:69:38)
+    at AsyncLocalStorage.run (node:async_hooks:338:14)
+    at run (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:67:22)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:303: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:315:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:90:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:88:13
+    at async Promise.all (index 0)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:321:22)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:90:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:88:13
+    at async Promise.all (index 0)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:333:5)
samDummyNested nested1
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:315:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:90:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:88:13
+    at async Promise.all (index 1)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:321:22)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:90:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:88:13
+    at async Promise.all (index 0)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:333:5)
samDummyNested nested2
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:315:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:90:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:88:13
+    at async Promise.all (index 2)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:321:22)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:90:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:88:13
+    at async Promise.all (index 0)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:333:5)
samDummyNested nested3
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:326:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:90:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:88:13
+    at async Promise.all (index 0)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:333:5)
dummy hi1
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:315:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:90:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:88:13
+    at async Promise.all (index 0)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:321:22)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:90:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:88:13
+    at async Promise.all (index 1)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:333:5)
samDummyNested nested1
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:315:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:90:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:88:13
+    at async Promise.all (index 1)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:321:22)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:90:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:88:13
+    at async Promise.all (index 1)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:333:5)
samDummyNested nested2
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:315:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:90:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:88:13
+    at async Promise.all (index 2)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:321:22)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:90:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:88:13
+    at async Promise.all (index 1)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:333:5)
samDummyNested nested3
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:326:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:90:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:88:13
+    at async Promise.all (index 1)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:333:5)
dummy hi2
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:315:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:90:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:88:13
+    at async Promise.all (index 0)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:321:22)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:90:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:88:13
+    at async Promise.all (index 2)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:333:5)
samDummyNested nested1
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:315:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:90:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:88:13
+    at async Promise.all (index 1)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:321:22)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:90:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:88:13
+    at async Promise.all (index 2)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:333:5)
samDummyNested nested2
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:315:15)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:90:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:88:13
+    at async Promise.all (index 2)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:321:22)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:90:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:88:13
+    at async Promise.all (index 2)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:333:5)
samDummyNested nested3
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:326:15)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:90:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:88:13
+    at async Promise.all (index 2)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:333:5)
dummy hi3
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:340:15)
+    at func (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:90:44)
+    at AsyncLocalStorage.run (node:async_hooks:338:14)
+    at run (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:88:28)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:356:5)
hello world
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:315:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:90:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:88:13
+    at async Promise.all (index 0)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:321:22)
samDummyNested nested1
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:315:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:90:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:88:13
+    at async Promise.all (index 1)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:321:22)
samDummyNested nested2
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:315:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:90:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:88:13
+    at async Promise.all (index 2)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:321:22)
samDummyNested nested3
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:326: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:315:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:90:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:88:13
+    at async Promise.all (index 0)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:321:22)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:90:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:88:13
+    at /Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:345:20
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:90:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:88:13
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:339:17)
samDummyNested nested1
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:315:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:90:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:88:13
+    at async Promise.all (index 1)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:321:22)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:90:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:88:13
+    at /Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:345:20
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:90:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:88:13
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:339:17)
samDummyNested nested2
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:315:15)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:90:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:88:13
+    at async Promise.all (index 2)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:321:22)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:90:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:88:13
+    at /Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:345:20
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:90:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:88:13
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:339:17)
samDummyNested nested3
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:326:15)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:90:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:88:13
+    at /Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:345:20
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:90:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:88:13
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:339:17)
dummy secondDummyFuncArg
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:315:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:90:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:88:13
+    at async Promise.all (index 0)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:321:22)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:90:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:88:13
+    at /Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:353:20
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:90:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:88:13
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:339:17)
samDummyNested nested1
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:315:15)
+    at runNextTicks (node:internal/process/task_queues:60:5)
+    at listOnTimeout (node:internal/timers:538:9)
+    at processTimers (node:internal/timers:512:7)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:90:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:88:13
+    at async Promise.all (index 1)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:321:22)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:90:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:88:13
+    at /Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:353:20
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:90:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:88:13
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:339:17)
samDummyNested nested2
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:315:15)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:90:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:88:13
+    at async Promise.all (index 2)
+    at dummyFn (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:321:22)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:90:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:88:13
+    at /Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:353:20
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:90:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:88:13
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:339:17)
samDummyNested nested3
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:326:15)
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:90:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:88:13
+    at /Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:353:20
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:90:38
+    at /Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:88:13
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:339:17)
dummy thirdDummyFuncArg
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:359:15)
+    at func (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:90:44)
+    at AsyncLocalStorage.run (node:async_hooks:338:14)
+    at run (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:88:28)
+    at Object.<anonymous> (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:365:5)
hello world
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:369: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:393: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:450: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:452: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:452: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:460:13)
final  {
+  hair_color: 'black',
+  attributes: { eye_color: 'blue', facial_hair: 'beard' }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:484:13)
+    at Promise.then.completed (/Users/vbv/repos/gloo-lang/integ-tests/typescript/node_modules/.pnpm/jest-circus@29.7.0/node_modules/jest-circus/build/utils.js:298:28)
+    at new Promise (<anonymous>)
+    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:486: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:486: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:486: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:494: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:505: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:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: null, prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: '', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: 'value', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: 'value1', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: 'value1', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: 'value1', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: 'value1', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: 'value1', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: 'value1', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: 'value1', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: 'value1', prop2: null }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: 'value1', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: 'value1', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: 'value1', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: 'value1', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: 'value1', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: 'value1', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: 'value1', prop2: { prop1: null, prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: 'value1', prop2: { prop1: '', prop2: null, inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
+  prop1: 'value1',
+  prop2: { prop1: 'value', prop2: null, inner: null }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
+  prop1: 'value1',
+  prop2: { prop1: 'value2', prop2: null, inner: null }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
+  prop1: 'value1',
+  prop2: { prop1: 'value2', prop2: null, inner: null }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
+  prop1: 'value1',
+  prop2: { prop1: 'value2', prop2: null, inner: null }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
+  prop1: 'value1',
+  prop2: { prop1: 'value2', prop2: null, inner: null }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
+  prop1: 'value1',
+  prop2: { prop1: 'value2', prop2: null, inner: null }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
+  prop1: 'value1',
+  prop2: { prop1: 'value2', prop2: null, inner: null }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
+  prop1: 'value1',
+  prop2: { prop1: 'value2', prop2: null, inner: null }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
+  prop1: 'value1',
+  prop2: { prop1: 'value2', prop2: null, inner: null }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg { prop1: 'value1', prop2: { prop1: 'value2', prop2: '', inner: null } }
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
+  prop1: 'value1',
+  prop2: { prop1: 'value2', prop2: 'value', inner: null }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
+  prop1: 'value1',
+  prop2: { prop1: 'value2', prop2: 'value3', inner: null }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
+  prop1: 'value1',
+  prop2: { prop1: 'value2', prop2: 'value3', inner: null }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
+  prop1: 'value1',
+  prop2: { prop1: 'value2', prop2: 'value3', inner: null }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
+  prop1: 'value1',
+  prop2: { prop1: 'value2', prop2: 'value3', inner: null }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
+  prop1: 'value1',
+  prop2: { prop1: 'value2', prop2: 'value3', inner: null }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
+  prop1: 'value1',
+  prop2: { prop1: 'value2', prop2: 'value3', inner: null }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
+  prop1: 'value1',
+  prop2: { prop1: 'value2', prop2: 'value3', inner: null }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
+  prop1: 'value1',
+  prop2: {
+    prop1: 'value2',
+    prop2: 'value3',
+    inner: { prop2: null, prop3: null }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
+  prop1: 'value1',
+  prop2: {
+    prop1: 'value2',
+    prop2: 'value3',
+    inner: { prop2: null, prop3: null }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
+  prop1: 'value1',
+  prop2: {
+    prop1: 'value2',
+    prop2: 'value3',
+    inner: { prop2: null, prop3: null }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
+  prop1: 'value1',
+  prop2: {
+    prop1: 'value2',
+    prop2: 'value3',
+    inner: { prop2: null, prop3: null }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
+  prop1: 'value1',
+  prop2: {
+    prop1: 'value2',
+    prop2: 'value3',
+    inner: { prop2: null, prop3: null }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
+  prop1: 'value1',
+  prop2: {
+    prop1: 'value2',
+    prop2: 'value3',
+    inner: { prop2: null, prop3: null }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
+  prop1: 'value1',
+  prop2: {
+    prop1: 'value2',
+    prop2: 'value3',
+    inner: { prop2: null, prop3: null }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
+  prop1: 'value1',
+  prop2: {
+    prop1: 'value2',
+    prop2: 'value3',
+    inner: { prop2: null, prop3: null }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
+  prop1: 'value1',
+  prop2: {
+    prop1: 'value2',
+    prop2: 'value3',
+    inner: { prop2: 4, prop3: null }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
+  prop1: 'value1',
+  prop2: {
+    prop1: 'value2',
+    prop2: 'value3',
+    inner: { prop2: 42, prop3: null }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
+  prop1: 'value1',
+  prop2: {
+    prop1: 'value2',
+    prop2: 'value3',
+    inner: { prop2: 42, prop3: null }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
+  prop1: 'value1',
+  prop2: {
+    prop1: 'value2',
+    prop2: 'value3',
+    inner: { prop2: 42, prop3: null }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
+  prop1: 'value1',
+  prop2: {
+    prop1: 'value2',
+    prop2: 'value3',
+    inner: { prop2: 42, prop3: null }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
+  prop1: 'value1',
+  prop2: {
+    prop1: 'value2',
+    prop2: 'value3',
+    inner: { prop2: 42, prop3: null }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
+  prop1: 'value1',
+  prop2: {
+    prop1: 'value2',
+    prop2: 'value3',
+    inner: { prop2: 42, prop3: null }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
+  prop1: 'value1',
+  prop2: {
+    prop1: 'value2',
+    prop2: 'value3',
+    inner: { prop2: 42, prop3: null }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
+  prop1: 'value1',
+  prop2: {
+    prop1: 'value2',
+    prop2: 'value3',
+    inner: { prop2: 42, prop3: null }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
+  prop1: 'value1',
+  prop2: {
+    prop1: 'value2',
+    prop2: 'value3',
+    inner: { prop2: 42, prop3: null }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
+  prop1: 'value1',
+  prop2: {
+    prop1: 'value2',
+    prop2: 'value3',
+    inner: { prop2: 42, prop3: null }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
+  prop1: 'value1',
+  prop2: {
+    prop1: 'value2',
+    prop2: 'value3',
+    inner: { prop2: 42, prop3: null }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
+  prop1: 'value1',
+  prop2: {
+    prop1: 'value2',
+    prop2: 'value3',
+    inner: { prop2: 42, prop3: null }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
+  prop1: 'value1',
+  prop2: {
+    prop1: 'value2',
+    prop2: 'value3',
+    inner: { prop2: 42, prop3: null }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
+  prop1: 'value1',
+  prop2: {
+    prop1: 'value2',
+    prop2: 'value3',
+    inner: { prop2: 42, prop3: null }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
+  prop1: 'value1',
+  prop2: {
+    prop1: 'value2',
+    prop2: 'value3',
+    inner: { prop2: 42, prop3: null }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
+  prop1: 'value1',
+  prop2: {
+    prop1: 'value2',
+    prop2: 'value3',
+    inner: { prop2: 42, prop3: null }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
+  prop1: 'value1',
+  prop2: {
+    prop1: 'value2',
+    prop2: 'value3',
+    inner: { prop2: 42, prop3: null }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
+  prop1: 'value1',
+  prop2: {
+    prop1: 'value2',
+    prop2: 'value3',
+    inner: { prop2: 42, prop3: null }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
+  prop1: 'value1',
+  prop2: {
+    prop1: 'value2',
+    prop2: 'value3',
+    inner: { prop2: 42, prop3: null }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
+  prop1: 'value1',
+  prop2: {
+    prop1: 'value2',
+    prop2: 'value3',
+    inner: { prop2: 42, prop3: null }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
+  prop1: 'value1',
+  prop2: {
+    prop1: 'value2',
+    prop2: 'value3',
+    inner: { prop2: 42, prop3: null }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
+  prop1: 'value1',
+  prop2: {
+    prop1: 'value2',
+    prop2: 'value3',
+    inner: { prop2: 42, prop3: null }
+  }
+}
    at Object.log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:518:15)
msg {
+  prop1: 'value1',
+  prop2: {
+    prop1: 'value2',
+    prop2: 'value3',
+    inner: { prop2: 42, prop3: null }
+  }
+}
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:543:15)
+    at callback (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:56:17)
onLogEvent {
+  metadata: {
+    eventId: '4f05a7f4-c040-4200-a5b1-a6458e162147',
+    rootEventId: '4f05a7f4-c040-4200-a5b1-a6458e162147'
+  },
+  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-08-27T07:50:08.476Z'
+}
    at log (/Users/vbv/repos/gloo-lang/integ-tests/typescript/tests/integ-tests.test.ts:543:15)
+    at callback (/Users/vbv/repos/gloo-lang/engine/language_client_typescript/async_context_vars.js:56:17)
onLogEvent {
+  metadata: {
+    eventId: '33e24dc8-b793-40e7-b853-f28ecae28620',
+    rootEventId: '33e24dc8-b793-40e7-b853-f28ecae28620'
+  },
+  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-08-27T07:50:08.951Z'
+}
\ No newline at end of file diff --git a/tools/versions/engine.cfg b/tools/versions/engine.cfg index d46c5a62d..5c53e508d 100644 --- a/tools/versions/engine.cfg +++ b/tools/versions/engine.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.53.1 +current_version = 0.54.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 f7f8a90fb..a503394ba 100644 --- a/tools/versions/integ-tests.cfg +++ b/tools/versions/integ-tests.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.53.1 +current_version = 0.54.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 87551b2ee..472a9c874 100644 --- a/tools/versions/python.cfg +++ b/tools/versions/python.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.53.1 +current_version = 0.54.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 000ea649a..64dbd7f3b 100644 --- a/tools/versions/ruby.cfg +++ b/tools/versions/ruby.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.53.1 +current_version = 0.54.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 dabba9d42..b9110821f 100644 --- a/tools/versions/typescript.cfg +++ b/tools/versions/typescript.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.53.1 +current_version = 0.54.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 dd34ce61f..61ffff923 100644 --- a/tools/versions/vscode.cfg +++ b/tools/versions/vscode.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.53.1 +current_version = 0.54.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 953ad6bd0..d831dff03 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.53.1", + "version": "0.54.0", "publisher": "Boundary", "repository": "https://github.com/BoundaryML/baml", "homepage": "https://www.boundaryml.com",